diff --git a/gnome-session-tile-ui.patch b/gnome-session-tile-ui.patch index 4282f8c..584a3c5 100644 --- a/gnome-session-tile-ui.patch +++ b/gnome-session-tile-ui.patch @@ -1,401 +1,54 @@ ---- gnome-session-2.16.1/gnome-session/logout.c -+++ gnome-session-2.16.1/gnome-session/logout.c -@@ -41,6 +41,15 @@ - #include "gdm-logout-action.h" - #include "gsm-multiscreen.h" +--- gnome-session-2.19.6/gnome-session/logout.c ++++ gnome-session-2.19.6/gnome-session/logout.c +@@ -44,6 +44,14 @@ -+ -+enum -+{ + enum + { + GS_RESPONSE_LOGOUT, + GS_RESPONSE_SHUTDOWN, + GS_RESPONSE_RESTART, + GS_RESPONSE_LOCK +}; + - enum - { - OPTION_LOGOUT, -@@ -73,7 +82,26 @@ - int callback_id; - } FadeoutData; - -+static GtkWidget *ssui_get_tile(GtkWidget *image, const gchar *title, -+ const gchar *desc); -+static void logout_button_clicked(GtkButton *button, gpointer user_data); -+static void shutdown_button_clicked(GtkButton *button, gpointer user_data); -+static void restart_button_clicked(GtkButton *button, gpointer user_data); -+static void lock_button_clicked(GtkButton *button, gpointer user_data); -+static gboolean logout_dialog_callback (GtkWidget *dialog); -+static gboolean logout_dialog_configure_cb( GtkWidget *widget, -+ GdkEventConfigure *event, -+ gpointer data); -+static gboolean logout_dialog_focus_out_cb( GtkWidget *widget, -+ GdkEventFocus *event, -+ gpointer data); -+static void window_get_frame_extents (GdkWindow *window, gint *left, -+ gint *right, gint *top, gint *bottom); -+ -+ - static GList *fadeout_windows = NULL; -+static GList *ionly_windows = NULL; -+ - - /* Go for five seconds */ - #define FADE_DURATION 1500.0 -@@ -122,115 +150,234 @@ - - if (elapsed > FADE_DURATION) - { -- get_current_frame (fadeout, 0.0); -- gdk_draw_pixbuf (fadeout->draw_pixmap, -- fadeout->gc, -- fadeout->frame, -- 0, 0, -- 0, 0, -- fadeout->area.width, -- fadeout->area.height, -- GDK_RGB_DITHER_NONE, -- 0, 0); -- gdk_window_clear (fadeout->draw_window); -+ get_current_frame (fadeout, 0.0); -+ gdk_draw_pixbuf (fadeout->draw_pixmap, -+ fadeout->gc, -+ fadeout->frame, -+ 0, 0, -+ 0, 0, -+ fadeout->area.width, -+ fadeout->area.height, -+ GDK_RGB_DITHER_NONE, -+ 0, 0); -+ gdk_window_clear (fadeout->draw_window); - -- fadeout->callback_id = 0; -- return FALSE; -- } -+ fadeout->callback_id = 0; -+ return FALSE; -+ } - - percent = elapsed / FADE_DURATION; - - get_current_frame (fadeout, 1.0 - percent); - gdk_draw_pixbuf (fadeout->draw_pixmap, -- fadeout->gc, -- fadeout->frame, -- 0, 0, -- 0, 0, -- fadeout->area.width, -- fadeout->area.height, -- GDK_RGB_DITHER_NONE, -- 0, 0); -+ fadeout->gc, -+ fadeout->frame, -+ 0, 0, -+ 0, 0, -+ fadeout->area.width, -+ fadeout->area.height, -+ GDK_RGB_DITHER_NONE, -+ 0, 0); - gdk_window_clear (fadeout->draw_window); - - gdk_flush (); -- -+ - return TRUE; - } -- -+ - static void --fadeout_screen (GdkScreen *screen, -- int monitor) -+fadeout_screen (GdkScreen *screen, int monitor) - { -- GdkWindowAttr attr; -- int attr_mask; -- GdkGCValues values; -- FadeoutData *fadeout; -- GdkAtom property = gdk_atom_intern ("_NET_WM_STATE_DISPLAY_MODAL", FALSE); -- -- if (gdk_x11_screen_supports_net_wm_hint (screen, property)) -- return; -- -- fadeout = g_new (FadeoutData, 1); -- -- fadeout->screen = screen; -- fadeout->monitor = monitor; -- -- fadeout->area.x = gsm_screen_get_x (screen, monitor); -- fadeout->area.y = gsm_screen_get_y (screen, monitor); -- fadeout->area.width = gsm_screen_get_width (screen, monitor); -- fadeout->area.height = gsm_screen_get_height (screen, monitor); -- -- fadeout->root_window = gdk_screen_get_root_window (screen); -- attr.window_type = GDK_WINDOW_CHILD; -- attr.x = fadeout->area.x; -- attr.y = fadeout->area.y; -- attr.width = fadeout->area.width; -- attr.height = fadeout->area.height; -- attr.wclass = GDK_INPUT_OUTPUT; -- attr.visual = gdk_screen_get_system_visual (fadeout->screen); -- attr.colormap = gdk_screen_get_default_colormap (fadeout->screen); -- attr.override_redirect = TRUE; -- attr_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_NOREDIR; -- -- fadeout->draw_window = gdk_window_new (fadeout->root_window, &attr, attr_mask); -- fadeout->draw_pixmap = gdk_pixmap_new (fadeout->draw_window, fadeout->area.width, fadeout->area.height, gdk_drawable_get_depth (fadeout->draw_window)); -- fadeout_windows = g_list_prepend (fadeout_windows, fadeout); -- -- fadeout->start_pb = gdk_pixbuf_get_from_drawable (NULL, -- fadeout->root_window, -- NULL, -- fadeout->area.x, -- fadeout->area.y, -- 0, 0, -- fadeout->area.width, -- fadeout->area.height); -- -- fadeout->frame = gdk_pixbuf_copy (fadeout->start_pb); -- fadeout->rowstride = gdk_pixbuf_get_rowstride (fadeout->start_pb); -+ GdkGCValues values; -+ GdkWindowAttr attr; -+ int attr_mask; -+ FadeoutData *fadeout; -+ FadeoutData *indata; -+ -+ indata = g_new (FadeoutData, 1); -+ -+ indata->screen = screen; -+ indata->monitor = monitor; -+ -+ indata->area.x = gsm_screen_get_x (screen, monitor); -+ indata->area.y = gsm_screen_get_y (screen, monitor); -+ indata->area.width = gsm_screen_get_width (screen, monitor); -+ indata->area.height = gsm_screen_get_height (screen, monitor); -+ -+ indata->root_window = gdk_screen_get_root_window (screen); -+ -+ attr.window_type = GDK_WINDOW_CHILD; -+ attr.x = indata->area.x; -+ attr.y = indata->area.y; -+ attr.width = indata->area.width; -+ attr.height = indata->area.height; -+ attr.wclass = GDK_INPUT_ONLY; -+ attr.override_redirect = TRUE; -+ attr_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_NOREDIR; -+ -+ indata->draw_window = gdk_window_new (indata->root_window, -+ &attr, attr_mask); -+ indata->draw_pixmap = NULL; -+ indata->start_pb = NULL; -+ indata->frame = NULL; -+ indata->gc = NULL; -+ indata->callback_id = 0; -+ gdk_window_show (indata->draw_window); -+ ionly_windows = g_list_prepend (ionly_windows, indata); -+ -+ GdkAtom property = gdk_atom_intern ("_NET_WM_STATE_DISPLAY_MODAL", FALSE); -+ // if we have setup our little window manager coolness, then -+ // just create a GTK_INPUT_ONLY window to handle no input -+ if(!gdk_x11_screen_supports_net_wm_hint (screen, property)) -+ { -+ fadeout = g_new (FadeoutData, 1); - -- fadeout->start_p = gdk_pixbuf_get_pixels (fadeout->start_pb); -- fadeout->frame_p = gdk_pixbuf_get_pixels (fadeout->frame); -- -- values.subwindow_mode = GDK_INCLUDE_INFERIORS; -+ fadeout->screen = screen; -+ fadeout->monitor = monitor; - -- fadeout->gc = gdk_gc_new_with_values (fadeout->root_window, &values, GDK_GC_SUBWINDOW); -+ fadeout->area.x = gsm_screen_get_x (screen, monitor); -+ fadeout->area.y = gsm_screen_get_y (screen, monitor); -+ fadeout->area.width = gsm_screen_get_width (screen, monitor); -+ fadeout->area.height = gsm_screen_get_height (screen, monitor); -+ -+ fadeout->root_window = gdk_screen_get_root_window (screen); -+ -+ attr.window_type = GDK_WINDOW_TOPLEVEL; -+ attr.x = fadeout->area.x; -+ attr.y = fadeout->area.y; -+ attr.width = fadeout->area.width; -+ attr.height = fadeout->area.height; -+ attr.wclass = GDK_INPUT_OUTPUT; -+ attr.visual = gdk_screen_get_system_visual (fadeout->screen); -+ attr.colormap = gdk_screen_get_default_colormap (fadeout->screen); -+ attr.override_redirect = FALSE; -+ attr_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | -+ GDK_WA_NOREDIR; -+ -+ fadeout->draw_window = gdk_window_new (fadeout->root_window, -+ &attr, attr_mask); -+ -+ gdk_window_set_decorations(fadeout->draw_window, 0); -+ -+ fadeout->draw_pixmap = gdk_pixmap_new (fadeout->draw_window, -+ fadeout->area.width, fadeout->area.height, -+ gdk_drawable_get_depth (fadeout->draw_window)); -+ -+ fadeout_windows = g_list_prepend (fadeout_windows, fadeout); -+ -+ fadeout->start_pb = gdk_pixbuf_get_from_drawable (NULL, -+ fadeout->root_window, -+ NULL, -+ fadeout->area.x, -+ fadeout->area.y, -+ 0, 0, -+ fadeout->area.width, -+ fadeout->area.height); -+ -+ fadeout->frame = gdk_pixbuf_copy (fadeout->start_pb); -+ fadeout->rowstride = gdk_pixbuf_get_rowstride (fadeout->start_pb); -+ -+ fadeout->start_p = gdk_pixbuf_get_pixels (fadeout->start_pb); -+ fadeout->frame_p = gdk_pixbuf_get_pixels (fadeout->frame); -+ -+ values.subwindow_mode = GDK_INCLUDE_INFERIORS; -+ -+ fadeout->gc = gdk_gc_new_with_values (fadeout->root_window, &values, -+ GDK_GC_SUBWINDOW); -+ -+ gdk_window_set_back_pixmap (fadeout->draw_window, NULL, FALSE); -+ gdk_window_show (fadeout->draw_window); -+ -+ gdk_window_move(fadeout->draw_window, attr.x, attr.y); -+ gdk_window_stick(fadeout->draw_window); -+ gdk_window_set_keep_above(fadeout->draw_window, TRUE); -+ -+ gdk_draw_pixbuf (fadeout->draw_pixmap, -+ fadeout->gc, -+ fadeout->frame, -+ 0, 0, -+ 0, 0, -+ fadeout->area.width, -+ fadeout->area.height, -+ GDK_RGB_DITHER_NONE, -+ 0, 0); -+ -+ gdk_window_set_back_pixmap (fadeout->draw_window, -+ fadeout->draw_pixmap, FALSE); -+ gdk_window_clear (fadeout->draw_window); -+ g_get_current_time (&fadeout->start_time); - -- gdk_window_set_back_pixmap (fadeout->draw_window, NULL, FALSE); -- gdk_window_show (fadeout->draw_window); -- gdk_draw_pixbuf (fadeout->draw_pixmap, -- fadeout->gc, -- fadeout->frame, -- 0, 0, -- 0, 0, -- fadeout->area.width, -- fadeout->area.height, -- GDK_RGB_DITHER_NONE, -- 0, 0); -- gdk_window_set_back_pixmap (fadeout->draw_window, fadeout->draw_pixmap, FALSE); -- gdk_window_clear (fadeout->draw_window); -- -- g_get_current_time (&fadeout->start_time); -- fadeout->callback_id = g_idle_add ((GSourceFunc) fadeout_callback, fadeout); -+ fadeout->callback_id = g_idle_add ((GSourceFunc) fadeout_callback, -+ fadeout); -+ } -+ -+} -+ -+static void -+ssui_punch_hole_fadeout_windows (GtkWindow *dialog) ++enum +{ -+ GList *l; -+ GdkRectangle dialogRect, parentRect; -+ gint left, right, top, bottom; -+ gint monitor; -+ GdkWindow *parent; -+ GdkOverlapType overlap; -+ GdkRegion *parentRegion, *dialogRegion; -+ -+ // Loop through screens and monitors and punch and fill holes where needed -+ for (l = ionly_windows; l; l = l->next) -+ { -+ FadeoutData *fadeout = l->data; -+ parent = fadeout->draw_window; -+ -+ // don't use this, it doesn't work with compiz correctly -+ // gdk_window_get_frame_extents(dialog, &dialogRect); -+ -+ gdk_window_get_position(GTK_WIDGET(dialog)->window, &dialogRect.x, -+ &dialogRect.y); -+ gdk_window_get_geometry(GTK_WIDGET(dialog)->window, NULL, NULL, -+ &dialogRect.width, &dialogRect.height, NULL); -+ window_get_frame_extents (GTK_WIDGET(dialog)->window, &left, &right, -+ &top, &bottom); -+ dialogRect.x -= left; -+ dialogRect.y -= top; -+ dialogRect.width += left + right; -+ dialogRect.height += top + bottom; -+ -+ gdk_window_get_frame_extents(parent, &parentRect); -+ -+ // Adjust the dialog rect to be relative to this the parent -+ dialogRect.x = dialogRect.x - parentRect.x; -+ dialogRect.y = dialogRect.y - parentRect.y; -+ -+ // set the parents rect to be relative to this display (0,0) -+ parentRect.x = 0; -+ parentRect.y = 0; -+ parentRegion = gdk_region_rectangle(&parentRect); -+ if(parentRegion) -+ { -+ overlap = gdk_region_rect_in(parentRegion, &dialogRect); -+ if(overlap == GDK_OVERLAP_RECTANGLE_OUT) -+ { -+ // re-protect the parent -+ gdk_window_shape_combine_region(parent, NULL, 0, 0); -+ } -+ else -+ { -+ dialogRegion = gdk_region_rectangle(&dialogRect); -+ if(dialogRegion) -+ { -+ -+ // subtract the dialog from the parent -+ gdk_region_subtract(parentRegion, dialogRegion); -+ gdk_window_shape_combine_region(parent, parentRegion, 0, 0); -+ -+ gdk_region_destroy(dialogRegion); -+ } -+ } -+ gdk_region_destroy(parentRegion); -+ } -+ } + OPTION_LOGOUT, + OPTION_HALT, + OPTION_REBOOT, +@@ -260,82 +268,128 @@ + fadeout_windows = NULL; } - static void -@@ -258,83 +405,52 @@ - - g_list_free (fadeout_windows); - 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; -} -+ for (l = ionly_windows; l; l = l->next) -+ { -+ FadeoutData *fadeout = l->data; -+ gdk_window_hide (fadeout->draw_window); ++ 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) @@ -403,198 +56,160 @@ - GConfClient *gconf_client; - char *str; - int option; -+ if (fadeout->callback_id) -+ g_source_remove (fadeout->callback_id); ++ 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); -+ if(fadeout->gc) -+ g_object_unref (fadeout->gc); -+ if(fadeout->start_pb) -+ g_object_unref (fadeout->start_pb); -+ if(fadeout->frame) -+ g_object_unref (fadeout->frame); -+ -+ if(fadeout->draw_window) -+ g_object_unref (fadeout->draw_window); -+ if(fadeout->draw_pixmap) -+ g_object_unref (fadeout->draw_pixmap); ++ 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; -+ g_free (fadeout); -+ } ++ gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); - g_free (str); - return option; -+ g_list_free (ionly_windows); -+ ionly_windows = NULL; ++ 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); -- -- gconf_client_set_string (gconf_client, LOGOUT_OPTION_KEY, 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 *box; - GtkWidget *title; - GtkWidget *hbox; -- GtkWidget *vbox; -- GtkWidget *image; ++ //GtkWidget *title; ++ //GtkWidget *hbox; + GtkWidget *vbox; + GtkWidget *image; - GtkWidget *toggle_button = NULL; -- gint response; ++ //GtkWidget *toggle_button = NULL; + gint response; - GtkWidget *halt = NULL; - GtkWidget *reboot = NULL; - GtkWidget *suspend = NULL; -- GtkWidget *invisible; ++ //GtkWidget *halt = NULL; ++ //GtkWidget *reboot = NULL; ++ //GtkWidget *suspend = NULL; + GtkWidget *invisible; - gboolean halt_supported = FALSE; - gboolean reboot_supported = FALSE; - gboolean suspend_supported = FALSE; -- gboolean retval = 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 a11y_enabled; -- GError *error = NULL; -- GdkScreen *screen; -- int monitor; ++ //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; -+ GtkWidget *logoutDlg; -+ GtkWidget *vbox; -+ GtkWidget *image; -+ GtkWidget *tile; -+ gint response; -+ GtkWidget *invisible; -+ GtkIconTheme *iconTheme; -+ GdkPixbuf *themePixbuf = NULL; -+ gboolean retval = FALSE; -+ gboolean showDialog = FALSE; -+ gboolean a11y_enabled; -+ GError *error = NULL; -+ GdkScreen *screen; -+ int monitor; ++ //int selected_option; ++ ++ GdkPixbuf *themePixbuf = NULL; ++ GtkIconTheme *iconTheme; ++ GtkWidget *tile; ++ gsm_verbose ("display_gui: showing logout dialog\n"); -@@ -355,278 +471,364 @@ +@@ -387,106 +441,188 @@ - a11y_enabled = GTK_IS_ACCESSIBLE (gtk_widget_get_accessible (invisible)); + gtk_dialog_set_has_separator (GTK_DIALOG (box), FALSE); -- /* Only create a managed window if a11y is enabled */ -+ logoutDlg = g_object_new (GTK_TYPE_DIALOG, -+ "type", GTK_WINDOW_TOPLEVEL, -+ NULL); - if (!a11y_enabled) -- { -- while (1) -+ { -+ atk_object_set_role (gtk_widget_get_accessible (logoutDlg), -+ ATK_ROLE_ALERT); -+ } -+ gtk_window_set_decorated (GTK_WINDOW (logoutDlg), TRUE); -+ gtk_window_set_title(GTK_WINDOW(logoutDlg), _("Log Out")); -+ gtk_dialog_set_has_separator (GTK_DIALOG (logoutDlg), FALSE); -+ -+ // setup specs from Gnome HIG -+ gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (logoutDlg)->vbox), 12); -+ gtk_container_set_border_width (GTK_CONTAINER(logoutDlg), 6); -+ -+ vbox = gtk_vbox_new (FALSE, 12); -+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (logoutDlg)->vbox), vbox, -+ FALSE, FALSE, 0); -+ gtk_container_set_border_width(GTK_CONTAINER (vbox), 6); -+ gtk_widget_show (vbox); + + -+ gtk_window_set_screen (GTK_WINDOW (logoutDlg), screen); -+ gtk_window_set_policy (GTK_WINDOW (logoutDlg), FALSE, FALSE, TRUE); -+ gtk_window_set_keep_above(GTK_WINDOW(logoutDlg), TRUE); -+ gtk_window_stick(GTK_WINDOW(logoutDlg)); + -+ 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 (logoutDlg), GTK_STOCK_HELP, -+ GTK_RESPONSE_HELP); ++ // 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); + -+ gtk_dialog_add_button (GTK_DIALOG (logoutDlg), -+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); -+ -+ // ============ LOGOUT TILE ============ -+ image = NULL; -+ if(gtk_icon_theme_has_icon(iconTheme, "system-log-out")) - { -- if (gdk_pointer_grab (invisible->window, FALSE, 0, -- NULL, NULL, GDK_CURRENT_TIME) == Success) -- { -- if (gdk_keyboard_grab (invisible->window, FALSE, GDK_CURRENT_TIME) -- == Success) -- break; -- gdk_pointer_ungrab (GDK_CURRENT_TIME); -- } -- sleep (1); -- } -- -- box = g_object_new (GTK_TYPE_DIALOG, -- "type", GTK_WINDOW_POPUP, -- NULL); -- } -- else -- { -- box = gtk_dialog_new (); -- atk_object_set_role (gtk_widget_get_accessible (box), ATK_ROLE_ALERT); -- gtk_window_set_decorated (GTK_WINDOW (box), FALSE); -- } -+ 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 = ssui_get_tile(image, _("_Log Out"), -+ _("Ends your session and logs you out.")); -+ g_signal_connect (G_OBJECT (tile), "clicked", -+ G_CALLBACK (logout_button_clicked), logoutDlg); - -- gtk_dialog_set_has_separator (GTK_DIALOG (box), FALSE); -+ gtk_box_pack_start (GTK_BOX (vbox), tile, TRUE, TRUE, 0); -+ gtk_widget_show_all(tile); - -- vbox = gtk_vbox_new (FALSE, 12); + 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_widget_show (vbox); ++ 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); @@ -614,55 +229,184 @@ - 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_policy (GTK_WINDOW (box), FALSE, FALSE, TRUE); ++ + 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); -+ // ============ 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 = ssui_get_tile(image, _("Loc_k Screen"), -+ _("Locks this computer's screen.")); -+ g_signal_connect (G_OBJECT (tile), "clicked", -+ G_CALLBACK (lock_button_clicked), logoutDlg); - if (!autosave) - { -- toggle_button = gtk_check_button_new_with_mnemonic (_("_Save current setup")); +- 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); - } -+ gtk_box_pack_start (GTK_BOX (vbox), tile, TRUE, TRUE, 0); -+ gtk_widget_show_all(tile); - +- - 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; @@ -697,7 +441,10 @@ - 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")); @@ -705,7 +452,7 @@ - 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")); @@ -719,135 +466,21 @@ - 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); -+ -+ // ============ 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 = ssui_get_tile(image, _("_Shutdown"), -+ _("Ends your session and turns off the computer.")); -+ g_signal_connect (G_OBJECT (tile), "clicked", -+ G_CALLBACK (shutdown_button_clicked), logoutDlg); -+ -+ gtk_box_pack_start (GTK_BOX (vbox), tile, TRUE, TRUE, 0); -+ gtk_widget_show_all(tile); - } +- } - } -- gsm_center_window_on_screen (GTK_WINDOW (box), screen, monitor); + gsm_center_window_on_screen (GTK_WINDOW (box), screen, monitor); -- /* Grabbing the Xserver when accessibility is enabled will cause -- * a hang. See #93103 for details. -- */ -- if (!a11y_enabled) -- { -- /* Really necessary? -- XGrabServer (GDK_DISPLAY ()); -- */ -- gsm_foreach_screen (fadeout_screen); -- } +@@ -518,27 +654,6 @@ -- gtk_widget_show_all (box); -+ // ============ 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 = ssui_get_tile(image, _("_Restart"), -+ _("Ends your session and restarts the computer.")); -+ g_signal_connect (G_OBJECT (tile), "clicked", -+ G_CALLBACK (restart_button_clicked), logoutDlg); - -- /* XXX: Appending experimental display modal state */ -- { -- Display *xdisplay = GDK_WINDOW_XDISPLAY (box->window); -- Window xwindow = GDK_WINDOW_XID (box->window); -- Atom state_atom, display_modal_atom; -- -- state_atom = XInternAtom (xdisplay, "_NET_WM_STATE", 0); -- display_modal_atom = XInternAtom (xdisplay, -- "_NET_WM_STATE_DISPLAY_MODAL", 0); -- -- XChangeProperty (xdisplay, -- xwindow, -- state_atom, -- XA_ATOM, 32, PropModeAppend, -- (guchar *) &display_modal_atom, 1); -- } -+ gtk_box_pack_start (GTK_BOX (vbox), tile, TRUE, TRUE, 0); -+ gtk_widget_show_all(tile); -+ } - -- if (!a11y_enabled) -- { -- /* Move the grabs to our message box */ -- gdk_pointer_grab (box->window, TRUE, 0, -- NULL, NULL, GDK_CURRENT_TIME); -- gdk_keyboard_grab (box->window, FALSE, GDK_CURRENT_TIME); -- XSetInputFocus (GDK_DISPLAY (), -- GDK_WINDOW_XWINDOW (box->window), -- RevertToParent, -- CurrentTime); -- } - -- response = gtk_dialog_run (GTK_DIALOG (box)); -+ gtk_dialog_set_default_response (GTK_DIALOG (logoutDlg), -+ GTK_RESPONSE_CANCEL); + response = gtk_dialog_run (GTK_DIALOG (box)); - if (halt) - halt_active = GTK_TOGGLE_BUTTON (halt)->active; -+ gsm_center_window_on_screen (GTK_WINDOW (logoutDlg), screen, monitor); - +- - if (reboot) - reboot_active = GTK_TOGGLE_BUTTON (reboot)->active; - +- - if (suspend) - suspend_active = GTK_TOGGLE_BUTTON (suspend)->active; - @@ -862,67 +495,14 @@ - selected_option = OPTION_SUSPEND; - else - selected_option = OPTION_LOGOUT; -+ /* Grabbing the Xserver when accessibility is enabled will cause -+ * a hang. See #93103 for details. -+ */ -+ if (!a11y_enabled) -+ { -+ /* Really necessary? -+ XGrabServer (GDK_DISPLAY ()); -+ */ -+ gsm_foreach_screen (fadeout_screen); -+ } +- + gtk_widget_destroy (box); + gtk_widget_destroy (invisible); -- gtk_widget_destroy (box); -- gtk_widget_destroy (invisible); -+ gtk_widget_show_all (logoutDlg); +@@ -558,62 +673,62 @@ + } -- if (!a11y_enabled) -- { -- hide_fadeout_windows (); -- /* XUngrabServer (GDK_DISPLAY ()); */ -+ /* setup properties for window manager to special case the -+ dialog (compiz does some awesome fading here) */ -+ { -+ Display *xdisplay = GDK_WINDOW_XDISPLAY (logoutDlg->window); -+ Window xwindow = GDK_WINDOW_XID (logoutDlg->window); -+ Atom state_atom, display_modal_atom; -+ -+ state_atom = XInternAtom (xdisplay, "_NET_WM_STATE", 0); -+ display_modal_atom = XInternAtom (xdisplay, -+ "_NET_WM_STATE_DISPLAY_MODAL", 0); -+ -+ XChangeProperty (xdisplay, -+ xwindow, -+ state_atom, -+ XA_ATOM, 32, PropModeAppend, -+ (guchar *) &display_modal_atom, 1); -+ } - -- gdk_pointer_ungrab (GDK_CURRENT_TIME); -- gdk_keyboard_ungrab (GDK_CURRENT_TIME); -+ if (!a11y_enabled) -+ { -+ // adds a callback to start the fading of all windows after -+ // the primary display is captured and the logout dialog is -+ // shown -+ g_idle_add ((GSourceFunc) logout_dialog_callback, logoutDlg); -+ -+ g_signal_connect (G_OBJECT(GTK_WIDGET(logoutDlg)), "configure-event", -+ G_CALLBACK (logout_dialog_configure_cb), -+ NULL); -+ -+ g_signal_connect (G_OBJECT(GTK_WIDGET(logoutDlg)), "focus-out-event", -+ G_CALLBACK (logout_dialog_focus_out_cb), -+ NULL); -+ } - -- gdk_flush (); -- } -+ do -+ { - -- switch (response) { + switch (response) { - case GTK_RESPONSE_OK: - /* We want to know if we should trash changes (and lose forever) - * or save them */ @@ -977,247 +557,64 @@ - retval = FALSE; - break; - } -+ response = gtk_dialog_run (GTK_DIALOG (logoutDlg)); -+ showDialog = FALSE; -+ -+ switch(response) -+ { -+ case GS_RESPONSE_LOGOUT: -+ gdm_set_logout_action (GDM_LOGOUT_ACTION_NONE); -+ retval = TRUE; -+// ssui_request_logout(); -+ break; -+ case GS_RESPONSE_SHUTDOWN: -+ gdm_set_logout_action (GDM_LOGOUT_ACTION_SHUTDOWN); -+ retval = TRUE; -+// ssui_request_logout(); -+ break; -+ case GS_RESPONSE_RESTART: -+ gdm_set_logout_action (GDM_LOGOUT_ACTION_REBOOT); -+ retval = TRUE; -+// ssui_request_logout(); -+ 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(); -+ } -+ -+ }while(showDialog); -+ -+ gtk_widget_destroy (logoutDlg); -+ gtk_widget_destroy (invisible); - +- - 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; -+ if (!a11y_enabled) -+ { -+ hide_fadeout_windows (); -+ /* XUngrabServer (GDK_DISPLAY ()); */ -+ -+ gdk_flush (); -+ } -+ -+ return retval; -+} -+ -+static gboolean logout_dialog_callback (GtkWidget *dialog) -+{ -+ XSetInputFocus (GDK_DISPLAY (), -+ GDK_WINDOW_XWINDOW (dialog->window), -+ RevertToParent, -+ CurrentTime); -+ -+ return FALSE; -+} -+ -+static gboolean logout_dialog_configure_cb( GtkWidget *widget, -+ GdkEventConfigure *event, -+ gpointer data) -+{ -+ ssui_punch_hole_fadeout_windows(GTK_WINDOW(widget)); -+ return FALSE; -+} -+ -+static gboolean logout_dialog_focus_out_cb( GtkWidget *widget, -+ GdkEventFocus *event, -+ gpointer data) -+{ -+ if(event->in == FALSE) -+ { -+ XSetInputFocus (GDK_DISPLAY (), -+ GDK_WINDOW_XWINDOW (widget->window), -+ RevertToParent, -+ CurrentTime); -+ } -+ -+ return FALSE; + return retval; } - -+ -+ - /* Display GUI if user wants it. Returns TRUE if save should - continue, FALSE otherwise. */ - gboolean -@@ -650,3 +852,121 @@ - - return result; - } -+ -+ -+static void logout_button_clicked(GtkButton *button, gpointer user_data) -+{ -+ gtk_dialog_response(GTK_DIALOG(user_data), GS_RESPONSE_LOGOUT); -+} -+ -+static void shutdown_button_clicked(GtkButton *button, gpointer user_data) -+{ -+ gtk_dialog_response(GTK_DIALOG(user_data), GS_RESPONSE_SHUTDOWN); -+} -+ -+static void restart_button_clicked(GtkButton *button, gpointer user_data) -+{ -+ gtk_dialog_response(GTK_DIALOG(user_data), GS_RESPONSE_RESTART); -+} -+ -+static void lock_button_clicked(GtkButton *button, gpointer user_data) -+{ -+ gtk_dialog_response(GTK_DIALOG(user_data), GS_RESPONSE_LOCK); -+} -+ -+static GtkWidget *ssui_get_tile(GtkWidget *image, const gchar *title, -+ const gchar *desc) -+{ -+ GtkWidget *button; -+ GtkWidget *alignment; -+ GtkWidget *hbox; -+ GtkWidget *vbox; -+ -+ g_assert(title != NULL); -+ -+ button = GTK_WIDGET(gtk_button_new()); -+ gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); -+// GTK_WIDGET_UNSET_FLAGS(button, GTK_HAS_FOCUS); -+ -+ 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(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); -+ -+ 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 -+window_get_frame_extents (GdkWindow *window, gint *left, gint *right, -+ gint *top, gint *bottom) -+{ -+ unsigned long *extents = NULL; -+ -+ /* some guesses in case this fails to read */ -+ *left = 6; -+ *right = 6; -+ *top = 21; -+ *bottom = 6; -+ -+ /* Attempt to retrieve window's frame extents. */ -+ if (gdk_property_get (window, -+ gdk_atom_intern ("_NET_FRAME_EXTENTS", FALSE), -+ gdk_atom_intern ("CARDINAL", FALSE), -+ 0, -+ sizeof (unsigned long) * 4, -+ FALSE, -+ NULL, -+ NULL, -+ NULL, -+ (guchar **)&extents)) -+ { -+ *left = extents [0]; -+ *right = extents [1]; -+ *top = extents [2]; -+ *bottom = extents [3]; -+ } -+} -+ diff --git a/gnome-session.changes b/gnome-session.changes index 7d69b24..6602ae4 100644 --- a/gnome-session.changes +++ b/gnome-session.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Fri Aug 3 03:44:59 CEST 2007 - cgaisford@suse.de + +- Fixed up the tile-ui patch to work with the new gnome + ------------------------------------------------------------------- Thu Aug 2 19:09:21 CEST 2007 - maw@suse.de diff --git a/gnome-session.spec b/gnome-session.spec index 7644020..c8b8bf9 100644 --- a/gnome-session.spec +++ b/gnome-session.spec @@ -16,7 +16,7 @@ BuildRequires: CASA-devel control-center2-devel gnome-common gnome-desktop-deve License: GPL v2 or later, LGPL v2 or later Group: System/GUI/GNOME Version: 2.19.6 -Release: 1 +Release: 2 Summary: Session Tools for the GNOME 2.x Desktop Source: %{name}-%{version}.tar.bz2 Source1: gnome @@ -55,10 +55,8 @@ Patch9: gnome-session-dist-splash.patch Patch10: gnome-session-compiz.patch Patch11: gnome-session-migrate-session-manual.patch Patch12: gnome-session-wm-switch.patch -# FIXME: This doesn't apply. Somebody should go through it and -# make it apply. -Patch13: gnome-session-tile-ui.patch -Patch14: gnome-session-no-devel-fatals.patch +Patch13: gnome-session-no-devel-fatals.patch +Patch14: gnome-session-tile-ui.patch URL: http://www.gnome.org BuildRoot: %{_tmppath}/%{name}-%{version}-build Autoreqprov: on @@ -103,8 +101,8 @@ gnome-patch-translation-prepare %patch10 %patch11 -p1 %patch12 -# %patch13 -p1 -%patch14 +%patch13 +%patch14 -p1 %endif gnome-patch-translation-update @@ -155,6 +153,8 @@ rm -rf $RPM_BUILD_ROOT %endif %changelog +* Fri Aug 03 2007 - cgaisford@suse.de +- Fixed up the tile-ui patch to work with the new gnome * Thu Aug 02 2007 - maw@suse.de - Update to version 2.19.6: + Better fadeout animation for the logout dialogue when there is