[gdm: 1/4] Move shutdown buttons to menu in panel (Bug #596151)
- From: Ray Strode <halfline src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gdm: 1/4] Move shutdown buttons to menu in panel (Bug #596151)
- Date: Tue, 20 Oct 2009 21:59:18 +0000 (UTC)
commit e53b45310bc0b83ab14fdfde1cac6e6ea22d82b7
Author: Robert Ancell <robert ancell canonical com>
Date: Thu Sep 24 15:51:10 2009 +1000
Move shutdown buttons to menu in panel (Bug #596151)
gui/simple-greeter/Makefile.am | 2 +-
gui/simple-greeter/gdm-greeter-login-window.c | 294 ---------------------
gui/simple-greeter/gdm-greeter-login-window.glade | 194 --------------
gui/simple-greeter/gdm-greeter-panel.c | 263 ++++++++++++++++++-
gui/simple-greeter/gdm-greeter-panel.h | 3 +-
gui/simple-greeter/gdm-greeter-session.c | 4 +-
gui/simple-greeter/test-greeter-panel.c | 2 +-
7 files changed, 267 insertions(+), 495 deletions(-)
---
diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am
index 4c06bc3..519e652 100644
--- a/gui/simple-greeter/Makefile.am
+++ b/gui/simple-greeter/Makefile.am
@@ -92,7 +92,6 @@ test_greeter_login_window_LDADD = \
libgdmuser.la \
$(COMMON_LIBS) \
$(SIMPLE_GREETER_LIBS) \
- $(DEVKIT_POWER_LIBS) \
$(RBAC_LIBS) \
$(NULL)
@@ -144,6 +143,7 @@ test_greeter_panel_LDADD = \
$(GTK_LIBS) \
$(GCONF_LIBS) \
$(LIBXKLAVIER_LIBS) \
+ $(DEVKIT_POWER_LIBS) \
$(NULL)
test_remote_login_window_SOURCES = \
diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c
index 10a5132..9a29a2e 100644
--- a/gui/simple-greeter/gdm-greeter-login-window.c
+++ b/gui/simple-greeter/gdm-greeter-login-window.c
@@ -34,11 +34,6 @@
#include <errno.h>
#include <pwd.h>
-#ifdef ENABLE_RBAC_SHUTDOWN
-#include <auth_attr.h>
-#include <secdb.h>
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <glib/gstdio.h>
@@ -56,10 +51,6 @@
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-lowlevel.h>
-#ifdef HAVE_DEVICEKIT_POWER
-#include <devkit-power-gobject/devicekit-power.h>
-#endif
-
#include "gdm-settings-client.h"
#include "gdm-settings-keys.h"
#include "gdm-profile.h"
@@ -90,7 +81,6 @@
#define KEY_BANNER_MESSAGE_TEXT KEY_GREETER_DIR "/banner_message_text"
#define KEY_BANNER_MESSAGE_TEXT_NOCHOOSER KEY_GREETER_DIR "/banner_message_text_nochooser"
#define KEY_LOGO KEY_GREETER_DIR "/logo_icon_name"
-#define KEY_DISABLE_RESTART_BUTTONS KEY_GREETER_DIR "/disable_restart_buttons"
#define GDM_GREETER_LOGIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_LOGIN_WINDOW, GdmGreeterLoginWindowPrivate))
enum {
@@ -125,8 +115,6 @@ struct GdmGreeterLoginWindowPrivate
char *timed_login_username;
guint timed_login_timeout_id;
- guint sensitize_power_buttons_timeout_id;
-
guint login_button_handler_id;
guint start_session_handler_id;
};
@@ -353,37 +341,6 @@ sensitize_widget (GdmGreeterLoginWindow *login_window,
}
}
-static gboolean
-get_show_restart_buttons (GdmGreeterLoginWindow *login_window)
-{
- gboolean show;
- GError *error;
-
- error = NULL;
- show = ! gconf_client_get_bool (login_window->priv->client, KEY_DISABLE_RESTART_BUTTONS, &error);
- if (error != NULL) {
- g_debug ("GdmGreeterLoginWindow: unable to get disable-restart-buttons configuration: %s", error->message);
- g_error_free (error);
- }
-
-#ifdef ENABLE_RBAC_SHUTDOWN
- {
- char *username;
-
- username = g_get_user_name ();
- if (username == NULL || !chkauthattr (RBAC_SHUTDOWN_KEY, username)) {
- show = FALSE;
- g_debug ("GdmGreeterLoginWindow: Not showing stop/restart buttons for user %s due to RBAC key %s",
- username, RBAC_SHUTDOWN_KEY);
- } else {
- g_debug ("GdmGreeterLoginWindow: Showing stop/restart buttons for user %s due to RBAC key %s",
- username, RBAC_SHUTDOWN_KEY);
- }
- }
-#endif
- return show;
-}
-
static void
on_login_button_clicked_answer_query (GtkButton *button,
GdmGreeterLoginWindow *login_window)
@@ -477,61 +434,6 @@ adjust_other_login_visibility(GdmGreeterLoginWindow *login_window)
}
}
-#ifdef HAVE_DEVICEKIT_POWER
-static gboolean
-can_suspend (GdmGreeterLoginWindow *login_window)
-{
- gboolean ret;
- DkpClient *dkp_client;
-
- /* use DeviceKit-power to get data */
- dkp_client = dkp_client_new ();
- g_object_get (dkp_client,
- "can-suspend", &ret,
- NULL);
- g_object_unref (dkp_client);
- return ret;
-}
-#endif
-
-static void
-remove_sensitize_power_buttons_timeout (GdmGreeterLoginWindow *login_window)
-{
- if (login_window->priv->sensitize_power_buttons_timeout_id > 0) {
- g_source_remove (login_window->priv->sensitize_power_buttons_timeout_id);
- login_window->priv->sensitize_power_buttons_timeout_id = 0;
- }
-}
-
-static gboolean
-sensitize_power_buttons_timeout (GdmGreeterLoginWindow *login_window)
-{
- switch (login_window->priv->dialog_mode) {
- case MODE_SELECTION:
- sensitize_widget (login_window, "shutdown-button", TRUE);
- sensitize_widget (login_window, "restart-button", TRUE);
- sensitize_widget (login_window, "suspend-button", TRUE);
- sensitize_widget (login_window, "disconnect-button", TRUE);
- break;
- case MODE_AUTHENTICATION:
- break;
- default:
- g_assert_not_reached ();
- }
-
- login_window->priv->sensitize_power_buttons_timeout_id = 0;
- return FALSE;
-}
-
-static void
-add_sensitize_power_buttons_timeout (GdmGreeterLoginWindow *login_window)
-{
- remove_sensitize_power_buttons_timeout (login_window);
- login_window->priv->sensitize_power_buttons_timeout_id = g_timeout_add_seconds (1,
- (GSourceFunc)sensitize_power_buttons_timeout,
- login_window);
-}
-
static void
switch_mode (GdmGreeterLoginWindow *login_window,
int number)
@@ -539,16 +441,6 @@ switch_mode (GdmGreeterLoginWindow *login_window,
const char *default_name;
GtkWidget *user_chooser;
GtkWidget *box;
- gboolean show_restart_buttons;
- gboolean show_suspend_button;
-
- show_restart_buttons = get_show_restart_buttons (login_window);
-
-#ifdef HAVE_DEVICEKIT_POWER
- show_suspend_button = can_suspend (login_window);
-#else
- show_suspend_button = FALSE;
-#endif
/* we want to run this even if we're supposed to
be in the mode already so that we reset everything
@@ -557,38 +449,20 @@ switch_mode (GdmGreeterLoginWindow *login_window,
default_name = NULL;
- remove_sensitize_power_buttons_timeout (login_window);
-
switch (number) {
case MODE_SELECTION:
set_log_in_button_mode (login_window, LOGIN_BUTTON_HIDDEN);
show_widget (login_window, "cancel-button", FALSE);
- show_widget (login_window, "shutdown-button",
- login_window->priv->display_is_local && show_restart_buttons);
- show_widget (login_window, "restart-button",
- login_window->priv->display_is_local && show_restart_buttons);
- show_widget (login_window, "suspend-button",
- login_window->priv->display_is_local && show_restart_buttons && show_suspend_button);
- show_widget (login_window, "disconnect-button",
- ! login_window->priv->display_is_local);
-
show_widget (login_window, "auth-input-box", FALSE);
- add_sensitize_power_buttons_timeout (login_window);
- sensitize_widget (login_window, "shutdown-button", FALSE);
- sensitize_widget (login_window, "restart-button", FALSE);
- sensitize_widget (login_window, "suspend-button", FALSE);
sensitize_widget (login_window, "disconnect-button", FALSE);
default_name = NULL;
break;
case MODE_AUTHENTICATION:
show_widget (login_window, "cancel-button", TRUE);
- show_widget (login_window, "shutdown-button", FALSE);
- show_widget (login_window, "restart-button", FALSE);
- show_widget (login_window, "suspend-button", FALSE);
show_widget (login_window, "disconnect-button", FALSE);
default_name = "log-in-button";
break;
@@ -629,32 +503,6 @@ switch_mode (GdmGreeterLoginWindow *login_window,
}
static void
-do_disconnect (GdmGreeterLoginWindow *login_window)
-{
- gtk_main_quit ();
-}
-
-#ifdef HAVE_DEVICEKIT_POWER
-static void
-do_suspend (GdmGreeterLoginWindow *login_window)
-{
- gboolean ret;
- DkpClient *dkp_client;
- GError *error = NULL;
-
- /* use DeviceKit-power to get data */
- dkp_client = dkp_client_new ();
- ret = dkp_client_suspend (dkp_client, &error);
- if (!ret) {
- g_warning ("Couldn't suspend: %s", error->message);
- g_error_free (error);
- return;
- }
- g_object_unref (dkp_client);
-}
-#endif
-
-static void
delete_entry_text (GtkWidget *entry)
{
const char *typed_text;
@@ -968,16 +816,6 @@ gdm_greeter_login_window_get_property (GObject *object,
}
static void
-suspend_button_clicked (GtkButton *button,
- GdmGreeterLoginWindow *login_window)
-{
-#ifdef HAVE_DEVICEKIT_POWER
- do_suspend (login_window);
-#endif
-}
-
-
-static void
cancel_button_clicked (GtkButton *button,
GdmGreeterLoginWindow *login_window)
{
@@ -985,125 +823,6 @@ cancel_button_clicked (GtkButton *button,
}
static void
-disconnect_button_clicked (GtkButton *button,
- GdmGreeterLoginWindow *login_window)
-{
- do_disconnect (login_window);
-}
-
-static gboolean
-try_system_stop (DBusGConnection *connection,
- GError **error)
-{
- DBusGProxy *proxy;
- gboolean res;
-
- g_debug ("GdmGreeterLoginWindow: 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 ("GdmGreeterLoginWindow: 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 (GdmGreeterLoginWindow *login_window)
-{
- 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 ("GdmGreeterLoginWindow: unable to restart system: %s: %s",
- dbus_g_error_get_name (error),
- error->message);
- g_error_free (error);
- }
-}
-
-static void
-do_system_stop (GdmGreeterLoginWindow *login_window)
-{
- 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 ("GdmGreeterLoginWindow: unable to stop system: %s: %s",
- dbus_g_error_get_name (error),
- error->message);
- g_error_free (error);
- }
-}
-
-static void
-restart_button_clicked (GtkButton *button,
- GdmGreeterLoginWindow *login_window)
-{
- g_debug ("GdmGreeterLoginWindow: restart button clicked");
- do_system_restart (login_window);
-}
-
-static void
-shutdown_button_clicked (GtkButton *button,
- GdmGreeterLoginWindow *login_window)
-{
- g_debug ("GdmGreeterLoginWindow: stop button clicked");
- do_system_stop (login_window);
-}
-
-static void
on_user_chooser_visibility_changed (GdmGreeterLoginWindow *login_window)
{
update_banner_message (login_window);
@@ -1400,20 +1119,9 @@ load_theme (GdmGreeterLoginWindow *login_window)
login_window->priv->auth_banner_label = glade_xml_get_widget (login_window->priv->xml, "auth-banner-label");
/*make_label_small_italic (login_window->priv->auth_banner_label);*/
- button = glade_xml_get_widget (login_window->priv->xml, "suspend-button");
- g_signal_connect (button, "clicked", G_CALLBACK (suspend_button_clicked), login_window);
-
button = glade_xml_get_widget (login_window->priv->xml, "cancel-button");
g_signal_connect (button, "clicked", G_CALLBACK (cancel_button_clicked), login_window);
- button = glade_xml_get_widget (login_window->priv->xml, "disconnect-button");
- g_signal_connect (button, "clicked", G_CALLBACK (disconnect_button_clicked), login_window);
-
- button = glade_xml_get_widget (login_window->priv->xml, "restart-button");
- g_signal_connect (button, "clicked", G_CALLBACK (restart_button_clicked), login_window);
- button = glade_xml_get_widget (login_window->priv->xml, "shutdown-button");
- g_signal_connect (button, "clicked", G_CALLBACK (shutdown_button_clicked), login_window);
-
entry = glade_xml_get_widget (login_window->priv->xml, "auth-prompt-entry");
/* Only change the invisible character if it '*' otherwise assume it is OK */
if ('*' == gtk_entry_get_invisible_char (GTK_ENTRY (entry))) {
@@ -1780,8 +1488,6 @@ gdm_greeter_login_window_finalize (GObject *object)
g_object_unref (login_window->priv->client);
}
- remove_sensitize_power_buttons_timeout (login_window);
-
G_OBJECT_CLASS (gdm_greeter_login_window_parent_class)->finalize (object);
}
diff --git a/gui/simple-greeter/gdm-greeter-login-window.glade b/gui/simple-greeter/gdm-greeter-login-window.glade
index d972c82..7c6e94b 100644
--- a/gui/simple-greeter/gdm-greeter-login-window.glade
+++ b/gui/simple-greeter/gdm-greeter-login-window.glade
@@ -337,200 +337,6 @@
<property name="spacing">6</property>
<child>
- <widget class="GtkButton" id="disconnect-button">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label">gtk-disconnect</property>
- <property name="use_stock">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="suspend-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkHBox" id="hbox3">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkImage" id="image9">
- <property name="visible">True</property>
- <property name="icon_name">media-playback-pause</property>
- <property name="pixel_size">16</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Suspend</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="restart-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkHBox" id="hbox1">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkImage" id="image7">
- <property name="visible">True</property>
- <property name="icon_name">view-refresh</property>
- <property name="pixel_size">16</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label2">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Restart</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
- <widget class="GtkButton" id="shutdown-button">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="has_default">True</property>
- <property name="can_focus">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
-
- <child>
- <widget class="GtkHBox" id="hbox4">
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkImage" id="image5">
- <property name="visible">True</property>
- <property name="icon_name">system-shutdown</property>
- <property name="pixel_size">16</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label10">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Shut Down</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
-
- <child>
<widget class="GtkButton" id="cancel-button">
<property name="visible">True</property>
<property name="can_focus">True</property>
diff --git a/gui/simple-greeter/gdm-greeter-panel.c b/gui/simple-greeter/gdm-greeter-panel.c
index dbdef29..dd0cb32 100644
--- a/gui/simple-greeter/gdm-greeter-panel.c
+++ b/gui/simple-greeter/gdm-greeter-panel.c
@@ -27,12 +27,22 @@
#include <unistd.h>
#include <string.h>
+#ifdef ENABLE_RBAC_SHUTDOWN
+#include <auth_attr.h>
+#include <secdb.h>
+#endif
+
#include <glib.h>
#include <glib/gi18n.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <gconf/gconf-client.h>
+#include <dbus/dbus-glib.h>
+
+#ifdef HAVE_DEVICEKIT_POWER
+#include <devkit-power-gobject/devicekit-power.h>
+#endif
#include "gdm-languages.h"
#include "gdm-layouts.h"
@@ -46,6 +56,16 @@
#include "na-tray.h"
+#define CK_NAME "org.freedesktop.ConsoleKit"
+#define CK_MANAGER_PATH "/org/freedesktop/ConsoleKit/Manager"
+#define CK_MANAGER_INTERFACE "org.freedesktop.ConsoleKit.Manager"
+
+#define GPM_DBUS_NAME "org.freedesktop.PowerManagement"
+#define GPM_DBUS_PATH "/org/freedesktop/PowerManagement"
+#define GPM_DBUS_INTERFACE "org.freedesktop.PowerManagement"
+
+#define KEY_DISABLE_RESTART_BUTTONS "/apps/gdm/simple-greeter/disable_restart_buttons"
+
#define GDM_GREETER_PANEL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_GREETER_PANEL, GdmGreeterPanelPrivate))
struct GdmGreeterPanelPrivate
@@ -66,11 +86,15 @@ struct GdmGreeterPanelPrivate
char *default_session_name;
char *default_language_name;
+
+ GConfClient *client;
+ guint display_is_local : 1;
};
enum {
PROP_0,
- PROP_MONITOR
+ PROP_MONITOR,
+ PROP_DISPLAY_IS_LOCAL
};
enum {
@@ -107,6 +131,13 @@ gdm_greeter_panel_set_monitor (GdmGreeterPanel *panel,
}
static void
+_gdm_greeter_panel_set_display_is_local (GdmGreeterPanel *panel,
+ gboolean is)
+{
+ panel->priv->display_is_local = is;
+}
+
+static void
gdm_greeter_panel_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -120,6 +151,9 @@ gdm_greeter_panel_set_property (GObject *object,
case PROP_MONITOR:
gdm_greeter_panel_set_monitor (self, g_value_get_int (value));
break;
+ case PROP_DISPLAY_IS_LOCAL:
+ _gdm_greeter_panel_set_display_is_local (self, g_value_get_boolean (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -140,6 +174,9 @@ gdm_greeter_panel_get_property (GObject *object,
case PROP_MONITOR:
g_value_set_int (value, self->priv->monitor);
break;
+ case PROP_DISPLAY_IS_LOCAL:
+ g_value_set_boolean (value, self->priv->display_is_local);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -477,6 +514,13 @@ gdm_greeter_panel_class_init (GdmGreeterPanelClass *klass)
G_MAXINT,
0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_IS_LOCAL,
+ g_param_spec_boolean ("display-is-local",
+ "display is local",
+ "display is local",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_type_class_add_private (klass, sizeof (GdmGreeterPanelPrivate));
}
@@ -563,11 +607,185 @@ on_animation_tick (GdmGreeterPanel *panel,
gtk_widget_queue_resize (GTK_WIDGET (panel));
}
+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 gboolean
+can_suspend (void)
+{
+ gboolean ret = FALSE;
+
+#ifdef HAVE_DEVICEKIT_POWER
+ DkpClient *dkp_client;
+
+ /* use DeviceKit-power to get data */
+ dkp_client = dkp_client_new ();
+ g_object_get (dkp_client,
+ "can-suspend", &ret,
+ NULL);
+ g_object_unref (dkp_client);
+#endif
+
+ return ret;
+}
+
+static void
+do_system_suspend (void)
+{
+#ifdef HAVE_DEVICEKIT_POWER
+ gboolean ret;
+ DkpClient *dkp_client;
+ GError *error = NULL;
+
+ /* use DeviceKit-power to get data */
+ dkp_client = dkp_client_new ();
+ ret = dkp_client_suspend (dkp_client, &error);
+ if (!ret) {
+ g_warning ("Couldn't suspend: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+ g_object_unref (dkp_client);
+#endif
+}
+
+static void
+do_system_restart (void)
+{
+ 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 (void)
+{
+ 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
+do_disconnect (void)
+{
+ gtk_main_quit ();
+}
+
+static gboolean
+get_show_restart_buttons (GdmGreeterPanel *panel)
+{
+ gboolean show;
+ GError *error;
+
+ error = NULL;
+ show = ! gconf_client_get_bool (panel->priv->client, KEY_DISABLE_RESTART_BUTTONS, &error);
+ if (error != NULL) {
+ g_debug ("GdmGreeterPanel: unable to get disable-restart-buttons configuration: %s", error->message);
+ g_error_free (error);
+ }
+
+#ifdef ENABLE_RBAC_SHUTDOWN
+ {
+ char *username;
+
+ username = g_get_user_name ();
+ if (username == NULL || !chkauthattr (RBAC_SHUTDOWN_KEY, username)) {
+ show = FALSE;
+ g_debug ("GdmGreeterPanel: Not showing stop/restart buttons for user %s due to RBAC key %s",
+ username, RBAC_SHUTDOWN_KEY);
+ } else {
+ g_debug ("GdmGreeterPanel: Showing stop/restart buttons for user %s due to RBAC key %s",
+ username, RBAC_SHUTDOWN_KEY);
+ }
+ }
+#endif
+ return show;
+}
+
static void
gdm_greeter_panel_init (GdmGreeterPanel *panel)
{
NaTray *tray;
GtkWidget *spacer;
+ GtkWidget *shutdown_menu;
+ GtkWidget *menu, *menu_item;
gdm_profile_start (NULL);
@@ -603,6 +821,8 @@ gdm_greeter_panel_init (GdmGreeterPanel *panel)
spacer = gtk_label_new ("");
gtk_box_pack_start (GTK_BOX (panel->priv->option_hbox), spacer, TRUE, TRUE, 6);
gtk_widget_show (spacer);
+
+ panel->priv->client = gconf_client_get_default ();
gdm_profile_start ("creating option widget");
panel->priv->language_option_widget = gdm_language_option_widget_new ();
@@ -642,6 +862,42 @@ gdm_greeter_panel_init (GdmGreeterPanel *panel)
gtk_widget_show (panel->priv->hostname_label);
}
+ if (panel->priv->display_is_local || get_show_restart_buttons (panel)) {
+ 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_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (menu_item), TRUE);
+ 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_menu_shell_append (GTK_MENU_SHELL (shutdown_menu), menu_item);
+
+ if (panel->priv->display_is_local) {
+ menu_item = gtk_menu_item_new_with_label ("Disconnect");
+ g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_disconnect), NULL);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
+ } else {
+ if (can_suspend ()) {
+ menu_item = gtk_menu_item_new_with_label ("Suspend");
+ g_signal_connect (G_OBJECT (menu_item), "activate", G_CALLBACK (do_system_suspend), NULL);
+ 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);
@@ -651,7 +907,6 @@ gdm_greeter_panel_init (GdmGreeterPanel *panel)
GTK_ORIENTATION_HORIZONTAL);
gtk_box_pack_end (GTK_BOX (panel->priv->hbox), GTK_WIDGET (tray), FALSE, FALSE, 6);
gtk_widget_show (GTK_WIDGET (tray));
-
gdm_greeter_panel_hide_user_options (panel);
panel->priv->progress = 0.0;
@@ -684,13 +939,15 @@ gdm_greeter_panel_finalize (GObject *object)
GtkWidget *
gdm_greeter_panel_new (GdkScreen *screen,
- int monitor)
+ int monitor,
+ gboolean is_local)
{
GObject *object;
object = g_object_new (GDM_TYPE_GREETER_PANEL,
"screen", screen,
"monitor", monitor,
+ "display-is-local", is_local,
NULL);
return GTK_WIDGET (object);
diff --git a/gui/simple-greeter/gdm-greeter-panel.h b/gui/simple-greeter/gdm-greeter-panel.h
index 1e637f5..625c80d 100644
--- a/gui/simple-greeter/gdm-greeter-panel.h
+++ b/gui/simple-greeter/gdm-greeter-panel.h
@@ -60,7 +60,8 @@ typedef struct
GType gdm_greeter_panel_get_type (void);
GtkWidget * gdm_greeter_panel_new (GdkScreen *screen,
- int monitor);
+ int monitor,
+ gboolean is_local);
void gdm_greeter_panel_show_user_options (GdmGreeterPanel *panel);
void gdm_greeter_panel_hide_user_options (GdmGreeterPanel *panel);
diff --git a/gui/simple-greeter/gdm-greeter-session.c b/gui/simple-greeter/gdm-greeter-session.c
index 167b693..e7d206a 100644
--- a/gui/simple-greeter/gdm-greeter-session.c
+++ b/gui/simple-greeter/gdm-greeter-session.c
@@ -332,13 +332,15 @@ toggle_panel (GdmGreeterSession *session,
GdkScreen *screen;
int monitor;
int x, y;
+ gboolean is_local;
display = gdk_display_get_default ();
gdk_display_get_pointer (display, &screen, &x, &y, NULL);
monitor = get_tallest_monitor_at_point (screen, x, y);
- session->priv->panel = gdm_greeter_panel_new (screen, monitor);
+ is_local = gdm_greeter_client_get_display_is_local (session->priv->client);
+ session->priv->panel = gdm_greeter_panel_new (screen, monitor, is_local);
g_signal_connect_swapped (session->priv->panel,
"language-selected",
diff --git a/gui/simple-greeter/test-greeter-panel.c b/gui/simple-greeter/test-greeter-panel.c
index 80ef0a9..86adae3 100644
--- a/gui/simple-greeter/test-greeter-panel.c
+++ b/gui/simple-greeter/test-greeter-panel.c
@@ -53,7 +53,7 @@ main (int argc, char *argv[])
gdk_display_get_pointer (display, &screen, &x, &y, NULL);
monitor = gdk_screen_get_monitor_at_point (screen, x, y);
- panel = gdm_greeter_panel_new (screen, monitor);
+ panel = gdm_greeter_panel_new (screen, monitor, TRUE);
gdm_greeter_panel_show_user_options (GDM_GREETER_PANEL (panel));
gtk_widget_show (panel);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]