[Xfce4-commits] <xfce4-panel:devel> Implement basic session management.

Nick Schermer noreply at xfce.org
Mon Oct 26 21:18:04 CET 2009


Updating branch refs/heads/devel
         to 96f181b232e1f47805d098c5325ae255e761719c (commit)
       from 38cb0e38337d6308ac873b8075df9f1167ad4a9a (commit)

commit 96f181b232e1f47805d098c5325ae255e761719c
Author: Nick Schermer <nick at xfce.org>
Date:   Mon Oct 26 15:43:09 2009 +0100

    Implement basic session management.

 panel/main.c               |   85 ++++++++++++++++++++++++++++----------------
 panel/panel-application.c  |    8 ++---
 panel/panel-dbus-service.c |   32 +++++++++++------
 panel/panel-dbus-service.h |   24 +++++++++---
 panel/panel-window.c       |    7 +---
 5 files changed, 98 insertions(+), 58 deletions(-)

diff --git a/panel/main.c b/panel/main.c
index ac23f1c..419c33c 100644
--- a/panel/main.c
+++ b/panel/main.c
@@ -65,7 +65,6 @@ static gboolean callback_handler (const gchar  *name,
                                   const gchar  *value,
                                   gpointer      user_data,
                                   GError      **error);
-static void     signal_handler   (gint          signum);
 
 
 
@@ -119,11 +118,17 @@ callback_handler (const gchar  *name,
 static void
 signal_handler (gint signum)
 {
-  /* don't try to restart */
-  dbus_quit_with_restart = FALSE;
+  panel_dbus_service_exit_panel (PANEL_DBUS_EXIT_QUIT);
+}
+
+
+
+static void
+session_quit (XfceSMClient *sm_client)
+{
+  panel_return_if_fail (XFCE_IS_SM_CLIENT (sm_client));
 
-  /* quit the main loop */
-  gtk_main_quit ();
+  panel_dbus_service_exit_panel (PANEL_DBUS_EXIT_SESSION);
 }
 
 
@@ -131,13 +136,16 @@ signal_handler (gint signum)
 gint
 main (gint argc, gchar **argv)
 {
-  PanelApplication *application;
-  GError           *error = NULL;
-  PanelDBusService *dbus_service;
-  gboolean          result;
-  guint             i;
-  const gint        signums[] = { SIGHUP, SIGINT, SIGQUIT, SIGTERM };
-  const gchar      *error_msg;
+  GOptionContext     *context;
+  PanelApplication   *application;
+  GError             *error = NULL;
+  PanelDBusService   *dbus_service;
+  gboolean            result;
+  guint               i;
+  const gint          signums[] = { SIGHUP, SIGINT, SIGQUIT, SIGTERM };
+  const gchar        *error_msg;
+  XfceSMClient       *sm_client;
+  PanelDBusExitStyle  exit_style;
 
   /* set translation domain */
   xfce_textdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
@@ -148,27 +156,24 @@ main (gint argc, gchar **argv)
   g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING);
 #endif
 
-  /* initialize gtk+ */
-  if (!gtk_init_with_args (&argc, &argv, _("[ARGUMENTS...]"), option_entries, GETTEXT_PACKAGE, &error))
+  /* parse context options */
+  context = g_option_context_new (_("[ARGUMENTS...]"));
+  g_option_context_add_main_entries (context, option_entries, GETTEXT_PACKAGE);
+  g_option_context_add_group (context, gtk_get_option_group (TRUE));
+  g_option_context_add_group (context, xfce_sm_client_get_option_group (argc, argv));
+  if (!g_option_context_parse (context, &argc, &argv, &error))
     {
-      if (G_LIKELY (error))
-        {
-          /* print error */
-          g_print ("%s: %s.\n", PACKAGE_NAME, error->message);
-          g_print (_("Type '%s --help' for usage."), G_LOG_DOMAIN);
-          g_print ("\n");
-
-          /* cleanup */
-          g_error_free (error);
-        }
-      else
-        {
-          g_error ("Unable to open display.");
-        }
+      g_print ("%s: %s.\n", PACKAGE_NAME, error->message);
+      g_print (_("Type '%s --help' for usage."), G_LOG_DOMAIN);
+      g_print ("\n");
+      g_error_free (error);
 
-      /* leave */
       return EXIT_FAILURE;
     }
+  g_option_context_free (context);
+
+  /* initialize gtk */
+  gtk_init (&argc, &argv);
 
   /* handle option arguments */
   if (opt_version)
@@ -225,6 +230,17 @@ main (gint argc, gchar **argv)
       goto dbus_return;
     }
 
+  /* start session management */
+  sm_client = xfce_sm_client_get ();
+  xfce_sm_client_set_restart_style (sm_client, XFCE_SM_CLIENT_RESTART_IMMEDIATELY);
+  g_signal_connect (G_OBJECT (sm_client), "quit",
+      G_CALLBACK (session_quit), NULL);
+  if (!xfce_sm_client_connect (sm_client, &error))
+    {
+      g_warning ("Failed to connect to session manager: %s", error->message);
+      g_error_free (error);
+    }
+
   /* create dbus service */
   dbus_service = panel_dbus_service_get ();
 
@@ -250,8 +266,15 @@ main (gint argc, gchar **argv)
   /* release application reference */
   g_object_unref (G_OBJECT (application));
 
+  /* release session reference */
+  exit_style = panel_dbus_service_get_exit_style ();
+  if (exit_style == PANEL_DBUS_EXIT_QUIT
+      || exit_style == PANEL_DBUS_EXIT_RESTART)
+    xfce_sm_client_set_restart_style (sm_client, XFCE_SM_CLIENT_RESTART_NORMAL);
+  g_object_unref (G_OBJECT (sm_client));
+
   /* whether we need to restart */
-  if (dbus_quit_with_restart)
+  if (exit_style == PANEL_DBUS_EXIT_RESTART)
     {
       /* message */
       g_print ("%s: %s\n\n", G_LOG_DOMAIN, _("Restarting"));
diff --git a/panel/panel-application.c b/panel/panel-application.c
index d7b0bef..41fd82d 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -508,11 +508,9 @@ panel_application_plugin_provider_signal (XfcePanelPluginProvider       *provide
 
       case PROVIDER_SIGNAL_PANEL_QUIT:
       case PROVIDER_SIGNAL_PANEL_RESTART:
-        /* set the restart boolean */
-        dbus_quit_with_restart = !!(provider_signal == PROVIDER_SIGNAL_PANEL_RESTART);
-
-        /* quit the main loop */
-        gtk_main_quit ();
+        /* quit of restart the entire panel */
+        panel_dbus_service_exit_panel (provider_signal == PROVIDER_SIGNAL_PANEL_QUIT ?
+                                       PANEL_DBUS_EXIT_QUIT : PANEL_DBUS_EXIT_RESTART);
         break;
 
       case PROVIDER_SIGNAL_PANEL_ABOUT:
diff --git a/panel/panel-dbus-service.c b/panel/panel-dbus-service.c
index 2a0e09d..0b0f81d 100644
--- a/panel/panel-dbus-service.c
+++ b/panel/panel-dbus-service.c
@@ -95,12 +95,8 @@ struct _PanelDBusService
 
 
 
-/* shared boolean with main.c */
-gboolean dbus_quit_with_restart = FALSE;
-
-
-
-static guint dbus_service_signals[LAST_SIGNAL];
+static PanelDBusExitStyle dbus_exit_style = PANEL_DBUS_EXIT_UNSET;
+static guint              dbus_service_signals[LAST_SIGNAL];
 
 
 
@@ -298,11 +294,8 @@ panel_dbus_service_terminate (PanelDBusService  *service,
   panel_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE);
   panel_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-  /* set restart boolean */
-  dbus_quit_with_restart = restart;
-
-  /* quit */
-  gtk_main_quit ();
+  panel_dbus_service_exit_panel (restart ? PANEL_DBUS_EXIT_RESTART :
+                                 PANEL_DBUS_EXIT_QUIT);
 
   return TRUE;
 }
@@ -391,3 +384,20 @@ panel_dbus_service_plugin_property_changed (gint                 plugin_id,
   /* release */
   g_object_unref (G_OBJECT (service));
 }
+
+
+
+void
+panel_dbus_service_exit_panel (PanelDBusExitStyle exit_style)
+{
+  dbus_exit_style = exit_style;
+  gtk_main_quit ();
+}
+
+
+
+PanelDBusExitStyle
+panel_dbus_service_get_exit_style (void)
+{
+  return dbus_exit_style;
+}
diff --git a/panel/panel-dbus-service.h b/panel/panel-dbus-service.h
index 31f798c..f5d1db6 100644
--- a/panel/panel-dbus-service.h
+++ b/panel/panel-dbus-service.h
@@ -33,15 +33,27 @@ typedef struct _PanelDBusService      PanelDBusService;
 #define PANEL_IS_DBUS_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANEL_TYPE_DBUS_SERVICE))
 #define PANEL_DBUS_SERVICE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), PANEL_TYPE_DBUS_SERVICE, PanelDBusServiceClass))
 
-extern gboolean   dbus_quit_with_restart;
+typedef enum
+{
+  PANEL_DBUS_EXIT_UNSET,
+  PANEL_DBUS_EXIT_QUIT,
+  PANEL_DBUS_EXIT_RESTART,
+  PANEL_DBUS_EXIT_SESSION
+}
+PanelDBusExitStyle;
 
-GType             panel_dbus_service_get_type                (void) G_GNUC_CONST;
 
-PanelDBusService *panel_dbus_service_get                     (void);
 
-void              panel_dbus_service_plugin_property_changed (gint                 plugin_id,
-                                                              DBusPropertyChanged  property,
-                                                              const GValue        *value);
+GType               panel_dbus_service_get_type                (void) G_GNUC_CONST;
+
+PanelDBusService   *panel_dbus_service_get                     (void);
+
+void                panel_dbus_service_plugin_property_changed (gint                 plugin_id,
+                                                                DBusPropertyChanged  property,
+                                                                const GValue        *value);
+
+void                panel_dbus_service_exit_panel              (PanelDBusExitStyle   exit_style);
+PanelDBusExitStyle  panel_dbus_service_get_exit_style          (void);
 
 G_END_DECLS
 
diff --git a/panel/panel-window.c b/panel/panel-window.c
index ed36c65..ae1f7b7 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -1882,11 +1882,8 @@ panel_window_set_autohide (PanelWindow *window,
 static void
 panel_window_menu_quit (gpointer boolean)
 {
-  /* restart or quit */
-  dbus_quit_with_restart = !!(GPOINTER_TO_UINT (boolean));
-
-  /* quit main loop */
-  gtk_main_quit ();
+  panel_dbus_service_exit_panel (GPOINTER_TO_UINT (boolean) == 0 ?
+                                 PANEL_DBUS_EXIT_QUIT : PANEL_DBUS_EXIT_RESTART);
 }
 
 



More information about the Xfce4-commits mailing list