File gnome-session-bgo507101-tile-ui.patch of Package gnome-session

Index: gnome-session/gsm-manager.c
===================================================================
--- gnome-session/gsm-manager.c	(révision 5137)
+++ gnome-session/gsm-manager.c	(copie de travail)
@@ -2180,7 +2180,8 @@ logout_dialog_response (GsmLogoutDialog
 {
         g_debug ("GsmManager: Logout dialog response: %d", response_id);
 
-        gtk_widget_destroy (GTK_WIDGET (logout_dialog));
+        if (response_id != GTK_RESPONSE_HELP)
+                gtk_widget_destroy (GTK_WIDGET (logout_dialog));
 
         /* In case of dialog cancel, switch user, hibernate and
          * suspend, we just perform the respective action and return,
@@ -2190,6 +2191,10 @@ logout_dialog_response (GsmLogoutDialog
         case GTK_RESPONSE_NONE:
         case GTK_RESPONSE_DELETE_EVENT:
                 break;
+        case GTK_RESPONSE_HELP:
+                gsm_util_help_display (GTK_WINDOW (logout_dialog),
+                                       "gosgetstarted-73");
+                break;
         case GSM_LOGOUT_RESPONSE_SWITCH_USER:
                 request_switch_user (manager);
                 break;
Index: gnome-session/gsm-util.c
===================================================================
--- gnome-session/gsm-util.c	(révision 5137)
+++ gnome-session/gsm-util.c	(copie de travail)
@@ -21,6 +21,7 @@
 #include <config.h>
 #include <stdlib.h>
 #include <ctype.h>
+#include <string.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <sys/time.h>
@@ -288,3 +289,75 @@ gsm_util_setenv (const char *variable,
                 g_error_free (bus_error);
         }
 }
+
+void
+gsm_util_help_display (GtkWindow  *parent,
+                       const char *link_id)
+{
+        GError *error = NULL;
+        char *command;
+        const char *lang;
+        char *uri = NULL;
+        GdkScreen *gscreen;
+        gboolean found;
+
+        int i;
+
+        const char * const * langs = g_get_language_names ();
+
+        uri = NULL;
+        found = FALSE;
+
+        for (i = 0; langs[i]; i++) {
+                lang = langs[i];
+                if (strchr (lang, '.')) {
+                        continue;
+                }
+
+                uri = g_build_filename (DATADIR,
+                                        "/gnome/help/user-guide/",
+                                        lang,
+                                        "/user-guide.xml",
+                                        NULL);
+
+                if (g_file_test (uri, G_FILE_TEST_EXISTS)) {
+                        found = TRUE;
+                        break;
+                }
+        }
+
+        if (found) {
+                if (link_id) {
+                        command = g_strconcat ("gnome-open ghelp://", uri, "?", link_id, NULL);
+                } else {
+                        command = g_strconcat ("gnome-open ghelp://", uri,  NULL);
+                }
+
+                gscreen = gdk_screen_get_default ();
+                gdk_spawn_command_line_on_screen (gscreen, command, &error);
+        } else
+                command = NULL;
+
+        if (!found || error != NULL) {
+                GtkWidget *d;
+                const char *errmsg;
+
+                if (!found)
+                        errmsg = _("Cannot find help.");
+                else {
+                        errmsg = error->message;
+                        g_error_free (error);
+                }
+
+                d = gtk_message_dialog_new (parent,
+                                            GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
+                                            GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+                                            "%s", errmsg);
+                gtk_widget_show (GTK_WIDGET (d));
+                g_signal_connect (d, "response",
+                                  G_CALLBACK (gtk_widget_destroy), NULL);
+        }
+
+        g_free (command);
+        g_free (uri);
+}
Index: gnome-session/gsm-util.h
===================================================================
--- gnome-session/gsm-util.h	(révision 5137)
+++ gnome-session/gsm-util.h	(copie de travail)
@@ -21,6 +21,7 @@
 #define __GSM_UTIL_H__
 
 #include <glib.h>
+#include <gtk/gtk.h>
 
 G_BEGIN_DECLS
 
@@ -37,6 +38,9 @@ char *    gsm_util_generate_startup_id
 void      gsm_util_setenv               (const char *variable,
                                          const char *value);
 
+void      gsm_util_help_display         (GtkWindow  *parent,
+                                         const char * link_id);
+
 G_END_DECLS
 
 #endif /* __GSM_UTIL_H__ */
Index: gnome-session/Makefile.am
===================================================================
--- gnome-session/Makefile.am	(révision 5137)
+++ gnome-session/Makefile.am	(copie de travail)
@@ -21,6 +21,7 @@ INCLUDES =					\
 	-DDATA_DIR=\""$(datadir)/gnome-session"\" \
 	-DDBUS_LAUNCH=\"dbus-launch\"		\
 	-DLIBEXECDIR=\"$(libexecdir)\"		\
+	-DDATADIR=\""$(datadir)"\"		\
 	-DGLADEDIR=\""$(pkgdatadir)"\"		\
 	-DGCONF_SANITY_CHECK=\""$(GCONF_SANITY_CHECK)"\" \
 	-DGCONFTOOL_CMD=\"$(GCONFTOOL)\"
Index: gnome-session/gsm-logout-dialog.c
===================================================================
--- gnome-session/gsm-logout-dialog.c	(révision 5137)
+++ gnome-session/gsm-logout-dialog.c	(copie de travail)
@@ -37,8 +37,13 @@
 
 #define AUTOMATIC_ACTION_TIMEOUT 60
 
-#define GSM_ICON_LOGOUT   "system-log-out"
-#define GSM_ICON_SHUTDOWN "system-shutdown"
+#define GSM_ICON_LOGOUT    "system-log-out"
+#define GSM_ICON_SWITCH    "system-users"
+#define GSM_ICON_SHUTDOWN  "system-shutdown"
+#define GSM_ICON_REBOOT    "view-refresh"
+/* TODO: use gpm icons? */
+#define GSM_ICON_HIBERNATE "drive-harddisk"
+#define GSM_ICON_SLEEP     "gnome-session-sleep"
 
 typedef enum {
         GSM_DIALOG_LOGOUT_TYPE_LOGOUT,
@@ -47,11 +52,12 @@ typedef enum {
 
 struct _GsmLogoutDialogPrivate
 {
-        GsmDialogLogoutType  type;
-
         GsmPowerManager     *power_manager;
         GsmConsolekit       *consolekit;
 
+        GtkWidget           *info_label;
+        GtkWidget           *cancel_button;
+
         int                  timeout;
         unsigned int         timeout_id;
 
@@ -60,7 +66,8 @@ struct _GsmLogoutDialogPrivate
 
 static GsmLogoutDialog *current_dialog = NULL;
 
-static void gsm_logout_dialog_set_timeout  (GsmLogoutDialog *logout_dialog);
+static void gsm_logout_dialog_set_timeout  (GsmLogoutDialog *logout_dialog,
+                                            int              seconds);
 
 static void gsm_logout_dialog_destroy  (GsmLogoutDialog *logout_dialog,
                                         gpointer         data);
@@ -68,43 +75,10 @@ static void gsm_logout_dialog_destroy  (
 static void gsm_logout_dialog_show     (GsmLogoutDialog *logout_dialog,
                                         gpointer         data);
 
-enum {
-        PROP_0,
-        PROP_MESSAGE_TYPE
-};
-
-G_DEFINE_TYPE (GsmLogoutDialog, gsm_logout_dialog, GTK_TYPE_MESSAGE_DIALOG);
-
-static void
-gsm_logout_dialog_set_property (GObject      *object,
-                                guint         prop_id,
-                                const GValue *value,
-                                GParamSpec   *pspec)
-{
-        switch (prop_id) {
-        case PROP_MESSAGE_TYPE:
-                break;
-        default:
-                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-                break;
-        }
-}
+static void gsm_logout_set_info_text   (GsmLogoutDialog *logout_dialog,
+                                        int              seconds);
 
-static void
-gsm_logout_dialog_get_property (GObject     *object,
-                                guint        prop_id,
-                                GValue      *value,
-                                GParamSpec  *pspec)
-{
-        switch (prop_id) {
-        case PROP_MESSAGE_TYPE:
-                g_value_set_enum (value, GTK_MESSAGE_WARNING);
-                break;
-        default:
-                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-                break;
-        }
-}
+G_DEFINE_TYPE (GsmLogoutDialog, gsm_logout_dialog, GTK_TYPE_DIALOG);
 
 static void
 gsm_logout_dialog_class_init (GsmLogoutDialogClass *klass)
@@ -113,18 +87,6 @@ gsm_logout_dialog_class_init (GsmLogoutD
 
         gobject_class = G_OBJECT_CLASS (klass);
 
-        /* This is a workaround to avoid a stupid crash: libgnomeui
-         * listens for the "show" signal on all GtkMessageDialog and
-         * gets the "message-type" of the dialogs. We will crash when
-         * it accesses this property if we don't override it since we
-         * didn't define it. */
-        gobject_class->set_property = gsm_logout_dialog_set_property;
-        gobject_class->get_property = gsm_logout_dialog_get_property;
-
-        g_object_class_override_property (gobject_class,
-                                          PROP_MESSAGE_TYPE,
-                                          "message-type");
-
         g_type_class_add_private (klass, sizeof (GsmLogoutDialogPrivate));
 }
 
@@ -146,11 +108,23 @@ gsm_logout_dialog_init (GsmLogoutDialog
         logout_dialog->priv->timeout_id = 0;
         logout_dialog->priv->timeout = 0;
         logout_dialog->priv->default_response = GTK_RESPONSE_CANCEL;
+        logout_dialog->priv->info_label = NULL;
 
-        gtk_window_set_skip_taskbar_hint (GTK_WINDOW (logout_dialog), TRUE);
+        gtk_window_set_resizable (GTK_WINDOW (logout_dialog), FALSE);
+        gtk_dialog_set_has_separator (GTK_DIALOG (logout_dialog), FALSE);
         gtk_window_set_keep_above (GTK_WINDOW (logout_dialog), TRUE);
         gtk_window_stick (GTK_WINDOW (logout_dialog));
 
+        /* use HIG spacings */
+        gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (logout_dialog)->vbox), 12);
+        gtk_container_set_border_width (GTK_CONTAINER (logout_dialog), 6);
+
+        gtk_dialog_add_button (GTK_DIALOG (logout_dialog), GTK_STOCK_HELP, 
+                               GTK_RESPONSE_HELP);
+        logout_dialog->priv->cancel_button =
+                gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
+                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
+
         logout_dialog->priv->power_manager = gsm_get_power_manager ();
 
         logout_dialog->priv->consolekit = gsm_get_consolekit ();
@@ -247,17 +221,82 @@ gsm_logout_supports_shutdown (GsmLogoutD
 }
 
 static void
-gsm_logout_dialog_show (GsmLogoutDialog *logout_dialog, gpointer user_data)
+gsm_logout_dialog_show (GsmLogoutDialog *logout_dialog,
+                        gpointer         user_data)
+{
+        gsm_logout_set_info_text (logout_dialog, AUTOMATIC_ACTION_TIMEOUT);
+
+        if (logout_dialog->priv->default_response != GTK_RESPONSE_CANCEL)
+                gsm_logout_dialog_set_timeout (logout_dialog,
+                                               AUTOMATIC_ACTION_TIMEOUT);
+}
+
+static void
+gsm_logout_set_info_text (GsmLogoutDialog *logout_dialog,
+                          int              seconds)
 {
-        gsm_logout_dialog_set_timeout (logout_dialog);
+        const char *info_text;
+        char       *buf;
+        char       *markup;
+        char       *name;
+
+        switch (logout_dialog->priv->default_response) {
+        case GSM_LOGOUT_RESPONSE_LOGOUT:
+                info_text = ngettext ("You are currently logged in as "
+                                      "\"%s\".\n"
+                                      "You will be automatically logged out "
+                                      "in %d second.",
+                                      "You are currently logged in as "
+                                      "\"%s\".\n"
+                                      "You will be automatically logged out "
+                                      "in %d seconds.",
+                                      seconds);
+                break;
+
+        case GSM_LOGOUT_RESPONSE_SHUTDOWN:
+                info_text = ngettext ("You are currently logged in as "
+                                      "\"%s\".\n"
+                                      "This system will be automatically shut "
+                                      "down in %d second.",
+                                      "You are currently logged in as "
+                                      "\"%s\".\n"
+                                      "This system will be automatically shut "
+                                      "down in %d seconds.",
+                                      seconds);
+                break;
+
+        case GTK_RESPONSE_CANCEL:
+                info_text = _("You are currently logged in as \"%s\".\n");
+                break;
+
+        default:
+                g_assert_not_reached ();
+        }
+
+	name = g_locale_to_utf8 (g_get_real_name (), -1, NULL, NULL, NULL);
+
+	if (!name || name[0] == '\0' || strcmp (name, "Unknown") == 0) {
+		name = g_locale_to_utf8 (g_get_user_name (), -1 , NULL, NULL, NULL);
+	}
+
+	if (!name) {
+		name = g_strdup (g_get_user_name ());
+	}
+
+        buf = g_strdup_printf (info_text, name, seconds);
+        markup = g_markup_printf_escaped ("<i>%s</i>", buf);
+        g_free (buf);
+        gtk_label_set_markup (GTK_LABEL (logout_dialog->priv->info_label),
+                              markup);
+        g_free (markup);
+
+	g_free (name);
 }
 
 static gboolean
 gsm_logout_dialog_timeout (gpointer data)
 {
         GsmLogoutDialog *logout_dialog;
-        char            *secondary_text;
-        char            *name;
         int              seconds_to_show;
 
         logout_dialog = (GsmLogoutDialog *) data;
@@ -278,73 +317,129 @@ gsm_logout_dialog_timeout (gpointer data
                         seconds_to_show += 10;
         }
 
-        switch (logout_dialog->priv->type) {
-        case GSM_DIALOG_LOGOUT_TYPE_LOGOUT:
-                secondary_text = ngettext ("You are currently logged in as "
-                                           "\"%s\".\n"
-                                           "You will be automatically logged "
-                                           "out in %d second.",
-                                           "You are currently logged in as "
-                                           "\"%s\".\n"
-                                           "You will be automatically logged "
-                                           "out in %d seconds.",
-                                           seconds_to_show);
-                break;
+        gsm_logout_set_info_text (logout_dialog, seconds_to_show);
 
-        case GSM_DIALOG_LOGOUT_TYPE_SHUTDOWN:
-                secondary_text = ngettext ("You are currently logged in as "
-                                           "\"%s\".\n"
-                                           "This system will be automatically "
-                                           "shut down in %d second.",
-                                           "You are currently logged in as "
-                                           "\"%s\".\n"
-                                           "This system will be automatically "
-                                           "shut down in %d seconds.",
-                                           seconds_to_show);
-                break;
+        logout_dialog->priv->timeout--;
 
-        default:
-                g_assert_not_reached ();
-        }
+        return TRUE;
+}
 
-        name = g_locale_to_utf8 (g_get_real_name (), -1, NULL, NULL, NULL);
+static void
+gsm_logout_dialog_set_timeout (GsmLogoutDialog *logout_dialog,
+                               int              seconds)
+{
+        logout_dialog->priv->timeout = seconds;
 
-        if (!name || name[0] == '\0' || strcmp (name, "Unknown") == 0) {
-                name = g_locale_to_utf8 (g_get_user_name (), -1 , NULL, NULL, NULL);
+        if (logout_dialog->priv->timeout_id != 0) {
+                g_source_remove (logout_dialog->priv->timeout_id);
         }
 
-        if (!name) {
-                name = g_strdup (g_get_user_name ());
+        logout_dialog->priv->timeout_id = g_timeout_add (1000,
+                                                         gsm_logout_dialog_timeout,
+                                                         logout_dialog);
+}
+
+static GtkWidget *
+gsm_logout_tile_new (const char *icon_name,
+                     const char *title,
+                     const char *description)
+{
+        GtkWidget *button;
+        GtkWidget *alignment;
+        GtkWidget *hbox;
+        GtkWidget *vbox;
+        GtkWidget *image;
+        GtkWidget *label;
+        char      *markup;
+
+        g_assert (title != NULL);
+
+        button = GTK_WIDGET (gtk_button_new ());
+        gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+
+        alignment = gtk_alignment_new (0, 0.5, 0, 0);
+        gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 0, 0, 6, 6);
+        gtk_container_add (GTK_CONTAINER (button), alignment);
+
+        hbox = gtk_hbox_new (FALSE, 12);
+        gtk_container_add (GTK_CONTAINER (alignment), hbox);
+        if (icon_name != NULL) {
+                image = gtk_image_new_from_icon_name (icon_name,
+                                                      GTK_ICON_SIZE_DIALOG);
+                gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
         }
 
-        gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (logout_dialog),
-                                                  secondary_text,
-                                                  name,
-                                                  seconds_to_show,
-                                                  NULL);
+        vbox = gtk_vbox_new (FALSE, 2);
 
-        logout_dialog->priv->timeout--;
+        markup = g_markup_printf_escaped ("<span weight=\"bold\">%s</span>",
+                                          title);
+        label = gtk_label_new (markup);
+        g_free (markup);
 
-        g_free (name);
+        gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+        gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+        gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
 
-        return TRUE;
+        gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+
+        if (description != NULL) {
+                gchar     *markup;
+                GdkColor  *color;
+                GtkWidget *label;
+
+                color = &GTK_WIDGET (button)->style->fg[GTK_STATE_INSENSITIVE];
+                markup = g_markup_printf_escaped ("<span size=\"small\" foreground=\"#%.2x%.2x%.2x\">%s</span>", 
+                                                  color->red,
+                                                  color->green,
+                                                  color->blue,
+                                                  description);
+                label = gtk_label_new (markup);
+                g_free (markup);
+
+                gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
+                gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
+                gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
+                gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+
+                gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
+        }
+
+        gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+        return button;
 }
 
 static void
-gsm_logout_dialog_set_timeout (GsmLogoutDialog *logout_dialog)
+gsm_logout_tile_clicked (GtkWidget *tile,
+                         gpointer   response_p)
 {
-        logout_dialog->priv->timeout = AUTOMATIC_ACTION_TIMEOUT;
+        GtkWidget *dialog;
 
-        /* Sets the secondary text */
-        gsm_logout_dialog_timeout (logout_dialog);
+        dialog = gtk_widget_get_toplevel (tile);
+        g_assert (GTK_IS_DIALOG (dialog));
+        gtk_dialog_response (GTK_DIALOG (dialog),
+                             GPOINTER_TO_UINT (response_p));
+}
 
-        if (logout_dialog->priv->timeout_id != 0) {
-                g_source_remove (logout_dialog->priv->timeout_id);
-        }
+static GtkWidget *
+gsm_logout_append_tile (GtkWidget    *vbox,
+                        unsigned int  response,
+                        const char   *icon_name,
+                        const char   *title,
+                        const char   *description)
+{
+        GtkWidget *tile;
+
+        tile = gsm_logout_tile_new (icon_name, title, description);
+        gtk_box_pack_start (GTK_BOX (vbox), tile, TRUE, TRUE, 0);
+        gtk_widget_show_all (tile);
+
+        g_signal_connect (tile,
+                          "clicked",
+                          G_CALLBACK (gsm_logout_tile_clicked),
+                          GUINT_TO_POINTER (response));
 
-        logout_dialog->priv->timeout_id = g_timeout_add (1000,
-                                                         gsm_logout_dialog_timeout,
-                                                         logout_dialog);
+        return tile;
 }
 
 static GtkWidget *
@@ -353,8 +448,10 @@ gsm_get_dialog (GsmDialogLogoutType type
                 guint32             activate_time)
 {
         GsmLogoutDialog *logout_dialog;
-        const char      *primary_text;
+        GtkWidget       *vbox;
+        GtkWidget       *tile;
         const char      *icon_name;
+        const char      *title;
 
         if (current_dialog != NULL) {
                 gtk_widget_destroy (GTK_WIDGET (current_dialog));
@@ -364,82 +461,119 @@ gsm_get_dialog (GsmDialogLogoutType type
 
         current_dialog = logout_dialog;
 
-        gtk_window_set_title (GTK_WINDOW (logout_dialog), "");
-
-        logout_dialog->priv->type = type;
+        vbox = gtk_vbox_new (FALSE, 12);
+        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (logout_dialog)->vbox), vbox,
+                            FALSE, FALSE, 0);
+        gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
+        gtk_widget_show (vbox);
 
         icon_name = NULL;
-        primary_text = NULL;
+        title = NULL;
 
         switch (type) {
         case GSM_DIALOG_LOGOUT_TYPE_LOGOUT:
                 icon_name    = GSM_ICON_LOGOUT;
-                primary_text = _("Log out of this system now?");
+                title        = _("Log Out of the Session");
 
                 logout_dialog->priv->default_response = GSM_LOGOUT_RESPONSE_LOGOUT;
 
-                if (gsm_logout_supports_switch_user (logout_dialog)) {
-                        gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
+
+                gsm_logout_append_tile (vbox, GSM_LOGOUT_RESPONSE_LOGOUT,
+                                        GSM_ICON_LOGOUT, _("_Log Out"),
+                                        _("Ends your session and logs you "
+                                          "out."));
+
+                tile = gsm_logout_append_tile (vbox,
+                                               GSM_LOGOUT_RESPONSE_SWITCH_USER,
+                                               GSM_ICON_SWITCH,
                                                _("_Switch User"),
-                                               GSM_LOGOUT_RESPONSE_SWITCH_USER);
+                                               _("Suspends your session, "
+                                                 "allowing another user to "
+                                                 "log in and use the "
+                                                 "computer."));
+                if (!gsm_logout_supports_switch_user (logout_dialog)) {
+                        gtk_widget_set_sensitive (tile, FALSE);
                 }
 
-                gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
-                                       GTK_STOCK_CANCEL,
-                                       GTK_RESPONSE_CANCEL);
-
-                gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
-                                       _("_Log Out"),
-                                       GSM_LOGOUT_RESPONSE_LOGOUT);
-
                 break;
         case GSM_DIALOG_LOGOUT_TYPE_SHUTDOWN:
                 icon_name    = GSM_ICON_SHUTDOWN;
-                primary_text = _("Shut down this system now?");
+                title        = _("Shut Down the Computer");
 
                 logout_dialog->priv->default_response = GSM_LOGOUT_RESPONSE_SHUTDOWN;
 
-                if (gsm_logout_supports_system_suspend (logout_dialog)) {
-                        gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
-                                               _("S_uspend"),
-                                               GSM_LOGOUT_RESPONSE_SLEEP);
+                tile = gsm_logout_append_tile (vbox,
+                                               GSM_LOGOUT_RESPONSE_SHUTDOWN,
+                                               GSM_ICON_SHUTDOWN,
+                                               _("_Shut Down"),
+                                               _("Ends your session and turns "
+                                                 "off the computer."));
+                if (!gsm_logout_supports_shutdown (logout_dialog)) {
+                        gtk_widget_set_sensitive (tile, FALSE);
+                        /* If shutdown is not available, let's just fallback
+                         * on cancel as the default action. We could fallback
+                         * on reboot first, then suspend and then hibernate
+                         * but it's not that useful, really */
+                        logout_dialog->priv->default_response = GTK_RESPONSE_CANCEL;
                 }
 
-                if (gsm_logout_supports_system_hibernate (logout_dialog)) {
-                        gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
-                                               _("_Hibernate"),
-                                               GSM_LOGOUT_RESPONSE_HIBERNATE);
+                tile = gsm_logout_append_tile (vbox,
+                                               GSM_LOGOUT_RESPONSE_REBOOT,
+                                               GSM_ICON_REBOOT, _("_Restart"),
+                                               _("Ends your session and "
+                                                 "restarts the computer."));
+                if (!gsm_logout_supports_reboot (logout_dialog)) {
+                        gtk_widget_set_sensitive (tile, FALSE);
                 }
 
-                if (gsm_logout_supports_reboot (logout_dialog)) {
-                        gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
-                                               _("_Restart"),
-                                               GSM_LOGOUT_RESPONSE_REBOOT);
+                /* We don't set those options insensitive if they are no
+                 * supported (like we do for shutdown/restart) since some
+                 * hardware just don't support suspend/hibernate. So we
+                 * don't show those options in this case. */
+                if (gsm_logout_supports_system_suspend (logout_dialog)) {
+                        gsm_logout_append_tile (vbox,
+                                                GSM_LOGOUT_RESPONSE_SLEEP,
+                                                GSM_ICON_SLEEP, _("S_uspend"),
+                                                _("Suspends your session "
+                                                  "quickly, using minimal "
+                                                  "power while the computer "
+                                                  "stands by."));
                 }
 
-                gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
-                                       GTK_STOCK_CANCEL,
-                                       GTK_RESPONSE_CANCEL);
-
-                if (gsm_logout_supports_shutdown (logout_dialog)) {
-                        gtk_dialog_add_button (GTK_DIALOG (logout_dialog),
-                                               _("_Shut Down"),
-                                               GSM_LOGOUT_RESPONSE_SHUTDOWN);
+                if (gsm_logout_supports_system_hibernate (logout_dialog)) {
+                        gsm_logout_append_tile (vbox,
+                                                GSM_LOGOUT_RESPONSE_HIBERNATE,
+                                                GSM_ICON_HIBERNATE,
+                                                _("_Hibernate"),
+                                                _("Suspends your session, "
+                                                  "using no power until the "
+                                                  "computer is restarted."));
                 }
+
                 break;
         default:
                 g_assert_not_reached ();
         }
 
-        gtk_image_set_from_icon_name (GTK_IMAGE (GTK_MESSAGE_DIALOG (logout_dialog)->image),
-                                      icon_name, GTK_ICON_SIZE_DIALOG);
+        logout_dialog->priv->info_label = gtk_label_new ("");
+        gtk_label_set_line_wrap (GTK_LABEL (logout_dialog->priv->info_label),
+                                 TRUE);
+        gtk_box_pack_start (GTK_BOX (vbox), logout_dialog->priv->info_label,
+                            TRUE, TRUE, 0);
+        gtk_widget_show (logout_dialog->priv->info_label);
+
         gtk_window_set_icon_name (GTK_WINDOW (logout_dialog), icon_name);
-        gtk_window_set_position (GTK_WINDOW (logout_dialog), GTK_WIN_POS_CENTER_ALWAYS);
-        gtk_label_set_text (GTK_LABEL (GTK_MESSAGE_DIALOG (logout_dialog)->label),
-                            primary_text);
+        gtk_window_set_title (GTK_WINDOW (logout_dialog), title);
+        gtk_window_set_position (GTK_WINDOW (logout_dialog),
+                                 GTK_WIN_POS_CENTER_ALWAYS);
 
         gtk_dialog_set_default_response (GTK_DIALOG (logout_dialog),
                                          logout_dialog->priv->default_response);
+        /* Note that focus is on the widget for the default response by default
+         * (since they're the first widget, except when it's Cancel */
+        if (logout_dialog->priv->default_response == GTK_RESPONSE_CANCEL)
+                gtk_window_set_focus (GTK_WINDOW (logout_dialog),
+                                      logout_dialog->priv->cancel_button);
 
         gtk_window_set_screen (GTK_WINDOW (logout_dialog), screen);
 
openSUSE Build Service is sponsored by