[gtk+/places-sidebar] Rebuild the popup menu every time it is used
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/places-sidebar] Rebuild the popup menu every time it is used
- Date: Sat, 15 Dec 2012 03:47:34 +0000 (UTC)
commit fc01ce0756de1f918d973d937d1ea674bea50cd6
Author: Federico Mena Quintero <federico gnome org>
Date: Fri Dec 14 17:56:53 2012 -0600
Rebuild the popup menu every time it is used
We'll need to rebuild it every time for the populate-popup signal.
Signed-off-by: Federico Mena Quintero <federico gnome org>
gtk/gtkplacessidebar.c | 189 ++++++++++++++++++++----------------------------
1 files changed, 77 insertions(+), 112 deletions(-)
---
diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c
index 033fda0..d5f95ed 100644
--- a/gtk/gtkplacessidebar.c
+++ b/gtk/gtkplacessidebar.c
@@ -109,20 +109,6 @@ struct _GtkPlacesSidebar {
gboolean drop_occured;
GtkWidget *popup_menu;
- GtkWidget *popup_menu_open_in_new_tab_item;
- GtkWidget *popup_menu_add_shortcut_item;
- GtkWidget *popup_menu_remove_item;
- GtkWidget *popup_menu_rename_item;
- GtkWidget *popup_menu_separator_item;
- GtkWidget *popup_menu_mount_item;
- GtkWidget *popup_menu_unmount_item;
- GtkWidget *popup_menu_eject_item;
- GtkWidget *popup_menu_rescan_item;
- GtkWidget *popup_menu_empty_trash_item;
- GtkWidget *popup_menu_start_item;
- GtkWidget *popup_menu_stop_item;
- GtkWidget *popup_menu_properties_separator_item;
- GtkWidget *popup_menu_properties_item;
/* volume mounting - delayed open process */
gboolean mounting;
@@ -255,8 +241,6 @@ static void check_unmount_and_eject (GMount *mount,
gboolean *show_unmount,
gboolean *show_eject);
-static void check_popup_sensitivity (GtkPlacesSidebar *sidebar);
-
/* Identifiers for target types */
enum {
GTK_TREE_MODEL_ROW,
@@ -1708,24 +1692,9 @@ bookmarks_popup_menu_detach_cb (GtkWidget *attach_widget,
GtkPlacesSidebar *sidebar;
sidebar = GTK_PLACES_SIDEBAR (attach_widget);
- g_assert (GTK_IS_PLACES_SIDEBAR (sidebar));
sidebar->popup_menu = NULL;
- sidebar->popup_menu_add_shortcut_item = NULL;
- sidebar->popup_menu_remove_item = NULL;
- sidebar->popup_menu_rename_item = NULL;
- sidebar->popup_menu_separator_item = NULL;
- sidebar->popup_menu_mount_item = NULL;
- sidebar->popup_menu_unmount_item = NULL;
- sidebar->popup_menu_eject_item = NULL;
- sidebar->popup_menu_rescan_item = NULL;
- sidebar->popup_menu_start_item = NULL;
- sidebar->popup_menu_stop_item = NULL;
- sidebar->popup_menu_empty_trash_item = NULL;
- sidebar->popup_menu_properties_separator_item = NULL;
- sidebar->popup_menu_properties_item = NULL;
}
-
static void
check_unmount_and_eject (GMount *mount,
GVolume *volume,
@@ -1786,8 +1755,25 @@ check_visibility (GMount *mount,
}
}
+typedef struct {
+ GtkWidget *open_in_new_tab_item;
+ GtkWidget *add_shortcut_item;
+ GtkWidget *remove_item;
+ GtkWidget *rename_item;
+ GtkWidget *separator_item;
+ GtkWidget *mount_item;
+ GtkWidget *unmount_item;
+ GtkWidget *eject_item;
+ GtkWidget *rescan_item;
+ GtkWidget *empty_trash_item;
+ GtkWidget *start_item;
+ GtkWidget *stop_item;
+ GtkWidget *properties_separator_item;
+ GtkWidget *properties_item;
+} PopupMenuData;
+
static void
-check_popup_sensitivity (GtkPlacesSidebar *sidebar)
+check_popup_sensitivity (GtkPlacesSidebar *sidebar, PopupMenuData *data)
{
GtkTreeIter iter;
PlaceType type;
@@ -1807,10 +1793,6 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar)
type = PLACES_BUILT_IN;
- if (sidebar->popup_menu == NULL) {
- return;
- }
-
if (get_selected_iter (sidebar, &iter)) {
gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter,
PLACES_SIDEBAR_COLUMN_ROW_TYPE, &type,
@@ -1821,11 +1803,11 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar)
-1);
}
- gtk_widget_set_visible (sidebar->popup_menu_add_shortcut_item, (type == PLACES_MOUNTED_VOLUME));
+ gtk_widget_set_visible (data->add_shortcut_item, (type == PLACES_MOUNTED_VOLUME));
- gtk_widget_set_sensitive (sidebar->popup_menu_remove_item, (type == PLACES_BOOKMARK));
- gtk_widget_set_sensitive (sidebar->popup_menu_rename_item, (type == PLACES_BOOKMARK));
- gtk_widget_set_sensitive (sidebar->popup_menu_empty_trash_item, sidebar->trash_is_full);
+ gtk_widget_set_sensitive (data->remove_item, (type == PLACES_BOOKMARK));
+ gtk_widget_set_sensitive (data->rename_item, (type == PLACES_BOOKMARK));
+ gtk_widget_set_sensitive (data->empty_trash_item, sidebar->trash_is_full);
check_visibility (mount, volume, drive,
&show_mount, &show_unmount, &show_eject, &show_rescan, &show_start, &show_stop);
@@ -1847,40 +1829,40 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar)
} else
show_properties = FALSE;
- gtk_widget_set_visible (sidebar->popup_menu_separator_item,
+ gtk_widget_set_visible (data->separator_item,
show_mount || show_unmount || show_eject || show_empty_trash);
- gtk_widget_set_visible (sidebar->popup_menu_mount_item, show_mount);
- gtk_widget_set_visible (sidebar->popup_menu_unmount_item, show_unmount);
- gtk_widget_set_visible (sidebar->popup_menu_eject_item, show_eject);
- gtk_widget_set_visible (sidebar->popup_menu_rescan_item, show_rescan);
- gtk_widget_set_visible (sidebar->popup_menu_start_item, show_start);
- gtk_widget_set_visible (sidebar->popup_menu_stop_item, show_stop);
- gtk_widget_set_visible (sidebar->popup_menu_empty_trash_item, show_empty_trash);
- gtk_widget_set_visible (sidebar->popup_menu_properties_separator_item, show_properties);
- gtk_widget_set_visible (sidebar->popup_menu_properties_item, show_properties);
+ gtk_widget_set_visible (data->mount_item, show_mount);
+ gtk_widget_set_visible (data->unmount_item, show_unmount);
+ gtk_widget_set_visible (data->eject_item, show_eject);
+ gtk_widget_set_visible (data->rescan_item, show_rescan);
+ gtk_widget_set_visible (data->start_item, show_start);
+ gtk_widget_set_visible (data->stop_item, show_stop);
+ gtk_widget_set_visible (data->empty_trash_item, show_empty_trash);
+ gtk_widget_set_visible (data->properties_separator_item, show_properties);
+ gtk_widget_set_visible (data->properties_item, show_properties);
/* Adjust start/stop items to reflect the type of the drive */
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Start"));
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Stop"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Start"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Stop"));
if ((show_start || show_stop) && drive != NULL) {
switch (g_drive_get_start_stop_type (drive)) {
case G_DRIVE_START_STOP_TYPE_SHUTDOWN:
/* start() for type G_DRIVE_START_STOP_TYPE_SHUTDOWN is normally not used */
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Power On"));
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Safely Remove Drive"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Power On"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Safely Remove Drive"));
break;
case G_DRIVE_START_STOP_TYPE_NETWORK:
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Connect Drive"));
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Disconnect Drive"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Connect Drive"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Disconnect Drive"));
break;
case G_DRIVE_START_STOP_TYPE_MULTIDISK:
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Start Multi-disk Device"));
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Stop Multi-disk Device"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Start Multi-disk Device"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Stop Multi-disk Device"));
break;
case G_DRIVE_START_STOP_TYPE_PASSWORD:
/* stop() for type G_DRIVE_START_STOP_TYPE_PASSWORD is normally not used */
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Unlock Drive"));
- gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_stop_item), _("_Lock Drive"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->start_item), _("_Unlock Drive"));
+ gtk_menu_item_set_label (GTK_MENU_ITEM (data->stop_item), _("_Lock Drive"));
break;
default:
@@ -1894,14 +1876,6 @@ check_popup_sensitivity (GtkPlacesSidebar *sidebar)
g_free (uri);
}
-/* Callback used when the selection in the shortcuts tree changes */
-static void
-bookmarks_selection_changed_cb (GtkTreeSelection *selection,
- GtkPlacesSidebar *sidebar)
-{
- check_popup_sensitivity (sidebar);
-}
-
static void
drive_start_from_bookmark_cb (GObject *source_object,
GAsyncResult *res,
@@ -2892,16 +2866,13 @@ append_menu_separator (GtkMenu *menu)
static void
bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
{
+ PopupMenuData menu_data;
GtkWidget *item;
- if (sidebar->popup_menu) {
- return;
- }
-
sidebar->popup_menu = gtk_menu_new ();
gtk_menu_attach_to_widget (GTK_MENU (sidebar->popup_menu),
- GTK_WIDGET (sidebar),
- bookmarks_popup_menu_detach_cb);
+ GTK_WIDGET (sidebar),
+ bookmarks_popup_menu_detach_cb);
item = gtk_image_menu_item_new_with_mnemonic (_("_Open"));
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item),
@@ -2912,7 +2883,7 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
item = gtk_menu_item_new_with_mnemonic (_("Open in New _Tab"));
- sidebar->popup_menu_open_in_new_tab_item = item;
+ menu_data.open_in_new_tab_item = item;
g_signal_connect (item, "activate",
G_CALLBACK (open_shortcut_in_new_tab_cb), sidebar);
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
@@ -2933,68 +2904,68 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
append_menu_separator (GTK_MENU (sidebar->popup_menu));
item = gtk_menu_item_new_with_mnemonic (_("_Add Bookmark"));
- sidebar->popup_menu_add_shortcut_item = item;
+ menu_data.add_shortcut_item = item;
g_signal_connect (item, "activate",
G_CALLBACK (add_shortcut_cb), sidebar);
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
item = gtk_image_menu_item_new_with_label (_("Remove"));
- sidebar->popup_menu_remove_item = item;
+ menu_data.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));
+ gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU));
g_signal_connect (item, "activate",
- G_CALLBACK (remove_shortcut_cb), sidebar);
+ G_CALLBACK (remove_shortcut_cb), 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;
+ menu_data.rename_item = item;
g_signal_connect (item, "activate",
- G_CALLBACK (rename_shortcut_cb), sidebar);
+ G_CALLBACK (rename_shortcut_cb), sidebar);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
/* Mount/Unmount/Eject menu items */
- sidebar->popup_menu_separator_item = GTK_WIDGET (append_menu_separator (GTK_MENU (sidebar->popup_menu)));
+ menu_data.separator_item = GTK_WIDGET (append_menu_separator (GTK_MENU (sidebar->popup_menu)));
item = gtk_menu_item_new_with_mnemonic (_("_Mount"));
- sidebar->popup_menu_mount_item = item;
+ menu_data.mount_item = item;
g_signal_connect (item, "activate",
- G_CALLBACK (mount_shortcut_cb), sidebar);
+ G_CALLBACK (mount_shortcut_cb), sidebar);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
item = gtk_menu_item_new_with_mnemonic (_("_Unmount"));
- sidebar->popup_menu_unmount_item = item;
+ menu_data.unmount_item = item;
g_signal_connect (item, "activate",
- G_CALLBACK (unmount_shortcut_cb), sidebar);
+ G_CALLBACK (unmount_shortcut_cb), sidebar);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
item = gtk_menu_item_new_with_mnemonic (_("_Eject"));
- sidebar->popup_menu_eject_item = item;
+ menu_data.eject_item = item;
g_signal_connect (item, "activate",
- G_CALLBACK (eject_shortcut_cb), sidebar);
+ G_CALLBACK (eject_shortcut_cb), sidebar);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
item = gtk_menu_item_new_with_mnemonic (_("_Detect Media"));
- sidebar->popup_menu_rescan_item = item;
+ menu_data.rescan_item = item;
g_signal_connect (item, "activate",
- G_CALLBACK (rescan_shortcut_cb), sidebar);
+ G_CALLBACK (rescan_shortcut_cb), sidebar);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
item = gtk_menu_item_new_with_mnemonic (_("_Start"));
- sidebar->popup_menu_start_item = item;
+ menu_data.start_item = item;
g_signal_connect (item, "activate",
G_CALLBACK (start_shortcut_cb), sidebar);
gtk_widget_show (item);
gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item);
item = gtk_menu_item_new_with_mnemonic (_("_Stop"));
- sidebar->popup_menu_stop_item = item;
+ menu_data.stop_item = item;
g_signal_connect (item, "activate",
G_CALLBACK (stop_shortcut_cb), sidebar);
gtk_widget_show (item);
@@ -3003,7 +2974,7 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
/* Empty Trash menu item */
item = gtk_menu_item_new_with_mnemonic (_("Empty _Trash"));
- sidebar->popup_menu_empty_trash_item = item;
+ menu_data.empty_trash_item = item;
g_signal_connect (item, "activate",
G_CALLBACK (empty_trash_cb), sidebar);
gtk_widget_show (item);
@@ -3011,10 +2982,10 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
/* Properties menu item */
- sidebar->popup_menu_properties_separator_item = GTK_WIDGET (append_menu_separator (GTK_MENU (sidebar->popup_menu)));
+ menu_data.properties_separator_item = GTK_WIDGET (append_menu_separator (GTK_MENU (sidebar->popup_menu)));
item = gtk_menu_item_new_with_mnemonic (_("_Properties"));
- sidebar->popup_menu_properties_item = item;
+ menu_data.properties_item = item;
g_signal_connect (item, "activate",
G_CALLBACK (properties_cb), sidebar);
gtk_widget_show (item);
@@ -3022,13 +2993,7 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar)
/* Update everything! */
- check_popup_sensitivity (sidebar);
-}
-
-static void
-bookmarks_update_popup_menu (GtkPlacesSidebar *sidebar)
-{
- bookmarks_build_popup_menu (sidebar);
+ check_popup_sensitivity (sidebar, &menu_data);
}
static void
@@ -3037,7 +3002,10 @@ bookmarks_popup_menu (GtkPlacesSidebar *sidebar,
{
int button;
- bookmarks_update_popup_menu (sidebar);
+ if (sidebar->popup_menu)
+ gtk_widget_destroy (sidebar->popup_menu);
+
+ bookmarks_build_popup_menu (sidebar);
/* The event button needs to be 0 if we're popping up this menu from
* a button release, else a 2nd click outside the menu with any button
@@ -3060,8 +3028,6 @@ bookmarks_popup_menu (GtkPlacesSidebar *sidebar,
NULL, /* popup_position_user_data */
button, /* button */
event ? event->time : gtk_get_current_event_time ()); /* activate_time */
-
- g_object_ref_sink (sidebar->popup_menu); /* FIXME: is this right? It was gtk_object_sink() */
}
/* Callback used for the GtkWidget::popup-menu signal of the shortcuts list */
@@ -3615,8 +3581,6 @@ gtk_places_sidebar_init (GtkPlacesSidebar *sidebar)
g_signal_connect (tree_view, "drag-drop",
G_CALLBACK (drag_drop_callback), sidebar);
- g_signal_connect (selection, "changed",
- G_CALLBACK (bookmarks_selection_changed_cb), sidebar);
g_signal_connect (tree_view, "popup-menu",
G_CALLBACK (bookmarks_popup_menu_cb), sidebar);
g_signal_connect (tree_view, "button-release-event",
@@ -3655,6 +3619,11 @@ gtk_places_sidebar_dispose (GObject *object)
sidebar->bookmarks_manager = NULL;
}
+ if (sidebar->popup_menu) {
+ gtk_widget_destroy (sidebar->popup_menu);
+ sidebar->popup_menu = NULL;
+ }
+
g_clear_object (&sidebar->store);
g_slist_free_full (sidebar->shortcuts, g_object_unref);
@@ -3966,7 +3935,6 @@ gtk_places_sidebar_set_multiple_tabs_supported (GtkPlacesSidebar *sidebar, gbool
g_return_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar));
sidebar->multiple_tabs_supported = !!supported;
- bookmarks_popup_menu_detach_cb (GTK_WIDGET (sidebar), NULL);
}
/**
@@ -3985,7 +3953,6 @@ gtk_places_sidebar_set_multiple_windows_supported (GtkPlacesSidebar *sidebar, gb
g_return_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar));
sidebar->multiple_windows_supported = !!supported;
- bookmarks_popup_menu_detach_cb (GTK_WIDGET (sidebar), NULL);
}
/**
@@ -4012,7 +3979,6 @@ gtk_places_sidebar_set_show_properties (GtkPlacesSidebar *sidebar, gboolean show
g_return_if_fail (GTK_IS_PLACES_SIDEBAR (sidebar));
sidebar->show_properties = !!show_properties;
- check_popup_sensitivity (sidebar);
}
void
@@ -4031,7 +3997,6 @@ gtk_places_sidebar_set_trash_is_full (GtkPlacesSidebar *sidebar, gboolean is_ful
sidebar->trash_is_full = !!is_full;
update_places (sidebar);
- check_popup_sensitivity (sidebar);
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]