=== modified file 'applets/maintained/cairo-menu/gnome-menu-builder.c' --- applets/maintained/cairo-menu/gnome-menu-builder.c 2010-04-18 07:03:46 +0000 +++ applets/maintained/cairo-menu/gnome-menu-builder.c 2010-09-02 17:12:24 +0000 @@ -800,7 +800,7 @@ else if (g_strcmp0(instance->submenu_name,":::RECENT")==0) { g_assert (!instance->menu); - menu = get_recent_menu (); + menu = get_recent_menu (instance->recent); } else if (g_strcmp0(instance->submenu_name,":::SESSION")==0) { @@ -986,9 +986,9 @@ } else { - sub_menu = get_recent_menu (); gchar * icon_name; instance->recent = menu_item = cairo_menu_item_new_with_label (_("Recent Documents")); + sub_menu = get_recent_menu (menu_item); image = get_gtk_image (icon_name = "document-open-recent"); if (!image) { === modified file 'applets/maintained/cairo-menu/misc.c' --- applets/maintained/cairo-menu/misc.c 2010-04-05 15:38:29 +0000 +++ applets/maintained/cairo-menu/misc.c 2010-09-02 17:38:31 +0000 @@ -34,6 +34,7 @@ #endif +static GtkWidget * clear_recent_dialog = NULL; static GtkWidget * _get_recent_menu (GtkWidget * menu); void @@ -270,11 +271,86 @@ } static void -_purge_recent (GtkMenuItem *menuitem, GtkRecentManager *recent) -{ - g_message ("%s: Purged %d items from Recent Documents",__func__, - gtk_recent_manager_purge_items (recent,NULL)); - +_clear_dialog_response (GtkWidget *widget, + int response, + GtkRecentManager *recent) +{ + if (response == GTK_RESPONSE_ACCEPT) + { + gtk_recent_manager_purge_items (recent, NULL); + } + + gtk_widget_destroy (widget); +} + +/* + Let the user confirm before clearing the Recent Documents List. + Taken from gnome-panel 2.30 (panel-recent.c) + Copyright (C) 2002 James Willcox + Licence: GPL v2 or later + */ +static void +_recent_documents_clear (GtkMenuItem *menuitem, + GtkRecentManager *manager) +{ + gpointer tmp; + + if (clear_recent_dialog != NULL) + { + gtk_window_set_screen (GTK_WINDOW (clear_recent_dialog), + gtk_widget_get_screen (GTK_WIDGET (menuitem))); + gtk_window_present (GTK_WINDOW (clear_recent_dialog)); + return; + } + + clear_recent_dialog = gtk_message_dialog_new (NULL, + 0 /* flags */, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_NONE, + _("Clear the Recent Documents list?")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (clear_recent_dialog), + /* Translators: This is taken from gnome-panel, when deleting the Recent Documents List. + * Please use the same translation. */ + _("If you clear the Recent Documents list, you clear the following:\n" + "\342\200\242 All items from the Places \342\206\222 Recent Documents menu item.\n" + "\342\200\242 All items from the recent documents list in all applications.")); + + gtk_dialog_add_buttons (GTK_DIALOG (clear_recent_dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_CLEAR, GTK_RESPONSE_ACCEPT, + NULL); + + gtk_container_set_border_width (GTK_CONTAINER (clear_recent_dialog), 6); + + gtk_window_set_title (GTK_WINDOW (clear_recent_dialog), + _("Clear Recent Documents")); + + gtk_dialog_set_default_response (GTK_DIALOG (clear_recent_dialog), GTK_RESPONSE_ACCEPT); + gtk_window_set_skip_taskbar_hint (GTK_WINDOW (clear_recent_dialog), FALSE); + + gtk_window_set_icon_name (GTK_WINDOW (clear_recent_dialog), "gnome-main-menu"); + + g_signal_connect (clear_recent_dialog, "response", + G_CALLBACK (_clear_dialog_response), manager); + + g_signal_connect (clear_recent_dialog, "destroy", + G_CALLBACK (gtk_widget_destroyed), + &clear_recent_dialog); + + tmp = &clear_recent_dialog; + g_object_add_weak_pointer (G_OBJECT (clear_recent_dialog), tmp); + + gtk_window_set_screen (GTK_WINDOW (clear_recent_dialog), + gtk_widget_get_screen (GTK_WIDGET (menuitem))); + gtk_widget_show (clear_recent_dialog); +} + +static void +_recent_manager_changed (GtkRecentManager *recent, GtkWidget *parent) +{ + int size; + g_object_get (recent, "size", &size, NULL); + gtk_widget_set_sensitive (parent, size > 0); } /* @@ -347,7 +423,7 @@ { gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item),image); } - g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(_purge_recent),recent); + g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(_recent_documents_clear),recent); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); g_list_foreach (recent_list, (GFunc)gtk_recent_info_unref,NULL); @@ -362,11 +438,30 @@ Returns a new recent menu widget every time it is called */ GtkWidget * -get_recent_menu (void) +get_recent_menu (GtkWidget *parent) { guint id; GtkRecentManager *recent = gtk_recent_manager_get_default (); + /* + If there are no Recent Items, make menu insensitive. + This, including the callback, is taken from gnome-panel 2.30 (panel-recent.c) + Copyright (C) 2002 James Willcox + Licence: GPL v2 or later + */ + + int size; + g_signal_connect_object (recent, "changed", + G_CALLBACK (_recent_manager_changed), + parent, 0); + + size = 0; + g_object_get (recent, "size", &size, NULL); + gtk_widget_set_sensitive (parent, size > 0); + + /* end of panel-recent.c code */ + + GtkWidget *menu = cairo_menu_new(); g_signal_handlers_disconnect_by_func (recent,G_CALLBACK(_get_recent_menu),menu); _get_recent_menu (menu); === modified file 'applets/maintained/cairo-menu/misc.h' --- applets/maintained/cairo-menu/misc.h 2010-04-05 15:38:29 +0000 +++ applets/maintained/cairo-menu/misc.h 2010-09-02 17:29:57 +0000 @@ -43,9 +43,11 @@ void _launch (GtkWidget *widget,gchar * desktop_file); +static GtkWidget * clear_recent_dialog; + GtkWidget * get_gtk_image (const gchar const * icon_name); -GtkWidget * get_recent_menu (void); +GtkWidget * get_recent_menu (GtkWidget *parent); void _remove_menu_item (GtkWidget *menu_item,GtkWidget * menu);