[gtk/wip/carlosg/osk-activation: 1/2] imwayland: Connect OSK activating gesture to parent widget on editables
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/carlosg/osk-activation: 1/2] imwayland: Connect OSK activating gesture to parent widget on editables
- Date: Wed, 6 Apr 2022 13:57:19 +0000 (UTC)
commit 7ab39b546120eb2b605f3918aaee4face6291c76
Author: Carlos Garnacho <carlosg gnome org>
Date: Wed Apr 6 11:01:01 2022 +0200
imwayland: Connect OSK activating gesture to parent widget on editables
The gesture as connected currently on the child GtkText is easily overridden
by the parent editables (and gently done so in the attempt to consume all
clicks).
Connect this gesture to the parent editable widget in these cases, so the
gesture can cohabit with the click-consuming one. It's not part of the same
group, but it won't be abruptly cancelled.
Fixes: https://gitlab.gnome.org/GNOME/gtk/-/issues/4795
gtk/gtkimcontextwayland.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkimcontextwayland.c b/gtk/gtkimcontextwayland.c
index 486435f9e0..7e8d0e721c 100644
--- a/gtk/gtkimcontextwayland.c
+++ b/gtk/gtkimcontextwayland.c
@@ -71,6 +71,7 @@ struct _GtkIMContextWayland
{
GtkIMContextSimple parent_instance;
GtkWidget *widget;
+ GtkWidget *controller_widget;
GtkGesture *gesture;
double press_x;
@@ -555,16 +556,21 @@ gtk_im_context_wayland_set_client_widget (GtkIMContext *context,
return;
if (context_wayland->widget)
+ gtk_im_context_wayland_focus_out (context);
+
+ if (context_wayland->controller_widget)
{
- gtk_im_context_wayland_focus_out (context);
- gtk_widget_remove_controller (context_wayland->widget, GTK_EVENT_CONTROLLER
(context_wayland->gesture));
+ gtk_widget_remove_controller (context_wayland->controller_widget,
+ GTK_EVENT_CONTROLLER (context_wayland->gesture));
context_wayland->gesture = NULL;
+ g_clear_object (&context_wayland->controller_widget);
}
g_set_object (&context_wayland->widget, widget);
if (widget)
{
+ GtkWidget *parent;
GtkGesture *gesture;
gesture = gtk_gesture_click_new ();
@@ -575,7 +581,18 @@ gtk_im_context_wayland_set_client_widget (GtkIMContext *context,
G_CALLBACK (pressed_cb), context);
g_signal_connect (gesture, "released",
G_CALLBACK (released_cb), context);
- gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture));
+
+ parent = gtk_widget_get_parent (widget);
+
+ if (parent &&
+ GTK_IS_EDITABLE (widget) &&
+ GTK_IS_EDITABLE (parent))
+ g_set_object (&context_wayland->controller_widget, parent);
+ else
+ g_set_object (&context_wayland->controller_widget, widget);
+
+ gtk_widget_add_controller (context_wayland->controller_widget,
+ GTK_EVENT_CONTROLLER (gesture));
context_wayland->gesture = gesture;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]