# HG changeset patch # User John W. Eaton # Date 1380914770 14400 # Node ID 9d0992c6df30a54e02bab5bb6831c8f0b958164f # Parent 1b388d922e6bfba0f62b6ff39f0e895f3b8312fa arrange to pass signals to the GUI subprocess * sighandlers.h, sighandlers.cc (gui_pid): New static variable. (gui_driver_sig_handler, install_gui_driver_signal_handlers): New functions. * octave-gui.cc (dissociate_terminal): Call install_gui_driver_signal_handlers from parent process. diff -r 1b388d922e6b -r 9d0992c6df30 libgui/src/octave-gui.cc --- a/libgui/src/octave-gui.cc Fri Oct 04 13:53:25 2013 -0400 +++ b/libgui/src/octave-gui.cc Fri Oct 04 15:26:10 2013 -0400 @@ -38,8 +38,11 @@ #include "lo-utils.h" #include "oct-env.h" +#include "oct-syscalls.h" #include "syswait.h" +#include "sighandlers.h" + #include "welcome-wizard.h" #include "resource-manager.h" #include "main-window.h" @@ -73,8 +76,7 @@ { // Parent - // FIXME -- we should catch signals and pass them on to the child - // process in some way, possibly translating SIGINT to SIGTERM. + install_gui_driver_signal_handlers (pid); int status; diff -r 1b388d922e6b -r 9d0992c6df30 libinterp/corefcn/sighandlers.cc --- a/libinterp/corefcn/sighandlers.cc Fri Oct 04 13:53:25 2013 -0400 +++ b/libinterp/corefcn/sighandlers.cc Fri Oct 04 15:26:10 2013 -0400 @@ -577,6 +577,137 @@ } +static pid_t gui_pid = 0; + +static void +gui_driver_sig_handler (int sig) +{ + if (gui_pid > 0) + octave_syscalls::kill (gui_pid, sig); +} + +void +install_gui_driver_signal_handlers (pid_t pid) +{ + gui_pid = pid; + +#ifdef SIGINT + octave_set_signal_handler (SIGINT, gui_driver_sig_handler); +#endif + +#ifdef SIGBREAK + octave_set_signal_handler (SIGBREAK, gui_driver_sig_handler); +#endif + +#ifdef SIGABRT + octave_set_signal_handler (SIGABRT, gui_driver_sig_handler); +#endif + +#ifdef SIGALRM + octave_set_signal_handler (SIGALRM, gui_driver_sig_handler); +#endif + +#ifdef SIGBUS + octave_set_signal_handler (SIGBUS, gui_driver_sig_handler); +#endif + + // SIGCHLD + // SIGCLD + // SIGCONT + +#ifdef SIGEMT + octave_set_signal_handler (SIGEMT, gui_driver_sig_handler); +#endif + +#ifdef SIGFPE + octave_set_signal_handler (SIGFPE, gui_driver_sig_handler); +#endif + +#ifdef SIGHUP + octave_set_signal_handler (SIGHUP, gui_driver_sig_handler); +#endif + +#ifdef SIGILL + octave_set_signal_handler (SIGILL, gui_driver_sig_handler); +#endif + + // SIGINFO + // SIGINT + +#ifdef SIGIOT + octave_set_signal_handler (SIGIOT, gui_driver_sig_handler); +#endif + +#ifdef SIGLOST + octave_set_signal_handler (SIGLOST, gui_driver_sig_handler); +#endif + +#ifdef SIGPIPE + octave_set_signal_handler (SIGPIPE, gui_driver_sig_handler); +#endif + +#ifdef SIGPOLL + octave_set_signal_handler (SIGPOLL, gui_driver_sig_handler); +#endif + + // SIGPROF + // SIGPWR + +#ifdef SIGQUIT + octave_set_signal_handler (SIGQUIT, gui_driver_sig_handler); +#endif + +#ifdef SIGSEGV + octave_set_signal_handler (SIGSEGV, gui_driver_sig_handler); +#endif + + // SIGSTOP + +#ifdef SIGSYS + octave_set_signal_handler (SIGSYS, gui_driver_sig_handler); +#endif + +#ifdef SIGTERM + octave_set_signal_handler (SIGTERM, gui_driver_sig_handler); +#endif + +#ifdef SIGTRAP + octave_set_signal_handler (SIGTRAP, gui_driver_sig_handler); +#endif + + // SIGTSTP + // SIGTTIN + // SIGTTOU + // SIGURG + +#ifdef SIGUSR1 + octave_set_signal_handler (SIGUSR1, gui_driver_sig_handler); +#endif + +#ifdef SIGUSR2 + octave_set_signal_handler (SIGUSR2, gui_driver_sig_handler); +#endif + +#ifdef SIGVTALRM + octave_set_signal_handler (SIGVTALRM, gui_driver_sig_handler); +#endif + +#ifdef SIGIO + octave_set_signal_handler (SIGIO, gui_driver_sig_handler); +#endif + + // SIGWINCH + +#ifdef SIGXCPU + octave_set_signal_handler (SIGXCPU, gui_driver_sig_handler); +#endif + +#ifdef SIGXFSZ + octave_set_signal_handler (SIGXFSZ, gui_driver_sig_handler); +#endif + +} + static octave_scalar_map make_sig_struct (void) { diff -r 1b388d922e6b -r 9d0992c6df30 libinterp/corefcn/sighandlers.h --- a/libinterp/corefcn/sighandlers.h Fri Oct 04 13:53:25 2013 -0400 +++ b/libinterp/corefcn/sighandlers.h Fri Oct 04 15:26:10 2013 -0400 @@ -71,6 +71,8 @@ extern OCTINTERP_API void install_signal_handlers (void); +extern OCTINTERP_API void install_gui_driver_signal_handlers (pid_t pid); + extern OCTINTERP_API void octave_signal_handler (void); extern OCTINTERP_API octave_interrupt_handler octave_catch_interrupts (void);