Enable sync process in GTK4

This commit is contained in:
Takao Fujiwara 2021-08-09 13:27:50 +09:00
parent fb4b95e6ad
commit 07c6d0a5df
2 changed files with 222 additions and 1 deletions

View File

@ -6037,3 +6037,221 @@ index 0ef72c03..c1016703 100755
--
2.28.0
From a823161768c8f6916dbdebe73842a9fc04521369 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Mon, 9 Aug 2021 12:36:40 +0900
Subject: [PATCH] client/gtk2/ibusimcontext: Enable sync process in GTK4
gtk_im_context_filter_key() does not forward control keys likes
BackSpace, Return and change the process mode to the synchronization.
BUG=https://gitlab.gnome.org/GNOME/gtk/-/issues/3465
---
client/gtk2/ibusimcontext.c | 65 +++++++++++++++++++++++--------------
1 file changed, 41 insertions(+), 24 deletions(-)
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
index e7ce5363..da9a402f 100644
--- a/client/gtk2/ibusimcontext.c
+++ b/client/gtk2/ibusimcontext.c
@@ -110,13 +110,15 @@ static guint _signal_preedit_end_id = 0;
static guint _signal_delete_surrounding_id = 0;
static guint _signal_retrieve_surrounding_id = 0;
-#if !GTK_CHECK_VERSION (3, 98, 4)
+#if GTK_CHECK_VERSION (3, 98, 4)
+static gboolean _use_sync_mode = TRUE;
+#else
static const gchar *_no_snooper_apps = NO_SNOOPER_APPS;
static gboolean _use_key_snooper = ENABLE_SNOOPER;
static guint _key_snooper_id = 0;
-#endif
static gboolean _use_sync_mode = FALSE;
+#endif
static const gchar *_discard_password_apps = "";
static gboolean _use_discard_password = FALSE;
@@ -767,11 +769,13 @@ ibus_im_context_class_init (IBusIMContextClass *class)
g_signal_lookup ("retrieve-surrounding", G_TYPE_FROM_CLASS (class));
g_assert (_signal_retrieve_surrounding_id != 0);
-#if !GTK_CHECK_VERSION (3, 98, 4)
+#if GTK_CHECK_VERSION (3, 98, 4)
+ _use_sync_mode = _get_boolean_env ("IBUS_ENABLE_SYNC_MODE", TRUE);
+#else
_use_key_snooper = !_get_boolean_env ("IBUS_DISABLE_SNOOPER",
!(ENABLE_SNOOPER));
-#endif
_use_sync_mode = _get_boolean_env ("IBUS_ENABLE_SYNC_MODE", FALSE);
+#endif
_use_discard_password = _get_boolean_env ("IBUS_DISCARD_PASSWORD", FALSE);
#define CHECK_APP_IN_CSV_ENV_VARIABLES(retval, \
@@ -1434,6 +1438,9 @@ static gboolean
_set_cursor_location_internal (IBusIMContext *ibusimcontext)
{
GdkRectangle area;
+#if GTK_CHECK_VERSION (3, 98, 4)
+ GtkWidget *root;
+#endif
if(ibusimcontext->client_window == NULL ||
ibusimcontext->ibuscontext == NULL) {
@@ -1442,8 +1449,27 @@ _set_cursor_location_internal (IBusIMContext *ibusimcontext)
area = ibusimcontext->cursor_area;
-#if !GTK_CHECK_VERSION (3, 98, 4)
#ifdef GDK_WINDOWING_WAYLAND
+#if GTK_CHECK_VERSION (3, 98, 4)
+ root = GTK_WIDGET (gtk_widget_get_root (ibusimcontext->client_window));
+ /* FIXME: GTK_STYLE_CLASS_TITLEBAR is available in GTK3 but not GTK4.
+ * gtk_css_boxes_get_content_rect() is available in GTK4 but it's an
+ * internal API and calculate the window edge 32 in GTK3.
+ */
+ area.y += 32;
+ area.width = 50; /* FIXME: Why 50 meets the cursor position? */
+ area.height = gtk_widget_get_height (root);
+ area.height += 32;
+ if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ())) {
+ ibus_input_context_set_cursor_location_relative (
+ ibusimcontext->ibuscontext,
+ area.x,
+ area.y,
+ area.width,
+ area.height);
+ return FALSE;
+ }
+#else
if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ())) {
gdouble px, py;
GdkWindow *parent;
@@ -1469,23 +1495,20 @@ _set_cursor_location_internal (IBusIMContext *ibusimcontext)
#endif
#endif
- if (area.x == -1 && area.y == -1 && area.width == 0 && area.height == 0) {
#if GTK_CHECK_VERSION (3, 98, 4)
- area.x = 0;
- area.y += gtk_widget_get_height (ibusimcontext->client_window);
#elif GTK_CHECK_VERSION (2, 91, 0)
- area.x = 0;
- area.y += gdk_window_get_height (ibusimcontext->client_window);
+ area.y += gdk_window_get_height (ibusimcontext->client_window);
#else
+ if (area.x == -1 && area.y == -1 && area.width == 0 && area.height == 0) {
gint w, h;
gdk_drawable_get_size (ibusimcontext->client_window, &w, &h);
area.y += h;
area.x = 0;
-#endif
}
+#endif
#if GTK_CHECK_VERSION (3, 98, 4)
-#ifdef GDK_WINDOWING_X11
+#if defined(GDK_WINDOWING_X11)
GdkDisplay *display = gtk_widget_get_display (ibusimcontext->client_window);
if (GDK_IS_X11_DISPLAY (display)) {
Display *xdisplay = gdk_x11_display_get_xdisplay (display);
@@ -1505,21 +1528,10 @@ _set_cursor_location_internal (IBusIMContext *ibusimcontext)
XGetWindowAttributes (xdisplay, window, &xwa);
area.x = x - xwa.x + area.x;
area.y = y - xwa.y + area.y;
- area.width = xwa.width;
+ area.width = 50; /* FIXME: Why 50 meets the cursor position? */
area.height = xwa.height;
}
#endif
-#elif GTK_CHECK_VERSION (3, 93, 0)
- {
- GtkNative *native = gtk_widget_get_native (
- ibusimcontext->client_window);
- GdkSurface *surface = gtk_native_get_surface (native);
- int root_x = 0;
- int root_y = 0;
- gdk_surface_get_position (surface, &root_x, &root_y);
- area.x += root_x;
- area.y += root_y;
- }
#else
gdk_window_get_root_coords (ibusimcontext->client_window,
area.x, area.y,
@@ -1541,12 +1553,17 @@ ibus_im_context_set_cursor_location (GtkIMContext *context, GdkRectangle *area)
IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context);
+#if !GTK_CHECK_VERSION (3, 93, 0)
+ /* The area is the relative coordinates and this has to get the absolute
+ * ones in _set_cursor_location_internal() since GTK 4.0.
+ */
if (ibusimcontext->cursor_area.x == area->x &&
ibusimcontext->cursor_area.y == area->y &&
ibusimcontext->cursor_area.width == area->width &&
ibusimcontext->cursor_area.height == area->height) {
return;
}
+#endif
ibusimcontext->cursor_area = *area;
_set_cursor_location_internal (ibusimcontext);
gtk_im_context_set_cursor_location (ibusimcontext->slave, area);
--
2.28.0
From 943d37444d9cc0881cb5fff87bdd4b9efd5abdb4 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Mon, 9 Aug 2021 12:49:15 +0900
Subject: [PATCH] client/gtk2/ibusimcontext: Fix a key event loop with
forwarding keys.
_ibus_context_forward_key_event_cb() caused a key event loop in
_key_snooper_cb() with key release events.
---
client/gtk2/ibusimcontext.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
index da9a402f..e66125df 100644
--- a/client/gtk2/ibusimcontext.c
+++ b/client/gtk2/ibusimcontext.c
@@ -366,6 +366,10 @@ ibus_im_context_commit_event (IBusIMContext *ibusimcontext,
g_signal_emit (ibusimcontext, _signal_commit_id, 0, text->text);
g_object_unref (text);
_request_surrounding_text (ibusimcontext);
+#if !GTK_CHECK_VERSION (3, 98, 4)
+ /* Avoid a loop with _ibus_context_forward_key_event_cb() */
+ event->state |= IBUS_HANDLED_MASK;
+#endif
return TRUE;
}
return FALSE;
@@ -643,12 +647,15 @@ _key_snooper_cb (GtkWidget *widget,
} while (0);
- if (ibusimcontext != NULL) {
+ if (ibusimcontext != NULL && event->type == GDK_KEY_PRESS) {
/* "retrieve-surrounding" signal sometimes calls unref by
* gtk_im_multicontext_get_slave() because priv->context_id is not
* the latest than global_context_id in GtkIMMulticontext.
* Since _focus_im_context is gotten by the focus_in event,
* it would be good to call ref here.
+ *
+ * Most release key events would be redundant from
+ * _ibus_context_forward_key_event_cb ().
*/
g_object_ref (ibusimcontext);
_request_surrounding_text (ibusimcontext);
@@ -657,7 +664,7 @@ _key_snooper_cb (GtkWidget *widget,
retval = _process_key_event (ibuscontext, event, ibusimcontext);
- if (ibusimcontext != NULL) {
+ if (ibusimcontext != NULL && event->type == GDK_KEY_PRESS) {
/* unref ibusimcontext could call ibus_im_context_finalize here
* because "retrieve-surrounding" signal could call unref.
*/
--
2.28.0

View File

@ -38,7 +38,7 @@
Name: ibus
Version: 1.5.24
Release: 12%{?dist}
Release: 13%{?dist}
Summary: Intelligent Input Bus for Linux OS
License: LGPLv2+
URL: https://github.com/ibus/%name/wiki
@ -510,6 +510,9 @@ dconf update || :
%{_datadir}/installed-tests/ibus
%changelog
* Mon Aug 09 2021 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.24-13
- Enable sync process in GTK4
* Mon Jul 26 2021 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.24-12
- Search language name in engine list in ibus-setup
- Set Multi_key to 0xB7 in compose preedit