changeset 1248:19c1a4a2e5cc

Add a Windows signal handler.
author Elliott Sales de Andrade <quantum.analyst@gmail.com>
date Fri, 26 Apr 2019 18:40:51 -0400
parents 9c0f0847ae76
children 1eaceab078ca
files gntmain.c
diffstat 1 files changed, 22 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/gntmain.c	Fri Apr 26 17:32:54 2019 -0400
+++ b/gntmain.c	Fri Apr 26 18:40:51 2019 -0400
@@ -533,6 +533,21 @@
 static void (*org_winch_handler_sa)(int, siginfo_t *, void *);
 #endif
 
+#ifdef _WIN32
+static BOOL WINAPI
+CtrlHandler(DWORD fdwCtrlType)
+{
+	switch (fdwCtrlType) {
+	case CTRL_C_EVENT:
+	case CTRL_CLOSE_EVENT:
+		ask_before_exit();
+		return TRUE;
+
+	default:
+		return FALSE;
+	}
+}
+#else
 static void
 sighandler(int sig, siginfo_t *info, void *data)
 {
@@ -557,6 +572,7 @@
 		break;
 	}
 }
+#endif
 
 static void
 init_wm(void)
@@ -581,10 +597,12 @@
 {
 	char *filename;
 	const char *locale;
+#ifndef _WIN32
 	struct sigaction act;
 #ifdef SIGWINCH
 	struct sigaction oact;
 #endif
+#endif
 
 	if (channel)
 		return;
@@ -636,6 +654,9 @@
 	werase(stdscr);
 	wrefresh(stdscr);
 
+#ifdef _WIN32
+	SetConsoleCtrlHandler(CtrlHandler, TRUE);
+#else
 	act.sa_sigaction = sighandler;
 	sigemptyset(&act.sa_mask);
 	act.sa_flags = SA_SIGINFO;
@@ -656,6 +677,7 @@
 	sigaction(SIGCHLD, &act, NULL);
 	sigaction(SIGINT, &act, NULL);
 	signal(SIGPIPE, SIG_IGN);
+#endif
 
 	init_wm();
 	refresh_screen();