summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2018-05-14 18:19:44 +0200
committerTimm Bäder <mail@baedert.org>2018-05-19 10:18:50 +0200
commit5ff4ef14e63aa1ced7321a47021d902896fde595 (patch)
treebe9bdd8e55cb906271c6e8cc1cf327e9e1bcdea0 /gtk
parentf13cccd04280954c45f6c51a1fc3c5d4f844d76b (diff)
downloadgtk+-5ff4ef14e63aa1ced7321a47021d902896fde595.tar.gz
widget: Directly notify gestures of grab
Since each widget has a list of event controllers now, we don't need to connect to ::grab-notify of the widget for every controller.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkbutton.c4
-rw-r--r--gtk/gtkcalendar.c2
-rw-r--r--gtk/gtkentry.c2
-rw-r--r--gtk/gtkmenu.c2
-rw-r--r--gtk/gtknotebook.c2
-rw-r--r--gtk/gtkscrolledwindow.c2
-rw-r--r--gtk/gtkspinbutton.c2
-rw-r--r--gtk/gtkwidget.c47
8 files changed, 38 insertions, 25 deletions
diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c
index 7d9395b9c5..8bc976f146 100644
--- a/gtk/gtkbutton.c
+++ b/gtk/gtkbutton.c
@@ -1051,11 +1051,13 @@ gtk_button_state_flags_changed (GtkWidget *widget,
static void
gtk_button_grab_notify (GtkWidget *widget,
- gboolean was_grabbed)
+ gboolean was_grabbed)
{
GtkButton *button = GTK_BUTTON (widget);
GtkButtonPrivate *priv = gtk_button_get_instance_private (button);
+ GTK_WIDGET_CLASS (gtk_button_parent_class)->grab_notify (widget, was_grabbed);
+
if (priv->activate_timeout &&
priv->grab_keyboard &&
gtk_widget_device_is_shadowed (widget, priv->grab_keyboard))
diff --git a/gtk/gtkcalendar.c b/gtk/gtkcalendar.c
index 906789c2af..e7546b90f3 100644
--- a/gtk/gtkcalendar.c
+++ b/gtk/gtkcalendar.c
@@ -2892,6 +2892,8 @@ static void
gtk_calendar_grab_notify (GtkWidget *widget,
gboolean was_grabbed)
{
+ GTK_WIDGET_CLASS (gtk_calendar_parent_class)->grab_notify (widget, was_grabbed);
+
if (!was_grabbed)
calendar_stop_spinning (GTK_CALENDAR (widget));
}
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index 9a4a0f75de..6ca8eec087 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -8190,6 +8190,8 @@ gtk_entry_grab_notify (GtkWidget *widget,
GtkEntryPrivate *priv = gtk_entry_get_instance_private (GTK_ENTRY (widget));
gint i;
+ GTK_WIDGET_CLASS (gtk_entry_parent_class)->grab_notify (widget, was_grabbed);
+
for (i = 0; i < MAX_ICONS; i++)
{
if (priv->icons[i])
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index fec340e311..1efbb2ed4d 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -4743,6 +4743,8 @@ gtk_menu_grab_notify (GtkWidget *widget,
GtkWidget *grab;
GdkDevice *pointer;
+ GTK_WIDGET_CLASS (gtk_menu_parent_class)->grab_notify (widget, was_grabbed);
+
menu = GTK_MENU (widget);
pointer = _gtk_menu_shell_get_grab_device (GTK_MENU_SHELL (widget));
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c
index a3a7f01c04..6b7230f9a7 100644
--- a/gtk/gtknotebook.c
+++ b/gtk/gtknotebook.c
@@ -2760,6 +2760,8 @@ gtk_notebook_grab_notify (GtkWidget *widget,
{
GtkNotebook *notebook = GTK_NOTEBOOK (widget);
+ GTK_WIDGET_CLASS (gtk_notebook_parent_class)->grab_notify (widget, was_grabbed);
+
if (!was_grabbed)
{
gtk_notebook_stop_reorder (notebook);
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index 825cd51f44..459144580d 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -3897,6 +3897,8 @@ gtk_scrolled_window_grab_notify (GtkWidget *widget,
GtkScrolledWindow *scrolled_window = GTK_SCROLLED_WINDOW (widget);
GtkScrolledWindowPrivate *priv = scrolled_window->priv;
+ GTK_WIDGET_CLASS (gtk_scrolled_window_parent_class)->grab_notify (widget, was_grabbed);
+
if (priv->drag_device &&
gtk_widget_device_is_shadowed (widget,
priv->drag_device))
diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c
index 74359e912d..0639fee044 100644
--- a/gtk/gtkspinbutton.c
+++ b/gtk/gtkspinbutton.c
@@ -1112,6 +1112,8 @@ gtk_spin_button_grab_notify (GtkWidget *widget,
{
GtkSpinButton *spin = GTK_SPIN_BUTTON (widget);
+ GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->grab_notify (widget, was_grabbed);
+
if (!was_grabbed)
{
if (gtk_spin_button_stop_spinning (spin))
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 471f9af067..a52c0563ca 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -457,7 +457,6 @@ typedef struct {
typedef struct {
GtkEventController *controller;
- guint grab_notify_id;
guint sequence_state_changed_id;
} EventControllerData;
@@ -846,6 +845,28 @@ gtk_widget_real_pick (GtkWidget *widget,
}
static void
+gtk_widget_real_grab_notify (GtkWidget *widget,
+ gboolean was_grabbed)
+{
+ GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+ GList *l;
+
+ for (l = g_list_last (priv->event_controllers); l; l = l->prev)
+ {
+ EventControllerData *data = l->data;
+ GdkDevice *device = NULL;
+
+ if (GTK_IS_GESTURE (data->controller))
+ device = gtk_gesture_get_device (GTK_GESTURE (data->controller));
+
+ if (!device || !gtk_widget_device_is_shadowed (widget, device))
+ continue;
+
+ gtk_event_controller_reset (data->controller);
+ }
+}
+
+static void
gtk_widget_class_init (GtkWidgetClass *klass)
{
static GObjectNotifyContext cpn_context = { 0, NULL, NULL };
@@ -897,7 +918,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
klass->state_flags_changed = gtk_widget_real_state_flags_changed;
klass->hierarchy_changed = NULL;
klass->direction_changed = gtk_widget_real_direction_changed;
- klass->grab_notify = NULL;
+ klass->grab_notify = gtk_widget_real_grab_notify;
klass->child_notify = NULL;
klass->snapshot = gtk_widget_real_snapshot;
klass->mnemonic_activate = gtk_widget_real_mnemonic_activate;
@@ -12847,22 +12868,6 @@ gtk_widget_get_action_group (GtkWidget *widget,
}
static void
-event_controller_grab_notify (GtkWidget *widget,
- gboolean was_grabbed,
- EventControllerData *data)
-{
- GdkDevice *device = NULL;
-
- if (GTK_IS_GESTURE (data->controller))
- device = gtk_gesture_get_device (GTK_GESTURE (data->controller));
-
- if (!device || !gtk_widget_device_is_shadowed (widget, device))
- return;
-
- gtk_event_controller_reset (data->controller);
-}
-
-static void
event_controller_sequence_state_changed (GtkGesture *gesture,
GdkEventSequence *sequence,
GtkEventSequenceState state,
@@ -12912,9 +12917,6 @@ gtk_widget_add_controller (GtkWidget *widget,
data = g_new0 (EventControllerData, 1);
data->controller = controller;
- data->grab_notify_id =
- g_signal_connect (widget, "grab-notify",
- G_CALLBACK (event_controller_grab_notify), data);
g_object_add_weak_pointer (G_OBJECT (data->controller), (gpointer *) &data->controller);
@@ -12966,9 +12968,6 @@ gtk_widget_remove_controller (GtkWidget *widget,
g_object_remove_weak_pointer (G_OBJECT (data->controller), (gpointer *) &data->controller);
- if (g_signal_handler_is_connected (widget, data->grab_notify_id))
- g_signal_handler_disconnect (widget, data->grab_notify_id);
-
if (data->sequence_state_changed_id)
g_signal_handler_disconnect (data->controller, data->sequence_state_changed_id);