Here is a patch to be consistant with gtkfilechooser. The patch isn't finished yet but I've a problem that I don't understand : why my function nautilus_places_sidebar_popup_menu_detach_callback () is never called ? it should be when GtkMenu is destroyed... I'm not an exert so if someone can help me it would be nice :-)
Index: src/nautilus-places-sidebar.c =================================================================== RCS file: /cvs/gnome/nautilus/src/nautilus-places-sidebar.c,v retrieving revision 1.5 diff -u -p -r1.5 nautilus-places-sidebar.c --- src/nautilus-places-sidebar.c 11 Jul 2005 10:12:46 -0000 1.5 +++ src/nautilus-places-sidebar.c 15 Aug 2005 20:27:14 -0000 @@ -38,6 +38,7 @@ #include <gtk/gtkstock.h> #include <gtk/gtktreemodel.h> #include <gtk/gtktreeselection.h> +#include <gtk/gtk.h> #include <libgnome/gnome-macros.h> #include <libgnome/gnome-i18n.h> #include <libnautilus-private/nautilus-bookmark.h> @@ -62,6 +63,10 @@ typedef struct { GtkListStore *store; NautilusWindowInfo *window; NautilusBookmarkList *bookmarks; + + GtkWidget *popup_menu; + GtkWidget *popup_menu_remove_item; + GtkWidget *popup_menu_rename_item; } NautilusPlacesSidebar; typedef struct { @@ -294,6 +299,101 @@ row_activated_callback (GtkTreeView *tre } static void +nautilus_places_sidebar_popup_menu_remove_callback (GtkMenuItem *item, + NautilusPlacesSidebar *sidebar) +{ + g_print ("remove\n"); +} + +static void +nautilus_places_sidebar_popup_menu_rename_callback (GtkMenuItem *item, + NautilusPlacesSidebar *sidebar) +{ + g_print ("rename\n"); +} + +static void +nautilus_places_sidebar_popup_menu_detach_callback (GtkWidget *attach_widget, + GtkMenu *menu) +{ + NautilusPlacesSidebar *sidebar; + + sidebar = g_object_get_data (G_OBJECT (attach_widget), "sidebar"); + g_assert (NAUTILUS_IS_PLACES_SIDEBAR (sidebar)); + sidebar->popup_menu = NULL; + sidebar->popup_menu_remove_item = NULL; + sidebar->popup_menu_rename_item = NULL; +} + +static void +nautilus_places_sidebar_do_popup_menu (NautilusPlacesSidebar *sidebar, + GdkEventButton *event) +{ + GtkWidget *item; + + if (sidebar->popup_menu) + return; + + sidebar->popup_menu = gtk_menu_new (); + g_object_set_data (G_OBJECT (sidebar->tree_view), "sidebar", sidebar); + gtk_menu_attach_to_widget (GTK_MENU (sidebar->popup_menu), + GTK_WIDGET (sidebar->tree_view), + nautilus_places_sidebar_popup_menu_detach_callback); + + item = gtk_image_menu_item_new_with_label (_("Remove")); + sidebar->popup_menu_remove_item = item; + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), + gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU)); + g_signal_connect (item, "activate", + G_CALLBACK (nautilus_places_sidebar_popup_menu_remove_callback), sidebar); + gtk_widget_show (item); + gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); + + item = gtk_menu_item_new_with_label (_("Rename...")); + sidebar->popup_menu_rename_item = item; + g_signal_connect (item, "activate", + G_CALLBACK (nautilus_places_sidebar_popup_menu_rename_callback), sidebar); + gtk_widget_show (item); + gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); + + if (event) + gtk_menu_popup (GTK_MENU (sidebar->popup_menu), + NULL, NULL, NULL, NULL, + event->button, event->time); + else { + gtk_menu_popup (GTK_MENU (sidebar->popup_menu), + NULL, NULL, NULL, NULL, + 0, GDK_CURRENT_TIME); + gtk_menu_shell_select_first (GTK_MENU_SHELL (sidebar->popup_menu), + FALSE); + } +} + +static gboolean +nautilus_places_sidebar_popup_menu_callback (GtkWidget *widget, + NautilusPlacesSidebar *sidebar) +{ + nautilus_places_sidebar_do_popup_menu (sidebar, NULL); + return TRUE; +} + +static gboolean +nautilus_places_sidebar_button_press_event_callback (GtkWidget *widget, + GdkEventButton *event, + NautilusPlacesSidebar *sidebar) +{ + if (event->button != 3) + return FALSE; + + nautilus_places_sidebar_do_popup_menu (sidebar, event); + return TRUE; +} + +static void update_click_policy (NautilusPlacesSidebar *sidebar) { int policy; @@ -422,6 +522,12 @@ nautilus_places_sidebar_init (NautilusPl g_signal_connect_object (tree_view, "row_activated", G_CALLBACK (row_activated_callback), sidebar, 0); + g_signal_connect (tree_view, "popup-menu", + G_CALLBACK (nautilus_places_sidebar_popup_menu_callback), + sidebar); + g_signal_connect (tree_view, "button-press-event", + G_CALLBACK (nautilus_places_sidebar_button_press_event_callback), + sidebar); eel_preferences_add_callback (NAUTILUS_PREFERENCES_CLICK_POLICY, click_policy_changed_callback,
Attachment:
signature.asc
Description: This is a digitally signed message part