diff options
author | Timm Bäder <mail@baedert.org> | 2018-05-14 18:19:44 +0200 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2018-05-19 10:18:50 +0200 |
commit | 5ff4ef14e63aa1ced7321a47021d902896fde595 (patch) | |
tree | be9bdd8e55cb906271c6e8cc1cf327e9e1bcdea0 /gtk | |
parent | f13cccd04280954c45f6c51a1fc3c5d4f844d76b (diff) | |
download | gtk+-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.c | 4 | ||||
-rw-r--r-- | gtk/gtkcalendar.c | 2 | ||||
-rw-r--r-- | gtk/gtkentry.c | 2 | ||||
-rw-r--r-- | gtk/gtkmenu.c | 2 | ||||
-rw-r--r-- | gtk/gtknotebook.c | 2 | ||||
-rw-r--r-- | gtk/gtkscrolledwindow.c | 2 | ||||
-rw-r--r-- | gtk/gtkspinbutton.c | 2 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 47 |
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); |