summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2016-07-02 09:57:34 -0700
committerKaz Kylheku <kaz@kylheku.com>2020-10-11 09:05:59 -0700
commit2ee7c6ce2989dbc4694fea4d8c5e5031b7f67ddb (patch)
treef5d155fc35adef731df4ee5401f8507149691b1a
parent4fef9cc363cc3aff606f057edfb0bf492f544877 (diff)
downloadcygnal-2ee7c6ce2989dbc4694fea4d8c5e5031b7f67ddb.tar.gz
cygnal-2ee7c6ce2989dbc4694fea4d8c5e5031b7f67ddb.tar.bz2
cygnal-2ee7c6ce2989dbc4694fea4d8c5e5031b7f67ddb.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.in3
-rw-r--r--winsup/cygwin/spawn.cc5
2 files changed, 7 insertions, 1 deletions
diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in
index fac81759e..baaeaae67 100644
--- a/winsup/cygwin/Makefile.in
+++ b/winsup/cygwin/Makefile.in
@@ -147,7 +147,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}}
MT_SAFE_OBJECTS:=
#
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc
index 578abf389..1cd017e34 100644
--- a/winsup/cygwin/spawn.cc
+++ b/winsup/cygwin/spawn.cc
@@ -651,6 +651,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