diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt index 98d7fed3aa..338ea2b06a 100644 --- a/docs/reference/gtk/gtk4-sections.txt +++ b/docs/reference/gtk/gtk4-sections.txt @@ -4287,12 +4287,6 @@ gtk_init_check GTK_PRIORITY_RESIZE - -gtk_get_current_event -gtk_get_current_event_time -gtk_get_current_event_state -gtk_get_current_event_device - gtk_init_abi_check gtk_init_check_abi_check @@ -5815,6 +5809,12 @@ gtk_event_controller_set_propagation_limit gtk_event_controller_get_widget gtk_event_controller_reset + +gtk_event_controller_get_current_event +gtk_event_controller_get_current_event_device +gtk_event_controller_get_current_event_state +gtk_event_controller_get_current_event_time + GTK_TYPE_EVENT_CONTROLLER GTK_EVENT_CONTROLLER diff --git a/docs/reference/gtk/migrating-3to4.xml b/docs/reference/gtk/migrating-3to4.xml index 570bdca0d7..bb44f1a8a4 100644 --- a/docs/reference/gtk/migrating-3to4.xml +++ b/docs/reference/gtk/migrating-3to4.xml @@ -339,6 +339,15 @@ +
+ Stop using gtk_get_current_... APIs + + The function gtk_get_current_event() and its variants have been + replaced by equivalent event controller APIs: + gtk_event_controller_get_current_event(), etc. + +
+
Adapt to surface API changes diff --git a/gtk/gtkaboutdialog.c b/gtk/gtkaboutdialog.c index c3ce0403cb..577eb6e633 100644 --- a/gtk/gtkaboutdialog.c +++ b/gtk/gtkaboutdialog.c @@ -981,7 +981,7 @@ gtk_about_dialog_activate_link (GtkAboutDialog *about, { GError *error = NULL; - if (!gtk_show_uri_on_window (GTK_WINDOW (about), uri, gtk_get_current_event_time (), &error)) + if (!gtk_show_uri_on_window (GTK_WINDOW (about), uri, GDK_CURRENT_TIME, &error)) { GtkWidget *dialog; diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c index 7276d2c24d..6ad1fb6304 100644 --- a/gtk/gtkbutton.c +++ b/gtk/gtkbutton.c @@ -309,29 +309,25 @@ click_pressed_cb (GtkGestureClick *gesture, } static gboolean -touch_release_in_button (GtkButton *button, - double x, - double y) +touch_release_in_button (GtkGestureClick *gesture, + GtkWidget *widget, + double x, + double y) { GdkEvent *event; - event = gtk_get_current_event (); + event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture)); if (!event) return FALSE; if (gdk_event_get_event_type (event) != GDK_TOUCH_END) - { - gdk_event_unref (event); - return FALSE; - } + return FALSE; - gdk_event_unref (event); + if (!gtk_widget_contains (widget, x, y)) + return FALSE; - if (gtk_widget_contains (GTK_WIDGET (button), x, y)) - return TRUE; - - return FALSE; + return TRUE; } static void @@ -348,7 +344,7 @@ click_released_cb (GtkGestureClick *gesture, gtk_button_do_release (button, gtk_widget_is_sensitive (GTK_WIDGET (button)) && (priv->in_button || - touch_release_in_button (button, x, y))); + touch_release_in_button (gesture, widget, x, y))); sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); diff --git a/gtk/gtkcellrendereraccel.c b/gtk/gtkcellrendereraccel.c index 7d172432e1..7c3fc2c526 100644 --- a/gtk/gtkcellrendereraccel.c +++ b/gtk/gtkcellrendereraccel.c @@ -539,8 +539,10 @@ key_controller_key_pressed (GtkEventControllerKey *key, gboolean cleared = FALSE; GdkModifierType accel_mods = 0; guint accel_key; + GdkEvent *event; - if (!gdk_key_event_get_match (gtk_get_current_event (), &accel_key, &accel_mods)) + event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (key)); + if (!gdk_key_event_get_match (event, &accel_key, &accel_mods)) return FALSE; if (accel_mods == 0) diff --git a/gtk/gtkentrycompletion.c b/gtk/gtkentrycompletion.c index ad0b36d634..1d5f32fae9 100644 --- a/gtk/gtkentrycompletion.c +++ b/gtk/gtkentrycompletion.c @@ -2233,7 +2233,6 @@ gtk_entry_completion_changed (GtkWidget *widget, gpointer user_data) { GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (user_data); - GdkDevice *device; if (!completion->priv->popup_completion) return; @@ -2257,14 +2256,6 @@ gtk_entry_completion_changed (GtkWidget *widget, return; } - device = gtk_get_current_event_device (); - - if (device && gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) - device = gdk_device_get_associated_device (device); - - if (device) - completion->priv->device = device; - completion->priv->completion_timeout = g_timeout_add (COMPLETION_TIMEOUT, gtk_entry_completion_timeout, diff --git a/gtk/gtkentryprivate.h b/gtk/gtkentryprivate.h index de765d9b49..af5e24cd8c 100644 --- a/gtk/gtkentryprivate.h +++ b/gtk/gtkentryprivate.h @@ -104,8 +104,6 @@ struct _GtkEntryCompletionPrivate gchar *completion_prefix; GSource *check_completion_idle; - - GdkDevice *device; }; void _gtk_entry_completion_resize_popup (GtkEntryCompletion *completion); diff --git a/gtk/gtkeventcontroller.c b/gtk/gtkeventcontroller.c index f8a9d701dd..824e75b983 100644 --- a/gtk/gtkeventcontroller.c +++ b/gtk/gtkeventcontroller.c @@ -59,6 +59,7 @@ struct _GtkEventControllerPrivate GtkPropagationLimit limit; char *name; GtkWidget *target; + GdkEvent *event; }; G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkEventController, gtk_event_controller, G_TYPE_OBJECT) @@ -337,13 +338,15 @@ gtk_event_controller_handle_event (GtkEventController *controller, controller_class = GTK_EVENT_CONTROLLER_GET_CLASS (controller); - priv->target = target; + priv->target = g_object_ref (target); + priv->event = gdk_event_ref (event); g_object_ref (controller); retval = controller_class->handle_event (controller, event, x, y); g_object_unref (controller); - priv->target = NULL; + g_clear_object (&priv->target); + g_clear_pointer (&priv->event, gdk_event_unref); return retval; } @@ -532,6 +535,83 @@ gtk_event_controller_get_target (GtkEventController *controller) return priv->target; } +/** + * gtk_event_controller_get_current_event: + * @controller: a #GtkEventController + * + * Returns the event that is currently being handled by the + * controller, and %NULL at other times. + * + * Returns: (nullable) the event is current handled by @controller + */ +GdkEvent * +gtk_event_controller_get_current_event (GtkEventController *controller) +{ + GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (controller); + + return priv->event; +} + +/** + * gtk_event_controller_get_current_event_time: + * @controller: a #GtkEventController + * + * Returns the timestamp of the event that is currently being + * handled by the controller, and 0 otherwise. + * + * Returns: timestamp of the event is current handled by @controller + */ +guint32 +gtk_event_controller_get_current_event_time (GtkEventController *controller) +{ + GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (controller); + + if (priv->event) + return gdk_event_get_time (priv->event); + + return 0; +} + +/** + * gtk_event_controller_get_current_event_device: + * @controller: a #GtkEventController + * + * Returns the device of the event that is currently being + * handled by the controller, and %NULL otherwise. + * + * Returns: (nullable): device of the event is current handled by @controller + */ +GdkDevice * +gtk_event_controller_get_current_event_device (GtkEventController *controller) +{ + GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (controller); + + if (priv->event) + return gdk_event_get_device (priv->event); + + return NULL; +} + +/** + * gtk_event_controller_get_current_event_device: + * @controller: a #GtkEventController + * + * Returns the modifier state of the event that is currently being + * handled by the controller, and 0 otherwise. + * + * Returns: (nullable): modifier state of the event is current handled by @controller + */ +GdkModifierType +gtk_event_controller_get_current_event_state (GtkEventController *controller) +{ + GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (controller); + + if (priv->event) + return gdk_event_get_modifier_state (priv->event); + + return 0; +} + static GtkCrossingData * gtk_crossing_data_copy (GtkCrossingData *crossing) { diff --git a/gtk/gtkeventcontroller.h b/gtk/gtkeventcontroller.h index 6bdcfbb678..4b33432895 100644 --- a/gtk/gtkeventcontroller.h +++ b/gtk/gtkeventcontroller.h @@ -72,6 +72,15 @@ GDK_AVAILABLE_IN_ALL void gtk_event_controller_set_name (GtkEventController *controller, const char *name); +GDK_AVAILABLE_IN_ALL +GdkEvent * gtk_event_controller_get_current_event (GtkEventController *controller); +GDK_AVAILABLE_IN_ALL +guint32 gtk_event_controller_get_current_event_time (GtkEventController *controller); +GDK_AVAILABLE_IN_ALL +GdkDevice * gtk_event_controller_get_current_event_device (GtkEventController *controller); +GDK_AVAILABLE_IN_ALL +GdkModifierType gtk_event_controller_get_current_event_state (GtkEventController *controller); + G_END_DECLS #endif /* __GTK_EVENT_CONTROLLER_H__ */ diff --git a/gtk/gtkeventcontrollerprivate.h b/gtk/gtkeventcontrollerprivate.h index 571d78f960..c997f7951e 100644 --- a/gtk/gtkeventcontrollerprivate.h +++ b/gtk/gtkeventcontrollerprivate.h @@ -100,7 +100,8 @@ struct _GtkEventControllerClass gpointer padding[10]; }; -GtkWidget *gtk_event_controller_get_target (GtkEventController *controller); +GtkWidget * gtk_event_controller_get_target (GtkEventController *controller); + gboolean gtk_event_controller_handle_event (GtkEventController *controller, GdkEvent *event, diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index f02939df3e..c7f6b34c31 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -1502,7 +1502,7 @@ open_folder_cb (GSimpleAction *action, gchar *uri; uri = g_file_get_uri (file); - gtk_show_uri_on_window (GTK_WINDOW (toplevel), uri, gtk_get_current_event_time (), NULL); + gtk_show_uri_on_window (GTK_WINDOW (toplevel), uri, GDK_CURRENT_TIME, NULL); g_free (uri); } diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c index 73214fb90f..81c142318b 100644 --- a/gtk/gtkflowbox.c +++ b/gtk/gtkflowbox.c @@ -129,28 +129,6 @@ static void gtk_flow_box_set_accept_unpaired_release (GtkFlowBox *box, static void gtk_flow_box_check_model_compat (GtkFlowBox *box); -static void -get_current_selection_modifiers (GtkWidget *widget, - gboolean *modify, - gboolean *extend) -{ - GdkModifierType state = 0; - GdkModifierType mask; - - *modify = FALSE; - *extend = FALSE; - - if (gtk_get_current_event_state (&state)) - { - mask = GDK_CONTROL_MASK; - if ((state & mask) == mask) - *modify = TRUE; - mask = GDK_SHIFT_MASK; - if ((state & mask) == mask) - *extend = TRUE; - } -} - static void path_from_horizontal_line_rects (cairo_t *cr, GdkRectangle *lines, @@ -307,15 +285,8 @@ static void gtk_flow_box_child_set_focus (GtkFlowBoxChild *child) { GtkFlowBox *box = gtk_flow_box_child_get_box (child); - gboolean modify; - gboolean extend; - get_current_selection_modifiers (GTK_WIDGET (box), &modify, &extend); - - if (modify) - gtk_flow_box_update_cursor (box, child); - else - gtk_flow_box_update_selection (box, child, FALSE, FALSE); + gtk_flow_box_update_selection (box, child, FALSE, FALSE); } /* GtkWidget implementation {{{2 */ @@ -613,7 +584,9 @@ struct _GtkFlowBoxClass void (*toggle_cursor_child) (GtkFlowBox *box); gboolean (*move_cursor) (GtkFlowBox *box, GtkMovementStep step, - gint count); + gint count, + gboolean extend, + gboolean modify); void (*select_all) (GtkFlowBox *box); void (*unselect_all) (GtkFlowBox *box); }; @@ -2708,10 +2681,13 @@ gtk_flow_box_click_gesture_released (GtkGestureClick *gesture, GdkEventSequence *sequence; GdkInputSource source; GdkEvent *event; + GdkModifierType state; gboolean modify; gboolean extend; - get_current_selection_modifiers (GTK_WIDGET (box), &modify, &extend); + state = gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (gesture)); + modify = (state & GDK_CONTROL_MASK) != 0; + extend = (state & GDK_SHIFT_MASK) != 0; /* With touch, we default to modifying the selection. * You can still clear the selection and start over @@ -2747,6 +2723,7 @@ gtk_flow_box_drag_gesture_begin (GtkGestureDrag *gesture, GtkWidget *widget) { GtkFlowBoxPrivate *priv = BOX_PRIV (widget); + GdkModifierType state; if (priv->selection_mode != GTK_SELECTION_MULTIPLE) { @@ -2757,7 +2734,10 @@ gtk_flow_box_drag_gesture_begin (GtkGestureDrag *gesture, priv->rubberband_select = FALSE; priv->rubberband_first = NULL; priv->rubberband_last = NULL; - get_current_selection_modifiers (widget, &priv->rubberband_modify, &priv->rubberband_extend); + + state = gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (gesture)); + priv->rubberband_modify = (state & GDK_CONTROL_MASK) != 0; + priv->rubberband_extend = (state & GDK_SHIFT_MASK) != 0; } static void @@ -2992,25 +2972,22 @@ gtk_flow_box_add_move_binding (GtkWidgetClass *widget_class, GtkMovementStep step, gint count) { - GdkModifierType extend_mod_mask = GDK_SHIFT_MASK; - GdkModifierType modify_mod_mask = GDK_CONTROL_MASK; - gtk_widget_class_add_binding_signal (widget_class, keyval, modmask, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, FALSE, FALSE); gtk_widget_class_add_binding_signal (widget_class, - keyval, modmask | extend_mod_mask, + keyval, modmask | GDK_SHIFT_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, TRUE, FALSE); gtk_widget_class_add_binding_signal (widget_class, - keyval, modmask | modify_mod_mask, + keyval, modmask | GDK_CONTROL_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, FALSE, TRUE); gtk_widget_class_add_binding_signal (widget_class, - keyval, modmask | extend_mod_mask | modify_mod_mask, + keyval, modmask | GDK_SHIFT_MASK | GDK_CONTROL_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, TRUE, TRUE); } static void @@ -3038,11 +3015,11 @@ gtk_flow_box_toggle_cursor_child (GtkFlowBox *box) static gboolean gtk_flow_box_move_cursor (GtkFlowBox *box, GtkMovementStep step, - gint count) + gint count, + gboolean extend, + gboolean modify) { GtkFlowBoxPrivate *priv = BOX_PRIV (box); - gboolean modify; - gboolean extend; GtkFlowBoxChild *child; GtkFlowBoxChild *prev; GtkFlowBoxChild *next; @@ -3227,8 +3204,6 @@ gtk_flow_box_move_cursor (GtkFlowBox *box, } } - get_current_selection_modifiers (GTK_WIDGET (box), &modify, &extend); - gtk_flow_box_update_cursor (box, child); if (!modify) gtk_flow_box_update_selection (box, child, FALSE, extend); @@ -3577,6 +3552,8 @@ gtk_flow_box_class_init (GtkFlowBoxClass *class) * @box: the #GtkFlowBox on which the signal is emitted * @step: the granularity fo the move, as a #GtkMovementStep * @count: the number of @step units to move + * @extend: whether to extend the selection + * @modify: whether to modify the selection * * The ::move-cursor signal is a * [keybinding signal][GtkBindingSignal] @@ -3602,12 +3579,12 @@ gtk_flow_box_class_init (GtkFlowBoxClass *class) G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GtkFlowBoxClass, move_cursor), NULL, NULL, - _gtk_marshal_BOOLEAN__ENUM_INT, - G_TYPE_BOOLEAN, 2, - GTK_TYPE_MOVEMENT_STEP, G_TYPE_INT); + _gtk_marshal_BOOLEAN__ENUM_INT_BOOLEAN_BOOLEAN, + G_TYPE_BOOLEAN, 4, + GTK_TYPE_MOVEMENT_STEP, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); g_signal_set_va_marshaller (signals[MOVE_CURSOR], G_TYPE_FROM_CLASS (class), - _gtk_marshal_BOOLEAN__ENUM_INTv); + _gtk_marshal_BOOLEAN__ENUM_INT_BOOLEAN_BOOLEANv); /** * GtkFlowBox::select-all: * @box: the #GtkFlowBox on which the signal is emitted diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c index 163b97b8bf..b078d69531 100644 --- a/gtk/gtkiconview.c +++ b/gtk/gtkiconview.c @@ -241,7 +241,9 @@ static void gtk_icon_view_add_move_binding (GtkWid gint count); static gboolean gtk_icon_view_real_move_cursor (GtkIconView *icon_view, GtkMovementStep step, - gint count); + gint count, + gboolean extend, + gboolean modify); static void gtk_icon_view_move_cursor_up_down (GtkIconView *icon_view, gint count); static void gtk_icon_view_move_cursor_page_up_down (GtkIconView *icon_view, @@ -776,6 +778,8 @@ gtk_icon_view_class_init (GtkIconViewClass *klass) * @iconview: the object which received the signal * @step: the granularity of the move, as a #GtkMovementStep * @count: the number of @step units to move + * @extend: whether to extend the selection + * @modify: whether to modify the selection * * The ::move-cursor signal is a * [keybinding signal][GtkBindingSignal] @@ -798,13 +802,15 @@ gtk_icon_view_class_init (GtkIconViewClass *klass) G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GtkIconViewClass, move_cursor), NULL, NULL, - _gtk_marshal_BOOLEAN__ENUM_INT, - G_TYPE_BOOLEAN, 2, + _gtk_marshal_BOOLEAN__ENUM_INT_BOOLEAN_BOOLEAN, + G_TYPE_BOOLEAN, 4, GTK_TYPE_MOVEMENT_STEP, - G_TYPE_INT); + G_TYPE_INT, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN); g_signal_set_va_marshaller (icon_view_signals[MOVE_CURSOR], G_TYPE_FROM_CLASS (klass), - _gtk_marshal_BOOLEAN__ENUM_INTv); + _gtk_marshal_BOOLEAN__ENUM_INT_BOOLEAN_BOOLEANv); /* Key bindings */ gtk_widget_class_add_binding_signal (widget_class, @@ -1823,7 +1829,7 @@ gtk_icon_view_motion (GtkEventController *controller, icon_view->priv->mouse_x = x; icon_view->priv->mouse_y = y; - device = gtk_get_current_event_device (); /* FIXME: controller device */ + device = gtk_event_controller_get_current_event_device (controller); gtk_icon_view_maybe_begin_drag (icon_view, x, y, device); if (icon_view->priv->doing_rubberband) @@ -3421,12 +3427,12 @@ gtk_icon_view_add_move_binding (GtkWidgetClass *widget_class, gtk_widget_class_add_binding_signal (widget_class, keyval, modmask, I_("move-cursor"), - "(ii)", step, count); + "(iibb)", step, count, FALSE, FALSE); gtk_widget_class_add_binding_signal (widget_class, keyval, GDK_SHIFT_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, TRUE, FALSE); if ((modmask & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) return; @@ -3434,21 +3440,21 @@ gtk_icon_view_add_move_binding (GtkWidgetClass *widget_class, gtk_widget_class_add_binding_signal (widget_class, keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, TRUE, TRUE); gtk_widget_class_add_binding_signal (widget_class, keyval, GDK_CONTROL_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, FALSE, TRUE); } static gboolean gtk_icon_view_real_move_cursor (GtkIconView *icon_view, GtkMovementStep step, - gint count) + gint count, + gboolean extend, + gboolean modify) { - GdkModifierType state; - g_return_val_if_fail (GTK_ICON_VIEW (icon_view), FALSE); g_return_val_if_fail (step == GTK_MOVEMENT_LOGICAL_POSITIONS || step == GTK_MOVEMENT_VISUAL_POSITIONS || @@ -3462,17 +3468,8 @@ gtk_icon_view_real_move_cursor (GtkIconView *icon_view, gtk_cell_area_stop_editing (icon_view->priv->cell_area, FALSE); gtk_widget_grab_focus (GTK_WIDGET (icon_view)); - if (gtk_get_current_event_state (&state)) - { - GdkModifierType extend_mod_mask = GDK_SHIFT_MASK; - GdkModifierType modify_mod_mask = GDK_CONTROL_MASK; - - if ((state & modify_mod_mask) == modify_mod_mask) - icon_view->priv->modify_selection_pressed = TRUE; - if ((state & extend_mod_mask) == extend_mod_mask) - icon_view->priv->extend_selection_pressed = TRUE; - } - /* else we assume not pressed */ + icon_view->priv->extend_selection_pressed = extend; + icon_view->priv->modify_selection_pressed = modify; switch (step) { diff --git a/gtk/gtkiconviewprivate.h b/gtk/gtkiconviewprivate.h index 1cfd1aa3d8..8c58bccf96 100644 --- a/gtk/gtkiconviewprivate.h +++ b/gtk/gtkiconviewprivate.h @@ -63,7 +63,9 @@ struct _GtkIconViewClass void (* toggle_cursor_item) (GtkIconView *icon_view); gboolean (* move_cursor) (GtkIconView *icon_view, GtkMovementStep step, - gint count); + gint count, + gboolean extend, + gboolean modify); gboolean (* activate_cursor_item) (GtkIconView *icon_view); }; diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c index f930b2de73..6f6efaec64 100644 --- a/gtk/gtklabel.c +++ b/gtk/gtklabel.c @@ -5816,13 +5816,12 @@ gtk_label_activate_link (GtkLabel *label, { GtkWidget *widget = GTK_WIDGET (label); GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (widget)); - guint32 timestamp = gtk_get_current_event_time (); GError *error = NULL; if (!GTK_IS_WINDOW (toplevel)) return FALSE; - if (!gtk_show_uri_on_window (GTK_WINDOW (toplevel), uri, timestamp, &error)) + if (!gtk_show_uri_on_window (GTK_WINDOW (toplevel), uri, GDK_CURRENT_TIME, &error)) { g_warning ("Unable to show '%s': %s", uri, error->message); g_error_free (error); diff --git a/gtk/gtklistbox.c b/gtk/gtklistbox.c index 090ee4f2d4..2ca063710e 100644 --- a/gtk/gtklistbox.c +++ b/gtk/gtklistbox.c @@ -147,7 +147,9 @@ struct _GtkListBoxClass void (*toggle_cursor_row) (GtkListBox *box); void (*move_cursor) (GtkListBox *box, GtkMovementStep step, - gint count); + gint count, + gboolean extend, + gboolean modify); void (*selected_rows_changed) (GtkListBox *box); void (*select_all) (GtkListBox *box); void (*unselect_all) (GtkListBox *box); @@ -261,7 +263,9 @@ static void gtk_list_box_activate_cursor_row (GtkListBo static void gtk_list_box_toggle_cursor_row (GtkListBox *box); static void gtk_list_box_move_cursor (GtkListBox *box, GtkMovementStep step, - gint count); + gint count, + gboolean extend, + gboolean modify); static void gtk_list_box_finalize (GObject *obj); static void gtk_list_box_parent_cb (GObject *object, GParamSpec *pspec, @@ -594,12 +598,12 @@ gtk_list_box_class_init (GtkListBoxClass *klass) G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GtkListBoxClass, move_cursor), NULL, NULL, - _gtk_marshal_VOID__ENUM_INT, - G_TYPE_NONE, 2, - GTK_TYPE_MOVEMENT_STEP, G_TYPE_INT); + _gtk_marshal_VOID__ENUM_INT_BOOLEAN_BOOLEAN, + G_TYPE_NONE, 4, + GTK_TYPE_MOVEMENT_STEP, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN); g_signal_set_va_marshaller (signals[MOVE_CURSOR], G_TYPE_FROM_CLASS (klass), - _gtk_marshal_VOID__ENUM_INTv); + _gtk_marshal_VOID__ENUM_INT_BOOLEAN_BOOLEANv); widget_class->activate_signal = signals[ACTIVATE_CURSOR_ROW]; @@ -1426,25 +1430,22 @@ gtk_list_box_add_move_binding (GtkWidgetClass *widget_class, GtkMovementStep step, gint count) { - GdkModifierType extend_mod_mask = GDK_SHIFT_MASK; - GdkModifierType modify_mod_mask = GDK_CONTROL_MASK; - gtk_widget_class_add_binding_signal (widget_class, keyval, modmask, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, FALSE, FALSE); gtk_widget_class_add_binding_signal (widget_class, - keyval, modmask | extend_mod_mask, + keyval, modmask | GDK_SHIFT_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, TRUE, FALSE); gtk_widget_class_add_binding_signal (widget_class, - keyval, modmask | modify_mod_mask, + keyval, modmask | GDK_CONTROL_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, FALSE, TRUE); gtk_widget_class_add_binding_signal (widget_class, - keyval, modmask | extend_mod_mask | modify_mod_mask, - "move-cursor", - "(ii)", step, count); + keyval, modmask | GDK_SHIFT_MASK | GDK_CONTROL_MASK, + "move-cursor", + "(iibb)", step, count, TRUE, TRUE); } static void @@ -1764,28 +1765,6 @@ gtk_list_box_click_gesture_pressed (GtkGestureClick *gesture, } } -static void -get_current_selection_modifiers (GtkWidget *widget, - gboolean *modify, - gboolean *extend) -{ - GdkModifierType state = 0; - GdkModifierType mask; - - *modify = FALSE; - *extend = FALSE; - - if (gtk_get_current_event_state (&state)) - { - mask = GDK_CONTROL_MASK; - if ((state & mask) == mask) - *modify = TRUE; - mask = GDK_SHIFT_MASK; - if ((state & mask) == mask) - *extend = TRUE; - } -} - static void gtk_list_box_click_unpaired_release (GtkGestureClick *gesture, gdouble x, @@ -1829,16 +1808,19 @@ gtk_list_box_click_gesture_released (GtkGestureClick *gesture, GdkEventSequence *sequence; GdkInputSource source; GdkEvent *event; - gboolean modify; + GdkModifierType state; gboolean extend; + gboolean modify; - get_current_selection_modifiers (GTK_WIDGET (box), &modify, &extend); /* With touch, we default to modifying the selection. * You can still clear the selection and start over * by holding Ctrl. */ sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture)); event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence); + state = gdk_event_get_modifier_state (event); + extend = (state & GDK_SHIFT_MASK) != 0; + modify = (state & GDK_CONTROL_MASK) != 0; source = gdk_device_get_source (gdk_event_get_source_device (event)); if (source == GDK_SOURCE_TOUCHSCREEN) @@ -2730,10 +2712,10 @@ gtk_list_box_toggle_cursor_row (GtkListBox *box) static void gtk_list_box_move_cursor (GtkListBox *box, GtkMovementStep step, - gint count) + gint count, + gboolean extend, + gboolean modify) { - gboolean modify; - gboolean extend; GtkListBoxRow *row; gint page_size; GSequenceIter *iter; @@ -2851,8 +2833,6 @@ gtk_list_box_move_cursor (GtkListBox *box, return; } - get_current_selection_modifiers (GTK_WIDGET (box), &modify, &extend); - gtk_list_box_update_cursor (box, row, TRUE); if (!modify) gtk_list_box_update_selection (box, row, FALSE, extend); @@ -2876,18 +2856,11 @@ static void gtk_list_box_row_set_focus (GtkListBoxRow *row) { GtkListBox *box = gtk_list_box_row_get_box (row); - gboolean modify; - gboolean extend; if (!box) return; - get_current_selection_modifiers (GTK_WIDGET (row), &modify, &extend); - - if (modify) - gtk_list_box_update_cursor (box, row, TRUE); - else - gtk_list_box_update_selection (box, row, FALSE, FALSE); + gtk_list_box_update_selection (box, row, FALSE, FALSE); } static gboolean diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 986e7ae8a0..a34d2a8f84 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -2014,37 +2014,6 @@ gtk_grab_remove (GtkWidget *widget) } } -/** - * gtk_get_current_event: - * - * Obtains a reference of the event currently being processed by GTK. - * - * For example, if you are handling a #GtkButton::clicked signal, - * the current event will be the #GdkEventButton that triggered - * the ::clicked signal. - * - * Returns: (transfer full) (nullable): a reference of the current event, or - * %NULL if there is no current event. The returned event must be - * freed with g_object_unref(). - */ -GdkEvent* -gtk_get_current_event (void) -{ - if (current_events) - return gdk_event_ref (current_events->data); - else - return NULL; -} - -/** - * gtk_get_current_event_time: - * - * If there is a current event and it has a timestamp, - * return that timestamp, otherwise return %GDK_CURRENT_TIME. - * - * Returns: the timestamp from the current event, - * or %GDK_CURRENT_TIME. - */ guint32 gtk_get_current_event_time (void) { @@ -2054,51 +2023,6 @@ gtk_get_current_event_time (void) return GDK_CURRENT_TIME; } -/** - * gtk_get_current_event_state: - * @state: (out): a location to store the state of the current event - * - * If there is a current event and it has a state field, place - * that state field in @state and return %TRUE, otherwise return - * %FALSE. - * - * Returns: %TRUE if there was a current event and it - * had a state field - */ -gboolean -gtk_get_current_event_state (GdkModifierType *state) -{ - g_return_val_if_fail (state != NULL, FALSE); - - if (current_events) - { - *state = gdk_event_get_modifier_state (current_events->data); - return TRUE; - } - else - { - *state = 0; - return FALSE; - } -} - -/** - * gtk_get_current_event_device: - * - * If there is a current event and it has a device, return that - * device, otherwise return %NULL. - * - * Returns: (transfer none) (nullable): a #GdkDevice, or %NULL - */ -GdkDevice * -gtk_get_current_event_device (void) -{ - if (current_events) - return gdk_event_get_device (current_events->data); - else - return NULL; -} - /** * gtk_get_event_widget: * @event: a #GdkEvent diff --git a/gtk/gtkmain.h b/gtk/gtkmain.h index 16fb5743d5..ba1e1ac9f8 100644 --- a/gtk/gtkmain.h +++ b/gtk/gtkmain.h @@ -107,15 +107,6 @@ PangoLanguage *gtk_get_default_language (void); GDK_AVAILABLE_IN_ALL GtkTextDirection gtk_get_locale_direction (void); -GDK_AVAILABLE_IN_ALL -GdkEvent * gtk_get_current_event (void); -GDK_AVAILABLE_IN_ALL -guint32 gtk_get_current_event_time (void); -GDK_AVAILABLE_IN_ALL -gboolean gtk_get_current_event_state (GdkModifierType *state); -GDK_AVAILABLE_IN_ALL -GdkDevice *gtk_get_current_event_device (void); - G_END_DECLS diff --git a/gtk/gtkmarshalers.list b/gtk/gtkmarshalers.list index ee0d355f85..6e91f452b5 100644 --- a/gtk/gtkmarshalers.list +++ b/gtk/gtkmarshalers.list @@ -29,6 +29,7 @@ BOOLEAN:ENUM,BOOLEAN BOOLEAN:ENUM,BOXED,BOXED,BOXED BOOLEAN:ENUM,DOUBLE BOOLEAN:ENUM,INT +BOOLEAN:ENUM,INT,BOOLEAN,BOOLEAN BOOLEAN:FLAGS BOOLEAN:OBJECT BOOLEAN:OBJECT,UINT,FLAGS @@ -76,6 +77,7 @@ VOID:ENUM,FLOAT VOID:ENUM,FLOAT,BOOLEAN VOID:ENUM,INT VOID:ENUM,INT,BOOLEAN +VOID:ENUM,INT,BOOLEAN,BOOLEAN VOID:ENUM,INT,INT VOID:ENUM,OBJECT VOID:ENUM,STRING diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index 3edb540074..277138fe32 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -2877,8 +2877,7 @@ gtk_notebook_motion (GtkEventController *controller, if (!page) return; - if (!gtk_get_current_event_state (&state)) - return; + state = gtk_event_controller_get_current_event_state (controller); if (!(state & GDK_BUTTON1_MASK) && notebook->pressed_button != 0) @@ -2905,7 +2904,7 @@ gtk_notebook_motion (GtkEventController *controller, notebook->detached_tab = notebook->cur_page; surface = gtk_native_get_surface (gtk_widget_get_native (GTK_WIDGET (notebook))); - device = gtk_get_current_event_device (); + device = gtk_event_controller_get_current_event_device (controller); content = gdk_content_provider_new_union ((GdkContentProvider *[2]) { gtk_notebook_root_content_new (notebook), diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c index 934a834762..110bfa7acb 100644 --- a/gtk/gtkplacessidebar.c +++ b/gtk/gtkplacessidebar.c @@ -3420,7 +3420,7 @@ on_row_released (GtkGestureClick *gesture, NULL); button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)); - gtk_get_current_event_state (&state); + state = gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (gesture)); if (row) { diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h index 9e8300d1a3..4985f2d125 100644 --- a/gtk/gtkprivate.h +++ b/gtk/gtkprivate.h @@ -91,6 +91,8 @@ void gtk_main_do_event (GdkEvent *event); GtkWidget *gtk_get_event_widget (GdkEvent *event); +guint32 gtk_get_current_event_time (void); + void check_crossing_invariants (GtkWidget *widget, GtkCrossingData *crossing); diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index db66c3ff9d..3a965ac8f2 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -30,6 +30,7 @@ #include "gtkadjustmentprivate.h" #include "gtkeventcontrollermotion.h" #include "gtkeventcontrollerscroll.h" +#include "gtkeventcontrollerprivate.h" #include "gtkgesturedrag.h" #include "gtkgesturelongpress.h" #include "gtkgesturepan.h" @@ -1171,9 +1172,10 @@ captured_scroll_cb (GtkEventControllerScroll *scroll, } static void -captured_motion (GtkScrolledWindow *sw, - gdouble x, - gdouble y) +captured_motion (GtkEventController *controller, + double x, + double y, + GtkScrolledWindow *sw) { GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (sw); GdkDevice *source_device; @@ -1185,7 +1187,10 @@ captured_motion (GtkScrolledWindow *sw, if (!priv->use_indicators) return; - event = gtk_get_current_event (); + target = gtk_event_controller_get_target (controller); + state = gtk_event_controller_get_current_event_state (controller); + event = gtk_event_controller_get_current_event (controller); + source_device = gdk_event_get_source_device (event); input_source = gdk_device_get_source (source_device); @@ -1194,10 +1199,6 @@ captured_motion (GtkScrolledWindow *sw, if (priv->vscrollbar_visible) indicator_start_fade (&priv->vindicator, 1.0); - state = gdk_event_get_modifier_state (event); - - target = gtk_widget_pick (GTK_WIDGET (sw), x, y, GTK_PICK_DEFAULT); - if (!target && (state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK)) != 0) { @@ -1218,8 +1219,6 @@ captured_motion (GtkScrolledWindow *sw, else indicator_set_over (&priv->hindicator, FALSE); } - - gdk_event_unref (event); } static gboolean @@ -1259,9 +1258,7 @@ scroll_controller_scroll (GtkEventControllerScroll *scroll, gboolean shifted; GdkModifierType state; - if (!gtk_get_current_event_state (&state)) - return GDK_EVENT_PROPAGATE; - + state = gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (scroll)); shifted = (state & GDK_SHIFT_MASK) != 0; gtk_scrolled_window_invalidate_overshoot (scrolled_window); @@ -1343,8 +1340,8 @@ scroll_controller_decelerate (GtkEventControllerScroll *scroll, gboolean shifted; GdkModifierType state; - if (!gtk_get_current_event_state (&state)) - return; + + state = gtk_event_controller_get_current_event_state (GTK_EVENT_CONTROLLER (scroll)); shifted = (state & GDK_SHIFT_MASK) != 0; @@ -1970,8 +1967,8 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window) controller = gtk_event_controller_motion_new (); gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE); - g_signal_connect_swapped (controller, "motion", - G_CALLBACK (captured_motion), scrolled_window); + g_signal_connect (controller, "motion", + G_CALLBACK (captured_motion), scrolled_window); gtk_widget_add_controller (widget, controller); widget_node = gtk_widget_get_css_node (widget); diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 261e46b68e..c52d642ebf 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -8142,7 +8142,7 @@ gtk_text_view_value_changed (GtkAdjustment *adjustment, if (gtk_gesture_is_active (priv->drag_gesture)) { GdkEvent *current_event; - current_event = gtk_get_current_event (); + current_event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (priv->drag_gesture)); if (current_event != NULL) { if (gdk_event_get_event_type (current_event) == GDK_SCROLL) @@ -8621,20 +8621,14 @@ gtk_text_view_get_menu_model (GtkTextView *text_view) } static void -gtk_text_view_do_popup (GtkTextView *text_view, - GdkEvent *event) +gtk_text_view_do_popup (GtkTextView *text_view, + GdkEvent *trigger_event) { GtkTextViewPrivate *priv = text_view->priv; - GdkEvent *trigger_event; if (!gtk_widget_get_realized (GTK_WIDGET (text_view))) return; - if (event) - trigger_event = (GdkEvent *)event; - else - trigger_event = gtk_get_current_event (); - gtk_text_view_update_clipboard_actions (text_view); if (!priv->popup_menu) @@ -8709,9 +8703,6 @@ gtk_text_view_do_popup (GtkTextView *text_view, } gtk_popover_popup (GTK_POPOVER (priv->popup_menu)); - - if (trigger_event && trigger_event != event) - gdk_event_unref (trigger_event); } static void diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 83daf4f487..30f97c408e 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -345,7 +345,9 @@ struct _GtkTreeViewClass /* Key Binding signals */ gboolean (* move_cursor) (GtkTreeView *tree_view, GtkMovementStep step, - gint count); + gint count, + gboolean extend, + gboolean modify); gboolean (* select_all) (GtkTreeView *tree_view); gboolean (* unselect_all) (GtkTreeView *tree_view); gboolean (* select_cursor_row) (GtkTreeView *tree_view, @@ -715,7 +717,9 @@ static void gtk_tree_view_drag_data_received (GObject /* tree_model signals */ static gboolean gtk_tree_view_real_move_cursor (GtkTreeView *tree_view, GtkMovementStep step, - gint count); + gint count, + gboolean extend, + gboolean modify); static gboolean gtk_tree_view_real_select_all (GtkTreeView *tree_view); static gboolean gtk_tree_view_real_unselect_all (GtkTreeView *tree_view); static gboolean gtk_tree_view_real_select_cursor_row (GtkTreeView *tree_view, @@ -850,8 +854,7 @@ static TreeViewDragInfo* get_info (GtkTreeView *tree_view); /* interactive search */ static void gtk_tree_view_ensure_interactive_directory (GtkTreeView *tree_view); static void gtk_tree_view_search_popover_hide (GtkWidget *search_popover, - GtkTreeView *tree_view, - GdkDevice *device); + GtkTreeView *tree_view); static void gtk_tree_view_search_preedit_changed (GtkText *text, const char *preedit, GtkTreeView *tree_view); @@ -900,7 +903,6 @@ static gboolean gtk_tree_view_start_editing (GtkTreeView *tree_ static void gtk_tree_view_stop_editing (GtkTreeView *tree_view, gboolean cancel_editing); static gboolean gtk_tree_view_real_start_interactive_search (GtkTreeView *tree_view, - GdkDevice *device, gboolean keybinding); static gboolean gtk_tree_view_start_interactive_search (GtkTreeView *tree_view); static GtkTreeViewColumn *gtk_tree_view_get_drop_column (GtkTreeView *tree_view, @@ -1376,15 +1378,16 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) /** * GtkTreeView::move-cursor: * @tree_view: the object on which the signal is emitted. - * @step: the granularity of the move, as a - * #GtkMovementStep. %GTK_MOVEMENT_LOGICAL_POSITIONS, - * %GTK_MOVEMENT_VISUAL_POSITIONS, %GTK_MOVEMENT_DISPLAY_LINES, - * %GTK_MOVEMENT_PAGES and %GTK_MOVEMENT_BUFFER_ENDS are - * supported. %GTK_MOVEMENT_LOGICAL_POSITIONS and - * %GTK_MOVEMENT_VISUAL_POSITIONS are treated identically. - * @direction: the direction to move: +1 to move forwards; - * -1 to move backwards. The resulting movement is - * undefined for all other values. + * @step: the granularity of the move, as a #GtkMovementStep. + * %GTK_MOVEMENT_LOGICAL_POSITIONS, %GTK_MOVEMENT_VISUAL_POSITIONS, + * %GTK_MOVEMENT_DISPLAY_LINES, %GTK_MOVEMENT_PAGES and + * %GTK_MOVEMENT_BUFFER_ENDS are supported. + * %GTK_MOVEMENT_LOGICAL_POSITIONS and %GTK_MOVEMENT_VISUAL_POSITIONS + * are treated identically. + * @direction: the direction to move: +1 to move forwards; -1 to move + * backwards. The resulting movement is undefined for all other values. + * @extend: whether to extend the selection + * @modify: whether to modify the selection * * The #GtkTreeView::move-cursor signal is a [keybinding * signal][GtkBindingSignal] which gets emitted when the user @@ -1404,13 +1407,15 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET (GtkTreeViewClass, move_cursor), NULL, NULL, - _gtk_marshal_BOOLEAN__ENUM_INT, - G_TYPE_BOOLEAN, 2, + _gtk_marshal_BOOLEAN__ENUM_INT_BOOLEAN_BOOLEAN, + G_TYPE_BOOLEAN, 4, GTK_TYPE_MOVEMENT_STEP, - G_TYPE_INT); + G_TYPE_INT, + G_TYPE_BOOLEAN, + G_TYPE_BOOLEAN); g_signal_set_va_marshaller (tree_view_signals[MOVE_CURSOR], G_TYPE_FROM_CLASS (o_class), - _gtk_marshal_BOOLEAN__ENUM_INTv); + _gtk_marshal_BOOLEAN__ENUM_INT_BOOLEAN_BOOLEANv); tree_view_signals[SELECT_ALL] = g_signal_new (I_("select-all"), @@ -1537,46 +1542,15 @@ gtk_tree_view_class_init (GtkTreeViewClass *class) gtk_tree_view_add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0, TRUE, GTK_MOVEMENT_PAGES, 1); + gtk_tree_view_add_move_binding (widget_class, GDK_KEY_Right, 0, FALSE, + GTK_MOVEMENT_VISUAL_POSITIONS, 1); + gtk_tree_view_add_move_binding (widget_class, GDK_KEY_Left, 0, FALSE, + GTK_MOVEMENT_VISUAL_POSITIONS, -1); - gtk_widget_class_add_binding_signal (widget_class, - GDK_KEY_Right, 0, - "move-cursor", - "(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, 1); - - gtk_widget_class_add_binding_signal (widget_class, - GDK_KEY_Left, 0, - "move-cursor", - "(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, -1); - - gtk_widget_class_add_binding_signal (widget_class, - GDK_KEY_KP_Right, 0, - "move-cursor", - "(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, 1); - - gtk_widget_class_add_binding_signal (widget_class, - GDK_KEY_KP_Left, 0, - "move-cursor", - "(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, -1); - - gtk_widget_class_add_binding_signal (widget_class, - GDK_KEY_Right, GDK_CONTROL_MASK, - "move-cursor", - "(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, 1); - - gtk_widget_class_add_binding_signal (widget_class, - GDK_KEY_Left, GDK_CONTROL_MASK, - "move-cursor", - "(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, -1); - - gtk_widget_class_add_binding_signal (widget_class, - GDK_KEY_KP_Right, GDK_CONTROL_MASK, - "move-cursor", - "(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, 1); - - gtk_widget_class_add_binding_signal (widget_class, - GDK_KEY_KP_Left, GDK_CONTROL_MASK, - "move-cursor", - "(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, -1); + gtk_tree_view_add_move_binding (widget_class, GDK_KEY_KP_Right, 0, FALSE, + GTK_MOVEMENT_VISUAL_POSITIONS, 1); + gtk_tree_view_add_move_binding (widget_class, GDK_KEY_KP_Left, 0, FALSE, + GTK_MOVEMENT_VISUAL_POSITIONS, -1); gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_space, GDK_CONTROL_MASK, "toggle-cursor-row", NULL); gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Space, GDK_CONTROL_MASK, "toggle-cursor-row", NULL); @@ -2778,33 +2752,23 @@ gtk_tree_view_get_expander_size (GtkTreeView *tree_view) } static void -get_current_selection_modifiers (GtkWidget *widget, - gboolean *modify, - gboolean *extend) +get_current_selection_modifiers (GtkEventController *controller, + gboolean *modify, + gboolean *extend) { - GdkModifierType state = 0; - GdkModifierType mask; + GdkModifierType state; - *modify = FALSE; - *extend = FALSE; - - if (gtk_get_current_event_state (&state)) - { - mask = GDK_CONTROL_MASK; - if ((state & mask) == mask) - *modify = TRUE; - mask = GDK_SHIFT_MASK; - if ((state & mask) == mask) - *extend = TRUE; - } + state = gtk_event_controller_get_current_event_state (controller); + *modify = (state & GDK_CONTROL_MASK) != 0; + *extend = (state & GDK_SHIFT_MASK) != 0; } static void gtk_tree_view_click_gesture_pressed (GtkGestureClick *gesture, - gint n_press, - gdouble x, - gdouble y, - GtkTreeView *tree_view) + int n_press, + double x, + double y, + GtkTreeView *tree_view) { GtkWidget *widget = GTK_WIDGET (tree_view); GdkRectangle background_area, cell_area; @@ -3006,7 +2970,7 @@ gtk_tree_view_click_gesture_pressed (GtkGestureClick *gesture, GtkCellRenderer *focus_cell; gboolean modify, extend; - get_current_selection_modifiers (widget, &modify, &extend); + get_current_selection_modifiers (GTK_EVENT_CONTROLLER (gesture), &modify, &extend); tree_view->modify_selection_pressed = modify; tree_view->extend_selection_pressed = extend; @@ -3094,7 +3058,7 @@ gtk_tree_view_drag_gesture_begin (GtkGestureDrag *gesture, tree_view->rubber_band_y += tree_view->dy; tree_view->rubber_band_status = RUBBER_BAND_MAYBE_START; - get_current_selection_modifiers (GTK_WIDGET (tree_view), &modify, &extend); + get_current_selection_modifiers (GTK_EVENT_CONTROLLER (gesture), &modify, &extend); tree_view->rubber_band_modify = modify; tree_view->rubber_band_extend = extend; } @@ -3316,7 +3280,7 @@ gtk_tree_view_click_gesture_released (GtkGestureClick *gesture, tree_view->button_pressed_node != tree_view->prelight_node) return; - get_current_selection_modifiers (GTK_WIDGET (tree_view), &modify, &extend); + get_current_selection_modifiers (GTK_EVENT_CONTROLLER (gesture), &modify, &extend); if (tree_view->arrow_prelit) { @@ -5466,12 +5430,7 @@ gtk_tree_view_forward_controller_key_pressed (GtkEventControllerKey *key, gtk_event_controller_key_forward (key, tree_view->search_entry); if (tree_view->imcontext_changed) - { - GdkDevice *device; - - device = gtk_get_current_event_device (); - return gtk_tree_view_real_start_interactive_search (tree_view, device, FALSE); - } + return gtk_tree_view_real_start_interactive_search (tree_view, FALSE); } } @@ -5537,8 +5496,7 @@ gtk_tree_view_focus_controller_focus_out (GtkEventController *focus, if (tree_view->search_popover && !gtk_event_controller_focus_contains_focus (GTK_EVENT_CONTROLLER_FOCUS (focus))) - gtk_tree_view_search_popover_hide (tree_view->search_popover, tree_view, - gtk_get_current_event_device ()); + gtk_tree_view_search_popover_hide (tree_view->search_popover, tree_view); } /* Incremental Reflow @@ -7937,10 +7895,10 @@ gtk_tree_view_css_changed (GtkWidget *widget, static gboolean gtk_tree_view_real_move_cursor (GtkTreeView *tree_view, GtkMovementStep step, - gint count) + gint count, + gboolean extend, + gboolean modify) { - GdkModifierType state; - g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), FALSE); g_return_val_if_fail (step == GTK_MOVEMENT_LOGICAL_POSITIONS || step == GTK_MOVEMENT_VISUAL_POSITIONS || @@ -7957,20 +7915,8 @@ gtk_tree_view_real_move_cursor (GtkTreeView *tree_view, tree_view->draw_keyfocus = TRUE; gtk_widget_grab_focus (GTK_WIDGET (tree_view)); - if (gtk_get_current_event_state (&state)) - { - GdkModifierType extend_mod_mask; - GdkModifierType modify_mod_mask; - - extend_mod_mask = GDK_SHIFT_MASK; - modify_mod_mask = GDK_CONTROL_MASK; - - if ((state & modify_mod_mask) == modify_mod_mask) - tree_view->modify_selection_pressed = TRUE; - if ((state & extend_mod_mask) == extend_mod_mask) - tree_view->extend_selection_pressed = TRUE; - } - /* else we assume not pressed */ + tree_view->modify_selection_pressed = modify; + tree_view->extend_selection_pressed = extend; switch (step) { @@ -8902,30 +8848,30 @@ gtk_tree_view_add_move_binding (GtkWidgetClass *widget_class, GtkMovementStep step, gint count) { - gtk_widget_class_add_binding_signal (widget_class, keyval, modmask, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, FALSE, FALSE); if (add_shifted_binding) gtk_widget_class_add_binding_signal (widget_class, keyval, GDK_SHIFT_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, TRUE, FALSE); if ((modmask & GDK_CONTROL_MASK) == GDK_CONTROL_MASK) return; - gtk_widget_class_add_binding_signal (widget_class, keyval, - GDK_CONTROL_MASK | GDK_SHIFT_MASK, - "move-cursor", - "(ii)", step, count); - gtk_widget_class_add_binding_signal (widget_class, keyval, GDK_CONTROL_MASK, "move-cursor", - "(ii)", step, count); + "(iibb)", step, count, FALSE, TRUE); + + if (add_shifted_binding) + gtk_widget_class_add_binding_signal (widget_class, keyval, + GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "move-cursor", + "(iibb)", step, count, TRUE, TRUE); } static gint @@ -9960,7 +9906,6 @@ static gboolean gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view) { GtkTreePath *cursor_path = NULL; - GdkModifierType state; if (!gtk_widget_has_focus (GTK_WIDGET (tree_view))) goto out; @@ -9977,23 +9922,11 @@ gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view) gtk_tree_path_up (cursor_path); - if (gtk_get_current_event_state (&state)) - { - GdkModifierType modify_mod_mask; - - modify_mod_mask = GDK_CONTROL_MASK; - - if ((state & modify_mod_mask) == modify_mod_mask) - tree_view->modify_selection_pressed = TRUE; - } - gtk_tree_view_real_set_cursor (tree_view, cursor_path, CLEAR_AND_SELECT | CLAMP_NODE); gtk_tree_path_free (cursor_path); gtk_widget_grab_focus (GTK_WIDGET (tree_view)); - tree_view->modify_selection_pressed = FALSE; - return TRUE; } @@ -10006,7 +9939,7 @@ gtk_tree_view_real_select_cursor_parent (GtkTreeView *tree_view) static gboolean gtk_tree_view_search_entry_flush_timeout (GtkTreeView *tree_view) { - gtk_tree_view_search_popover_hide (tree_view->search_popover, tree_view, NULL); + gtk_tree_view_search_popover_hide (tree_view->search_popover, tree_view); tree_view->typeselect_flush_timeout = 0; return FALSE; @@ -10067,7 +10000,6 @@ gtk_tree_view_ensure_interactive_directory (GtkTreeView *tree_view) */ static gboolean gtk_tree_view_real_start_interactive_search (GtkTreeView *tree_view, - GdkDevice *device, gboolean keybinding) { /* We only start interactive search if we have focus or the columns @@ -10148,9 +10080,7 @@ gtk_tree_view_real_start_interactive_search (GtkTreeView *tree_view, static gboolean gtk_tree_view_start_interactive_search (GtkTreeView *tree_view) { - return gtk_tree_view_real_start_interactive_search (tree_view, - gtk_get_current_event_device (), - TRUE); + return gtk_tree_view_real_start_interactive_search (tree_view, TRUE); } /* Callbacks */ @@ -13527,8 +13457,7 @@ gtk_tree_view_set_search_entry (GtkTreeView *tree_view, static void gtk_tree_view_search_popover_hide (GtkWidget *search_popover, - GtkTreeView *tree_view, - GdkDevice *device) + GtkTreeView *tree_view) { if (tree_view->disable_popdown) return; @@ -13587,9 +13516,7 @@ gtk_tree_view_search_activate (GtkEntry *entry, { GtkTreePath *path; - gtk_tree_view_search_popover_hide (tree_view->search_popover, - tree_view, - gtk_get_current_event_device ()); + gtk_tree_view_search_popover_hide (tree_view->search_popover, tree_view); /* If we have a row selected and it's the cursor row, we activate * the row XXX */ @@ -13612,14 +13539,7 @@ gtk_tree_view_search_pressed_cb (GtkGesture *gesture, double y, GtkTreeView *tree_view) { - GdkDevice *keyb_device; - GdkEventSequence *sequence; - GdkEvent *event; - - sequence = gtk_gesture_get_last_updated_sequence (gesture); - event = gtk_gesture_get_last_event (gesture, sequence); - keyb_device = gdk_device_get_associated_device (gdk_event_get_device (event)); - gtk_tree_view_search_popover_hide (tree_view->search_popover, tree_view, keyb_device); + gtk_tree_view_search_popover_hide (tree_view->search_popover, tree_view); } static gboolean @@ -13670,8 +13590,7 @@ gtk_tree_view_search_key_pressed (GtkEventControllerKey *key, if (!tree_view->search_custom_entry_set && gtk_tree_view_search_key_cancels_search (keyval)) { - gtk_tree_view_search_popover_hide (tree_view->search_popover, tree_view, - gtk_get_current_event_device ()); + gtk_tree_view_search_popover_hide (tree_view->search_popover, tree_view); return TRUE; } diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 59cf8d94c3..8cfd04254a 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -1425,7 +1425,7 @@ drag_gesture_update_cb (GtkGestureDrag *gesture, gtk_gesture_get_device (GTK_GESTURE (gesture)), gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)), (int)start_x, (int)start_y, - gtk_get_current_event_time ()); + gdk_event_get_time (gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture)))); gtk_event_controller_reset (GTK_EVENT_CONTROLLER (gesture)); gtk_event_controller_reset (GTK_EVENT_CONTROLLER (priv->click_gesture)); diff --git a/tests/testinhibitshortcuts.c b/tests/testinhibitshortcuts.c index fa746ed3e4..6de7a89cfe 100644 --- a/tests/testinhibitshortcuts.c +++ b/tests/testinhibitshortcuts.c @@ -40,7 +40,6 @@ static void on_button_toggle (GtkWidget *button, gpointer data) { GdkSurface *surface = GDK_SURFACE (data); - GdkEvent *event; if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) { @@ -49,8 +48,7 @@ on_button_toggle (GtkWidget *button, gpointer data) } gtk_check_button_set_inconsistent (GTK_CHECK_BUTTON (button), TRUE); - event = gtk_get_current_event (); - gdk_toplevel_inhibit_system_shortcuts (GDK_TOPLEVEL (surface), event); + gdk_toplevel_inhibit_system_shortcuts (GDK_TOPLEVEL (surface), NULL); } static void diff --git a/tests/testwindowdrag.c b/tests/testwindowdrag.c index e25abf0cef..07c7735f59 100644 --- a/tests/testwindowdrag.c +++ b/tests/testwindowdrag.c @@ -19,7 +19,7 @@ start_resize (GtkGestureClick *gesture, gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); surface = gtk_native_get_surface (gtk_widget_get_native (widget)); - event = gtk_get_current_event (); + event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture)); if (gdk_event_get_event_type (event) == GDK_BUTTON_PRESS) button = gdk_button_event_get_button (event); else @@ -67,7 +67,7 @@ start_move (GtkGestureClick *gesture, gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED); surface = gtk_native_get_surface (gtk_widget_get_native (widget)); - event = gtk_get_current_event (); + event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture)); if (gdk_event_get_event_type (event) == GDK_BUTTON_PRESS) button = gdk_button_event_get_button (event); else