diff options
author | António Fernandes <antoniof@gnome.org> | 2021-12-16 15:25:45 +0000 |
---|---|---|
committer | António Fernandes <antoniof@gnome.org> | 2022-01-01 22:04:06 +0000 |
commit | 9913da2dabc5a803acf12e169718445bbdb79bbf (patch) | |
tree | 7e72096dc55f3430b1eee03df616a91863e01e6e | |
parent | 8ee5ad912af515e720c4fab5ff42e83d88b6b2d8 (diff) | |
download | nautilus-9913da2dabc5a803acf12e169718445bbdb79bbf.tar.gz |
toolbar: Use popovers for history menus
GtkMenu is gone in GTK 4.
-rw-r--r-- | src/nautilus-bookmark.c | 26 | ||||
-rw-r--r-- | src/nautilus-bookmark.h | 5 | ||||
-rw-r--r-- | src/nautilus-toolbar.c | 94 | ||||
-rw-r--r-- | src/nautilus-window.c | 30 | ||||
-rw-r--r-- | src/resources/ui/nautilus-toolbar.ui | 8 |
5 files changed, 64 insertions, 99 deletions
diff --git a/src/nautilus-bookmark.c b/src/nautilus-bookmark.c index 083c59dc3..ba56a97e5 100644 --- a/src/nautilus-bookmark.c +++ b/src/nautilus-bookmark.c @@ -53,8 +53,6 @@ enum NUM_PROPERTIES }; -#define ELLIPSISED_MENU_ITEM_MIN_CHARS 32 - static GParamSpec *properties[NUM_PROPERTIES] = { NULL }; static guint signals[LAST_SIGNAL]; @@ -807,30 +805,6 @@ nautilus_bookmark_new (GFile *location, return new_bookmark; } -/** - * nautilus_bookmark_menu_item_new: - * - * Return a menu item representing a bookmark. - * @bookmark: The bookmark the menu item represents. - * Return value: A newly-created bookmark, not yet shown. - **/ -GtkWidget * -nautilus_bookmark_menu_item_new (NautilusBookmark *bookmark) -{ - GtkWidget *menu_item; - GtkLabel *label; - const char *name; - - name = nautilus_bookmark_get_name (bookmark); - menu_item = gtk_menu_item_new_with_label (name); - label = GTK_LABEL (gtk_bin_get_child (GTK_BIN (menu_item))); - gtk_label_set_use_underline (label, FALSE); - gtk_label_set_ellipsize (label, PANGO_ELLIPSIZE_END); - gtk_label_set_max_width_chars (label, ELLIPSISED_MENU_ITEM_MIN_CHARS); - - return menu_item; -} - void nautilus_bookmark_set_scroll_pos (NautilusBookmark *bookmark, const char *uri) diff --git a/src/nautilus-bookmark.h b/src/nautilus-bookmark.h index ae03bbe88..6bf38526e 100644 --- a/src/nautilus-bookmark.h +++ b/src/nautilus-bookmark.h @@ -51,7 +51,4 @@ void nautilus_bookmark_set_scroll_pos (NautilusBookmark const char *uri); char * nautilus_bookmark_get_scroll_pos (NautilusBookmark *bookmark); -/* Helper functions for displaying bookmarks */ -GtkWidget * nautilus_bookmark_menu_item_new (NautilusBookmark *bookmark); - -G_END_DECLS
\ No newline at end of file +G_END_DECLS diff --git a/src/nautilus-toolbar.c b/src/nautilus-toolbar.c index 2f1987d75..d507eabfc 100644 --- a/src/nautilus-toolbar.c +++ b/src/nautilus-toolbar.c @@ -91,10 +91,12 @@ struct _NautilusToolbar GtkWidget *operations_icon; GtkWidget *forward_button; + GtkWidget *forward_menu; GtkGesture *forward_button_longpress_gesture; GtkGesture *forward_button_multi_press_gesture; GtkWidget *back_button; + GtkWidget *back_menu; GtkGesture *back_button_longpress_gesture; GtkGesture *back_button_multi_press_gesture; @@ -153,41 +155,13 @@ toolbar_update_appearance (NautilusToolbar *self) } static void -activate_back_or_forward_menu_item (GtkMenuItem *menu_item, - NautilusWindowSlot *window_slot, - gboolean back) -{ - int index; - - g_assert (GTK_IS_MENU_ITEM (menu_item)); - - index = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item), "user_data")); - - nautilus_window_slot_back_or_forward (window_slot, back, index); -} - -static void -activate_back_menu_item_callback (GtkMenuItem *menu_item, - NautilusToolbar *self) -{ - activate_back_or_forward_menu_item (menu_item, self->window_slot, TRUE); -} - -static void -activate_forward_menu_item_callback (GtkMenuItem *menu_item, - NautilusToolbar *self) -{ - activate_back_or_forward_menu_item (menu_item, self->window_slot, FALSE); -} - -static void fill_menu (NautilusToolbar *self, - GtkWidget *menu, + GMenu *menu, gboolean back) { - GtkWidget *menu_item; - int index; + guint index; GList *list; + const gchar *name; list = back ? nautilus_window_slot_get_back_history (self->window_slot) : nautilus_window_slot_get_forward_history (self->window_slot); @@ -195,16 +169,15 @@ fill_menu (NautilusToolbar *self, index = 0; while (list != NULL) { - menu_item = nautilus_bookmark_menu_item_new (NAUTILUS_BOOKMARK (list->data)); - g_object_set_data (G_OBJECT (menu_item), "user_data", GINT_TO_POINTER (index)); - gtk_widget_show (GTK_WIDGET (menu_item)); - g_signal_connect_object (menu_item, "activate", - back - ? G_CALLBACK (activate_back_menu_item_callback) - : G_CALLBACK (activate_forward_menu_item_callback), - self, 0); - - gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + g_autoptr (GMenuItem) item = NULL; + + name = nautilus_bookmark_get_name (NAUTILUS_BOOKMARK (list->data)); + item = g_menu_item_new (name, NULL); + g_menu_item_set_action_and_target (item, + back ? "win.back-n" : "win.forward-n", + "u", index); + g_menu_append_item (menu, item); + list = g_list_next (list); ++index; } @@ -212,13 +185,13 @@ fill_menu (NautilusToolbar *self, static void show_menu (NautilusToolbar *self, - GtkWidget *widget, - const GdkEvent *event) + GtkWidget *widget) { - GtkWidget *menu; + g_autoptr (GMenu) menu = NULL; NautilusNavigationDirection direction; + GtkPopover *popover; - menu = gtk_menu_new (); + menu = g_menu_new (); direction = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget), "nav-direction")); @@ -228,12 +201,14 @@ show_menu (NautilusToolbar *self, case NAUTILUS_NAVIGATION_DIRECTION_FORWARD: { fill_menu (self, menu, FALSE); + popover = GTK_POPOVER (self->forward_menu); } break; case NAUTILUS_NAVIGATION_DIRECTION_BACK: { fill_menu (self, menu, TRUE); + popover = GTK_POPOVER (self->back_menu); } break; @@ -244,11 +219,8 @@ show_menu (NautilusToolbar *self, break; } - gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (self->window), NULL); - gtk_menu_popup_at_widget (GTK_MENU (menu), widget, - GDK_GRAVITY_SOUTH_WEST, - GDK_GRAVITY_NORTH_WEST, - event); + gtk_popover_bind_model (popover, G_MENU_MODEL (menu), NULL); + gtk_popover_popup (popover); } static void @@ -260,15 +232,11 @@ navigation_button_press_cb (GtkGestureMultiPress *gesture, { NautilusToolbar *self; GtkWidget *widget; - GdkEventSequence *sequence; - const GdkEvent *event; self = NAUTILUS_TOOLBAR (user_data); widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)); - sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); - event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); - show_menu (self, widget, event); + show_menu (self, widget); } static void @@ -278,13 +246,8 @@ back_button_longpress_cb (GtkGestureLongPress *gesture, gpointer user_data) { NautilusToolbar *self = user_data; - GdkEventSequence *sequence; - const GdkEvent *event; - sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); - event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); - - show_menu (self, self->back_button, event); + show_menu (self, self->back_button); } static void @@ -294,13 +257,8 @@ forward_button_longpress_cb (GtkGestureLongPress *gesture, gpointer user_data) { NautilusToolbar *self = user_data; - GdkEventSequence *sequence; - const GdkEvent *event; - - sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); - event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); - show_menu (self, self->forward_button, event); + show_menu (self, self->forward_button); } static gboolean @@ -1178,7 +1136,9 @@ nautilus_toolbar_class_init (NautilusToolbarClass *klass) gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, view_toggle_icon); gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, app_menu); gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, back_button); + gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, back_menu); gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, forward_button); + gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, forward_menu); gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, toolbar_switcher); gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, search_container); gtk_widget_class_bind_template_child (widget_class, NautilusToolbar, path_bar_container); diff --git a/src/nautilus-window.c b/src/nautilus-window.c index 56404b571..38ef5e99e 100644 --- a/src/nautilus-window.c +++ b/src/nautilus-window.c @@ -294,6 +294,26 @@ action_forward (GSimpleAction *action, } static void +action_back_n (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + nautilus_window_back_or_forward (NAUTILUS_WINDOW (user_data), + TRUE, + g_variant_get_uint32 (parameter)); +} + +static void +action_forward_n (GSimpleAction *action, + GVariant *parameter, + gpointer user_data) +{ + nautilus_window_back_or_forward (NAUTILUS_WINDOW (user_data), + FALSE, + g_variant_get_uint32 (parameter)); +} + +static void action_bookmark_current_location (GSimpleAction *action, GVariant *state, gpointer user_data) @@ -1431,12 +1451,16 @@ nautilus_window_sync_location_widgets (NautilusWindow *window) nautilus_path_bar_set_path (NAUTILUS_PATH_BAR (path_bar), location); } - action = g_action_map_lookup_action (G_ACTION_MAP (window), "back"); enabled = nautilus_window_slot_get_back_history (slot) != NULL; + action = g_action_map_lookup_action (G_ACTION_MAP (window), "back"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled); + action = g_action_map_lookup_action (G_ACTION_MAP (window), "back-n"); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled); - action = g_action_map_lookup_action (G_ACTION_MAP (window), "forward"); enabled = nautilus_window_slot_get_forward_history (slot) != NULL; + action = g_action_map_lookup_action (G_ACTION_MAP (window), "forward"); + g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled); + action = g_action_map_lookup_action (G_ACTION_MAP (window), "forward-n"); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), enabled); nautilus_window_sync_bookmarks (window); @@ -1933,6 +1957,8 @@ const GActionEntry win_entries[] = { { "back", action_back }, { "forward", action_forward }, + { "back-n", action_back_n, "u" }, + { "forward-n", action_forward_n, "u" }, { "up", action_up }, { "view-menu", action_toggle_state_view_button, NULL, "false", NULL }, { "current-location-menu", action_show_current_location_menu }, diff --git a/src/resources/ui/nautilus-toolbar.ui b/src/resources/ui/nautilus-toolbar.ui index 09145eac3..16eebcfa1 100644 --- a/src/resources/ui/nautilus-toolbar.ui +++ b/src/resources/ui/nautilus-toolbar.ui @@ -2,6 +2,14 @@ <!-- Generated with glade 3.22.0 --> <interface> <requires lib="gtk+" version="3.22"/> + <object class="GtkPopover" id="back_menu"> + <property name="position">bottom</property> + <property name="relative-to">back_button</property> + </object> + <object class="GtkPopover" id="forward_menu"> + <property name="position">bottom</property> + <property name="relative-to">forward_button</property> + </object> <object class="GtkPopoverMenu" id="app_menu"> <property name="can_focus">False</property> <child> |