mike121 pushed a commit to branch wip-mingw-2025
in repository guile.

commit eaa38d6381a888239e6011150a5a4d1d66d1fee0
Author: Jan (janneke) Nieuwenhuizen <jann...@gnu.org>
AuthorDate: Fri Oct 30 13:32:00 2020 +0100

    Install 'mingw_take_signal' on MinGW.
    
    After installing a signal handler, these are handled
    
        * C-c
        * kill -SIGINT <guile.exe-pid> (the wine process) works
    
    these result in a direct terminate (or kill even?)
    
        - kill <guile.exe-pid>
        - wine cmd /c guile -c '(kill <guile-exe.pid> SIGINT)'
        - wine cmd /c guile -c '(kill <guile-exe.pid> SIGTERM)'
    
    * libguile/scmsigs.c (mingw_take_signal)[__MINGW32__]: New function.
    install_mingw_take_signal)[__MINGW32__]: New function.
    (scm_init_scmsigs)[__MINGW32__]: Use it.
---
 libguile/scmsigs.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/libguile/scmsigs.c b/libguile/scmsigs.c
index d5a4a63d6..3cf97c1f0 100644
--- a/libguile/scmsigs.c
+++ b/libguile/scmsigs.c
@@ -42,6 +42,11 @@
 
 #include <full-write.h>
 
+#ifdef __MINGW32__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+#endif
+
 #include "async.h"
 #include "boolean.h"
 #include "dynwind.h"
@@ -363,6 +368,30 @@ scm_i_signals_post_fork ()
     scm_i_ensure_signal_delivery_thread ();
 }
 
+#ifdef __MINGW32__
+
+static BOOL
+mingw_take_signal (DWORD ctrl_signal)
+{
+  switch (ctrl_signal)
+    {
+    case CTRL_C_EVENT:
+      take_signal (SIGINT);
+      break;
+    case CTRL_BREAK_EVENT:
+      take_signal (SIGTERM);
+      break;
+    }
+  return TRUE;
+}
+
+static void
+install_mingw_take_signal ()
+{
+  SetConsoleCtrlHandler ((PHANDLER_ROUTINE) mingw_take_signal, TRUE);
+}
+#endif /* __MINGW32__ */
+
 static void
 install_handler (int signum, SCM thread, SCM handler)
 {
@@ -848,6 +877,10 @@ scm_init_scmsigs ()
 #endif
     }
 
+#ifdef __MINGW32__
+  install_mingw_take_signal ();
+#endif
+
   scm_c_define ("NSIG", scm_from_long (NSIG));
   scm_c_define ("SIG_IGN", scm_from_intptr_t ((intptr_t) SIG_IGN));
   scm_c_define ("SIG_DFL", scm_from_intptr_t ((intptr_t) SIG_DFL));

Reply via email to