diff options
author | Andrew Innes <andrewi@gnu.org> | 2001-06-11 11:00:24 +0000 |
---|---|---|
committer | Andrew Innes <andrewi@gnu.org> | 2001-06-11 11:00:24 +0000 |
commit | a55a5f3c869451baf82d3b0065f90622f2b29820 (patch) | |
tree | d424a4189a6faaca1f99db59e005279f0c5b3e5e /src | |
parent | 6eb51c108cfd0eec8bf67c73b3e902f0eda666db (diff) | |
download | emacs-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/ChangeLog | 10 | ||||
-rw-r--r-- | src/w32proc.c | 35 |
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", |