[gtk+] iconview: Stop using ::button-{press,release}-event
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] iconview: Stop using ::button-{press,release}-event
- Date: Thu, 14 Sep 2017 08:01:14 +0000 (UTC)
commit c8efb575f814bfbfe2e81eb2afe2774aeb8b4b01
Author: Timm Bäder <mail baedert org>
Date: Wed Sep 13 17:58:45 2017 +0200
iconview: Stop using ::button-{press,release}-event
Use a gesture instead.
gtk/gtkiconview.c | 85 +++++++++++++++++++++++++++------------------
gtk/gtkiconviewprivate.h | 3 ++
2 files changed, 54 insertions(+), 34 deletions(-)
---
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index c7ae2a3..5b0d536 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -160,10 +160,16 @@ static gboolean gtk_icon_view_motion (GtkWidget
GdkEventMotion *event);
static gboolean gtk_icon_view_leave (GtkWidget *widget,
GdkEventCrossing *event);
-static gboolean gtk_icon_view_button_press (GtkWidget *widget,
- GdkEventButton *event);
-static gboolean gtk_icon_view_button_release (GtkWidget *widget,
- GdkEventButton *event);
+static void gtk_icon_view_button_press (GtkGestureMultiPress *gesture,
+ int n_press,
+ double x,
+ double y,
+ gpointer user_data);
+static void gtk_icon_view_button_release (GtkGestureMultiPress *gesture,
+ int n_press,
+ double x,
+ double y,
+ gpointer user_data);
static gboolean gtk_icon_view_key_press (GtkWidget *widget,
GdkEventKey *event);
static gboolean gtk_icon_view_key_release (GtkWidget *widget,
@@ -355,8 +361,6 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
widget_class->snapshot = gtk_icon_view_snapshot;
widget_class->motion_notify_event = gtk_icon_view_motion;
widget_class->leave_notify_event = gtk_icon_view_leave;
- widget_class->button_press_event = gtk_icon_view_button_press;
- widget_class->button_release_event = gtk_icon_view_button_release;
widget_class->key_press_event = gtk_icon_view_key_press;
widget_class->key_release_event = gtk_icon_view_key_release;
widget_class->drag_begin = gtk_icon_view_drag_begin;
@@ -972,6 +976,12 @@ gtk_icon_view_init (GtkIconView *icon_view)
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (icon_view)),
GTK_STYLE_CLASS_VIEW);
+
+ icon_view->priv->press_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (icon_view));
+ g_signal_connect (icon_view->priv->press_gesture, "pressed", G_CALLBACK (gtk_icon_view_button_press),
+ icon_view);
+ g_signal_connect (icon_view->priv->press_gesture, "released", G_CALLBACK (gtk_icon_view_button_release),
+ icon_view);
}
/* GObject methods */
@@ -1020,6 +1030,8 @@ gtk_icon_view_dispose (GObject *object)
priv->cell_area = NULL;
}
+ g_clear_object (&priv->press_gesture);
+
G_OBJECT_CLASS (gtk_icon_view_parent_class)->dispose (object);
}
@@ -2095,21 +2107,26 @@ gtk_icon_view_get_cursor (GtkIconView *icon_view,
return (item != NULL);
}
-static gboolean
-gtk_icon_view_button_press (GtkWidget *widget,
- GdkEventButton *event)
+static void
+gtk_icon_view_button_press (GtkGestureMultiPress *gesture,
+ int n_press,
+ double x,
+ double y,
+ gpointer user_data)
{
- GtkIconView *icon_view;
+ GtkIconView *icon_view = user_data;
+ GtkWidget *widget = GTK_WIDGET (icon_view);
GtkIconViewItem *item;
gboolean dirty = FALSE;
GtkCellRenderer *cell = NULL, *cursor_cell = NULL;
-
- icon_view = GTK_ICON_VIEW (widget);
+ int button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
+ GdkEventSequence *sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
+ const GdkEventButton *event = (const GdkEventButton *)gtk_gesture_get_last_event (GTK_GESTURE (gesture),
sequence);
if (!gtk_widget_has_focus (widget))
gtk_widget_grab_focus (widget);
- if (event->button == GDK_BUTTON_PRIMARY && event->type == GDK_BUTTON_PRESS)
+ if (button == GDK_BUTTON_PRIMARY)
{
GdkModifierType extend_mod_mask;
GdkModifierType modify_mod_mask;
@@ -2121,7 +2138,7 @@ gtk_icon_view_button_press (GtkWidget *widget,
gtk_widget_get_modifier_mask (widget, GDK_MODIFIER_INTENT_MODIFY_SELECTION);
item = _gtk_icon_view_get_item_at_widget_coords (icon_view,
- event->x, event->y,
+ x, y,
FALSE,
&cell);
@@ -2183,9 +2200,9 @@ gtk_icon_view_button_press (GtkWidget *widget,
/* Save press to possibly begin a drag */
if (icon_view->priv->pressed_button < 0)
{
- icon_view->priv->pressed_button = event->button;
- icon_view->priv->press_start_x = event->x;
- icon_view->priv->press_start_y = event->y;
+ icon_view->priv->pressed_button = button;
+ icon_view->priv->press_start_x = x;
+ icon_view->priv->press_start_y = y;
}
icon_view->priv->last_single_clicked = item;
@@ -2214,7 +2231,7 @@ gtk_icon_view_button_press (GtkWidget *widget,
}
if (icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE)
- gtk_icon_view_start_rubberbanding (icon_view, event->device, event->x, event->y);
+ gtk_icon_view_start_rubberbanding (icon_view, event->device, x, y);
}
/* don't draw keyboard focus around an clicked-on item */
@@ -2222,11 +2239,11 @@ gtk_icon_view_button_press (GtkWidget *widget,
}
if (!icon_view->priv->activate_on_single_click
- && event->button == GDK_BUTTON_PRIMARY
- && event->type == GDK_2BUTTON_PRESS)
+ && button == GDK_BUTTON_PRIMARY
+ && n_press == 2)
{
item = _gtk_icon_view_get_item_at_widget_coords (icon_view,
- event->x, event->y,
+ x, y,
FALSE,
NULL);
@@ -2245,8 +2262,6 @@ gtk_icon_view_button_press (GtkWidget *widget,
if (dirty)
g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
-
- return event->button == GDK_BUTTON_PRIMARY;
}
static gboolean
@@ -2255,22 +2270,26 @@ button_event_modifies_selection (GdkEventButton *event)
return (event->state & (GDK_CONTROL_MASK | GDK_SHIFT_MASK)) != 0;
}
-static gboolean
-gtk_icon_view_button_release (GtkWidget *widget,
- GdkEventButton *event)
-{
- GtkIconView *icon_view;
-
- icon_view = GTK_ICON_VIEW (widget);
-
- if (icon_view->priv->pressed_button == event->button)
+static void
+gtk_icon_view_button_release (GtkGestureMultiPress *gesture,
+ int n_press,
+ double x,
+ double y,
+ gpointer user_data)
+{
+ GtkIconView *icon_view = user_data;
+ int button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture));
+ GdkEventSequence *sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
+ const GdkEventButton *event = (const GdkEventButton *)gtk_gesture_get_last_event (GTK_GESTURE (gesture),
sequence);
+
+ if (icon_view->priv->pressed_button == button)
icon_view->priv->pressed_button = -1;
gtk_icon_view_stop_rubberbanding (icon_view);
remove_scroll_timeout (icon_view);
- if (event->button == GDK_BUTTON_PRIMARY
+ if (button == GDK_BUTTON_PRIMARY
&& icon_view->priv->activate_on_single_click
&& !button_event_modifies_selection (event)
&& icon_view->priv->last_single_clicked != NULL)
@@ -2278,7 +2297,7 @@ gtk_icon_view_button_release (GtkWidget *widget,
GtkIconViewItem *item;
item = _gtk_icon_view_get_item_at_widget_coords (icon_view,
- event->x, event->y,
+ x, y,
FALSE,
NULL);
if (item == icon_view->priv->last_single_clicked)
@@ -2291,8 +2310,6 @@ gtk_icon_view_button_release (GtkWidget *widget,
icon_view->priv->last_single_clicked = NULL;
}
-
- return TRUE;
}
static gboolean
diff --git a/gtk/gtkiconviewprivate.h b/gtk/gtkiconviewprivate.h
index e4ab163..5080e07 100644
--- a/gtk/gtkiconviewprivate.h
+++ b/gtk/gtkiconviewprivate.h
@@ -17,6 +17,7 @@
#include "gtk/gtkiconview.h"
#include "gtk/gtkcssnodeprivate.h"
+#include "gtk/gtkgesturemultipress.h"
#ifndef __GTK_ICON_VIEW_PRIVATE_H__
#define __GTK_ICON_VIEW_PRIVATE_H__
@@ -58,6 +59,8 @@ struct _GtkIconViewPrivate
GList *items;
+ GtkGesture *press_gesture;
+
GtkAdjustment *hadjustment;
GtkAdjustment *vadjustment;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]