gnome-session r5243 - in trunk: . gnome-session



Author: lucasr
Date: Wed Feb 11 18:13:38 2009
New Revision: 5243
URL: http://svn.gnome.org/viewvc/gnome-session?rev=5243&view=rev

Log:
2009-02-11  Lucas Rocha  <lucasr gnome org>

	Bug 565063 â Avoid restarting applications when shutting down

	* gnome-session/gdm-signal-handler.[ch]
	(gdm_signal_handler_set_fatal_func): redefine this function to receive
	custom callback.
	* gnome-session/gsm-manager.[ch]: added gsm_manager_set_phase
	function.
	* gnome-session/main.c: set session manager phase to
	GSM_MANAGER_PHASE_EXIT when gnome-session process is shutting down.
	Patch by Brian Cameron.

Modified:
   trunk/ChangeLog
   trunk/gnome-session/gdm-signal-handler.c
   trunk/gnome-session/gdm-signal-handler.h
   trunk/gnome-session/gsm-manager.c
   trunk/gnome-session/gsm-manager.h
   trunk/gnome-session/main.c

Modified: trunk/gnome-session/gdm-signal-handler.c
==============================================================================
--- trunk/gnome-session/gdm-signal-handler.c	(original)
+++ trunk/gnome-session/gdm-signal-handler.c	Wed Feb 11 18:13:38 2009
@@ -458,9 +458,9 @@
 }
 
 void
-gdm_signal_handler_set_fatal_func (GdmSignalHandler *handler,
-                                   GDestroyNotify    func,
-                                   gpointer          user_data)
+gdm_signal_handler_set_fatal_func (GdmSignalHandler       *handler,
+                                   GdmShutdownHandlerFunc  func,
+                                   gpointer                user_data)
 {
         g_return_if_fail (GDM_IS_SIGNAL_HANDLER (handler));
 
@@ -487,7 +487,8 @@
 
         ioc = g_io_channel_unix_new (signal_pipes[0]);
         g_io_channel_set_flags (ioc, G_IO_FLAG_NONBLOCK, NULL);
-        g_io_add_watch (ioc, G_IO_IN, (GIOFunc)signal_io_watch, handler);
+        g_io_add_watch_full (ioc, G_PRIORITY_HIGH, G_IO_IN,
+                             (GIOFunc) signal_io_watch, handler, NULL);
         g_io_channel_set_close_on_unref (ioc, TRUE);
         g_io_channel_unref (ioc);
 }

Modified: trunk/gnome-session/gdm-signal-handler.h
==============================================================================
--- trunk/gnome-session/gdm-signal-handler.h	(original)
+++ trunk/gnome-session/gdm-signal-handler.h	Wed Feb 11 18:13:38 2009
@@ -37,6 +37,8 @@
 typedef gboolean (*GdmSignalHandlerFunc) (int           signal,
                                           gpointer      data);
 
+typedef void     (*GdmShutdownHandlerFunc) (gpointer    data);
+
 typedef struct GdmSignalHandlerPrivate GdmSignalHandlerPrivate;
 
 typedef struct
@@ -53,9 +55,9 @@
 GType               gdm_signal_handler_get_type                (void);
 
 GdmSignalHandler *  gdm_signal_handler_new                     (void);
-void                gdm_signal_handler_set_fatal_func          (GdmSignalHandler    *handler,
-                                                                GDestroyNotify       func,
-                                                                gpointer             user_data);
+void                gdm_signal_handler_set_fatal_func          (GdmSignalHandler       *handler,
+                                                                GdmShutdownHandlerFunc  func,
+                                                                gpointer                user_data);
 
 void                gdm_signal_handler_add_fatal               (GdmSignalHandler    *handler);
 guint               gdm_signal_handler_add                     (GdmSignalHandler    *handler,

Modified: trunk/gnome-session/gsm-manager.c
==============================================================================
--- trunk/gnome-session/gsm-manager.c	(original)
+++ trunk/gnome-session/gsm-manager.c	Wed Feb 11 18:13:38 2009
@@ -2475,6 +2475,15 @@
 */
 
 gboolean
+gsm_manager_set_phase (GsmManager      *manager,
+                       GsmManagerPhase  phase)
+{
+        g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE);
+        manager->priv->phase = phase;
+        return (TRUE);
+}
+
+gboolean
 gsm_manager_shutdown (GsmManager *manager,
                       GError    **error)
 {

Modified: trunk/gnome-session/gsm-manager.h
==============================================================================
--- trunk/gnome-session/gsm-manager.h	(original)
+++ trunk/gnome-session/gsm-manager.h	Wed Feb 11 18:13:38 2009
@@ -178,6 +178,8 @@
                                                                 const char     *condition,
                                                                 gboolean       *handled,
                                                                 GError        **error);
+gboolean            gsm_manager_set_phase                      (GsmManager     *manager,
+                                                                GsmManagerPhase phase);
 
 G_END_DECLS
 

Modified: trunk/gnome-session/main.c
==============================================================================
--- trunk/gnome-session/main.c	(original)
+++ trunk/gnome-session/main.c	Wed Feb 11 18:13:38 2009
@@ -448,6 +448,23 @@
         return ret;
 }
 
+static void
+shutdown_cb (gpointer data)
+{
+        GsmManager *manager = (GsmManager *)data;
+        g_debug ("Calling shutdown callback function");
+
+        /*
+         * When the signal handler gets a shutdown signal, it calls
+         * this function to inform GsmManager to not restart
+         * applications in the off chance a handler is already queued
+         * to dispatch following the below call to gtk_main_quit.
+         */
+        gsm_manager_set_phase (manager, GSM_MANAGER_PHASE_EXIT);
+
+        gtk_main_quit ();
+}
+
 static gboolean
 require_dbus_session (int      argc,
                       char   **argv,
@@ -542,7 +559,6 @@
         gdm_log_set_debug (debug);
 
         signal_handler = gdm_signal_handler_new ();
-        gdm_signal_handler_set_fatal_func (signal_handler, (GDestroyNotify)gtk_main_quit, NULL);
         gdm_signal_handler_add_fatal (signal_handler);
         gdm_signal_handler_add (signal_handler, SIGTERM, signal_cb, NULL);
         gdm_signal_handler_add (signal_handler, SIGINT, signal_cb, NULL);
@@ -577,6 +593,9 @@
         acquire_name ();
 
         manager = gsm_manager_new (client_store, failsafe);
+
+        gdm_signal_handler_set_fatal_func (signal_handler, shutdown_cb, manager);
+
         if (override_autostart_dirs != NULL) {
                 load_override_apps (manager, override_autostart_dirs);
         } else {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]