--- gnome-session-2.19.6/gnome-session/logout.c +++ gnome-session-2.19.6/gnome-session/logout.c @@ -44,6 +44,14 @@ enum { + GS_RESPONSE_LOGOUT, + GS_RESPONSE_SHUTDOWN, + GS_RESPONSE_RESTART, + GS_RESPONSE_LOCK +}; + +enum +{ OPTION_LOGOUT, OPTION_HALT, OPTION_REBOOT, @@ -260,82 +268,128 @@ fadeout_windows = NULL; } -static GtkWidget * -make_title_label (const char *text) + + +static GtkWidget* +get_tile(GtkWidget *image, const gchar *title, const gchar *desc) { - GtkWidget *label; - char *full; + GtkWidget *button; + GtkWidget *alignment; + GtkWidget *hbox; + GtkWidget *vbox; - full = g_strdup_printf ("%s", text); - label = gtk_label_new (full); - g_free (full); + g_assert(title != NULL); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_label_set_use_markup (GTK_LABEL (label), TRUE); + button = GTK_WIDGET(gtk_button_new()); + gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); +// GTK_WIDGET_UNSET_FLAGS(button, GTK_HAS_FOCUS); - return label; -} + 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); -static int -get_default_option (void) -{ - GConfClient *gconf_client; - char *str; - int option; + hbox = gtk_hbox_new(FALSE, 12); + gtk_container_add(GTK_CONTAINER(alignment), hbox); + if(image != NULL) + gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); + + vbox = gtk_vbox_new(FALSE, 2); + + if(title != NULL) + { + gchar *full; + GtkWidget *label; + + full = g_strdup_printf ("%s", title); + label = gtk_label_new(full); + g_free (full); + + 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_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + } + + if(desc != NULL) + { + gchar *full; + GtkWidget *label; + + full = g_strdup_printf ("%s", + desc); + label = gtk_label_new(full); + g_free (full); + + 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); - gconf_client = gsm_get_conf_client (); - str = gconf_client_get_string (gconf_client, LOGOUT_OPTION_KEY, NULL); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + } - if (str == NULL || !gconf_string_to_enum (logout_options_lookup_table, str, &option)) - option = OPTION_LOGOUT; + gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); - g_free (str); - return option; + return button; } -static void -set_default_option (int option) +static void logout_button_clicked(GtkButton *button, gpointer user_data) { - GConfClient *gconf_client; - const char *str; + gtk_dialog_response(GTK_DIALOG(user_data), GS_RESPONSE_LOGOUT); +} - gconf_client = gsm_get_conf_client (); +static void shutdown_button_clicked(GtkButton *button, gpointer user_data) +{ + gtk_dialog_response(GTK_DIALOG(user_data), GS_RESPONSE_SHUTDOWN); +} - str = gconf_enum_to_string (logout_options_lookup_table, option); - g_assert (str != NULL); +static void restart_button_clicked(GtkButton *button, gpointer user_data) +{ + gtk_dialog_response(GTK_DIALOG(user_data), GS_RESPONSE_RESTART); +} - gconf_client_set_string (gconf_client, LOGOUT_OPTION_KEY, str, NULL); +static void lock_button_clicked(GtkButton *button, gpointer user_data) +{ + gtk_dialog_response(GTK_DIALOG(user_data), GS_RESPONSE_LOCK); } + + static gboolean display_gui (void) { GtkWidget *box; - GtkWidget *title; - GtkWidget *hbox; + //GtkWidget *title; + //GtkWidget *hbox; GtkWidget *vbox; GtkWidget *image; - GtkWidget *toggle_button = NULL; + //GtkWidget *toggle_button = NULL; gint response; - GtkWidget *halt = NULL; - GtkWidget *reboot = NULL; - GtkWidget *suspend = NULL; + //GtkWidget *halt = NULL; + //GtkWidget *reboot = NULL; + //GtkWidget *suspend = NULL; GtkWidget *invisible; - gboolean halt_supported = FALSE; - gboolean reboot_supported = FALSE; - gboolean suspend_supported = FALSE; + //gboolean halt_supported = FALSE; + //gboolean reboot_supported = FALSE; + //gboolean suspend_supported = FALSE; gboolean retval = FALSE; - gboolean save_active = FALSE; - gboolean halt_active = FALSE; - gboolean reboot_active = FALSE; - gboolean suspend_active = FALSE; - GdmLogoutAction logout_action = GDM_LOGOUT_ACTION_NONE; + //gboolean save_active = FALSE; + //gboolean halt_active = FALSE; + //gboolean reboot_active = FALSE; + //gboolean suspend_active = FALSE; + //GdmLogoutAction logout_action = GDM_LOGOUT_ACTION_NONE; gboolean iris_effect_enabled; gboolean grab_xserver; GError *error = NULL; GdkScreen *screen; int monitor; - int selected_option; + //int selected_option; + + GdkPixbuf *themePixbuf = NULL; + GtkIconTheme *iconTheme; + GtkWidget *tile; + gsm_verbose ("display_gui: showing logout dialog\n"); @@ -387,106 +441,188 @@ gtk_dialog_set_has_separator (GTK_DIALOG (box), FALSE); + + + + + // setup specs from Gnome HIG + gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (box)->vbox), 12); + gtk_container_set_border_width (GTK_CONTAINER(box), 6); + vbox = gtk_vbox_new (FALSE, 12); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (box)->vbox), vbox, FALSE, FALSE, 0); - gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (box)->vbox), 2); - gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (box)->vbox), vbox, + FALSE, FALSE, 0); + gtk_container_set_border_width(GTK_CONTAINER (vbox), 6); gtk_widget_show (vbox); - - hbox = gtk_hbox_new (FALSE, 12); - gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - gtk_widget_show (hbox); - - image = gtk_image_new_from_stock ("gtk-dialog-question", GTK_ICON_SIZE_DIALOG); - gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0); - gtk_widget_show (image); - - title = make_title_label (_("Are you sure you want to log out?")); - gtk_box_pack_start (GTK_BOX (hbox), title, FALSE, FALSE, 0); - gtk_misc_set_alignment (GTK_MISC (title), 0, 0.5); - gtk_widget_show (title); - - gtk_dialog_add_button (GTK_DIALOG (box), GTK_STOCK_HELP, GTK_RESPONSE_HELP); - gtk_dialog_add_button (GTK_DIALOG (box), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - gtk_dialog_add_button (GTK_DIALOG (box), GTK_STOCK_OK, GTK_RESPONSE_OK); - gtk_dialog_set_default_response (GTK_DIALOG (box), GTK_RESPONSE_OK); + gtk_window_set_screen (GTK_WINDOW (box), screen); - gtk_window_set_resizable (GTK_WINDOW (box), FALSE); + gtk_window_set_policy (GTK_WINDOW (box), FALSE, FALSE, TRUE); + gtk_window_set_keep_above(GTK_WINDOW(box), TRUE); + gtk_window_stick(GTK_WINDOW(box)); + + iconTheme = gtk_icon_theme_get_for_screen(screen); + //iconTheme = gtk_icon_theme_get_default (); + + // add help button in every case + gtk_dialog_add_button (GTK_DIALOG (box), GTK_STOCK_HELP, + GTK_RESPONSE_HELP); + + gtk_dialog_add_button (GTK_DIALOG (box), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); + + // ============ LOGOUT TILE ============ + image = NULL; + if(gtk_icon_theme_has_icon(iconTheme, "system-log-out")) + { + themePixbuf = gtk_icon_theme_load_icon(iconTheme, + "system-log-out", 48, 0, &error); + if(themePixbuf != NULL) + image = gtk_image_new_from_pixbuf(themePixbuf); + else + image = NULL; + } + else if(gtk_icon_theme_has_icon(iconTheme, "gnome-logout")) + { + themePixbuf = gtk_icon_theme_load_icon(iconTheme, + "gnome-logout", 48, 0, &error); + if(themePixbuf != NULL) + image = gtk_image_new_from_pixbuf(themePixbuf); + else + image = NULL; + } + if(image == NULL) + { + image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, + GTK_ICON_SIZE_DIALOG); + } + tile = get_tile(image, _("_Log Out"), + _("Ends your session and logs you out.")); + g_signal_connect (G_OBJECT (tile), "clicked", + G_CALLBACK (logout_button_clicked), box); + + gtk_box_pack_start (GTK_BOX (vbox), tile, TRUE, TRUE, 0); + gtk_widget_show_all(tile); + + + + // ============ LOCK TILE ============ + image = NULL; + if(gtk_icon_theme_has_icon(iconTheme, "system-lock-screen")) + { + themePixbuf = gtk_icon_theme_load_icon(iconTheme, + "system-lock-screen", 48, 0, &error); + if(themePixbuf != NULL) + image = gtk_image_new_from_pixbuf(themePixbuf); + else + image = NULL; + } + else if(gtk_icon_theme_has_icon(iconTheme, "gnome-lockscreen")) + { + themePixbuf = gtk_icon_theme_load_icon(iconTheme, + "gnome-lockscreen", 48, 0, &error); + if(themePixbuf != NULL) + image = gtk_image_new_from_pixbuf(themePixbuf); + else + image = NULL; + } + if(image == NULL) + { + image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, + GTK_ICON_SIZE_DIALOG); + } + tile = get_tile(image, _("Loc_k Screen"), + _("Locks this computer's screen.")); + g_signal_connect (G_OBJECT (tile), "clicked", + G_CALLBACK (lock_button_clicked), box); + + gtk_box_pack_start (GTK_BOX (vbox), tile, TRUE, TRUE, 0); + gtk_widget_show_all(tile); + + + + // ============ SHUTDOWN TILE ============ + //if(panel_power_manager_can_power_down (powerManager)) + if(gdm_supports_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN)) + { + image = NULL; + if(gtk_icon_theme_has_icon(iconTheme, "system-shutdown")) + { + themePixbuf = gtk_icon_theme_load_icon(iconTheme, + "system-shutdown", 48, 0, &error); + if(themePixbuf != NULL) + image = gtk_image_new_from_pixbuf(themePixbuf); + else + image = NULL; + } + else if(gtk_icon_theme_has_icon(iconTheme, "gnome-shutdown")) + { + themePixbuf = gtk_icon_theme_load_icon(iconTheme, + "gnome-shutdown", 48, 0, &error); + if(themePixbuf != NULL) + image = gtk_image_new_from_pixbuf(themePixbuf); + else + image = NULL; + } + if(image == NULL) + { + image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, + GTK_ICON_SIZE_DIALOG); + } + tile = get_tile(image, _("_Shutdown"), + _("Ends your session and turns off the computer.")); + g_signal_connect (G_OBJECT (tile), "clicked", + G_CALLBACK (shutdown_button_clicked), box); + + gtk_box_pack_start (GTK_BOX (vbox), tile, TRUE, TRUE, 0); + gtk_widget_show_all(tile); + } + + + + // ============ RESTART TILE ============ + //if(panel_power_manager_can_power_down (powerManager)) + if(gdm_supports_logout_action (GDM_LOGOUT_ACTION_REBOOT)) + { + image = NULL; + if(gtk_icon_theme_has_icon(iconTheme, "stock_refresh")) + { + themePixbuf = gtk_icon_theme_load_icon(iconTheme, + "stock_refresh", 48, 0, &error); + if(themePixbuf != NULL) + image = gtk_image_new_from_pixbuf(themePixbuf); + else + image = NULL; + } + else if(gtk_icon_theme_has_icon(iconTheme, "gnome-reboot")) + { + themePixbuf = gtk_icon_theme_load_icon(iconTheme, + "gnome-reboot", 48, 0, &error); + if(themePixbuf != NULL) + image = gtk_image_new_from_pixbuf(themePixbuf); + else + image = NULL; + } + if(image == NULL) + { + image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, + GTK_ICON_SIZE_DIALOG); + } + tile = get_tile(image, _("_Restart"), + _("Ends your session and restarts the computer.")); + g_signal_connect (G_OBJECT (tile), "clicked", + G_CALLBACK (restart_button_clicked), box); + + gtk_box_pack_start (GTK_BOX (vbox), tile, TRUE, TRUE, 0); + gtk_widget_show_all(tile); + } - gtk_container_set_border_width (GTK_CONTAINER (box), 5); - if (!autosave) - { - toggle_button = gtk_check_button_new_with_mnemonic (_("Remember running applications")); - gtk_widget_show (toggle_button); - gtk_box_pack_start (GTK_BOX (vbox), - toggle_button, - FALSE, TRUE, 0); - } - - halt_supported = gdm_supports_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN); - reboot_supported = gdm_supports_logout_action (GDM_LOGOUT_ACTION_REBOOT); - suspend_supported = gdm_supports_logout_action (GDM_LOGOUT_ACTION_SUSPEND); - - if (halt_supported || reboot_supported || suspend_supported) - { - GtkWidget *title, *spacer; - GtkWidget *action_vbox, *hbox; - GtkWidget *category_vbox; - GtkWidget *r; - - selected_option = get_default_option (); - - category_vbox = gtk_vbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (vbox), category_vbox, TRUE, TRUE, 0); - gtk_widget_show (category_vbox); - - title = make_title_label (_("Action")); - gtk_box_pack_start (GTK_BOX (category_vbox), - title, FALSE, FALSE, 0); - gtk_widget_show (title); - - hbox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (category_vbox), hbox, TRUE, TRUE, 0); - gtk_widget_show (hbox); - - spacer = gtk_label_new (" "); - gtk_box_pack_start (GTK_BOX (hbox), spacer, FALSE, FALSE, 0); - gtk_widget_show (spacer); - - action_vbox = gtk_vbox_new (FALSE, 6); - gtk_box_pack_start (GTK_BOX (hbox), action_vbox, TRUE, TRUE, 0); - gtk_widget_show (action_vbox); - - r = gtk_radio_button_new_with_mnemonic (NULL, _("_Log out")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (r), (selected_option == OPTION_LOGOUT)); - gtk_box_pack_start (GTK_BOX (action_vbox), r, FALSE, FALSE, 0); - gtk_widget_show (r); + gtk_dialog_set_default_response (GTK_DIALOG (box), + GTK_RESPONSE_CANCEL); + - if (halt_supported) - { - r = halt = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (r), _("Sh_ut down")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (r), (selected_option == OPTION_HALT)); - gtk_box_pack_start (GTK_BOX (action_vbox), r, FALSE, FALSE, 0); - gtk_widget_show (r); - } - if (reboot_supported) - { - r = reboot = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (r), _("_Restart the computer")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (r), (selected_option == OPTION_REBOOT)); - gtk_box_pack_start (GTK_BOX (action_vbox), r, FALSE, FALSE, 0); - gtk_widget_show (r); - } - if (suspend_supported) - { - r = suspend = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (r), _("_Suspend the computer")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (r), (selected_option == OPTION_SUSPEND)); - gtk_box_pack_start (GTK_BOX (action_vbox), r, FALSE, FALSE, 0); - gtk_widget_show (r); - } - } gsm_center_window_on_screen (GTK_WINDOW (box), screen, monitor); @@ -518,27 +654,6 @@ response = gtk_dialog_run (GTK_DIALOG (box)); - if (halt) - halt_active = GTK_TOGGLE_BUTTON (halt)->active; - - if (reboot) - reboot_active = GTK_TOGGLE_BUTTON (reboot)->active; - - if (suspend) - suspend_active = GTK_TOGGLE_BUTTON (suspend)->active; - - if (toggle_button) - save_active = GTK_TOGGLE_BUTTON (toggle_button)->active; - - if (reboot_active) - selected_option = OPTION_REBOOT; - else if (halt_active) - selected_option = OPTION_HALT; - else if (suspend_active) - selected_option = OPTION_SUSPEND; - else - selected_option = OPTION_LOGOUT; - gtk_widget_destroy (box); gtk_widget_destroy (invisible); @@ -558,62 +673,62 @@ } switch (response) { - case GTK_RESPONSE_OK: - /* We want to know if we should trash changes (and lose forever) - * or save them */ - retval = TRUE; - if(save_active) - save_selected = save_active; - if (halt_active) - logout_action = GDM_LOGOUT_ACTION_SHUTDOWN; - else if (reboot_active) - logout_action = GDM_LOGOUT_ACTION_REBOOT; - else if (suspend_active) - { - logout_action = GDM_LOGOUT_ACTION_SUSPEND; - g_spawn_command_line_async ("powersave --suspend-to-disk", NULL); - retval = FALSE; - } - set_default_option (selected_option); - break; - default: - case GTK_RESPONSE_CANCEL: - retval = FALSE; - break; - case GTK_RESPONSE_HELP: - gnome_help_display_desktop_on_screen (NULL, "user-guide", - "user-guide.xml", - "gosgetstarted-73", - screen, - &error); - - if (error) - { - GtkWidget *dialog; - - dialog = gtk_message_dialog_new (NULL, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - ("There was an error displaying help: \n%s"), - error->message); - - g_signal_connect (G_OBJECT (dialog), "response", - G_CALLBACK (gtk_widget_destroy), - NULL); - - gtk_window_set_screen (GTK_WINDOW (dialog), screen); - - gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); - gtk_widget_show (dialog); - g_error_free (error); - } - - retval = FALSE; - break; - } - - gdm_set_logout_action (logout_action); + case GS_RESPONSE_LOGOUT: + gdm_set_logout_action (GDM_LOGOUT_ACTION_NONE); + retval = TRUE; + break; + case GS_RESPONSE_SHUTDOWN: + gdm_set_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN); + retval = TRUE; + break; + case GS_RESPONSE_RESTART: + gdm_set_logout_action (GDM_LOGOUT_ACTION_REBOOT); + retval = TRUE; + break; + case GS_RESPONSE_LOCK: + g_spawn_command_line_async( + "gnome-screensaver-command --lock", NULL); + retval = FALSE; + break; + case GTK_RESPONSE_HELP: + gnome_help_display_desktop_on_screen (NULL, "user-guide", + "user-guide.xml", + "gosgetstarted-73", + screen, + &error); + + if (error) + { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (NULL, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + ("There was an error displaying help: \n%s"), + error->message); + + g_signal_connect (G_OBJECT (dialog), "response", + G_CALLBACK (gtk_widget_destroy), + NULL); + + gtk_window_set_screen (GTK_WINDOW (dialog), screen); + + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); + gtk_widget_show (dialog); + g_error_free (error); + } + + retval = FALSE; + break; + case GTK_RESPONSE_NONE: + case GTK_RESPONSE_DELETE_EVENT: + case GTK_RESPONSE_CANCEL: + retval = FALSE; + break; + default: + g_assert_not_reached(); + } return retval; }