commit bf2b4e6b36c75d943f201ec81843a1d4a46a9195 Author: Peng Wu Date: Tue Aug 22 15:10:30 2023 +0800 Use GTK_PHASE_CAPTURE for input method in GtkText diff --git a/gtk/gtktext.c b/gtk/gtktext.c index 147c8fa047..2715eb47ab 100644 --- a/gtk/gtktext.c +++ b/gtk/gtktext.c @@ -184,6 +184,7 @@ struct _GtkTextPrivate GtkWidget *placeholder; GtkGesture *drag_gesture; + GtkEventController *im_key_controller; GtkEventController *key_controller; GtkEventController *focus_controller; @@ -1937,6 +1938,14 @@ gtk_text_init (GtkText *self) G_CALLBACK (gtk_text_motion_controller_motion), self); gtk_widget_add_controller (GTK_WIDGET (self), controller); + + priv->im_key_controller = gtk_event_controller_key_new (); + gtk_event_controller_set_propagation_phase (priv->im_key_controller, GTK_PHASE_CAPTURE); + gtk_event_controller_set_static_name (priv->im_key_controller, "gtk-text-im-key-controller"); + gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->im_key_controller), + priv->im_context); + gtk_widget_add_controller (GTK_WIDGET (self), priv->im_key_controller); + priv->key_controller = gtk_event_controller_key_new (); gtk_event_controller_set_propagation_phase (priv->key_controller, GTK_PHASE_TARGET); gtk_event_controller_set_static_name (priv->key_controller, "gtk-text-key-controller"); @@ -1944,8 +1953,6 @@ gtk_text_init (GtkText *self) G_CALLBACK (gtk_text_key_controller_key_pressed), self); g_signal_connect_swapped (priv->key_controller, "im-update", G_CALLBACK (gtk_text_schedule_im_reset), self); - gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->key_controller), - priv->im_context); gtk_widget_add_controller (GTK_WIDGET (self), priv->key_controller); priv->focus_controller = gtk_event_controller_focus_new (); @@ -5579,7 +5586,7 @@ gtk_text_set_editable (GtkText *self, if (is_editable && gtk_widget_has_focus (widget)) gtk_im_context_focus_in (priv->im_context); - gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->key_controller), + gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->im_key_controller), is_editable ? priv->im_context : NULL); gtk_text_update_history (self); @@ -7031,6 +7038,14 @@ set_text_cursor (GtkWidget *widget) gtk_widget_set_cursor_from_name (widget, "text"); } +GtkEventController * +gtk_text_get_im_key_controller (GtkText *self) +{ + GtkTextPrivate *priv = gtk_text_get_instance_private (self); + + return priv->im_key_controller; +} + GtkEventController * gtk_text_get_key_controller (GtkText *self) { diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 0fd51136da..f90c6a6efe 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -248,6 +248,7 @@ struct _GtkTextViewPrivate GtkTextPendingScroll *pending_scroll; GtkGesture *drag_gesture; + GtkEventController *im_key_controller; GtkEventController *key_controller; GtkCssNode *selection_node; @@ -1994,6 +1995,12 @@ gtk_text_view_init (GtkTextView *text_view) g_signal_connect (controller, "motion", G_CALLBACK (gtk_text_view_motion), widget); gtk_widget_add_controller (widget, controller); + priv->im_key_controller = gtk_event_controller_key_new (); + gtk_event_controller_set_propagation_phase (priv->im_key_controller, GTK_PHASE_CAPTURE); + gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->im_key_controller), + priv->im_context); + gtk_widget_add_controller (widget, priv->im_key_controller); + priv->key_controller = gtk_event_controller_key_new (); g_signal_connect (priv->key_controller, "key-pressed", G_CALLBACK (gtk_text_view_key_controller_key_pressed), @@ -2001,8 +2008,6 @@ gtk_text_view_init (GtkTextView *text_view) g_signal_connect (priv->key_controller, "im-update", G_CALLBACK (gtk_text_view_key_controller_im_update), widget); - gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->key_controller), - priv->im_context); gtk_widget_add_controller (widget, priv->key_controller); controller = gtk_event_controller_focus_new (); g_signal_connect_swapped (controller, "enter", @@ -3183,7 +3188,7 @@ gtk_text_view_set_editable (GtkTextView *text_view, if (setting && gtk_widget_has_focus (GTK_WIDGET (text_view))) gtk_im_context_focus_in (priv->im_context); - gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->key_controller), + gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->im_key_controller), setting ? priv->im_context : NULL); if (priv->layout && priv->layout->default_style) @@ -10296,6 +10301,12 @@ gtk_text_view_get_rtl_context (GtkTextView *text_view) return text_view->priv->layout->rtl_context; } +GtkEventController * +gtk_text_view_get_im_key_controller (GtkTextView *text_view) +{ + return text_view->priv->im_key_controller; +} + GtkEventController * gtk_text_view_get_key_controller (GtkTextView *text_view) {