Enable sync process in GTK4
This commit is contained in:
parent
fb4b95e6ad
commit
07c6d0a5df
218
ibus-HEAD.patch
218
ibus-HEAD.patch
@ -6037,3 +6037,221 @@ index 0ef72c03..c1016703 100755
|
|||||||
--
|
--
|
||||||
2.28.0
|
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
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
Name: ibus
|
Name: ibus
|
||||||
Version: 1.5.24
|
Version: 1.5.24
|
||||||
Release: 12%{?dist}
|
Release: 13%{?dist}
|
||||||
Summary: Intelligent Input Bus for Linux OS
|
Summary: Intelligent Input Bus for Linux OS
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
URL: https://github.com/ibus/%name/wiki
|
URL: https://github.com/ibus/%name/wiki
|
||||||
@ -510,6 +510,9 @@ dconf update || :
|
|||||||
%{_datadir}/installed-tests/ibus
|
%{_datadir}/installed-tests/ibus
|
||||||
|
|
||||||
%changelog
|
%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
|
* Mon Jul 26 2021 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.24-12
|
||||||
- Search language name in engine list in ibus-setup
|
- Search language name in engine list in ibus-setup
|
||||||
- Set Multi_key to 0xB7 in compose preedit
|
- Set Multi_key to 0xB7 in compose preedit
|
||||||
|
Loading…
Reference in New Issue
Block a user