parent
bd4d6ff3e4
commit
3266acf63f
127
0001-wayland-Defer-text_input.done-on-an-idle.patch
Normal file
127
0001-wayland-Defer-text_input.done-on-an-idle.patch
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
From 63124e3e8a675725c729d4a99b994a83517a5c1a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Carlos Garnacho <carlosg@gnome.org>
|
||||||
|
Date: Thu, 18 Oct 2018 02:08:24 +0200
|
||||||
|
Subject: [PATCH] wayland: Defer text_input.done on an idle
|
||||||
|
|
||||||
|
IBus naturally doesn't know how to implement the text-input protocol,
|
||||||
|
and some input methods emit event streams that are incompatible with the
|
||||||
|
protocol, if not assumed to be part of an grouped series of events. As
|
||||||
|
IBus doesn't have any API to let us know about such groupings, let's
|
||||||
|
fake it by adding a specially crafted idle callback.
|
||||||
|
|
||||||
|
The idle callback has a known limitation; if there is an idle callback
|
||||||
|
with a higher priority, that either doesn't remove itself, or
|
||||||
|
reschedules itself before the next idle, we'll never get triggered.
|
||||||
|
This, however, is unlikely to actually be the bigger problem in such
|
||||||
|
situations, as it'd likely mean we'd have a 100% CPU bug.
|
||||||
|
|
||||||
|
https://gitlab.gnome.org/GNOME/gtk/issues/1365
|
||||||
|
---
|
||||||
|
src/wayland/meta-wayland-text-input.c | 60 ++++++++++++++++++++++++---
|
||||||
|
1 file changed, 54 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/wayland/meta-wayland-text-input.c b/src/wayland/meta-wayland-text-input.c
|
||||||
|
index 8681430217..0493760bd1 100644
|
||||||
|
--- a/src/wayland/meta-wayland-text-input.c
|
||||||
|
+++ b/src/wayland/meta-wayland-text-input.c
|
||||||
|
@@ -70,6 +70,8 @@ struct _MetaWaylandTextInput
|
||||||
|
uint32_t content_type_purpose;
|
||||||
|
uint32_t text_change_cause;
|
||||||
|
gboolean enabled;
|
||||||
|
+
|
||||||
|
+ guint done_idle_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MetaWaylandTextInputFocus
|
||||||
|
@@ -114,6 +116,52 @@ increment_serial (MetaWaylandTextInput *text_input,
|
||||||
|
GUINT_TO_POINTER (serial + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
+static gboolean
|
||||||
|
+done_idle_cb (gpointer user_data)
|
||||||
|
+{
|
||||||
|
+ ClutterInputFocus *focus = user_data;
|
||||||
|
+ MetaWaylandTextInput *text_input;
|
||||||
|
+ struct wl_resource *resource;
|
||||||
|
+
|
||||||
|
+ text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
|
||||||
|
+
|
||||||
|
+ wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||||
|
+ {
|
||||||
|
+ zwp_text_input_v3_send_done (resource,
|
||||||
|
+ lookup_serial (text_input, resource));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ text_input->done_idle_id = 0;
|
||||||
|
+ return G_SOURCE_REMOVE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+meta_wayland_text_input_focus_defer_done (ClutterInputFocus *focus)
|
||||||
|
+{
|
||||||
|
+ MetaWaylandTextInput *text_input;
|
||||||
|
+
|
||||||
|
+ text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
|
||||||
|
+
|
||||||
|
+ if (text_input->done_idle_id != 0)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ /* This operates on 3 principles:
|
||||||
|
+ * - GDBus uses G_PRIORITY_DEFAULT to put messages in the thread default main
|
||||||
|
+ * context.
|
||||||
|
+ * - All relevant ClutterInputFocus methods are ultimately backed by
|
||||||
|
+ * DBus methods inside IBus.
|
||||||
|
+ * - We want to run .done after them all. The slightly lower
|
||||||
|
+ * G_PRIORITY_DEFAULT + 1 priority should ensure we at least group
|
||||||
|
+ * all messages seen so far.
|
||||||
|
+ *
|
||||||
|
+ * FIXME: .done may be delayed indefinitely if there's a high enough
|
||||||
|
+ * priority idle source in the main loop. It's unlikely that
|
||||||
|
+ * recurring idles run at this high priority though.
|
||||||
|
+ */
|
||||||
|
+ text_input->done_idle_id = g_idle_add_full (G_PRIORITY_DEFAULT + 1,
|
||||||
|
+ done_idle_cb, focus, NULL);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
meta_wayland_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
|
||||||
|
guint cursor,
|
||||||
|
@@ -127,9 +175,9 @@ meta_wayland_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
|
||||||
|
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||||
|
{
|
||||||
|
zwp_text_input_v3_send_delete_surrounding_text (resource, cursor, len);
|
||||||
|
- zwp_text_input_v3_send_done (resource,
|
||||||
|
- lookup_serial (text_input, resource));
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ meta_wayland_text_input_focus_defer_done (focus);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -145,9 +193,9 @@ meta_wayland_text_input_focus_commit_text (ClutterInputFocus *focus,
|
||||||
|
{
|
||||||
|
zwp_text_input_v3_send_preedit_string (resource, NULL, 0, 0);
|
||||||
|
zwp_text_input_v3_send_commit_string (resource, text);
|
||||||
|
- zwp_text_input_v3_send_done (resource,
|
||||||
|
- lookup_serial (text_input, resource));
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ meta_wayland_text_input_focus_defer_done (focus);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -163,9 +211,9 @@ meta_wayland_text_input_focus_set_preedit_text (ClutterInputFocus *focus,
|
||||||
|
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||||
|
{
|
||||||
|
zwp_text_input_v3_send_preedit_string (resource, text, cursor, cursor);
|
||||||
|
- zwp_text_input_v3_send_done (resource,
|
||||||
|
- lookup_serial (text_input, resource));
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ meta_wayland_text_input_focus_defer_done (focus);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
Name: mutter
|
Name: mutter
|
||||||
Version: 3.30.1
|
Version: 3.30.1
|
||||||
Release: 4%{?dist}
|
Release: 5%{?dist}
|
||||||
Summary: Window and compositing manager based on Clutter
|
Summary: Window and compositing manager based on Clutter
|
||||||
|
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
@ -24,6 +24,9 @@ Patch1: 0001-monitor-manager-Don-t-use-switch-config-when-ensurin.patch
|
|||||||
Patch2: 0001-constraints-Make-current-placement-rule-stack-alloca.patch
|
Patch2: 0001-constraints-Make-current-placement-rule-stack-alloca.patch
|
||||||
Patch3: 0002-shaped-texture-Clean-up-texture-regions.patch
|
Patch3: 0002-shaped-texture-Clean-up-texture-regions.patch
|
||||||
|
|
||||||
|
# Backport work-around for hangul text input bug (rhbz#1632981)
|
||||||
|
Patch4: 0001-wayland-Defer-text_input.done-on-an-idle.patch
|
||||||
|
|
||||||
BuildRequires: chrpath
|
BuildRequires: chrpath
|
||||||
BuildRequires: pango-devel
|
BuildRequires: pango-devel
|
||||||
BuildRequires: startup-notification-devel
|
BuildRequires: startup-notification-devel
|
||||||
@ -188,6 +191,9 @@ desktop-file-validate %{buildroot}/%{_datadir}/applications/%{name}.desktop
|
|||||||
%{_datadir}/mutter/tests
|
%{_datadir}/mutter/tests
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Oct 22 2018 Jonas Ådahl <jadahl@redhat.com> - 3.30.1-5
|
||||||
|
- Backport work-around for hangul text input bug (rhbz#1632981)
|
||||||
|
|
||||||
* Sat Oct 20 2018 Jonas Ådahl <jadahl@redhat.com> - 3.30.1-4
|
* Sat Oct 20 2018 Jonas Ådahl <jadahl@redhat.com> - 3.30.1-4
|
||||||
- Backport a couple of memory leak fixes (rhbz#1641254)
|
- Backport a couple of memory leak fixes (rhbz#1641254)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user