diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-04-11 14:52:43 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-04-11 17:29:27 -0400 |
commit | 4b346538e24a19b628f787941bfe514efac5971a (patch) | |
tree | a7ea4140e669bf589464a93706daeaa6ae023706 /gtk/gtktreeview.c | |
parent | 0ee58e9ef41830e624333a52608a81682a79a545 (diff) | |
download | gtk+-4b346538e24a19b628f787941bfe514efac5971a.tar.gz |
gtk: Port widgets away from gtk_get_current_ apis
This commit handles complicated cases where we selections.
We handle this by adding extend and modify parameters to
the ::move-cursor signals, and adjust the bindings
accordingly.
Diffstat (limited to 'gtk/gtktreeview.c')
-rw-r--r-- | gtk/gtktreeview.c | 215 |
1 files changed, 67 insertions, 148 deletions
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; - - *modify = FALSE; - *extend = FALSE; + GdkModifierType state; - 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; } |