[gnome-flashback] desktop: unselect icons on button release



commit 28655b87a462d9f20512d595363c55542d3fdd24
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sat Nov 23 23:01:52 2019 +0200

    desktop: unselect icons on button release

 gnome-flashback/libdesktop/gf-icon.c | 60 +++++++++++++++++++++++++++++++++---
 1 file changed, 55 insertions(+), 5 deletions(-)
---
diff --git a/gnome-flashback/libdesktop/gf-icon.c b/gnome-flashback/libdesktop/gf-icon.c
index a5887b0..085691d 100644
--- a/gnome-flashback/libdesktop/gf-icon.c
+++ b/gnome-flashback/libdesktop/gf-icon.c
@@ -47,6 +47,7 @@ typedef struct
   GtkWidget       *label;
 
   gboolean         selected;
+  gboolean         did_select;
 
   GDesktopAppInfo *app_info;
 
@@ -453,13 +454,11 @@ multi_press_pressed_cb (GtkGestureMultiPress *gesture,
 
   if (button == GDK_BUTTON_PRIMARY)
     {
-      if (!control_pressed && !shift_pressed)
+      if (!priv->selected && !control_pressed && !shift_pressed)
         gf_icon_view_clear_selection (priv->icon_view);
 
-      if (control_pressed || shift_pressed)
-        gf_icon_set_selected (self, !priv->selected);
-      else
-        gf_icon_set_selected (self, TRUE);
+      priv->did_select = !priv->selected;
+      gf_icon_set_selected (self, TRUE);
 
       if (!control_pressed && n_press == 2)
         gf_icon_open (self);
@@ -479,6 +478,53 @@ multi_press_pressed_cb (GtkGestureMultiPress *gesture,
     }
 }
 
+static void
+multi_press_released_cb (GtkGestureMultiPress *gesture,
+                         gint                  n_press,
+                         gdouble               x,
+                         gdouble               y,
+                         GfIcon               *self)
+{
+  GfIconPrivate *priv;
+  guint button;
+  GdkEventSequence *sequence;
+  const GdkEvent *event;
+  GdkModifierType state;
+  gboolean control_pressed;
+  gboolean shift_pressed;
+
+  priv = gf_icon_get_instance_private (self);
+
+  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);
+
+  if (event == NULL)
+    return;
+
+  gdk_event_get_state (event, &state);
+
+  control_pressed = (state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK;
+  shift_pressed = (state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK;
+
+  if (button == GDK_BUTTON_PRIMARY)
+    {
+      if (!control_pressed && !shift_pressed)
+        {
+          gboolean was_selected;
+
+          was_selected = priv->selected;
+
+          gf_icon_view_clear_selection (priv->icon_view);
+          gf_icon_set_selected (self, was_selected);
+        }
+      else if (control_pressed && !priv->did_select)
+        {
+          gf_icon_set_selected (self, FALSE);
+        }
+    }
+}
+
 static cairo_surface_t *
 get_thumbnail_surface (GfIcon *self)
 {
@@ -1093,6 +1139,10 @@ gf_icon_init (GfIcon *self)
                     G_CALLBACK (multi_press_pressed_cb),
                     self);
 
+  g_signal_connect (priv->multi_press, "released",
+                    G_CALLBACK (multi_press_released_cb),
+                    self);
+
   gtk_widget_set_focus_on_click (GTK_WIDGET (self), FALSE);
 
   box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);


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