Re: [PATCH 5.6.1] Win32: Give user control over window creation behavior of system...
Jan Dubois [Tue, 12 Feb 2002 00:56:31 +0000 (16:56 -0800)]
Message-ID: <4llh6uc4gnqtk3csmfoqed3t6q85436bb1@4ax.com>

p4raw-id: //depot/perl@14657

lib/Win32.pod
win32/win32.c
win32/win32.h

index 842e484..95f7562 100644 (file)
@@ -253,6 +253,20 @@ The function returns the menu id of the selected push button:
 
 [EXT] Loads the DLL LIBRARYNAME and calls the function DllRegisterServer.
 
+=item Win32::SetChildShowWindow(SHOWWINDOW)
+
+[CORE] Sets the I<ShowMode> of child processes started by system().
+By default system() will create a new console window for child
+processes if Perl itself is not running from a console. Calling
+SetChildShowWindow(0) will make these new console windows invisible.
+Calling SetChildShowWindow() without arguments reverts system() to the
+default behavior.  The return value of SetChildShowWindow() is the
+previous setting or C<undef>.
+
+[EXT] The following symbolic constants for SHOWWINDOW are available
+(but not exported) from the Win32 module: SW_HIDE, SW_SHOWNORMAL,
+SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED and SW_SHOWNOACTIVATE.
+
 =item Win32::SetCwd(NEWDIRECTORY)
 
 [CORE] Sets the current active drive and directory. This function does not
index 52d0924..e0cdfc0 100644 (file)
@@ -3667,6 +3667,10 @@ win32_spawnvp(int mode, const char *cmdname, const char *const *argv)
     else {
        create |= CREATE_NEW_CONSOLE;
     }
+    if (w32_use_showwindow) {
+        StartupInfo.dwFlags |= STARTF_USESHOWWINDOW;
+        StartupInfo.wShowWindow = w32_showwindow;
+    }
 
     DEBUG_p(PerlIO_printf(Perl_debug_log, "Spawning [%s] with [%s]\n",
                          cname,cmd));
@@ -4003,6 +4007,32 @@ win32_dynaload(const char* filename)
  */
 
 static
+XS(w32_SetChildShowWindow)
+{
+    dXSARGS;
+    BOOL use_showwindow = w32_use_showwindow;
+    /* use "unsigned short" because Perl has redefined "WORD" */
+    unsigned short showwindow = w32_showwindow;
+
+    if (items > 1)
+       Perl_croak(aTHX_ "usage: Win32::SetChildShowWindow($showwindow)");
+
+    if (items == 0 || !SvOK(ST(0)))
+        w32_use_showwindow = FALSE;
+    else {
+        w32_use_showwindow = TRUE;
+        w32_showwindow = (unsigned short)SvIV(ST(0));
+    }
+
+    EXTEND(SP, 1);
+    if (use_showwindow)
+        ST(0) = sv_2mortal(newSViv(showwindow));
+    else
+        ST(0) = &PL_sv_undef;
+    XSRETURN(1);
+}
+
+static
 XS(w32_GetCwd)
 {
     dXSARGS;
@@ -4488,6 +4518,7 @@ Perl_init_os_extras(void)
     newXS("Win32::GetLongPathName", w32_GetLongPathName, file);
     newXS("Win32::CopyFile", w32_CopyFile, file);
     newXS("Win32::Sleep", w32_Sleep, file);
+    newXS("Win32::SetChildShowWindow", w32_SetChildShowWindow, file);
 
     /* XXX Bloat Alert! The following Activeware preloads really
      * ought to be part of Win32::Sys::*, so they're not included
index f5c04b6..299d8f1 100644 (file)
@@ -353,6 +353,8 @@ struct thread_intern {
 #    ifdef USE_RTL_THREAD_API
     void *             retv;   /* slot for thread return value */
 #    endif
+    BOOL               Wuse_showwindow;
+    WORD               Wshowwindow;
 };
 
 #ifdef USE_5005THREADS
@@ -421,12 +423,16 @@ DllExport int win32_async_check(pTHX);
 #  define w32_crypt_buffer     (thr->i.Wcrypt_buffer)
 #  define w32_servent          (thr->i.Wservent)
 #  define w32_init_socktype    (thr->i.Winit_socktype)
+#  define w32_use_showwindow   (thr->i.Wuse_showwindow)
+#  define w32_showwindow       (thr->i.Wshowwindow)
 #else
 #  define w32_strerror_buffer  (PL_sys_intern.thr_intern.Wstrerror_buffer)
 #  define w32_getlogin_buffer  (PL_sys_intern.thr_intern.Wgetlogin_buffer)
 #  define w32_crypt_buffer     (PL_sys_intern.thr_intern.Wcrypt_buffer)
 #  define w32_servent          (PL_sys_intern.thr_intern.Wservent)
 #  define w32_init_socktype    (PL_sys_intern.thr_intern.Winit_socktype)
+#  define w32_use_showwindow   (PL_sys_intern.thr_intern.Wuse_showwindow)
+#  define w32_showwindow       (PL_sys_intern.thr_intern.Wshowwindow)
 #endif /* USE_5005THREADS */
 
 /* UNICODE<>ANSI translation helpers */