On Saturday 11 March 2006 10:22, Gus Koppel wrote:
> Thomas Okken wrote:
> > I would like to catch SIGINT in my GTK+ application,
> > to do a graceful exit. I was looking for the GTK+
> > equivalent of XtNoticeSignal(), but I guess there
> > isn't one; when I searched the archive, all I found
> > was some mention of a proposed GLib extension called
> > g_signal_notify() -- which looks like what I'm looking
> > for, but the thread in question is 6 years old and
> > nothing seems to have come of it.
> > I read a few articles discussing the use of a pipe,
> > with an input source to handle the "noticing the
> > event" bit within the main loop. It seems like a
> > kludge, but I suppose it's workable... Is this still
> > the recommended approach? (I notice the GTK
> > documentation is utterly silent on the whole topic.)
>
> Yes, this is still the recommended way. GTK+ itself doesn't support
> dealing with Unix signals at all. To handle them you need to use the
> Unix libc functions. They are (mostly) standardized by POSIX for about
> every Unix there is. Note that Windows and other completely different
> architectures have nothing comparable to Unix signals.
>
> The main problem is that you MUST NOT call any GTK+ or Glib function
> within your signal handler. The signal may occur any time, not just when
> your program sits waiting in the GTK+ main loop. It's a very bad
> happening when any GTK+ functions are getting called from within a
> signal handler while the program was just interrupted when being in the
> middle of the execution of any other GTK+ function, i.e. opening a
> dialog, drawing things or just allocating or freeing some memory.
>
> So there's no direct way to inform the application about a Unix signal
> has been triggered and handled. You just can't send a GTK+ signal from
> within the Unix signal handler, for the reason stated above. Using a
> Unix pipe which is being monitored by the GTK+ main loop is a proper way
> to inform the application about the Unix signal being handled.
>
> For a code example of how to deal with Unix signals in GTK+, see:
> http://wwwtcs.inf.tu-dresden.de/~tews/Gtk/x2992.html

This is generally the best way of dealing with asynchronous (Unix) signals, 
but for simple cases another approach is just to set a flag of type volatile 
sig_atomic_t in the Unix signal handler, and then check and act on the status 
of the flag in the glib event loop with an idle handler set up with 
g_idle_add().

Chris

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to