From 6aeffd92d497b1130250eeaf832dfc5fdaeabd10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 5 Mar 2013 02:43:35 +0100 Subject: SessionManager: add shell name watcher and hide reboot on shell mode --- src/session-menu-mgr.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/session-menu-mgr.c b/src/session-menu-mgr.c index b618135..96781c0 100644 --- a/src/session-menu-mgr.c +++ b/src/session-menu-mgr.c @@ -110,8 +110,10 @@ struct _SessionMenuMgr gboolean allow_hibernate; gboolean allow_suspend; + gboolean shell_mode; gboolean greeter_mode; + guint shell_name_watcher; GCancellable * cancellable; DBusUPower * upower_proxy; SessionDbus * session_dbus; @@ -122,6 +124,7 @@ struct _SessionMenuMgr static SwitcherMode get_switcher_mode (SessionMenuMgr *); static void init_upower_proxy (SessionMenuMgr *); +static void init_shell_watcher (SessionMenuMgr *); static void update_screensaver_shortcut (SessionMenuMgr *); static void update_user_menuitems (SessionMenuMgr *); @@ -196,6 +199,7 @@ session_menu_mgr_init (SessionMenuMgr *mgr) G_CALLBACK(on_guest_logged_in_changed), mgr); init_upower_proxy (mgr); + init_shell_watcher (mgr); /* Online accounts menu item */ mgr->online_accounts_mgr = online_accounts_mgr_new (); @@ -224,6 +228,11 @@ session_menu_mgr_dispose (GObject *object) g_slist_free (mgr->user_menuitems); mgr->user_menuitems = NULL; + if (mgr->shell_name_watcher) + { + g_bus_unwatch_name (mgr->shell_name_watcher); + } + G_OBJECT_CLASS (session_menu_mgr_parent_class)->dispose (object); } @@ -328,6 +337,37 @@ init_upower_proxy (SessionMenuMgr * mgr) } } +static void +on_shell_name_appeared (GDBusConnection *connection, const gchar *name, + const gchar *name_owner, gpointer user_data) +{ + SessionMenuMgr * mgr = SESSION_MENU_MGR(user_data); + + g_debug("Shell appeared"); + mgr->shell_mode = TRUE; + update_session_menuitems (mgr); +} + +static void +on_shell_name_vanished (GDBusConnection *connection, const gchar *name, gpointer user_data) +{ + SessionMenuMgr * mgr = SESSION_MENU_MGR(user_data); + + g_debug("Shell vanished"); + mgr->shell_mode = FALSE; + update_session_menuitems (mgr); +} + +static void +init_shell_watcher (SessionMenuMgr * mgr) +{ + mgr->shell_name_watcher = g_bus_watch_name (G_BUS_TYPE_SESSION, "org.gnome.Shell", + G_BUS_NAME_WATCHER_FLAGS_NONE, + on_shell_name_appeared, + on_shell_name_vanished, + mgr, NULL); +} + /*** **** Menuitem Helpers ***/ @@ -468,7 +508,8 @@ update_session_menuitems (SessionMenuMgr * mgr) && mgr->allow_hibernate; mi_set_visible (mgr->hibernate_mi, v); - v = HAVE_RESTART_CMD + v = !mgr->shell_mode + && HAVE_RESTART_CMD && !g_settings_get_boolean (s, "suppress-restart-menuitem"); mi_set_visible (mgr->restart_mi, v); -- cgit v1.2.3 From 7f88c35d7ef9d504dc6b78769bf084fafbbfbcdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 5 Mar 2013 03:00:20 +0100 Subject: SessionMenuMgr: call gnome SessionManager method to shutdown on shell-mode --- src/session-menu-mgr.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/session-menu-mgr.c b/src/session-menu-mgr.c index 96781c0..7e87c39 100644 --- a/src/session-menu-mgr.c +++ b/src/session-menu-mgr.c @@ -134,6 +134,7 @@ static void update_confirmation_labels (SessionMenuMgr *); static void action_func_lock (SessionMenuMgr *); static void action_func_suspend (SessionMenuMgr *); static void action_func_hibernate (SessionMenuMgr *); +static void action_func_shutdown (SessionMenuMgr *); static void action_func_switch_to_lockscreen (SessionMenuMgr *); static void action_func_switch_to_greeter (SessionMenuMgr *); static void action_func_switch_to_guest (SessionMenuMgr *); @@ -568,7 +569,7 @@ build_session_menuitems (SessionMenuMgr* mgr) mi = mgr->shutdown_mi = mi_new (_("Shut Down\342\200\246")); dbusmenu_menuitem_child_append (mgr->top_mi, mi); g_signal_connect_swapped (mi, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, - G_CALLBACK(action_func_spawn_async), CMD_SHUTDOWN); + G_CALLBACK(action_func_shutdown), mgr); update_confirmation_labels (mgr); update_session_menuitems (mgr); @@ -1169,6 +1170,46 @@ action_func_hibernate (SessionMenuMgr * mgr) } } +static void +action_func_shutdown (SessionMenuMgr * mgr) +{ + if (mgr->shell_mode) + { + GError * error = NULL; + GDBusProxy * proxy = g_dbus_proxy_new_for_bus_sync ( + G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + NULL, + &error); + + if (error == NULL) + { + /* We call 'Reboot' method instead of 'Shutdown' because + * Unity SessionManager handles the Shutdown request as a more + * general request as the default SessionManager dialog would do */ + g_dbus_proxy_call_sync (proxy, "Reboot", + NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, + &error); + } + + if (error != NULL) + { + g_warning ("Error shutting down: %s", error->message); + g_clear_error (&error); + } + + g_clear_object (&proxy); + } + else + { + action_func_spawn_async (CMD_SHUTDOWN); + } +} + /*** **** ***/ -- cgit v1.2.3 From f0cdd99a95848a7c2ca610083477a0a0a6bf9788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 5 Mar 2013 03:10:49 +0100 Subject: SessionMenuMgr: call SessionManager Logout method in shell mode --- src/session-menu-mgr.c | 77 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/session-menu-mgr.c b/src/session-menu-mgr.c index 7e87c39..35f1b70 100644 --- a/src/session-menu-mgr.c +++ b/src/session-menu-mgr.c @@ -135,6 +135,7 @@ static void action_func_lock (SessionMenuMgr *); static void action_func_suspend (SessionMenuMgr *); static void action_func_hibernate (SessionMenuMgr *); static void action_func_shutdown (SessionMenuMgr *); +static void action_func_logout (SessionMenuMgr *); static void action_func_switch_to_lockscreen (SessionMenuMgr *); static void action_func_switch_to_greeter (SessionMenuMgr *); static void action_func_switch_to_guest (SessionMenuMgr *); @@ -549,7 +550,7 @@ build_session_menuitems (SessionMenuMgr* mgr) mi = mgr->logout_mi = mi_new (_("Log Out\342\200\246")); dbusmenu_menuitem_child_append (mgr->top_mi, mi); g_signal_connect_swapped (mi, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, - G_CALLBACK(action_func_spawn_async), CMD_LOGOUT); + G_CALLBACK(action_func_logout), mgr); mi = mgr->suspend_mi = mi_new (_("Suspend")); dbusmenu_menuitem_child_append (mgr->top_mi, mi); @@ -1171,38 +1172,44 @@ action_func_hibernate (SessionMenuMgr * mgr) } static void -action_func_shutdown (SessionMenuMgr * mgr) +call_session_manager_method (const gchar * method_name, GVariant * parameters) { - if (mgr->shell_mode) + GError * error = NULL; + GDBusProxy * proxy = g_dbus_proxy_new_for_bus_sync ( + G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + NULL, + &error); + + if (error == NULL) { - GError * error = NULL; - GDBusProxy * proxy = g_dbus_proxy_new_for_bus_sync ( - G_BUS_TYPE_SESSION, - G_DBUS_PROXY_FLAGS_NONE, - NULL, - "org.gnome.SessionManager", - "/org/gnome/SessionManager", - "org.gnome.SessionManager", - NULL, - &error); + g_dbus_proxy_call_sync (proxy, method_name, parameters, + G_DBUS_CALL_FLAGS_NONE, -1, NULL, + &error); + } - if (error == NULL) - { - /* We call 'Reboot' method instead of 'Shutdown' because - * Unity SessionManager handles the Shutdown request as a more - * general request as the default SessionManager dialog would do */ - g_dbus_proxy_call_sync (proxy, "Reboot", - NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, - &error); - } + if (error != NULL) + { + g_warning ("Error shutting down: %s", error->message); + g_clear_error (&error); + } - if (error != NULL) - { - g_warning ("Error shutting down: %s", error->message); - g_clear_error (&error); - } + g_clear_object (&proxy); +} - g_clear_object (&proxy); +static void +action_func_shutdown (SessionMenuMgr * mgr) +{ + if (mgr->shell_mode) + { + /* We call 'Reboot' method instead of 'Shutdown' because + * Unity SessionManager handles the Shutdown request as a more + * general request as the default SessionManager dialog would do */ + call_session_manager_method ("Reboot", NULL); } else { @@ -1210,6 +1217,20 @@ action_func_shutdown (SessionMenuMgr * mgr) } } +static void +action_func_logout (SessionMenuMgr * mgr) +{ + if (mgr->shell_mode) + { + guint interactive_mode = 0; + call_session_manager_method ("Logout", g_variant_new ("(u)", interactive_mode)); + } + else + { + action_func_spawn_async (CMD_LOGOUT); + } +} + /*** **** ***/ -- cgit v1.2.3 From 7f059f4a2cc87e3145332d2431220f2389271e4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 5 Mar 2013 03:15:25 +0100 Subject: SessionMenuMgr: unref the parameters if we got an error earlier --- src/session-menu-mgr.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/session-menu-mgr.c b/src/session-menu-mgr.c index 35f1b70..9010f36 100644 --- a/src/session-menu-mgr.c +++ b/src/session-menu-mgr.c @@ -1191,6 +1191,10 @@ call_session_manager_method (const gchar * method_name, GVariant * parameters) G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); } + else if (parameters != NULL) + { + g_variant_unref (parameters); + } if (error != NULL) { -- cgit v1.2.3 From a169fe5c78143eb91864c6cee3d9e537834c7c39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 6 Mar 2013 13:42:02 +0100 Subject: SessionMenuMgr: call Shutdown method if we're suppressing the dialogs --- src/session-menu-mgr.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/session-menu-mgr.c b/src/session-menu-mgr.c index 9010f36..ba82645 100644 --- a/src/session-menu-mgr.c +++ b/src/session-menu-mgr.c @@ -1210,10 +1210,17 @@ action_func_shutdown (SessionMenuMgr * mgr) { if (mgr->shell_mode) { - /* We call 'Reboot' method instead of 'Shutdown' because - * Unity SessionManager handles the Shutdown request as a more - * general request as the default SessionManager dialog would do */ - call_session_manager_method ("Reboot", NULL); + if (g_settings_get_boolean (mgr->indicator_settings, "suppress-logout-restart-shutdown")) + { + call_session_manager_method ("Shutdown", NULL); + } + else + { + /* We call 'Reboot' method instead of 'Shutdown' because + * Unity SessionManager handles the Shutdown request as a more + * general request as the default SessionManager dialog would do */ + call_session_manager_method ("Reboot", NULL); + } } else { -- cgit v1.2.3 From d93ba6784f824c4a19f85f6368a88744743171c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 6 Mar 2013 13:48:42 +0100 Subject: SessionMenuMgr: call also Reboot method in shell mode To make the entry to work in dialog suppression mode --- src/session-menu-mgr.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/session-menu-mgr.c b/src/session-menu-mgr.c index ba82645..2173e86 100644 --- a/src/session-menu-mgr.c +++ b/src/session-menu-mgr.c @@ -135,6 +135,7 @@ static void action_func_lock (SessionMenuMgr *); static void action_func_suspend (SessionMenuMgr *); static void action_func_hibernate (SessionMenuMgr *); static void action_func_shutdown (SessionMenuMgr *); +static void action_func_reboot (SessionMenuMgr *); static void action_func_logout (SessionMenuMgr *); static void action_func_switch_to_lockscreen (SessionMenuMgr *); static void action_func_switch_to_greeter (SessionMenuMgr *); @@ -565,7 +566,7 @@ build_session_menuitems (SessionMenuMgr* mgr) mi = mgr->restart_mi = mi_new (_("Restart\342\200\246")); dbusmenu_menuitem_child_append (mgr->top_mi, mi); g_signal_connect_swapped (mi, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, - G_CALLBACK(action_func_spawn_async), CMD_RESTART); + G_CALLBACK(action_func_reboot), mgr); mi = mgr->shutdown_mi = mi_new (_("Shut Down\342\200\246")); dbusmenu_menuitem_child_append (mgr->top_mi, mi); @@ -1210,7 +1211,8 @@ action_func_shutdown (SessionMenuMgr * mgr) { if (mgr->shell_mode) { - if (g_settings_get_boolean (mgr->indicator_settings, "suppress-logout-restart-shutdown")) + if (g_settings_get_boolean (mgr->indicator_settings, + "suppress-logout-restart-shutdown")) { call_session_manager_method ("Shutdown", NULL); } @@ -1234,7 +1236,8 @@ action_func_logout (SessionMenuMgr * mgr) if (mgr->shell_mode) { guint interactive_mode = 0; - call_session_manager_method ("Logout", g_variant_new ("(u)", interactive_mode)); + call_session_manager_method ("Logout", + g_variant_new ("(u)", interactive_mode)); } else { @@ -1242,6 +1245,19 @@ action_func_logout (SessionMenuMgr * mgr) } } +static void +action_func_reboot (SessionMenuMgr * mgr) +{ + if (mgr->shell_mode) + { + call_session_manager_method ("Reboot", NULL); + } + else + { + action_func_spawn_async (CMD_RESTART); + } +} + /*** **** ***/ -- cgit v1.2.3 From 146019d9c53b7d8cc31c67d069e7ec055f4002fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 6 Mar 2013 15:37:01 +0100 Subject: SessionMenuMgr: use the fallback dialog if the dbus SessionManager calls fail --- src/session-menu-mgr.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/session-menu-mgr.c b/src/session-menu-mgr.c index 2173e86..851f5b1 100644 --- a/src/session-menu-mgr.c +++ b/src/session-menu-mgr.c @@ -1172,9 +1172,10 @@ action_func_hibernate (SessionMenuMgr * mgr) } } -static void +static gboolean call_session_manager_method (const gchar * method_name, GVariant * parameters) { + gboolean result = TRUE; GError * error = NULL; GDBusProxy * proxy = g_dbus_proxy_new_for_bus_sync ( G_BUS_TYPE_SESSION, @@ -1199,32 +1200,38 @@ call_session_manager_method (const gchar * method_name, GVariant * parameters) if (error != NULL) { + result = FALSE; g_warning ("Error shutting down: %s", error->message); g_clear_error (&error); } g_clear_object (&proxy); + + return result; } static void action_func_shutdown (SessionMenuMgr * mgr) { + gboolean result = FALSE; + if (mgr->shell_mode) { if (g_settings_get_boolean (mgr->indicator_settings, "suppress-logout-restart-shutdown")) { - call_session_manager_method ("Shutdown", NULL); + result = call_session_manager_method ("Shutdown", NULL); } else { /* We call 'Reboot' method instead of 'Shutdown' because * Unity SessionManager handles the Shutdown request as a more * general request as the default SessionManager dialog would do */ - call_session_manager_method ("Reboot", NULL); + result = call_session_manager_method ("Reboot", NULL); } } - else + + if (!result) { action_func_spawn_async (CMD_SHUTDOWN); } @@ -1233,13 +1240,16 @@ action_func_shutdown (SessionMenuMgr * mgr) static void action_func_logout (SessionMenuMgr * mgr) { + gboolean result = FALSE; + if (mgr->shell_mode) { guint interactive_mode = 0; - call_session_manager_method ("Logout", - g_variant_new ("(u)", interactive_mode)); + result = call_session_manager_method ("Logout", + g_variant_new ("(u)", interactive_mode)); } - else + + if (!result) { action_func_spawn_async (CMD_LOGOUT); } @@ -1248,11 +1258,14 @@ action_func_logout (SessionMenuMgr * mgr) static void action_func_reboot (SessionMenuMgr * mgr) { + gboolean result = FALSE; + if (mgr->shell_mode) { - call_session_manager_method ("Reboot", NULL); + result = call_session_manager_method ("Reboot", NULL); } - else + + if (!result) { action_func_spawn_async (CMD_RESTART); } -- cgit v1.2.3 From 88fbd6e9d3a47d4a45b5bb5987a6413008585852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 6 Mar 2013 16:29:26 +0100 Subject: SessionMenuMgr: show the reboot menu item in shell-mode with no confirmation --- src/session-menu-mgr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/session-menu-mgr.c b/src/session-menu-mgr.c index 851f5b1..c7556bc 100644 --- a/src/session-menu-mgr.c +++ b/src/session-menu-mgr.c @@ -178,6 +178,8 @@ session_menu_mgr_init (SessionMenuMgr *mgr) s = g_settings_new ("com.canonical.indicator.session"); g_signal_connect_swapped (s, "changed::suppress-logout-restart-shutdown", G_CALLBACK(update_confirmation_labels), mgr); + g_signal_connect_swapped (s, "changed::suppress-logout-restart-shutdown", + G_CALLBACK(update_session_menuitems), mgr); g_signal_connect_swapped (s, "changed::suppress-logout-menuitem", G_CALLBACK(update_session_menuitems), mgr); g_signal_connect_swapped (s, "changed::suppress-restart-menuitem", @@ -511,8 +513,8 @@ update_session_menuitems (SessionMenuMgr * mgr) && mgr->allow_hibernate; mi_set_visible (mgr->hibernate_mi, v); - v = !mgr->shell_mode - && HAVE_RESTART_CMD + v = (!mgr->shell_mode || g_settings_get_boolean (s, "suppress-logout-restart-shutdown")) + && (HAVE_RESTART_CMD || mgr->shell_mode) && !g_settings_get_boolean (s, "suppress-restart-menuitem"); mi_set_visible (mgr->restart_mi, v); -- cgit v1.2.3