diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-07-02 09:57:34 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-07-26 21:52:23 -0700 |
commit | 6cc3d35eee6ec073361b7a33e19e6e0c9d54682b (patch) | |
tree | 514eececa07b44d97799305540230df140f1d077 | |
parent | 28402bd4de6a1f46eec0d3519d9cb2eb63d59a5b (diff) | |
download | cygnal-6cc3d35eee6ec073361b7a33e19e6e0c9d54682b.tar.gz cygnal-6cc3d35eee6ec073361b7a33e19e6e0c9d54682b.tar.bz2 cygnal-6cc3d35eee6ec073361b7a33e19e6e0c9d54682b.zip |
Fix spawned process window not foregrounding.
This patch addresses an issue whereby the window of
a process created with CreateProcess fails to come
to the foreground.
This occurs when the calling process itself hasn't run any
Windows event processing loop. A repro test case is to make a
program with a main, and and call CreateProcess to spawn
calc.exe or notepad.exe before doing anything else.
It turns out that a dummy call to TranslateMessage makes this
issue goes away. If such a call is made before CreateProcess,
then the spawned process' window comes up in the foreground
as expected.
* winsup/cygwin/Makefile.in (DLL_IMPORTS): We need to link
in user32.dll to call TranslateMessage. Condense the
multiple ${shell ...} call repetition with a foreach.
* winsup/cygwin/spawn.cc (child_info_spawn::worker): Do the
dummy TranslateMessage call before the section of code that
calls CreateProcess or CreateProcessAsUser.
-rw-r--r-- | winsup/cygwin/Makefile.in | 3 | ||||
-rw-r--r-- | winsup/cygwin/spawn.cc | 5 |
2 files changed, 7 insertions, 1 deletions
diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in index 73d9b37fd..74dbca3e3 100644 --- a/winsup/cygwin/Makefile.in +++ b/winsup/cygwin/Makefile.in @@ -136,7 +136,8 @@ EXTRA_OFILES:= MALLOC_OFILES:=malloc.o -DLL_IMPORTS:=${shell $(CC) -print-file-name=w32api/libkernel32.a} ${shell $(CC) -print-file-name=w32api/libntdll.a} +DLL_IMPORTS:=${foreach i,kernel32 user32 ntdll,\ + ${shell $(CC) -print-file-name=w32api/lib${i}.a}} # LIBC_OFILES:= \ diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index 676e5d798..a4071c986 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -715,6 +715,11 @@ child_info_spawn::worker (const char *prog_arg, const char *const *argv, if (!iscygwin ()) init_console_handler (myself->ctty > 0); + /* Workaround for the issue of the window of a spawned process + not coming to the foreground. A useless call to TranslateMessage + cures this somehow. */ + MSG dummy = { 0 }; + (void) TranslateMessage(&dummy); loop: /* When ruid != euid we create the new process under the current original |