# # Description: Move shutdown menu to lower right hand corner as it is easy to accidentally use below user list # Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gdm/+bug/434338 # Upstream: http://bugzilla.gnome.org/show_bug.cgi?id=596151 # diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/gui/simple-greeter/gdm-greeter-login-window.c gdm-2.28.1.new/gui/simple-greeter/gdm-greeter-login-window.c --- gdm-2.28.1/gui/simple-greeter/gdm-greeter-login-window.c 2009-10-20 12:30:15.000000000 +1100 +++ gdm-2.28.1.new/gui/simple-greeter/gdm-greeter-login-window.c 2009-10-20 12:30:16.000000000 +1100 @@ -550,6 +550,10 @@ show_suspend_button = FALSE; #endif + /* Buttons now in shutdown menu */ + show_restart_buttons = FALSE; + show_suspend_button = FALSE; + /* we want to run this even if we're supposed to be in the mode already so that we reset everything to a known state */ diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/gui/simple-greeter/gdm-greeter-panel.c gdm-2.28.1.new/gui/simple-greeter/gdm-greeter-panel.c --- gdm-2.28.1/gui/simple-greeter/gdm-greeter-panel.c 2009-10-20 09:12:45.000000000 +1100 +++ gdm-2.28.1.new/gui/simple-greeter/gdm-greeter-panel.c 2009-10-20 12:30:16.000000000 +1100 @@ -34,6 +34,8 @@ #include +#include + #include "gdm-languages.h" #include "gdm-layouts.h" #include "gdm-greeter-panel.h" @@ -66,6 +68,8 @@ char *default_session_name; char *default_language_name; + + DkpClient *dkp_client; }; enum { @@ -564,6 +568,138 @@ } static void +do_system_suspend (GtkWidget *widget, + GdmGreeterPanel *login_window) +{ + gboolean ret; + GError *error; + + g_debug ("GdmGreeterPanel: Suspend button clicked"); + ret = dkp_client_suspend (login_window->priv->dkp_client, &error); + if (!ret) { + g_warning ("Suspend failure: %s", error->message); + g_error_free (error); + } +} + +static void +do_system_hibernate (GtkWidget *widget, + GdmGreeterPanel *login_window) +{ + gboolean ret; + GError *error; + + g_debug ("GdmGreeterPanel: Hibernate button clicked"); + ret = dkp_client_hibernate (login_window->priv->dkp_client, &error); + if (!ret) { + g_warning ("Hibernate failure: %s", error->message); + g_error_free (error); + } +} + +#include + +#define CK_NAME "org.freedesktop.ConsoleKit" +#define CK_MANAGER_PATH "/org/freedesktop/ConsoleKit/Manager" +#define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager" + +static gboolean +try_system_stop (DBusGConnection *connection, + GError **error) +{ + DBusGProxy *proxy; + gboolean res; + + g_debug ("GdmGreeterPanel: trying to stop system"); + + proxy = dbus_g_proxy_new_for_name (connection, + CK_NAME, + CK_MANAGER_PATH, + CK_MANAGER_INTERFACE); + res = dbus_g_proxy_call_with_timeout (proxy, + "Stop", + INT_MAX, + error, + /* parameters: */ + G_TYPE_INVALID, + /* return values: */ + G_TYPE_INVALID); + return res; +} + +static gboolean +try_system_restart (DBusGConnection *connection, + GError **error) +{ + DBusGProxy *proxy; + gboolean res; + + g_debug ("GdmGreeterPanel: trying to restart system"); + + proxy = dbus_g_proxy_new_for_name (connection, + CK_NAME, + CK_MANAGER_PATH, + CK_MANAGER_INTERFACE); + res = dbus_g_proxy_call_with_timeout (proxy, + "Restart", + INT_MAX, + error, + /* parameters: */ + G_TYPE_INVALID, + /* return values: */ + G_TYPE_INVALID); + return res; +} + +static void +do_system_restart () +{ + gboolean res; + GError *error; + DBusGConnection *connection; + + error = NULL; + connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + if (connection == NULL) { + g_warning ("Unable to get system bus connection: %s", error->message); + g_error_free (error); + return; + } + + res = try_system_restart (connection, &error); + if (!res) { + g_debug ("GdmGreeterPanel: unable to restart system: %s: %s", + dbus_g_error_get_name (error), + error->message); + g_error_free (error); + } +} + +static void +do_system_stop () +{ + gboolean res; + GError *error; + DBusGConnection *connection; + + error = NULL; + connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error); + if (connection == NULL) { + g_warning ("Unable to get system bus connection: %s", error->message); + g_error_free (error); + return; + } + + res = try_system_stop (connection, &error); + if (!res) { + g_debug ("GdmGreeterPanel: unable to stop system: %s: %s", + dbus_g_error_get_name (error), + error->message); + g_error_free (error); + } +} + +static void gdm_greeter_panel_init (GdmGreeterPanel *panel) { NaTray *tray; @@ -642,6 +778,47 @@ gtk_widget_show (panel->priv->hostname_label); } + { + GtkWidget *shutdown_menu; + GtkWidget *menu, *menu_item; + + panel->priv->dkp_client = dkp_client_new (); + + shutdown_menu = gtk_menu_bar_new (); + + menu_item = gtk_image_menu_item_new (); + menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), menu); + gtk_menu_item_set_label (GTK_MENU_ITEM (menu_item), ""); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), + gtk_image_new_from_icon_name ("system-shutdown", GTK_ICON_SIZE_BUTTON)); + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (menu_item), TRUE); + gtk_menu_shell_append (GTK_MENU_SHELL (shutdown_menu), menu_item); + + if (dkp_client_can_suspend (panel->priv->dkp_client)) { + menu_item = gtk_menu_item_new_with_label (_("Suspend")); + g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_system_suspend), panel); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + } + + if (dkp_client_can_hibernate (panel->priv->dkp_client)) { + menu_item = gtk_menu_item_new_with_label (_("Hibernate")); + g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_system_hibernate), panel); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + } + + menu_item = gtk_menu_item_new_with_label (_("Restart")); + g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_system_restart), NULL); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + + menu_item = gtk_menu_item_new_with_label (_("Shut Down")); + g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_system_stop), NULL); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + + gtk_box_pack_end (GTK_BOX (panel->priv->hbox), GTK_WIDGET (shutdown_menu), FALSE, FALSE, 0); + gtk_widget_show_all (GTK_WIDGET (shutdown_menu)); + } + panel->priv->clock = gdm_clock_widget_new (); gtk_box_pack_end (GTK_BOX (panel->priv->hbox), GTK_WIDGET (panel->priv->clock), FALSE, FALSE, 6); diff -Nur -x '*.orig' -x '*~' gdm-2.28.1/gui/simple-greeter/Makefile.am gdm-2.28.1.new/gui/simple-greeter/Makefile.am --- gdm-2.28.1/gui/simple-greeter/Makefile.am 2009-10-20 12:30:15.000000000 +1100 +++ gdm-2.28.1.new/gui/simple-greeter/Makefile.am 2009-10-20 12:33:43.000000000 +1100 @@ -142,6 +142,7 @@ $(top_builddir)/common/libgdmcommon.la \ $(top_builddir)/gui/simple-greeter/libnotificationarea/libnotificationarea.la \ $(SIMPLE_GREETER_LIBS) \ + $(DEVKIT_POWER_LIBS) \ $(GTK_LIBS) \ $(GCONF_LIBS) \ $(LIBXKLAVIER_LIBS) \