On Tue, 2023-04-04 at 12:03 +0200, Jean Abou Samra wrote:
> Le mardi 04 avril 2023 à 11:34 +0200, Jean Abou Samra a écrit :
> Le lundi 03 avril 2023 à 20:50 +0200, Jonas Hahnfeld via LilyPond
> user discussion a écrit :
> > This shouldn't be needed: g_spawn_sync internally uses a helper
> > executable that should take care exactly of this aspect. LilyPond
> > uses
> > it internally to call Ghostscript.
> Hmm, but Denemo is already using g_spawn_sync and still experiencing
> this issue, or am I missing something?
> You are right that the GLib sources contain a gspawn-win32-helper.c
> program with the comment
> /* We build gspawn-win32-helper.exe as a Windows GUI application
>  * to avoid any temporarily flashing console windows in case
>  * the gspawn function is invoked by a GUI program. Thus, no main()
>  * but a WinMain().
>  */
> Later, there is
> #ifndef HELPER_CONSOLE
> int _stdcall
> WinMain (struct HINSTANCE__ *hInstance,
>        struct HINSTANCE__ *hPrevInstance,
>        char               *lpszCmdLine,
>        int                 nCmdShow)
> #else
> int
> main (int ignored_argc, char **ignored_argv)
> #endif
> Apparently, there are two such executables, gspawn-win32-helper.exe
> and gspawn-win32-helper-console.exe, the latter compiled with -
> DHELP_CONSOLE.
> In gspawn-win32.c, I see
>   if (might_be_console_process ())
>     helper_process = HELPER_PROCESS "-console.exe";
>   else
>     helper_process = HELPER_PROCESS ".exe";
> which calls
> static gboolean
> might_be_console_process (void)
> {
>   // we should always fail to attach ourself to a console (because
> we're
>   // either already attached, or we do not have a console)
>   gboolean attached_to_self = AttachConsole (GetCurrentProcessId ());
>   g_return_val_if_fail (!attached_to_self, TRUE);
> 
>   switch (GetLastError ())
>     {
>     // current process is already attached to a console
>     case ERROR_ACCESS_DENIED:
>       return TRUE;
>     // current process does not have a console
>     case ERROR_INVALID_HANDLE:
>       return FALSE;
>     // we should not get ERROR_INVALID_PARAMETER
>     }
> 
>   g_return_val_if_reached (FALSE);
> }
> Richard, maybe might_be_console_process is returning true inside
> Denemo for some reason?

I couldn't follow up this suggestion because I don't have a way of
building Denemo for Windows to experiment with. But it occurred to me
that I *could* test this idea just by swapping the executables
gspawn-win32-helper.exe and gspawn-win32-helper-console.exe around -
that is, running the opposite one that the 
might_be_console_process (void) 
call suggests.
I did this and it turns out that this doesn't prevent a terminal from
popping up, however there is a clue: the title of the program being run
in the title bar of the terminal changes from lilypond.exe to gspawn-
win32-helper.exe when that program is replaced by gspawn-win32-helper-
console.exe.
So it would seem that a terminal would pop up regardless of which of
those gspawn-win32 helper programs ran, but the title bar would name
the helper program rather than the lilypond.exe program.

Richard








Reply via email to