summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Innes <andrewi@gnu.org>2001-06-11 11:00:24 +0000
committerAndrew Innes <andrewi@gnu.org>2001-06-11 11:00:24 +0000
commita55a5f3c869451baf82d3b0065f90622f2b29820 (patch)
treed424a4189a6faaca1f99db59e005279f0c5b3e5e /src
parent6eb51c108cfd0eec8bf67c73b3e902f0eda666db (diff)
downloademacs-a55a5f3c869451baf82d3b0065f90622f2b29820.tar.gz
(create_child): Add new parameter is_gui_app.
(w32_executable_type): Add new parameter is_gui_app. (sys_spawnve): Use it. (sys_kill): Fake ^C for SIGINT, and ^Break (if possible) for SIGQUIT. This matches better how the signals are interpreted by MSVC compiled programs. (syms_of_ntproc): Update docstring.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog10
-rw-r--r--src/w32proc.c35
2 files changed, 33 insertions, 12 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 6bd26813216..f775a250c5d 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,13 @@
+2001-06-11 Andrew Innes <andrewi@gnu.org>
+
+ * w32proc.c (create_child): Add new parameter is_gui_app.
+ (w32_executable_type): Add new parameter is_gui_app.
+ (sys_spawnve): Use it.
+ (sys_kill): Fake ^C for SIGINT, and ^Break (if possible) for
+ SIGQUIT. This matches better how the signals are interpreted by
+ MSVC compiled programs.
+ (syms_of_ntproc): Update docstring.
+
2001-06-02 Stefan Monnier <monnier@cs.yale.edu>
* xterm.c (clear_mouse_face): Reset dpyinfo->mouse_face_overlay as
diff --git a/src/w32proc.c b/src/w32proc.c
index a2b5000b88d..8d5890b86dd 100644
--- a/src/w32proc.c
+++ b/src/w32proc.c
@@ -304,7 +304,7 @@ reader_thread (void *arg)
static char * process_dir;
static BOOL
-create_child (char *exe, char *cmdline, char *env,
+create_child (char *exe, char *cmdline, char *env, int is_gui_app,
int * pPid, child_process *cp)
{
STARTUPINFO start;
@@ -321,7 +321,7 @@ create_child (char *exe, char *cmdline, char *env,
start.cb = sizeof (start);
#ifdef HAVE_NTGUI
- if (NILP (Vw32_start_process_show_window))
+ if (NILP (Vw32_start_process_show_window) && !is_gui_app)
start.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
else
start.dwFlags = STARTF_USESTDHANDLES;
@@ -571,7 +571,7 @@ get_result:
}
void
-w32_executable_type (char * filename, int * is_dos_app, int * is_cygnus_app)
+w32_executable_type (char * filename, int * is_dos_app, int * is_cygnus_app, int * is_gui_app)
{
file_data executable;
char * p;
@@ -579,6 +579,7 @@ w32_executable_type (char * filename, int * is_dos_app, int * is_cygnus_app)
/* Default values in case we can't tell for sure. */
*is_dos_app = FALSE;
*is_cygnus_app = FALSE;
+ *is_gui_app = FALSE;
if (!open_input_file (&executable, filename))
return;
@@ -599,7 +600,7 @@ w32_executable_type (char * filename, int * is_dos_app, int * is_cygnus_app)
extension, which is defined in the registry. */
p = egetenv ("COMSPEC");
if (p)
- w32_executable_type (p, is_dos_app, is_cygnus_app);
+ w32_executable_type (p, is_dos_app, is_cygnus_app, is_gui_app);
}
else
{
@@ -651,6 +652,11 @@ w32_executable_type (char * filename, int * is_dos_app, int * is_cygnus_app)
break;
}
}
+
+ /* Check whether app is marked as a console or windowed (aka
+ GUI) app. Accept Posix and OS2 subsytem apps as console
+ apps. */
+ *is_gui_app = (nt_header->OptionalHeader.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI);
}
}
@@ -714,7 +720,7 @@ sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
int arglen, numenv;
int pid;
child_process *cp;
- int is_dos_app, is_cygnus_app;
+ int is_dos_app, is_cygnus_app, is_gui_app;
int do_quoting = 0;
char escape_char;
/* We pass our process ID to our children by setting up an environment
@@ -757,8 +763,11 @@ sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
executable that is implicitly linked to the Cygnus dll (implying it
was compiled with the Cygnus GNU toolchain and hence relies on
cygwin.dll to parse the command line - we use this to decide how to
- escape quote chars in command line args that must be quoted). */
- w32_executable_type (cmdname, &is_dos_app, &is_cygnus_app);
+ escape quote chars in command line args that must be quoted).
+
+ Also determine whether it is a GUI app, so that we don't hide its
+ initial window unless specifically requested. */
+ w32_executable_type (cmdname, &is_dos_app, &is_cygnus_app, &is_gui_app);
/* On Windows 95, if cmdname is a DOS app, we invoke a helper
application to start it by specifying the helper app as cmdname,
@@ -992,7 +1001,7 @@ sys_spawnve (int mode, char *cmdname, char **argv, char **envp)
}
/* Now create the process. */
- if (!create_child (cmdname, cmdline, env, &pid, cp))
+ if (!create_child (cmdname, cmdline, env, is_gui_app, &pid, cp))
{
delete_child (cp);
errno = ENOEXEC;
@@ -1383,18 +1392,19 @@ sys_kill (int pid, int sig)
EnumWindows (find_child_console, (LPARAM) cp);
}
- if (sig == SIGINT)
+ if (sig == SIGINT || sig == SIGQUIT)
{
if (NILP (Vw32_start_process_share_console) && cp && cp->hwnd)
{
BYTE control_scan_code = (BYTE) MapVirtualKey (VK_CONTROL, 0);
- BYTE vk_break_code = VK_CANCEL;
+ /* Fake Ctrl-C for SIGINT, and Ctrl-Break for SIGQUIT. */
+ BYTE vk_break_code = (sig == SIGINT) ? 'C' : VK_CANCEL;
BYTE break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
HWND foreground_window;
if (break_scan_code == 0)
{
- /* Fake Ctrl-C if we can't manage Ctrl-Break. */
+ /* Fake Ctrl-C for SIGQUIT if we can't manage Ctrl-Break. */
vk_break_code = 'C';
break_scan_code = (BYTE) MapVirtualKey (vk_break_code, 0);
}
@@ -2154,7 +2164,8 @@ will be chosen based on the type of the program.");
DEFVAR_LISP ("w32-start-process-show-window",
&Vw32_start_process_show_window,
"When nil, new child processes hide their windows.\n\
-When non-nil, they show their window in the method of their choice.");
+When non-nil, they show their window in the method of their choice.\n\
+This variable doesn't affect GUI applications, which will never be hidden.");
Vw32_start_process_show_window = Qnil;
DEFVAR_LISP ("w32-start-process-share-console",