[nautilus/wip/antoniof/flow-box-preparation: 12/14] view-icon-controller: Don't set selection when not needed




commit 100571ee1743979e45b2e58d75f7c15eba90a4c3
Author: António Fernandes <antoniof gnome org>
Date:   Thu Dec 9 12:09:37 2021 +0000

    view-icon-controller: Don't set selection when not needed
    
    Let GtkFlowBox handle it for us whenever possible.
    
    Document the case where GtkFlowBox doesn't do what we need.
    
    This also fixes a memory leak, where we reassign the selection variable
    to another GList without freeing the first.

 src/nautilus-view-icon-controller.c | 67 ++++++++++++++++---------------------
 1 file changed, 28 insertions(+), 39 deletions(-)
---
diff --git a/src/nautilus-view-icon-controller.c b/src/nautilus-view-icon-controller.c
index 2e0cac0f4..a864c029a 100644
--- a/src/nautilus-view-icon-controller.c
+++ b/src/nautilus-view-icon-controller.c
@@ -711,7 +711,7 @@ on_button_press_event (GtkGestureMultiPress *gesture,
     guint button;
     GdkEventSequence *sequence;
     const GdkEvent *event;
-    g_autolist (NautilusFile) selection = NULL;
+    GdkModifierType modifiers = 0;
     gint view_x;
     gint view_y;
     GtkWidget *child_at_pos;
@@ -720,9 +720,11 @@ on_button_press_event (GtkGestureMultiPress *gesture,
     button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
     sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
     event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
-
-    /* Need to update the selection so the popup has the right actions enabled */
-    selection = nautilus_view_get_selection (NAUTILUS_VIEW (self));
+#if GTK_MAJOR_VERSION < 4
+    gtk_get_current_event_state (&modifiers);
+#else
+    modifiers = gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (gesture));
+#endif
 
     gtk_widget_translate_coordinates (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)),
                                       GTK_WIDGET (self->view_ui),
@@ -731,23 +733,32 @@ on_button_press_event (GtkGestureMultiPress *gesture,
                                                               view_x, view_y));
     if (child_at_pos != NULL)
     {
-        NautilusFile *selected_file;
-        NautilusViewItemModel *item_model;
+        gboolean selection_mode;
 
-        item_model = nautilus_view_icon_item_ui_get_model (NAUTILUS_VIEW_ICON_ITEM_UI (child_at_pos));
-        selected_file = nautilus_view_item_model_get_file (item_model);
-        if (g_list_find (selection, selected_file) == NULL)
-        {
-            g_list_foreach (selection, (GFunc) g_object_unref, NULL);
-            selection = g_list_append (NULL, g_object_ref (selected_file));
-        }
-        else
+        selection_mode = (modifiers & (GDK_CONTROL_MASK | GDK_SHIFT_MASK));
+
+        /* GtkFlowBox changes selection only with the primary button, but we
+         * need that to happen with all buttons, otherwise e.g. opening context
+         * menus would require two clicks: a primary click to select the item,
+         * followed by a secondary click to open the menu.
+         * When holding Ctrl and Shift, GtkFlowBox does a good job, let's not
+         * interfere in that case. */
+        if (!selection_mode)
         {
-            selection = g_list_prepend (selection, g_object_ref (selected_file));
+            NautilusFile *selected_file;
+            NautilusViewItemModel *item_model;
+            g_autolist (NautilusFile) selection = NULL;
+
+            item_model = nautilus_view_icon_item_ui_get_model (NAUTILUS_VIEW_ICON_ITEM_UI (child_at_pos));
+            selected_file = nautilus_view_item_model_get_file (item_model);
+            selection = nautilus_view_get_selection (NAUTILUS_VIEW (self));
+            if (g_list_find (selection, selected_file) == NULL)
+            {
+                nautilus_view_set_selection (NAUTILUS_VIEW (self),
+                                             &(GList){selected_file});
+            }
         }
 
-        nautilus_view_set_selection (NAUTILUS_VIEW (self), selection);
-
         if (button == GDK_BUTTON_SECONDARY)
         {
             nautilus_files_view_pop_up_selection_context_menu (NAUTILUS_FILES_VIEW (self),
@@ -772,7 +783,6 @@ on_longpress_gesture_pressed_callback (GtkGestureLongPress *gesture,
                                        gpointer             user_data)
 {
     NautilusViewIconController *self;
-    g_autoptr (GList) selection = NULL;
     GtkWidget *child_at_pos;
     GdkEventSequence *event_sequence;
     GdkEvent *event;
@@ -784,8 +794,6 @@ on_longpress_gesture_pressed_callback (GtkGestureLongPress *gesture,
 
     self = NAUTILUS_VIEW_ICON_CONTROLLER (user_data);
 
-    /* Need to update the selection so the popup has the right actions enabled */
-    selection = nautilus_view_get_selection (NAUTILUS_VIEW (self));
     gtk_widget_translate_coordinates (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture)),
                                       GTK_WIDGET (self->view_ui),
                                       x, y, &view_x, &view_y);
@@ -793,23 +801,6 @@ on_longpress_gesture_pressed_callback (GtkGestureLongPress *gesture,
                                                               view_x, view_y));
     if (child_at_pos != NULL)
     {
-        NautilusFile *selected_file;
-        NautilusViewItemModel *item_model;
-
-        item_model = nautilus_view_icon_item_ui_get_model (NAUTILUS_VIEW_ICON_ITEM_UI (child_at_pos));
-        selected_file = nautilus_view_item_model_get_file (item_model);
-        if (g_list_find (selection, selected_file) == NULL)
-        {
-            g_list_foreach (selection, (GFunc) g_object_unref, NULL);
-            selection = g_list_append (NULL, g_object_ref (selected_file));
-        }
-        else
-        {
-            selection = g_list_prepend (selection, g_object_ref (selected_file));
-        }
-
-        nautilus_view_set_selection (NAUTILUS_VIEW (self), selection);
-
         nautilus_files_view_pop_up_selection_context_menu (NAUTILUS_FILES_VIEW (self),
                                                            event);
     }
@@ -819,8 +810,6 @@ on_longpress_gesture_pressed_callback (GtkGestureLongPress *gesture,
         nautilus_files_view_pop_up_background_context_menu (NAUTILUS_FILES_VIEW (self),
                                                             event);
     }
-
-    g_list_foreach (selection, (GFunc) g_object_unref, NULL);
 }
 
 static int


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]