Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-118293: Suppress mouse cursor change in multiprocessing #118315

Merged
merged 3 commits into from Apr 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 16 additions & 0 deletions Doc/library/subprocess.rst
Expand Up @@ -1066,6 +1066,22 @@ The :mod:`subprocess` module exposes the following constants.
Specifies that the :attr:`STARTUPINFO.wShowWindow` attribute contains
additional information.

.. data:: STARTF_FORCEONFEEDBACK

A :attr:`STARTUPINFO.dwFlags` parameter to specify that the
*Working in Background* mouse cursor will be displayed while a
process is launching. This is the default behavior for GUI
processes.

.. versionadded:: 3.13

.. data:: STARTF_FORCEOFFFEEDBACK

A :attr:`STARTUPINFO.dwFlags` parameter to specify that the mouse
cursor will not be changed when launching a process.

.. versionadded:: 3.13

.. data:: CREATE_NEW_CONSOLE

The new process has a new console, instead of inheriting its parent's
Expand Down
4 changes: 3 additions & 1 deletion Lib/multiprocessing/popen_spawn_win32.py
Expand Up @@ -3,6 +3,7 @@
import signal
import sys
import _winapi
from subprocess import STARTUPINFO, STARTF_FORCEOFFFEEDBACK

from .context import reduction, get_spawning_popen, set_spawning_popen
from . import spawn
Expand Down Expand Up @@ -74,7 +75,8 @@ def __init__(self, process_obj):
try:
hp, ht, pid, tid = _winapi.CreateProcess(
python_exe, cmd,
None, None, False, 0, env, None, None)
None, None, False, 0, env, None,
STARTUPINFO(dwFlags=STARTF_FORCEOFFFEEDBACK))
_winapi.CloseHandle(ht)
except:
_winapi.CloseHandle(rhandle)
Expand Down
2 changes: 2 additions & 0 deletions Lib/subprocess.py
Expand Up @@ -83,6 +83,7 @@
STD_INPUT_HANDLE, STD_OUTPUT_HANDLE,
STD_ERROR_HANDLE, SW_HIDE,
STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW,
STARTF_FORCEONFEEDBACK, STARTF_FORCEOFFFEEDBACK,
ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS,
HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
Expand All @@ -93,6 +94,7 @@
"STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE",
"STD_ERROR_HANDLE", "SW_HIDE",
"STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW",
"STARTF_FORCEONFEEDBACK", "STARTF_FORCEOFFFEEDBACK",
"STARTUPINFO",
"ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS",
"HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS",
Expand Down
@@ -0,0 +1,2 @@
The ``multiprocessing`` module now passes the ``STARTF_FORCEOFFFEEDBACK``
flag when spawning processes to tell Windows not to change the mouse cursor.
48 changes: 48 additions & 0 deletions Modules/_winapi.c
Expand Up @@ -72,9 +72,45 @@
#ifndef STARTF_USESHOWWINDOW
#define STARTF_USESHOWWINDOW 0x00000001
#endif
#ifndef STARTF_USESIZE
#define STARTF_USESIZE 0x00000002
#endif
#ifndef STARTF_USEPOSITION
#define STARTF_USEPOSITION 0x00000004
#endif
#ifndef STARTF_USECOUNTCHARS
#define STARTF_USECOUNTCHARS 0x00000008
#endif
#ifndef STARTF_USEFILLATTRIBUTE
#define STARTF_USEFILLATTRIBUTE 0x00000010
#endif
#ifndef STARTF_RUNFULLSCREEN
#define STARTF_RUNFULLSCREEN 0x00000020
#endif
#ifndef STARTF_FORCEONFEEDBACK
#define STARTF_FORCEONFEEDBACK 0x00000040
#endif
#ifndef STARTF_FORCEOFFFEEDBACK
#define STARTF_FORCEOFFFEEDBACK 0x00000080
#endif
#ifndef STARTF_USESTDHANDLES
#define STARTF_USESTDHANDLES 0x00000100
#endif
#ifndef STARTF_USEHOTKEY
#define STARTF_USEHOTKEY 0x00000200
#endif
#ifndef STARTF_TITLEISLINKNAME
#define STARTF_TITLEISLINKNAME 0x00000800
#endif
#ifndef STARTF_TITLEISAPPID
#define STARTF_TITLEISAPPID 0x00001000
#endif
#ifndef STARTF_PREVENTPINNING
#define STARTF_PREVENTPINNING 0x00002000
#endif
#ifndef STARTF_UNTRUSTEDSOURCE
#define STARTF_UNTRUSTEDSOURCE 0x00008000
#endif

typedef struct {
PyTypeObject *overlapped_type;
Expand Down Expand Up @@ -3061,7 +3097,19 @@ static int winapi_exec(PyObject *m)
WINAPI_CONSTANT(F_DWORD, SEC_RESERVE);
WINAPI_CONSTANT(F_DWORD, SEC_WRITECOMBINE);
WINAPI_CONSTANT(F_DWORD, STARTF_USESHOWWINDOW);
WINAPI_CONSTANT(F_DWORD, STARTF_USESIZE);
WINAPI_CONSTANT(F_DWORD, STARTF_USEPOSITION);
WINAPI_CONSTANT(F_DWORD, STARTF_USECOUNTCHARS);
WINAPI_CONSTANT(F_DWORD, STARTF_USEFILLATTRIBUTE);
WINAPI_CONSTANT(F_DWORD, STARTF_RUNFULLSCREEN);
WINAPI_CONSTANT(F_DWORD, STARTF_FORCEONFEEDBACK);
WINAPI_CONSTANT(F_DWORD, STARTF_FORCEOFFFEEDBACK);
WINAPI_CONSTANT(F_DWORD, STARTF_USESTDHANDLES);
WINAPI_CONSTANT(F_DWORD, STARTF_USEHOTKEY);
WINAPI_CONSTANT(F_DWORD, STARTF_TITLEISLINKNAME);
WINAPI_CONSTANT(F_DWORD, STARTF_TITLEISAPPID);
WINAPI_CONSTANT(F_DWORD, STARTF_PREVENTPINNING);
WINAPI_CONSTANT(F_DWORD, STARTF_UNTRUSTEDSOURCE);
WINAPI_CONSTANT(F_DWORD, STD_INPUT_HANDLE);
WINAPI_CONSTANT(F_DWORD, STD_OUTPUT_HANDLE);
WINAPI_CONSTANT(F_DWORD, STD_ERROR_HANDLE);
Expand Down