diff options
author | Eric Koegel <eric.koegel@gmail.com> | 2016-05-21 08:16:51 +0300 |
---|---|---|
committer | Eric Koegel <eric.koegel@gmail.com> | 2016-05-21 08:19:17 +0300 |
commit | 95617f7759eb99eda65defe9f65944062a494a91 (patch) | |
tree | 8e1b2491390baeb09e0583bc8d594e3c3bf050d7 /xfce4-session | |
parent | 769c1d1e92f06772499faaf9196163e9d9cb0c1f (diff) | |
download | xfce4-session-95617f7759eb99eda65defe9f65944062a494a91.tar.gz |
Fix the shutdown/reboot in xfsm-manager
With the new GDBUS setup, we can't just call gtk_main_quit to exit
since we'll never run the name_lost function which actually calls
shutdown/reboot. This patch changes the gtk_main_quit calls to be
a manager-quit signal which the main.c source will watch and
react to.
Diffstat (limited to 'xfce4-session')
-rw-r--r-- | xfce4-session/main.c | 47 | ||||
-rw-r--r-- | xfce4-session/xfsm-consolekit.c | 4 | ||||
-rw-r--r-- | xfce4-session/xfsm-manager.c | 33 | ||||
-rw-r--r-- | xfce4-session/xfsm-shutdown.c | 2 |
4 files changed, 70 insertions, 16 deletions
diff --git a/xfce4-session/main.c b/xfce4-session/main.c index 73aba71a..b2a01d52 100644 --- a/xfce4-session/main.c +++ b/xfce4-session/main.c @@ -71,6 +71,7 @@ static gboolean opt_disable_tcp = FALSE; static gboolean opt_version = FALSE; static XfsmManager *manager = NULL; static XfconfChannel *channel = NULL; +static guint name_id = 0; static GOptionEntry option_entries[] = { @@ -79,6 +80,12 @@ static GOptionEntry option_entries[] = { NULL } }; + +static void name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data); + + static void setup_environment (void) { @@ -148,13 +155,25 @@ init_display (XfsmManager *manager, static void +manager_quit_cb (XfsmManager *manager, gpointer user_data) +{ + GDBusConnection *connection = G_DBUS_CONNECTION (user_data); + + g_bus_unown_name (name_id); + + name_lost (connection, "xfce4-session", manager); +} + + + +static void bus_acquired (GDBusConnection *connection, const gchar *name, gpointer user_data) { GdkDisplay *dpy; - g_debug ("bus_acquired %s\n", name); + xfsm_verbose ("bus_acquired %s\n", name); manager = xfsm_manager_new (connection); @@ -162,6 +181,11 @@ bus_acquired (GDBusConnection *connection, g_critical ("Could not create XfsmManager"); } + g_signal_connect(G_OBJECT(manager), + "manager-quit", + G_CALLBACK(manager_quit_cb), + connection); + setup_environment (); channel = xfsm_open_config (); @@ -190,7 +214,7 @@ name_acquired (GDBusConnection *connection, const gchar *name, gpointer user_data) { - g_debug ("name_acquired\n"); + xfsm_verbose ("name_acquired\n"); } @@ -205,10 +229,10 @@ name_lost (GDBusConnection *connection, XfsmShutdown *shutdown_helper; gboolean succeed = TRUE; - g_debug ("name_lost\n"); + xfsm_verbose ("name_lost\n"); /* Release the object */ - g_debug ("Disconnected from D-Bus"); + xfsm_verbose ("Disconnected from D-Bus"); shutdown_type = xfsm_manager_get_shutdown_type (manager); @@ -229,6 +253,7 @@ name_lost (GDBusConnection *connection, } g_object_unref (shutdown_helper); + g_clear_error (&error); gtk_main_quit (); } @@ -238,15 +263,13 @@ name_lost (GDBusConnection *connection, static void xfsm_dbus_init (void) { - int ret; - - ret = g_bus_own_name (G_BUS_TYPE_SESSION, - "org.xfce.SessionManager", - G_BUS_NAME_OWNER_FLAGS_NONE, - bus_acquired, name_acquired, name_lost, - NULL, NULL); + name_id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.xfce.SessionManager", + G_BUS_NAME_OWNER_FLAGS_NONE, + bus_acquired, name_acquired, name_lost, + NULL, NULL); - if (ret == 0) + if (name_id == 0) { g_printerr ("%s: Another session manager is already running\n", PACKAGE_NAME); exit (EXIT_FAILURE); diff --git a/xfce4-session/xfsm-consolekit.c b/xfce4-session/xfsm-consolekit.c index 3e90ed86..d1dd73aa 100644 --- a/xfce4-session/xfsm-consolekit.c +++ b/xfce4-session/xfsm-consolekit.c @@ -258,6 +258,8 @@ xfsm_consolekit_try_method (XfsmConsolekit *consolekit, return FALSE; } + xfsm_verbose ("calling %s\n", method); + variant = g_dbus_proxy_call_sync (consolekit->proxy, method, g_variant_new ("()"), @@ -288,6 +290,8 @@ xfsm_consolekit_try_sleep (XfsmConsolekit *consolekit, return FALSE; } + xfsm_verbose ("calling %s\n", method); + variant = g_dbus_proxy_call_sync (consolekit->proxy, method, g_variant_new_boolean (TRUE), diff --git a/xfce4-session/xfsm-manager.c b/xfce4-session/xfsm-manager.c index e559b975..e6832d52 100644 --- a/xfce4-session/xfsm-manager.c +++ b/xfce4-session/xfsm-manager.c @@ -127,6 +127,9 @@ struct _XfsmManager typedef struct _XfsmManagerClass { XfsmDbusManagerSkeletonClass parent; + + /*< signals >*/ + void (*quit)(XfsmManager *manager); } XfsmManagerClass; typedef struct @@ -143,6 +146,13 @@ typedef struct gboolean allow_save; } ShutdownIdleData; +enum +{ + MANAGER_QUIT, + LAST_SIGNAL, +}; + +static guint manager_signals[LAST_SIGNAL] = { 0, }; static void xfsm_manager_finalize (GObject *obj); @@ -173,6 +183,14 @@ xfsm_manager_class_init (XfsmManagerClass *klass) gobject_class->finalize = xfsm_manager_finalize; + manager_signals[MANAGER_QUIT] = g_signal_new("manager-quit", + G_OBJECT_CLASS_TYPE(gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(XfsmManagerClass, quit), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + xfsm_manager_dbus_class_init (klass); } @@ -1117,6 +1135,7 @@ xfsm_manager_save_yourself_global (XfsmManager *manager, manager->shutdown_type, &error)) { + xfsm_verbose ("failed calling shutdown, error message was %s", error->message); xfce_message_dialog (NULL, _("Shutdown Failed"), "dialog-error", manager->shutdown_type == XFSM_SHUTDOWN_SUSPEND @@ -1330,7 +1349,7 @@ xfsm_manager_close_connection (XfsmManager *manager, g_source_remove (manager->die_timeout_id); manager->die_timeout_id = 0; } - gtk_main_quit (); + g_signal_emit(G_OBJECT(manager), manager_signals[MANAGER_QUIT], 0); } else if (manager->state == XFSM_MANAGER_SHUTDOWN || manager->state == XFSM_MANAGER_CHECKPOINT) { @@ -1412,12 +1431,20 @@ xfsm_manager_terminate_client (XfsmManager *manager, } +static gboolean +manager_quit_signal (XfsmManager *manager) +{ + g_signal_emit(G_OBJECT(manager), manager_signals[MANAGER_QUIT], 0); + return FALSE; +} + + void xfsm_manager_perform_shutdown (XfsmManager *manager) { GList *lp; - xfsm_verbose ("entering"); + xfsm_verbose ("entering\n"); /* send SmDie message to all clients */ xfsm_manager_set_state (manager, XFSM_MANAGER_SHUTDOWNPHASE2); @@ -1461,7 +1488,7 @@ xfsm_manager_perform_shutdown (XfsmManager *manager) /* give all clients the chance to close the connection */ manager->die_timeout_id = g_timeout_add (DIE_TIMEOUT, - (GSourceFunc) gtk_main_quit, + (GSourceFunc) manager_quit_signal, NULL); } diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c index 07ac3381..e015323f 100644 --- a/xfce4-session/xfsm-shutdown.c +++ b/xfce4-session/xfsm-shutdown.c @@ -238,7 +238,7 @@ xfsm_shutdown_try_restart (XfsmShutdown *shutdown, } else if (shutdown->consolekit != NULL) { - if (xfsm_consolekit_try_restart (shutdown->consolekit, NULL)) + if (xfsm_consolekit_try_restart (shutdown->consolekit, error)) { return TRUE; } |