gnome-session-07-logout-dialog.diff revision 16911
diff -Nur gnome-session-2.23.6-orig/gnome-session/gsm-logout-dialog.c gnome-session-2.23.6/gnome-session/gsm-logout-dialog.c
--- gnome-session-2.23.6-orig/gnome-session/gsm-logout-dialog.c 2008-08-07 12:32:18.469687950 +0800
+++ gnome-session-2.23.6/gnome-session/gsm-logout-dialog.c 2008-08-07 12:32:53.941874874 +0800
@@ -26,6 +26,7 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
#include "gsm-logout-dialog.h"
#include "gsm-power-manager.h"
@@ -210,11 +211,30 @@
}
static gboolean
+vt_is_available (void)
+{
+ Display *xdisplay;
+ GdkDisplay *gdisplay;
+ Atom prop;
+
+ gdisplay = gdk_display_get_default ();
+ xdisplay = gdk_x11_display_get_xdisplay (gdisplay);
+
+ prop = XInternAtom (xdisplay, "XFree86_VT", TRUE);
+
+ return (prop == None ? FALSE : TRUE);
+}
+
+static gboolean
gsm_logout_supports_switch_user (GsmLogoutDialog *logout_dialog)
{
gboolean ret;
+#if defined(sun) && defined(__SVR4)
+ ret = gdm_is_available () && vt_is_available ();
+#else
ret = gsm_consolekit_can_switch_user (logout_dialog->priv->consolekit);
+#endif
return ret;
}
@@ -224,10 +244,14 @@
{
gboolean ret;
+#if defined(sun) && defined(__SVR4)
+ ret = gsm_power_manager_can_reboot (logout_dialog->priv->power_manager);
+#else
ret = gsm_consolekit_can_restart (logout_dialog->priv->consolekit);
if (!ret) {
ret = gdm_supports_logout_action (GDM_LOGOUT_ACTION_REBOOT);
}
+#endif
return ret;
}
@@ -237,11 +261,15 @@
{
gboolean ret;
+#if defined(sun) && defined(__SVR4)
+ ret = gsm_power_manager_can_shutdown (logout_dialog->priv->power_manager);
+#else
ret = gsm_consolekit_can_stop (logout_dialog->priv->consolekit);
if (!ret) {
ret = gdm_supports_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN);
}
+#endif
return ret;
}
diff -Nur gnome-session-2.26.1-orig/gnome-session/gsm-manager.c gnome-session-2.23.6/gnome-session/gsm-manager.c
--- gnome-session-2.26.1-orig/gnome-session/gsm-manager.c 2008-08-07 12:32:18.468966829 +0800
+++ gnome-session-2.26.1/gnome-session/gsm-manager.c 2008-08-07 12:36:16.283146624 +0800
@@ -2540,48 +2556,13 @@ request_reboot_privileges_completed (Gsm
static void
request_reboot (GsmManager *manager)
{
- GsmConsolekit *consolekit;
- gboolean success;
-
- g_debug ("GsmManager: requesting reboot");
+ GsmPowerManager *power_manager;
- /* We request the privileges before doing anything. There are a few
- * different cases here:
- *
- * - no ConsoleKit: we fallback on GDM
- * - no password required: everything is fine
- * - password asked once: we ask for it now. If the user enters it
- * fine, then all is great. If the user doesn't enter it fine, we
- * don't do anything (so no logout).
- * - password asked each time: we don't ask it for now since we don't
- * want to ask for it twice. Instead we'll ask for it at the very
- * end. If the user will enter it fine, then all is great again. If
- * the user doesn't enter it fine, then we'll just fallback to GDM.
- *
- * The last case (password asked each time) is a bit broken, but
- * there's really nothing we can do about it. Generally speaking,
- * though, the password will only be asked once (unless the system is
- * configured in paranoid mode), and most probably only if there are
- * more than one user connected. So the general case is that it will
- * just work fine.
- */
-
- consolekit = gsm_get_consolekit ();
- g_signal_connect (consolekit,
- "privileges-completed",
- G_CALLBACK (request_reboot_privileges_completed),
- manager);
- success = gsm_consolekit_get_restart_privileges (consolekit);
-
- if (!success) {
- g_signal_handlers_disconnect_by_func (consolekit,
- request_reboot_privileges_completed,
- manager);
- g_object_unref (consolekit);
-
- manager->priv->logout_type = GSM_MANAGER_LOGOUT_REBOOT_GDM;
- end_phase (manager);
- }
+ power_manager = gsm_get_power_manager ();
+ if (gsm_power_manager_can_reboot (power_manager)) {
+ gsm_power_manager_attempt_reboot (power_manager);
+ }
+ g_object_unref (power_manager);
}
static void
@@ -2614,30 +2595,13 @@ request_shutdown_privileges_completed (G
static void
request_shutdown (GsmManager *manager)
{
- GsmConsolekit *consolekit;
- gboolean success;
-
- g_debug ("GsmManager: requesting shutdown");
+ GsmPowerManager *power_manager;
- /* See the comment in request_reboot() for some more details about how
- * this works. */
-
- consolekit = gsm_get_consolekit ();
- g_signal_connect (consolekit,
- "privileges-completed",
- G_CALLBACK (request_shutdown_privileges_completed),
- manager);
- success = gsm_consolekit_get_stop_privileges (consolekit);
-
- if (!success) {
- g_signal_handlers_disconnect_by_func (consolekit,
- request_shutdown_privileges_completed,
- manager);
- g_object_unref (consolekit);
-
- manager->priv->logout_type = GSM_MANAGER_LOGOUT_SHUTDOWN_GDM;
- end_phase (manager);
- }
+ power_manager = gsm_get_power_manager ();
+ if (gsm_power_manager_can_shutdown (power_manager)) {
+ gsm_power_manager_attempt_shutdown (power_manager);
+ }
+ g_object_unref (power_manager);
}
static void
@@ -2589,6 +2589,7 @@ gsm_manager_can_shutdown (GsmManager *ma
power_manager = gsm_get_power_manager ();
*shutdown_available = gsm_consolekit_can_stop (consolekit)
|| gsm_consolekit_can_restart (consolekit)
+ || gsm_power_manager_can_shutdown (power_manager)
|| gsm_power_manager_can_suspend (power_manager)
|| gsm_power_manager_can_hibernate (power_manager);
g_object_unref (consolekit);
diff -Nur gnome-session-2.23.6-orig/gnome-session/gsm-power-manager.c gnome-session-2.23.6/gnome-session/gsm-power-manager.c
--- gnome-session-2.23.6-orig/gnome-session/gsm-power-manager.c 2008-08-07 12:32:18.470657410 +0800
+++ gnome-session-2.23.6/gnome-session/gsm-power-manager.c 2008-08-07 12:32:49.365776065 +0800
@@ -391,6 +391,29 @@
return can_hibernate;
}
+#include <pwd.h>
+
+gboolean
+gsm_power_manager_can_reboot (GsmPowerManager *manager)
+{
+ uid_t uid;
+ struct passwd *pw;
+
+ uid = getuid ();
+ if ((pw = getpwuid (uid)) != NULL) {
+ return (gboolean)chkauthattr ("solaris.system.shutdown",
+ pw->pw_name);
+ }
+
+ return FALSE;
+}
+
+gboolean
+gsm_power_manager_can_shutdown (GsmPowerManager *manager)
+{
+ return gsm_power_manager_can_reboot (manager);
+}
+
void
gsm_power_manager_attempt_suspend (GsmPowerManager *manager)
{
@@ -466,6 +538,81 @@
}
}
+void
+gsm_power_manager_attempt_reboot (GsmPowerManager *manager)
+{
+ GError *error;
+
+ error = NULL;
+ if (!ensure_gpm_connection (manager, &error)) {
+ g_warning ("Could not connect to power manager: %s",
+ error->message);
+
+ g_error_free (error);
+
+ return;
+ }
+
+ if (!dbus_g_proxy_call (manager->priv->gpm_proxy, "Reboot",
+ &error,
+ G_TYPE_INVALID, G_TYPE_INVALID) &&
+ error != NULL) {
+ GError *call_error;
+
+ g_warning ("Could not ask power manager to reboot: %s",
+ error->message);
+
+ call_error = g_error_new_literal (GSM_POWER_MANAGER_ERROR,
+ GSM_POWER_MANAGER_ERROR_REBOOTING,
+ error->message);
+
+ g_error_free (error);
+
+ g_signal_emit (G_OBJECT (manager),
+ signals[REQUEST_FAILED],
+ 0, call_error);
+
+ g_error_free (call_error);
+ }
+}
+
+void
+gsm_power_manager_attempt_shutdown (GsmPowerManager *manager)
+{
+ GError *error;
+
+ error = NULL;
+ if (!ensure_gpm_connection (manager, &error)) {
+ g_warning ("Could not connect to power manager: %s",
+ error->message);
+
+ g_error_free (error);
+
+ return;
+ }
+
+ if (!dbus_g_proxy_call (manager->priv->gpm_proxy, "Shutdown",
+ &error,
+ G_TYPE_INVALID, G_TYPE_INVALID) &&
+ error != NULL) {
+ GError *call_error;
+
+ g_warning ("Could not ask power manager to shutdown: %s",
+ error->message);
+
+ call_error = g_error_new_literal (GSM_POWER_MANAGER_ERROR,
+ GSM_POWER_MANAGER_ERROR_SHUTDOWNING,
+ error->message);
+
+ g_error_free (error);
+
+ g_signal_emit (G_OBJECT (manager),
+ signals[REQUEST_FAILED],
+ 0, call_error);
+
+ g_error_free (call_error);
+ }
+}
GsmPowerManager *
gsm_get_power_manager (void)
diff -Nur gnome-session-2.23.6-orig/gnome-session/gsm-power-manager.h gnome-session-2.23.6/gnome-session/gsm-power-manager.h
--- gnome-session-2.23.6-orig/gnome-session/gsm-power-manager.h 2008-08-07 12:32:18.468173386 +0800
+++ gnome-session-2.23.6/gnome-session/gsm-power-manager.h 2008-08-07 12:35:21.509699117 +0800
@@ -59,6 +59,8 @@
enum _GsmPowerManagerError
{
GSM_POWER_MANAGER_ERROR_SUSPENDING = 0,
+ GSM_POWER_MANAGER_ERROR_REBOOTING,
+ GSM_POWER_MANAGER_ERROR_SHUTDOWNING,
GSM_POWER_MANAGER_ERROR_HIBERNATING
};
@@ -74,14 +76,18 @@
gboolean gsm_power_manager_can_hibernate (GsmPowerManager *manager);
-gboolean gsm_power_manager_can_power_down (GsmPowerManager *manager);
+gboolean gsm_power_manager_can_shutdown (GsmPowerManager *manager);
-gboolean gsm_power_manager_can_restart (GsmPowerManager *manager);
+gboolean gsm_power_manager_can_reboot (GsmPowerManager *manager);
void gsm_power_manager_attempt_suspend (GsmPowerManager *manager);
void gsm_power_manager_attempt_hibernate (GsmPowerManager *manager);
+void gsm_power_manager_attempt_shutdown (GsmPowerManager *manager);
+
+void gsm_power_manager_attempt_reboot (GsmPowerManager *manager);
+
G_END_DECLS
#endif /* __GSM_POWER_MANAGER_H__ */