ports/net-im/libpurple/files/patch-finch_libgnt_gntmain.c
2015-07-12 16:02:28 +00:00

74 lines
1.7 KiB
C

--- finch/libgnt/gntmain.c.orig 2015-07-10 05:07:01.325805007 -0400
+++ finch/libgnt/gntmain.c 2015-07-10 13:05:46.746810688 -0400
@@ -407,10 +407,11 @@ raise:
#ifdef SIGWINCH
static void (*org_winch_handler)(int);
+static void (*org_winch_handler_sa)(int, siginfo_t *, void *);
#endif
static void
-sighandler(int sig)
+sighandler(int sig, siginfo_t *info, void *data)
{
switch (sig) {
#ifdef SIGWINCH
@@ -419,16 +420,15 @@ sighandler(int sig)
g_idle_add((GSourceFunc)refresh_screen, NULL);
if (org_winch_handler)
org_winch_handler(sig);
- signal(SIGWINCH, sighandler);
+ if (org_winch_handler_sa)
+ org_winch_handler_sa(sig, info, data);
break;
#endif
case SIGCHLD:
clean_pid();
- signal(SIGCHLD, sighandler);
break;
case SIGINT:
ask_before_exit();
- signal(SIGINT, sighandler);
break;
}
}
@@ -456,6 +456,10 @@ void gnt_init()
{
char *filename;
const char *locale;
+ struct sigaction act;
+#ifdef SIGWINCH
+ struct sigaction oact;
+#endif
if (channel)
return;
@@ -501,11 +505,25 @@ void gnt_init()
werase(stdscr);
wrefresh(stdscr);
+ act.sa_sigaction = sighandler;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = SA_SIGINFO;
+
#ifdef SIGWINCH
- org_winch_handler = signal(SIGWINCH, sighandler);
+ org_winch_handler = NULL;
+ org_winch_handler_sa = NULL;
+ sigaction(SIGWINCH, &act, &oact);
+ if (oact.sa_flags & SA_SIGINFO)
+ {
+ org_winch_handler_sa = oact.sa_sigaction;
+ }
+ else if (oact.sa_handler != SIG_DFL && oact.sa_handler != SIG_IGN)
+ {
+ org_winch_handler = oact.sa_handler;
+ }
#endif
- signal(SIGCHLD, sighandler);
- signal(SIGINT, sighandler);
+ sigaction(SIGCHLD, &act, NULL);
+ sigaction(SIGINT, &act, NULL);
signal(SIGPIPE, SIG_IGN);
#if !GLIB_CHECK_VERSION(2, 36, 0)