[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