Resolve #2252227 Fix display buffer overflow
Change IBus unique name to :1.0 from IBUS_SERVICE_IBUS
This commit is contained in:
parent
63dc799769
commit
35469f4d4d
@ -1,225 +0,0 @@
|
||||
From b6376d3a680f7f43583de7731629666b8dd85f01 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Fri, 22 Mar 2024 09:47:28 +0900
|
||||
Subject: [PATCH] ui/gtk3: Configure initial keymaps with localectl in Wayland
|
||||
|
||||
`setxkbmap -query` returns US layout with Xwayland and it does not
|
||||
correspond to the session keymaps so ibus-panel now uses
|
||||
`localectl status` in Wayland but it does not provide the session
|
||||
XKB options against `setxkbmap` command in Xorg.
|
||||
Need to think how to load or set the XKB options in Wayland later.
|
||||
|
||||
BUG=rhbz#2267615
|
||||
---
|
||||
ui/gtk3/panel.vala | 2 +-
|
||||
ui/gtk3/xkblayout.vala | 123 ++++++++++++++++++++++++++++++-----------
|
||||
2 files changed, 91 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
|
||||
index c7176619..3576972d 100644
|
||||
--- a/ui/gtk3/panel.vala
|
||||
+++ b/ui/gtk3/panel.vala
|
||||
@@ -509,7 +509,7 @@ class Panel : IBus.PanelService {
|
||||
string layouts;
|
||||
string variants;
|
||||
string option;
|
||||
- XKBLayout.get_layout(out layouts, out variants, out option);
|
||||
+ m_xkblayout.get_layout(out layouts, out variants, out option);
|
||||
|
||||
GLib.List<IBus.EngineDesc> xkb_engines =
|
||||
new GLib.List<IBus.EngineDesc>();
|
||||
diff --git a/ui/gtk3/xkblayout.vala b/ui/gtk3/xkblayout.vala
|
||||
index 729b48ce..7812c4bb 100644
|
||||
--- a/ui/gtk3/xkblayout.vala
|
||||
+++ b/ui/gtk3/xkblayout.vala
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* Copyright(c) 2014 Red Hat, Inc.
|
||||
* Copyright(c) 2014 Peng Huang <shawn.p.huang@gmail.com>
|
||||
- * Copyright(c) 2014 Takao Fujiwara <tfujiwar@redhat.com>
|
||||
+ * Copyright(c) 2014-2024 Takao Fujiwara <tfujiwar@redhat.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -25,11 +25,11 @@
|
||||
class XKBLayout
|
||||
{
|
||||
private const string XKB_COMMAND = "setxkbmap";
|
||||
- private const string XKB_QUERY_ARG = "-query";
|
||||
private const string XKB_LAYOUT_ARG = "-layout";
|
||||
private const string XMODMAP_COMMAND = "xmodmap";
|
||||
private const string[] XMODMAP_KNOWN_FILES = {".xmodmap", ".xmodmaprc",
|
||||
".Xmodmap", ".Xmodmaprc"};
|
||||
+ private string[] m_get_layout_args = {};
|
||||
private string[] m_xkb_latin_layouts = {};
|
||||
private string m_default_layout = "";
|
||||
private string m_default_variant = "";
|
||||
@@ -39,16 +39,23 @@ class XKBLayout
|
||||
public XKBLayout() {
|
||||
}
|
||||
|
||||
+
|
||||
public void set_latin_layouts(string[] xkb_latin_layouts) {
|
||||
m_xkb_latin_layouts = xkb_latin_layouts;
|
||||
}
|
||||
|
||||
- public static void get_layout(out string layout,
|
||||
- out string variant,
|
||||
- out string option) {
|
||||
+
|
||||
+ public void get_layout(out string layout,
|
||||
+ out string variant,
|
||||
+ out string option) {
|
||||
+ search_get_layout_program();
|
||||
+ if (m_get_layout_args[0] == null) {
|
||||
+ warning("Not found localectl or setxkbmap command in PATH");
|
||||
+ return;
|
||||
+ }
|
||||
string[] exec_command = {};
|
||||
- exec_command += XKB_COMMAND;
|
||||
- exec_command += XKB_QUERY_ARG;
|
||||
+ foreach (unowned string arg in m_get_layout_args)
|
||||
+ exec_command += arg;
|
||||
string standard_output = null;
|
||||
string standard_error = null;
|
||||
int exit_status = 0;
|
||||
@@ -69,46 +76,94 @@ class XKBLayout
|
||||
} catch (GLib.SpawnError err) {
|
||||
stderr.printf("IBUS_ERROR: %s\n", err.message);
|
||||
}
|
||||
- if (exit_status != 0) {
|
||||
+ if (exit_status != 0)
|
||||
stderr.printf("IBUS_ERROR: %s\n", standard_error ?? "");
|
||||
- }
|
||||
- if (standard_output == null) {
|
||||
+ if (standard_output == null)
|
||||
return;
|
||||
+
|
||||
+ if (exec_command[0] == "localectl") {
|
||||
+ parse_localectl_status_str(standard_output,
|
||||
+ out layout,
|
||||
+ out variant,
|
||||
+ out option);
|
||||
+ } else if (exec_command[0] == XKB_COMMAND) {
|
||||
+ parse_xkbmap_query_str(standard_output,
|
||||
+ out layout,
|
||||
+ out variant,
|
||||
+ out option);
|
||||
}
|
||||
+ }
|
||||
+
|
||||
|
||||
+ private void search_get_layout_program() {
|
||||
+ if (m_get_layout_args[0] != null)
|
||||
+ return;
|
||||
+ string get_layout_command = null;
|
||||
+ // setxkbmap can get the session XKB options in Xorg.
|
||||
+ if (BindingCommon.default_is_xdisplay())
|
||||
+ get_layout_command = "setxkbmap -query";
|
||||
+ else if (GLib.Environment.find_program_in_path("localectl") != null)
|
||||
+ get_layout_command = "localectl status";
|
||||
+ else if (GLib.Environment.find_program_in_path("setxkbmap") != null)
|
||||
+ get_layout_command = "setxkbmap -query";
|
||||
+ if (get_layout_command != null)
|
||||
+ m_get_layout_args = get_layout_command.split(" ");
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ private void parse_localectl_status_str(string standard_output,
|
||||
+ out string layout,
|
||||
+ out string variant,
|
||||
+ out string option) {
|
||||
+ layout = "";
|
||||
+ variant = "";
|
||||
+ option = "";
|
||||
foreach (string line in standard_output.split("\n")) {
|
||||
- string element = "layout:";
|
||||
- string retval = "";
|
||||
- if (line.has_prefix(element)) {
|
||||
- retval = line[element.length:line.length];
|
||||
- if (retval != null) {
|
||||
- retval = retval.strip();
|
||||
+ const string[] elements = { "X11 Layout:", "X11 Variant:" };
|
||||
+ foreach (unowned string element in elements) {
|
||||
+ string retval = "";
|
||||
+ int index = line.index_of(element);
|
||||
+ if (index >= 0) {
|
||||
+ retval = line[index + element.length:line.length];
|
||||
+ if (retval != null)
|
||||
+ retval = retval.strip();
|
||||
+ if (element == elements[0])
|
||||
+ layout = retval;
|
||||
+ else if (element == elements[1])
|
||||
+ variant = retval;
|
||||
}
|
||||
- layout = retval;
|
||||
}
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- element = "variant:";
|
||||
- retval = "";
|
||||
- if (line.has_prefix(element)) {
|
||||
- retval = line[element.length:line.length];
|
||||
- if (retval != null) {
|
||||
- retval = retval.strip();
|
||||
- }
|
||||
- variant = retval;
|
||||
- }
|
||||
|
||||
- element = "options:";
|
||||
- retval = "";
|
||||
- if (line.has_prefix(element)) {
|
||||
- retval = line[element.length:line.length];
|
||||
- if (retval != null) {
|
||||
- retval = retval.strip();
|
||||
+ private void parse_xkbmap_query_str(string standard_output,
|
||||
+ out string layout,
|
||||
+ out string variant,
|
||||
+ out string option) {
|
||||
+ layout = "";
|
||||
+ variant = "";
|
||||
+ option = "";
|
||||
+ foreach (string line in standard_output.split("\n")) {
|
||||
+ const string[] elements = { "layout:", "variant:", "options:" };
|
||||
+ foreach (unowned string element in elements) {
|
||||
+ string retval = "";
|
||||
+ if (line.has_prefix(element)) {
|
||||
+ retval = line[element.length:line.length];
|
||||
+ if (retval != null)
|
||||
+ retval = retval.strip();
|
||||
+ if (element == elements[0])
|
||||
+ layout = retval;
|
||||
+ else if (element == elements[1])
|
||||
+ variant = retval;
|
||||
+ else if (element == elements[2])
|
||||
+ option = retval;
|
||||
}
|
||||
- option = retval;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+
|
||||
public void set_layout(IBus.EngineDesc engine) {
|
||||
string layout = engine.get_layout();
|
||||
string variant = engine.get_layout_variant();
|
||||
@@ -206,6 +261,7 @@ class XKBLayout
|
||||
run_xmodmap();
|
||||
}
|
||||
|
||||
+
|
||||
public void run_xmodmap() {
|
||||
if (!m_use_xmodmap) {
|
||||
return;
|
||||
@@ -246,6 +302,7 @@ class XKBLayout
|
||||
}
|
||||
}
|
||||
|
||||
+
|
||||
public void set_use_xmodmap(bool use_xmodmap) {
|
||||
m_use_xmodmap = use_xmodmap;
|
||||
}
|
||||
--
|
||||
2.43.0
|
||||
|
986
ibus-HEAD.patch
986
ibus-HEAD.patch
@ -1,14 +1,61 @@
|
||||
From cf30db6d19fd0d3c46a5468b34c53a2b7ba5d3b6 Mon Sep 17 00:00:00 2001
|
||||
From 4059b9f43f4505c855677abde1b59fc13241ca58 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Wed, 15 May 2024 23:30:59 +0900
|
||||
Subject: [PATCH] src/tests: Fix ibus-daemon in ibus-desktop-testing-runner
|
||||
Date: Tue, 2 Apr 2024 23:34:07 +0900
|
||||
Subject: [PATCH 1/6] Makefile: Add check sum file
|
||||
|
||||
---
|
||||
Makefile.am | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/Makefile.am b/Makefile.am
|
||||
index 16548d25..88fdbd48 100644
|
||||
--- a/Makefile.am
|
||||
+++ b/Makefile.am
|
||||
@@ -138,6 +138,14 @@ srpm: dist @PACKAGE_NAME@.spec
|
||||
--define "_specdir `pwd`/rpm" \
|
||||
@PACKAGE_NAME@.spec
|
||||
|
||||
+@PACKAGE_NAME@-@PACKAGE_VERSION@.%.sum: @PACKAGE_NAME@-@PACKAGE_VERSION@.%
|
||||
+ f=`basename $@ .sum`; \
|
||||
+ printf "cksum %s %s %s\n" `cksum $$f` > $@; \
|
||||
+ printf "sha1sum %s %s\n" `sha1sum $$f` >> $@; \
|
||||
+ printf "sha256sum %s %s\n" `sha256sum $$f` >> $@; \
|
||||
+ printf "sha512sum %s %s\n" `sha512sum $$f` >> $@; \
|
||||
+ $(NULL)
|
||||
+
|
||||
clean-rpm:
|
||||
-$(RM) -r "`uname -i`"
|
||||
|
||||
--
|
||||
2.45.0
|
||||
|
||||
From e39345af20c1dd9b18cdb6ccb5039b03e4135f73 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Fri, 24 May 2024 13:18:42 +0900
|
||||
Subject: [PATCH 2/6] src/tests: Fix ibus-daemon in ibus-desktop-testing-runner
|
||||
|
||||
Some distributions do not need the IBus panel and gnome-shell also
|
||||
does not need it.
|
||||
Add --verbose option to get ibus-daemon error messages.
|
||||
|
||||
Add vala check in autogen.sh since valac changes the source codes.
|
||||
---
|
||||
src/tests/ibus-desktop-testing-runner.in | 15 ++++++++++++---
|
||||
1 file changed, 12 insertions(+), 3 deletions(-)
|
||||
autogen.sh | 2 +-
|
||||
src/tests/ibus-desktop-testing-runner.in | 17 ++++++++++++++---
|
||||
2 files changed, 15 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/autogen.sh b/autogen.sh
|
||||
index d6f8f983..90e126ec 100755
|
||||
--- a/autogen.sh
|
||||
+++ b/autogen.sh
|
||||
@@ -14,7 +14,7 @@ GCC_VERSION=$(gcc --version | head -1 | awk '{print $3}')
|
||||
GCC_MAJOR_VERSION=$(echo "$GCC_VERSION" | awk -F. '{print $1}')
|
||||
FEDORA_PKG1='autoconf automake libtool gettext-devel'
|
||||
FEDORA_PKG2='glib2-devel gtk2-devel gtk3-devel
|
||||
- wayland-devel'
|
||||
+ wayland-devel vala'
|
||||
FEDORA_PKG3='cldr-emoji-annotation iso-codes-devel unicode-emoji unicode-ucd
|
||||
xkeyboard-config-devel'
|
||||
|
||||
diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
|
||||
index 6b208345..1ac2dfc8 100755
|
||||
@ -77,3 +124,932 @@ index 6b208345..1ac2dfc8 100755
|
||||
--
|
||||
2.45.0
|
||||
|
||||
From f190da19b53c267ca1c9730e18f1b53c089c0247 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Fri, 24 May 2024 15:37:00 +0900
|
||||
Subject: [PATCH 3/6] ui/gtk3: Configure initial keymaps with localectl in
|
||||
Wayland
|
||||
|
||||
`setxkbmap -query` returns US layout with Xwayland and it does not
|
||||
correspond to the session keymaps so ibus-panel now uses
|
||||
`localectl status` in Wayland but it does not provide the session
|
||||
XKB options against `setxkbmap` command in Xorg.
|
||||
Need to think how to load or set the XKB options in Wayland later.
|
||||
|
||||
BUG=rhbz#2267615
|
||||
BUG=https://github.com/ibus/ibus/pull/2624
|
||||
---
|
||||
src/tests/ibus-keypress.c | 40 +++++++++----
|
||||
ui/gtk3/panel.vala | 2 +-
|
||||
ui/gtk3/xkblayout.vala | 123 ++++++++++++++++++++++++++++----------
|
||||
3 files changed, 119 insertions(+), 46 deletions(-)
|
||||
|
||||
diff --git a/src/tests/ibus-keypress.c b/src/tests/ibus-keypress.c
|
||||
index bab05398..d44f39b2 100644
|
||||
--- a/src/tests/ibus-keypress.c
|
||||
+++ b/src/tests/ibus-keypress.c
|
||||
@@ -5,6 +5,14 @@
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/extensions/XTest.h>
|
||||
|
||||
+#ifdef GDK_WINDOWING_WAYLAND
|
||||
+#if GTK_CHECK_VERSION (3, 98, 4)
|
||||
+#include <gdk/wayland/gdkwayland.h>
|
||||
+#else
|
||||
+#include <gdk/gdkwayland.h>
|
||||
+#endif
|
||||
+#endif
|
||||
+
|
||||
#define GREEN "\033[0;32m"
|
||||
#define RED "\033[0;31m"
|
||||
#define NC "\033[0m"
|
||||
@@ -186,15 +194,8 @@ set_engine_cb (GObject *object,
|
||||
}
|
||||
|
||||
display = gtk_widget_get_display (entry);
|
||||
- if (GDK_IS_X11_DISPLAY (display)) {
|
||||
- xdisplay = gdk_x11_display_get_xdisplay (display);
|
||||
- } else {
|
||||
-#if 0
|
||||
- xdisplay = XOpenDisplay (NULL);
|
||||
-#else
|
||||
- g_critical ("No idea to simulate key events in Wayland\n");
|
||||
-#endif
|
||||
- }
|
||||
+ g_assert (GDK_IS_X11_DISPLAY (display));
|
||||
+ xdisplay = gdk_x11_display_get_xdisplay (display);
|
||||
g_return_if_fail (xdisplay);
|
||||
|
||||
for (i = 0; test_cases[i][0].keyval; i++) {
|
||||
@@ -272,12 +273,18 @@ create_window ()
|
||||
static void
|
||||
test_keypress (void)
|
||||
{
|
||||
+ gchar *path;
|
||||
int status = 0;
|
||||
GError *error = NULL;
|
||||
|
||||
- g_spawn_command_line_sync ("setxkbmap -layout us",
|
||||
- NULL, NULL,
|
||||
- &status, &error);
|
||||
+ /* localectl does not change the session keymap. */
|
||||
+ path = g_find_program_in_path ("setxkbmap");
|
||||
+ if (path) {
|
||||
+ g_spawn_command_line_sync ("setxkbmap -layout us",
|
||||
+ NULL, NULL,
|
||||
+ &status, &error);
|
||||
+ }
|
||||
+ g_free (path);
|
||||
g_assert (register_ibus_engine ());
|
||||
|
||||
create_window ();
|
||||
@@ -295,6 +302,15 @@ main (int argc, char *argv[])
|
||||
g_message ("Failed setenv NO_AT_BRIDGE\n");
|
||||
g_test_init (&argc, &argv, NULL);
|
||||
gtk_init (&argc, &argv);
|
||||
+#ifdef GDK_WINDOWING_WAYLAND
|
||||
+ {
|
||||
+ GdkDisplay *display = gdk_display_get_default ();
|
||||
+ if (GDK_IS_WAYLAND_DISPLAY (display)) {
|
||||
+ g_print ("setxkbmap and XTEST do not work in Wayland.\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+#endif
|
||||
|
||||
g_test_add_func ("/ibus/keyrepss", test_keypress);
|
||||
|
||||
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
|
||||
index 678b51f0..d907458e 100644
|
||||
--- a/ui/gtk3/panel.vala
|
||||
+++ b/ui/gtk3/panel.vala
|
||||
@@ -510,7 +510,7 @@ class Panel : IBus.PanelService {
|
||||
string layouts;
|
||||
string variants;
|
||||
string option;
|
||||
- XKBLayout.get_layout(out layouts, out variants, out option);
|
||||
+ m_xkblayout.get_layout(out layouts, out variants, out option);
|
||||
|
||||
GLib.List<IBus.EngineDesc> xkb_engines =
|
||||
new GLib.List<IBus.EngineDesc>();
|
||||
diff --git a/ui/gtk3/xkblayout.vala b/ui/gtk3/xkblayout.vala
|
||||
index 729b48ce..7812c4bb 100644
|
||||
--- a/ui/gtk3/xkblayout.vala
|
||||
+++ b/ui/gtk3/xkblayout.vala
|
||||
@@ -4,7 +4,7 @@
|
||||
*
|
||||
* Copyright(c) 2014 Red Hat, Inc.
|
||||
* Copyright(c) 2014 Peng Huang <shawn.p.huang@gmail.com>
|
||||
- * Copyright(c) 2014 Takao Fujiwara <tfujiwar@redhat.com>
|
||||
+ * Copyright(c) 2014-2024 Takao Fujiwara <tfujiwar@redhat.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -25,11 +25,11 @@
|
||||
class XKBLayout
|
||||
{
|
||||
private const string XKB_COMMAND = "setxkbmap";
|
||||
- private const string XKB_QUERY_ARG = "-query";
|
||||
private const string XKB_LAYOUT_ARG = "-layout";
|
||||
private const string XMODMAP_COMMAND = "xmodmap";
|
||||
private const string[] XMODMAP_KNOWN_FILES = {".xmodmap", ".xmodmaprc",
|
||||
".Xmodmap", ".Xmodmaprc"};
|
||||
+ private string[] m_get_layout_args = {};
|
||||
private string[] m_xkb_latin_layouts = {};
|
||||
private string m_default_layout = "";
|
||||
private string m_default_variant = "";
|
||||
@@ -39,16 +39,23 @@ class XKBLayout
|
||||
public XKBLayout() {
|
||||
}
|
||||
|
||||
+
|
||||
public void set_latin_layouts(string[] xkb_latin_layouts) {
|
||||
m_xkb_latin_layouts = xkb_latin_layouts;
|
||||
}
|
||||
|
||||
- public static void get_layout(out string layout,
|
||||
- out string variant,
|
||||
- out string option) {
|
||||
+
|
||||
+ public void get_layout(out string layout,
|
||||
+ out string variant,
|
||||
+ out string option) {
|
||||
+ search_get_layout_program();
|
||||
+ if (m_get_layout_args[0] == null) {
|
||||
+ warning("Not found localectl or setxkbmap command in PATH");
|
||||
+ return;
|
||||
+ }
|
||||
string[] exec_command = {};
|
||||
- exec_command += XKB_COMMAND;
|
||||
- exec_command += XKB_QUERY_ARG;
|
||||
+ foreach (unowned string arg in m_get_layout_args)
|
||||
+ exec_command += arg;
|
||||
string standard_output = null;
|
||||
string standard_error = null;
|
||||
int exit_status = 0;
|
||||
@@ -69,46 +76,94 @@ class XKBLayout
|
||||
} catch (GLib.SpawnError err) {
|
||||
stderr.printf("IBUS_ERROR: %s\n", err.message);
|
||||
}
|
||||
- if (exit_status != 0) {
|
||||
+ if (exit_status != 0)
|
||||
stderr.printf("IBUS_ERROR: %s\n", standard_error ?? "");
|
||||
- }
|
||||
- if (standard_output == null) {
|
||||
+ if (standard_output == null)
|
||||
return;
|
||||
+
|
||||
+ if (exec_command[0] == "localectl") {
|
||||
+ parse_localectl_status_str(standard_output,
|
||||
+ out layout,
|
||||
+ out variant,
|
||||
+ out option);
|
||||
+ } else if (exec_command[0] == XKB_COMMAND) {
|
||||
+ parse_xkbmap_query_str(standard_output,
|
||||
+ out layout,
|
||||
+ out variant,
|
||||
+ out option);
|
||||
}
|
||||
+ }
|
||||
+
|
||||
|
||||
+ private void search_get_layout_program() {
|
||||
+ if (m_get_layout_args[0] != null)
|
||||
+ return;
|
||||
+ string get_layout_command = null;
|
||||
+ // setxkbmap can get the session XKB options in Xorg.
|
||||
+ if (BindingCommon.default_is_xdisplay())
|
||||
+ get_layout_command = "setxkbmap -query";
|
||||
+ else if (GLib.Environment.find_program_in_path("localectl") != null)
|
||||
+ get_layout_command = "localectl status";
|
||||
+ else if (GLib.Environment.find_program_in_path("setxkbmap") != null)
|
||||
+ get_layout_command = "setxkbmap -query";
|
||||
+ if (get_layout_command != null)
|
||||
+ m_get_layout_args = get_layout_command.split(" ");
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ private void parse_localectl_status_str(string standard_output,
|
||||
+ out string layout,
|
||||
+ out string variant,
|
||||
+ out string option) {
|
||||
+ layout = "";
|
||||
+ variant = "";
|
||||
+ option = "";
|
||||
foreach (string line in standard_output.split("\n")) {
|
||||
- string element = "layout:";
|
||||
- string retval = "";
|
||||
- if (line.has_prefix(element)) {
|
||||
- retval = line[element.length:line.length];
|
||||
- if (retval != null) {
|
||||
- retval = retval.strip();
|
||||
+ const string[] elements = { "X11 Layout:", "X11 Variant:" };
|
||||
+ foreach (unowned string element in elements) {
|
||||
+ string retval = "";
|
||||
+ int index = line.index_of(element);
|
||||
+ if (index >= 0) {
|
||||
+ retval = line[index + element.length:line.length];
|
||||
+ if (retval != null)
|
||||
+ retval = retval.strip();
|
||||
+ if (element == elements[0])
|
||||
+ layout = retval;
|
||||
+ else if (element == elements[1])
|
||||
+ variant = retval;
|
||||
}
|
||||
- layout = retval;
|
||||
}
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- element = "variant:";
|
||||
- retval = "";
|
||||
- if (line.has_prefix(element)) {
|
||||
- retval = line[element.length:line.length];
|
||||
- if (retval != null) {
|
||||
- retval = retval.strip();
|
||||
- }
|
||||
- variant = retval;
|
||||
- }
|
||||
|
||||
- element = "options:";
|
||||
- retval = "";
|
||||
- if (line.has_prefix(element)) {
|
||||
- retval = line[element.length:line.length];
|
||||
- if (retval != null) {
|
||||
- retval = retval.strip();
|
||||
+ private void parse_xkbmap_query_str(string standard_output,
|
||||
+ out string layout,
|
||||
+ out string variant,
|
||||
+ out string option) {
|
||||
+ layout = "";
|
||||
+ variant = "";
|
||||
+ option = "";
|
||||
+ foreach (string line in standard_output.split("\n")) {
|
||||
+ const string[] elements = { "layout:", "variant:", "options:" };
|
||||
+ foreach (unowned string element in elements) {
|
||||
+ string retval = "";
|
||||
+ if (line.has_prefix(element)) {
|
||||
+ retval = line[element.length:line.length];
|
||||
+ if (retval != null)
|
||||
+ retval = retval.strip();
|
||||
+ if (element == elements[0])
|
||||
+ layout = retval;
|
||||
+ else if (element == elements[1])
|
||||
+ variant = retval;
|
||||
+ else if (element == elements[2])
|
||||
+ option = retval;
|
||||
}
|
||||
- option = retval;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+
|
||||
public void set_layout(IBus.EngineDesc engine) {
|
||||
string layout = engine.get_layout();
|
||||
string variant = engine.get_layout_variant();
|
||||
@@ -206,6 +261,7 @@ class XKBLayout
|
||||
run_xmodmap();
|
||||
}
|
||||
|
||||
+
|
||||
public void run_xmodmap() {
|
||||
if (!m_use_xmodmap) {
|
||||
return;
|
||||
@@ -246,6 +302,7 @@ class XKBLayout
|
||||
}
|
||||
}
|
||||
|
||||
+
|
||||
public void set_use_xmodmap(bool use_xmodmap) {
|
||||
m_use_xmodmap = use_xmodmap;
|
||||
}
|
||||
--
|
||||
2.45.0
|
||||
|
||||
From 48c4a9c900421b9e77be399a4792974f25a80be6 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Fri, 24 May 2024 16:17:58 +0900
|
||||
Subject: [PATCH 4/6] src/ibusenginesimple: Ignore Super modifier for compose
|
||||
keys
|
||||
|
||||
Now IBus receives key events prior to the window manager and needs
|
||||
to ignore Super modifier since Super key has been already ignored
|
||||
for compose keys.
|
||||
|
||||
BUG=https://gitlab.gnome.org/GNOME/mutter/-/issues/3128
|
||||
---
|
||||
src/ibusenginesimple.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
|
||||
index 4bee8cb3..76dd9eb5 100644
|
||||
--- a/src/ibusenginesimple.c
|
||||
+++ b/src/ibusenginesimple.c
|
||||
@@ -2,7 +2,7 @@
|
||||
/* vim:set et sts=4: */
|
||||
/* ibus - The Input Bus
|
||||
* Copyright (C) 2014 Peng Huang <shawn.p.huang@gmail.com>
|
||||
- * Copyright (C) 2015-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
||||
+ * Copyright (C) 2015-2024 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
||||
* Copyright (C) 2014-2017 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -1017,7 +1017,9 @@ ibus_engine_simple_process_key_event (IBusEngine *engine,
|
||||
!is_hex_start && !is_hex_end && !is_escape && !is_backspace) ||
|
||||
(priv->in_emoji_sequence && !printable_keyval &&
|
||||
!is_emoji_start && !is_hex_end && !is_escape && !is_backspace)) {
|
||||
- if (modifiers & (IBUS_MOD1_MASK | IBUS_CONTROL_MASK) ||
|
||||
+ guint no_text_input_mask = IBUS_MOD1_MASK | IBUS_MOD4_MASK \
|
||||
+ | IBUS_CONTROL_MASK | IBUS_SUPER_MASK;
|
||||
+ if (modifiers & no_text_input_mask ||
|
||||
((priv->in_hex_sequence || priv->in_emoji_sequence) &&
|
||||
priv->modifiers_dropped &&
|
||||
(keyval == IBUS_KEY_Return ||
|
||||
--
|
||||
2.45.0
|
||||
|
||||
From a3a5a20a30f2a8ecee4dc2aaa4fd48c62c91d768 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Fri, 24 May 2024 16:18:03 +0900
|
||||
Subject: [PATCH 5/6] src/ibusenginesimple: Do not update zero length preedit
|
||||
text
|
||||
|
||||
Several engines can inherit IBusEngieSimple for the compose key support
|
||||
likes Anthy, Hangul, M17n and it could have the duplicated preedit text
|
||||
between the engine and the parent IBusEngineSimple and it could update
|
||||
the preedit text mutually by mistake.
|
||||
|
||||
Then the preedit text should not be hidden for zero length at least.
|
||||
This update might not be enough but hope to fix the cursor position
|
||||
reset with hiding the preedit text against the reported issue with
|
||||
`m17n:sa:itrans` engine.
|
||||
|
||||
BUG=https://github.com/ibus/ibus/issues/2536
|
||||
---
|
||||
src/ibusenginesimple.c | 41 +++++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 35 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
|
||||
index 76dd9eb5..ac478855 100644
|
||||
--- a/src/ibusenginesimple.c
|
||||
+++ b/src/ibusenginesimple.c
|
||||
@@ -83,11 +83,13 @@ struct _IBusEngineSimplePrivate {
|
||||
IBusEngineDict *emoji_dict;
|
||||
IBusLookupTable *lookup_table;
|
||||
gboolean lookup_table_visible;
|
||||
+ IBusText *updated_preedit;
|
||||
};
|
||||
|
||||
guint COMPOSE_BUFFER_SIZE = 20;
|
||||
G_LOCK_DEFINE_STATIC (global_tables);
|
||||
static GSList *global_tables;
|
||||
+static IBusText *updated_preedit_empty;
|
||||
|
||||
/* functions prototype */
|
||||
static void ibus_engine_simple_destroy (IBusEngineSimple *simple);
|
||||
@@ -135,24 +137,29 @@ ibus_engine_simple_class_init (IBusEngineSimpleClass *class)
|
||||
engine_class->page_up = ibus_engine_simple_page_up;
|
||||
engine_class->candidate_clicked
|
||||
= ibus_engine_simple_candidate_clicked;
|
||||
+ updated_preedit_empty = ibus_text_new_from_string ("");
|
||||
+ g_object_ref_sink (updated_preedit_empty);
|
||||
}
|
||||
|
||||
static void
|
||||
ibus_engine_simple_init (IBusEngineSimple *simple)
|
||||
{
|
||||
+ IBusEngineSimplePrivate *priv;
|
||||
GBytes *data;
|
||||
GError *error = NULL;
|
||||
const char *contents;
|
||||
gsize length = 0;
|
||||
IBusComposeTableEx *en_compose_table;
|
||||
|
||||
- simple->priv = IBUS_ENGINE_SIMPLE_GET_PRIVATE (simple);
|
||||
- simple->priv->compose_buffer = g_new0 (guint, COMPOSE_BUFFER_SIZE + 1);
|
||||
- simple->priv->hex_mode_enabled =
|
||||
+ priv = simple->priv = IBUS_ENGINE_SIMPLE_GET_PRIVATE (simple);
|
||||
+ priv->compose_buffer = g_new0 (guint, COMPOSE_BUFFER_SIZE + 1);
|
||||
+ priv->hex_mode_enabled =
|
||||
g_getenv("IBUS_ENABLE_CTRL_SHIFT_U") != NULL ||
|
||||
g_getenv("IBUS_ENABLE_CONTROL_SHIFT_U") != NULL;
|
||||
- simple->priv->tentative_match = g_string_new ("");
|
||||
- simple->priv->tentative_match_len = 0;
|
||||
+ priv->tentative_match = g_string_new ("");
|
||||
+ priv->tentative_match_len = 0;
|
||||
+ priv->updated_preedit =
|
||||
+ (IBusText *)g_object_ref_sink (updated_preedit_empty);
|
||||
data = g_resources_lookup_data ("/org/freedesktop/ibus/compose/sequences",
|
||||
G_RESOURCE_LOOKUP_FLAGS_NONE,
|
||||
&error);
|
||||
@@ -190,6 +197,7 @@ ibus_engine_simple_destroy (IBusEngineSimple *simple)
|
||||
g_string_free (priv->tentative_match, TRUE);
|
||||
priv->tentative_match = NULL;
|
||||
priv->tentative_match_len = 0;
|
||||
+ g_clear_object (&priv->updated_preedit);
|
||||
|
||||
IBUS_OBJECT_CLASS(ibus_engine_simple_parent_class)->destroy (
|
||||
IBUS_OBJECT (simple));
|
||||
@@ -228,6 +236,9 @@ ibus_engine_simple_reset (IBusEngine *engine)
|
||||
priv->tentative_match_len = 0;
|
||||
}
|
||||
ibus_engine_hide_preedit_text ((IBusEngine *)simple);
|
||||
+ g_object_unref (priv->updated_preedit);
|
||||
+ priv->updated_preedit =
|
||||
+ (IBusText *)g_object_ref_sink (updated_preedit_empty);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -318,7 +329,10 @@ ibus_engine_simple_update_preedit_text (IBusEngineSimple *simple)
|
||||
int len = strlen (priv->tentative_emoji);
|
||||
ibus_text_append_attribute (text,
|
||||
IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_SINGLE, 0, len);
|
||||
+ g_object_ref_sink (text);
|
||||
ibus_engine_update_preedit_text ((IBusEngine *)simple, text, len, TRUE);
|
||||
+ g_object_unref (priv->updated_preedit);
|
||||
+ priv->updated_preedit = text;
|
||||
g_string_free (s, TRUE);
|
||||
return;
|
||||
} else if (priv->in_compose_sequence) {
|
||||
@@ -370,7 +384,19 @@ ibus_engine_simple_update_preedit_text (IBusEngineSimple *simple)
|
||||
}
|
||||
|
||||
if (s->len == 0) {
|
||||
- ibus_engine_hide_preedit_text ((IBusEngine *)simple);
|
||||
+ /* #2536 IBusEngine can inherit IBusEngineSimple for comopse keys.
|
||||
+ * If the previous preedit is zero, the current preedit does not
|
||||
+ * need to be hidden here at least because ibus-daemon could have
|
||||
+ * another preedit for the child IBusEnigne likes m17n and caclling
|
||||
+ * ibus_engine_hide_preedit_text() here could cause a reset of
|
||||
+ * the cursor position in ibus-daemon.
|
||||
+ */
|
||||
+ if (strlen (priv->updated_preedit->text)) {
|
||||
+ ibus_engine_hide_preedit_text ((IBusEngine *)simple);
|
||||
+ g_object_unref (priv->updated_preedit);
|
||||
+ priv->updated_preedit =
|
||||
+ (IBusText *)g_object_ref_sink (updated_preedit_empty);
|
||||
+ }
|
||||
} else if (s->len >= G_MAXINT) {
|
||||
g_warning ("%s is too long compose length: %lu", s->str, s->len);
|
||||
} else {
|
||||
@@ -378,7 +404,10 @@ ibus_engine_simple_update_preedit_text (IBusEngineSimple *simple)
|
||||
IBusText *text = ibus_text_new_from_string (s->str);
|
||||
ibus_text_append_attribute (text,
|
||||
IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_SINGLE, 0, len);
|
||||
+ g_object_ref_sink (text);
|
||||
ibus_engine_update_preedit_text ((IBusEngine *)simple, text, len, TRUE);
|
||||
+ g_object_unref (priv->updated_preedit);
|
||||
+ priv->updated_preedit = text;
|
||||
}
|
||||
g_string_free (s, TRUE);
|
||||
}
|
||||
--
|
||||
2.45.0
|
||||
|
||||
From 627e7cc37d3bea4c288c932773f69fcee9ac773e Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Fri, 24 May 2024 16:28:40 +0900
|
||||
Subject: [PATCH 6/6] ui/gtk3: Fix to unref GdkDisplay in Wayland
|
||||
|
||||
Panel does not need to allocate the X11 display in Wayland but the check
|
||||
only. Vala codes need to set the unowned parameter.
|
||||
Also fixed a memory leak in the update preedit in daemon.
|
||||
|
||||
BUG=rhbz#2252227
|
||||
BUG=https://github.com/ibus/ibus/issues/2642
|
||||
BUG=https://github.com/ibus/ibus/issues/2644
|
||||
---
|
||||
bus/inputcontext.c | 1 +
|
||||
ui/gtk3/application.vala | 2 +
|
||||
ui/gtk3/bindingcommon.vala | 6 +-
|
||||
ui/gtk3/handle.vala | 2 +
|
||||
ui/gtk3/panel.vala | 18 ++++-
|
||||
6 files changed, 96 insertions(+), 78 deletions(-)
|
||||
|
||||
diff --git a/bus/inputcontext.c b/bus/inputcontext.c
|
||||
index c914fbd2..7666f057 100644
|
||||
--- a/bus/inputcontext.c
|
||||
+++ b/bus/inputcontext.c
|
||||
@@ -3306,6 +3306,7 @@ bus_input_context_update_preedit_text (BusInputContext *context,
|
||||
pre_data.key = 'm';
|
||||
if (bus_input_context_make_post_process_key_event (context,
|
||||
&pre_data)) {
|
||||
+ g_variant_unref (variant);
|
||||
return;
|
||||
} else if (context->client_commit_preedit) {
|
||||
bus_input_context_emit_signal (
|
||||
diff --git a/ui/gtk3/application.vala b/ui/gtk3/application.vala
|
||||
index ae67624f..31517c79 100644
|
||||
--- a/ui/gtk3/application.vala
|
||||
+++ b/ui/gtk3/application.vala
|
||||
@@ -228,6 +228,8 @@ class Application {
|
||||
}
|
||||
|
||||
private static void make_wayland_im() {
|
||||
+ if (BindingCommon.default_is_xdisplay())
|
||||
+ return;
|
||||
assert (open_log());
|
||||
void *wl_display = null;
|
||||
ulong i = 0;
|
||||
diff --git a/ui/gtk3/bindingcommon.vala b/ui/gtk3/bindingcommon.vala
|
||||
index e32db178..7e6443c5 100644
|
||||
--- a/ui/gtk3/bindingcommon.vala
|
||||
+++ b/ui/gtk3/bindingcommon.vala
|
||||
@@ -259,11 +259,11 @@ class BindingCommon {
|
||||
|
||||
public static bool default_is_xdisplay() {
|
||||
if (m_xdisplay == null)
|
||||
- get_xdisplay();
|
||||
+ get_xdisplay(true);
|
||||
return m_default_is_xdisplay;
|
||||
}
|
||||
|
||||
- public static Gdk.X11.Display? get_xdisplay() {
|
||||
+ public static Gdk.X11.Display? get_xdisplay(bool check_only=false) {
|
||||
if (m_xdisplay != null)
|
||||
return m_xdisplay;
|
||||
var display = Gdk.Display.get_default();
|
||||
@@ -277,6 +277,8 @@ class BindingCommon {
|
||||
m_xdisplay = (Gdk.X11.Display)display;
|
||||
return m_xdisplay;
|
||||
}
|
||||
+ if (check_only)
|
||||
+ return null;
|
||||
Gdk.set_allowed_backends("x11");
|
||||
// Call _gdk_display_manager_add_display() internally.
|
||||
m_xdisplay =
|
||||
diff --git a/ui/gtk3/handle.vala b/ui/gtk3/handle.vala
|
||||
index 65635439..1d0eefe9 100644
|
||||
--- a/ui/gtk3/handle.vala
|
||||
+++ b/ui/gtk3/handle.vala
|
||||
@@ -62,6 +62,8 @@ class Handle : Gtk.EventBox {
|
||||
}
|
||||
|
||||
public override bool button_press_event(Gdk.EventButton event) {
|
||||
+ if (!BindingCommon.default_is_xdisplay())
|
||||
+ return false;
|
||||
if (event.button != 1)
|
||||
return false;
|
||||
m_workarea = Gdk.Rectangle(){
|
||||
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
|
||||
index d907458e..534a9d37 100644
|
||||
--- a/ui/gtk3/panel.vala
|
||||
+++ b/ui/gtk3/panel.vala
|
||||
@@ -166,6 +166,9 @@ class Panel : IBus.PanelService {
|
||||
property_activate(k, s);
|
||||
});
|
||||
|
||||
+ set_version();
|
||||
+ check_wayland();
|
||||
+
|
||||
state_changed();
|
||||
}
|
||||
|
||||
@@ -443,6 +446,8 @@ class Panel : IBus.PanelService {
|
||||
}
|
||||
|
||||
private void bind_switch_shortcut() {
|
||||
+ if (m_is_wayland_im)
|
||||
+ return;
|
||||
string[] accelerators = m_settings_hotkey.get_strv("triggers");
|
||||
|
||||
var keybinding_manager = KeybindingManager.get_instance();
|
||||
@@ -874,6 +879,16 @@ class Panel : IBus.PanelService {
|
||||
message = format.printf(Environment.get_prgname());
|
||||
}
|
||||
}
|
||||
+ if (!m_is_wayland && m_is_wayland_im) {
|
||||
+ var format =
|
||||
+ _("Seems you run %s with '--enable-wayland-im' " +
|
||||
+ "option but your display server is Xorg so the Wayland " +
|
||||
+ "feature is disabled. You would be better off running " +
|
||||
+ "ibus-daemon directly instead or %s without that " +
|
||||
+ "option.");
|
||||
+ unowned string prgname = Environment.get_prgname();
|
||||
+ message = format.printf(prgname, prgname);
|
||||
+ }
|
||||
if (message == null)
|
||||
return;
|
||||
#if ENABLE_LIBNOTIFY
|
||||
@@ -908,9 +923,6 @@ class Panel : IBus.PanelService {
|
||||
|
||||
|
||||
public void load_settings() {
|
||||
- set_version();
|
||||
- check_wayland();
|
||||
-
|
||||
init_engines_order();
|
||||
|
||||
// Update m_use_system_keyboard_layout before update_engines()
|
||||
--
|
||||
2.45.0
|
||||
|
||||
From be94b8ddb4c37fe83646860a08c600b98e67fe84 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Sat, 25 May 2024 18:10:36 +0900
|
||||
Subject: [PATCH] src/ibusengine: Hide preedit text with PanelExtensionReceived
|
||||
signal
|
||||
|
||||
IBusEngineSimple no longer calls to hide the preedit with the zero
|
||||
length to fix the slurring cursor position but the emoji preedit
|
||||
becomes not to be hidden with the preedit commit or escape events
|
||||
as a side effect.
|
||||
To fix the issue, IBusEngine needs to decide to clear or keep
|
||||
the preedit when the emoji mode is finished.
|
||||
|
||||
BUG=https://github.com/ibus/ibus/issues/2536
|
||||
Fixes: https://github.com/ibus/ibus/commit/a3a5a20a
|
||||
---
|
||||
src/ibusengine.c | 11 +++++++++++
|
||||
src/ibusenginesimple.c | 2 +-
|
||||
2 files changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/ibusengine.c b/src/ibusengine.c
|
||||
index eff4992c..0352fd49 100644
|
||||
--- a/src/ibusengine.c
|
||||
+++ b/src/ibusengine.c
|
||||
@@ -1326,6 +1326,17 @@ ibus_engine_service_method_call (IBusService *service,
|
||||
return;
|
||||
}
|
||||
priv->enable_extension = ibus_extension_event_is_enabled (event);
|
||||
+ /* IBusEngineSimple no longer calls to hide the preedit with the zero
|
||||
+ * lenght and this sends the null preedit here when the emojier
|
||||
+ * commits or escapes the emoji preedit text.
|
||||
+ * TODO: Do we need a signal for the parent engines to inform this
|
||||
+ * information because some engines don't wish to hide their preedit
|
||||
+ * with hiding the emoji preedit?
|
||||
+ */
|
||||
+ if (!priv->enable_extension) {
|
||||
+ IBusText *text = ibus_text_new_from_static_string ("");
|
||||
+ ibus_engine_update_preedit_text (engine, text, 0, FALSE);
|
||||
+ }
|
||||
g_dbus_method_invocation_return_value (invocation, NULL);
|
||||
return;
|
||||
}
|
||||
diff --git a/src/ibusenginesimple.c b/src/ibusenginesimple.c
|
||||
index ac478855..e2f96a37 100644
|
||||
--- a/src/ibusenginesimple.c
|
||||
+++ b/src/ibusenginesimple.c
|
||||
@@ -385,7 +385,7 @@ ibus_engine_simple_update_preedit_text (IBusEngineSimple *simple)
|
||||
|
||||
if (s->len == 0) {
|
||||
/* #2536 IBusEngine can inherit IBusEngineSimple for comopse keys.
|
||||
- * If the previous preedit is zero, the current preedit does not
|
||||
+ * If the previous preedit is zero, the current preedit does not
|
||||
* need to be hidden here at least because ibus-daemon could have
|
||||
* another preedit for the child IBusEnigne likes m17n and caclling
|
||||
* ibus_engine_hide_preedit_text() here could cause a reset of
|
||||
--
|
||||
2.45.0
|
||||
|
||||
From 759105df1d83ae25d9eea801a7c91e67dca43cb8 Mon Sep 17 00:00:00 2001
|
||||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||
Date: Sat, 25 May 2024 19:23:23 +0900
|
||||
Subject: [PATCH] bus: Change IBus unique name to :1.0 from IBUS_SERVICE_IBUS
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
According to the D-Bus specification,
|
||||
`org.freedesktop.DBus.GetNameOwner()` must return a unique name (i.e.
|
||||
one of the form `:1.23`). The only unique name which is allowed to not
|
||||
be in this form is `org.freedesktop.DBus`.
|
||||
|
||||
The change in GLib 2.80.1 was to validate that the sender of every
|
||||
message is either a unique name (according to `g_dbus_is_unique_name()`),
|
||||
or the special name `org.freedesktop.DBus` to meet the specification.
|
||||
|
||||
In the long term, it might be more robust to rework the code so that the
|
||||
mapping from `org.freedesktop.IBus` → a unique name is stored in
|
||||
`dbus->names` (in `dbusimpl.c`) like all the other requested names.
|
||||
However, handling for the `org.freedesktop.IBus` well-known name is
|
||||
hardcoded throughout `dbusimpl.c`, so porting this single bit of it to
|
||||
create a `BusNameService` would probably cause more problems.
|
||||
|
||||
BUG=https://github.com/ibus/ibus/issues/2639
|
||||
BUG=https://gitlab.gnome.org/GNOME/glib/-/issues/3268
|
||||
BUG=https://github.com/advisories/GHSA-f632-c3rh-r2v2
|
||||
---
|
||||
bus/connection.h | 3 +++
|
||||
bus/dbusimpl.c | 29 +++++++++++++++--------------
|
||||
bus/ibusimpl.c | 13 +++++++------
|
||||
bus/inputcontext.c | 2 +-
|
||||
bus/matchrule.c | 10 +++++++++-
|
||||
bus/matchrule.h | 4 +++-
|
||||
6 files changed, 38 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/bus/connection.h b/bus/connection.h
|
||||
index 440faf1e..8264980e 100644
|
||||
--- a/bus/connection.h
|
||||
+++ b/bus/connection.h
|
||||
@@ -42,6 +42,9 @@
|
||||
#define BUS_CONNECTION_GET_CLASS(obj) \
|
||||
(G_TYPE_INSTANCE_GET_CLASS ((obj), BUS_TYPE_CONNECTION, BusConnectionClass))
|
||||
|
||||
+/* bus_dbus_impl_hello() sets the client unique names ":1.1" or later. */
|
||||
+#define IBUS_NAME_OWNER_NAME ":1.0"
|
||||
+
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _BusConnection BusConnection;
|
||||
diff --git a/bus/dbusimpl.c b/bus/dbusimpl.c
|
||||
index 59787a80..52092e58 100644
|
||||
--- a/bus/dbusimpl.c
|
||||
+++ b/bus/dbusimpl.c
|
||||
@@ -710,7 +710,8 @@ bus_dbus_impl_list_names (BusDBusImpl *dbus,
|
||||
|
||||
/* FIXME should add them? */
|
||||
g_variant_builder_add (&builder, "s", "org.freedesktop.DBus");
|
||||
- g_variant_builder_add (&builder, "s", "org.freedesktop.IBus");
|
||||
+ g_variant_builder_add (&builder, "s", IBUS_SERVICE_IBUS);
|
||||
+ g_variant_builder_add (&builder, "s", IBUS_NAME_OWNER_NAME);
|
||||
|
||||
/* append well-known names */
|
||||
GList *names, *name;
|
||||
@@ -785,11 +786,11 @@ bus_dbus_impl_get_name_owner (BusDBusImpl *dbus,
|
||||
const gchar *name = NULL;
|
||||
g_variant_get (parameters, "(&s)", &name);
|
||||
|
||||
- if (g_strcmp0 (name, "org.freedesktop.DBus") == 0 ||
|
||||
- g_strcmp0 (name, "org.freedesktop.IBus") == 0) {
|
||||
+ if (!g_strcmp0 (name, "org.freedesktop.DBus")) {
|
||||
name_owner = name;
|
||||
- }
|
||||
- else {
|
||||
+ } else if (!g_strcmp0 (name, IBUS_SERVICE_IBUS)) {
|
||||
+ name_owner = IBUS_NAME_OWNER_NAME;
|
||||
+ } else {
|
||||
BusConnection *owner = bus_dbus_impl_get_connection_by_name (dbus, name);
|
||||
if (owner != NULL) {
|
||||
name_owner = bus_connection_get_unique_name (owner);
|
||||
@@ -800,8 +801,7 @@ bus_dbus_impl_get_name_owner (BusDBusImpl *dbus,
|
||||
g_dbus_method_invocation_return_error (invocation,
|
||||
G_DBUS_ERROR, G_DBUS_ERROR_NAME_HAS_NO_OWNER,
|
||||
"Can not get name owner of '%s': no such name", name);
|
||||
- }
|
||||
- else {
|
||||
+ } else {
|
||||
g_dbus_method_invocation_return_value (invocation,
|
||||
g_variant_new ("(s)", name_owner));
|
||||
}
|
||||
@@ -932,6 +932,9 @@ bus_dbus_impl_add_match (BusDBusImpl *dbus,
|
||||
"Parse match rule [%s] failed", rule_text);
|
||||
return;
|
||||
}
|
||||
+ /* ibus_bus_watch_ibus_signal() supports IBUS_SERVICE_IBUS sender. */
|
||||
+ if (!g_strcmp0 (bus_match_rule_get_sender (rule), IBUS_SERVICE_IBUS))
|
||||
+ bus_match_rule_set_sender (rule, IBUS_NAME_OWNER_NAME);
|
||||
|
||||
g_dbus_method_invocation_return_value (invocation, NULL);
|
||||
GList *p;
|
||||
@@ -1510,7 +1513,8 @@ bus_dbus_impl_connection_filter_cb (GDBusConnection *dbus_connection,
|
||||
/* connection unique name as sender of the message*/
|
||||
g_dbus_message_set_sender (message, bus_connection_get_unique_name (connection));
|
||||
|
||||
- if (g_strcmp0 (destination, "org.freedesktop.IBus") == 0) {
|
||||
+ if (!g_strcmp0 (destination, IBUS_SERVICE_IBUS) ||
|
||||
+ !g_strcmp0 (destination, IBUS_NAME_OWNER_NAME)) {
|
||||
/* the message is sent to IBus service. messages from ibusbus and ibuscontext may fall into this category. */
|
||||
switch (message_type) {
|
||||
case G_DBUS_MESSAGE_TYPE_METHOD_CALL:
|
||||
@@ -1528,8 +1532,7 @@ bus_dbus_impl_connection_filter_cb (GDBusConnection *dbus_connection,
|
||||
g_object_unref (message);
|
||||
g_return_val_if_reached (NULL); /* return NULL since the service does not handle signals. */
|
||||
}
|
||||
- }
|
||||
- else if (g_strcmp0 (destination, "org.freedesktop.DBus") == 0) {
|
||||
+ } else if (!g_strcmp0 (destination, "org.freedesktop.DBus")) {
|
||||
/* the message is sent to DBus service. messages from ibusbus may fall into this category. */
|
||||
switch (message_type) {
|
||||
case G_DBUS_MESSAGE_TYPE_METHOD_CALL:
|
||||
@@ -1547,8 +1550,7 @@ bus_dbus_impl_connection_filter_cb (GDBusConnection *dbus_connection,
|
||||
g_object_unref (message);
|
||||
g_return_val_if_reached (NULL); /* return NULL since the service does not handle signals. */
|
||||
}
|
||||
- }
|
||||
- else if (destination == NULL) {
|
||||
+ } else if (destination == NULL) {
|
||||
/* the message is sent to the current connection. communications between ibus-daemon and panel/engines may fall into this
|
||||
* category since the panel/engine proxies created by ibus-daemon does not set bus name. */
|
||||
switch (message_type) {
|
||||
@@ -1570,8 +1572,7 @@ bus_dbus_impl_connection_filter_cb (GDBusConnection *dbus_connection,
|
||||
g_object_unref (message);
|
||||
g_return_val_if_reached (NULL); /* return NULL since the service does not handle messages. */
|
||||
}
|
||||
- }
|
||||
- else {
|
||||
+ } else {
|
||||
/* The message is sent to an other service. Forward it.
|
||||
* For example, the config proxy class in src/ibusconfig.c sets its "g-name" property (i.e. destination) to IBUS_SERVICE_CONFIG. */
|
||||
bus_dbus_impl_forward_message (dbus, connection, message);
|
||||
diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
|
||||
index 875cd550..8681c78b 100644
|
||||
--- a/bus/ibusimpl.c
|
||||
+++ b/bus/ibusimpl.c
|
||||
@@ -2388,19 +2388,20 @@ bus_ibus_impl_property_changed (BusIBusImpl *service,
|
||||
GVariant *value)
|
||||
{
|
||||
GDBusMessage *message =
|
||||
- g_dbus_message_new_signal ("/org/freedesktop/IBus",
|
||||
+ g_dbus_message_new_signal (IBUS_PATH_IBUS,
|
||||
"org.freedesktop.DBus.Properties",
|
||||
"PropertiesChanged");
|
||||
|
||||
/* set a non-zero serial to make libdbus happy */
|
||||
g_dbus_message_set_serial (message, 1);
|
||||
- g_dbus_message_set_sender (message, "org.freedesktop.IBus");
|
||||
+ g_dbus_message_set_sender (message, IBUS_NAME_OWNER_NAME);
|
||||
+
|
||||
|
||||
GVariantBuilder *builder = g_variant_builder_new (G_VARIANT_TYPE_ARRAY);
|
||||
g_variant_builder_add (builder, "{sv}", property_name, value);
|
||||
g_dbus_message_set_body (message,
|
||||
g_variant_new ("(sa{sv}as)",
|
||||
- "org.freedesktop.IBus",
|
||||
+ IBUS_SERVICE_IBUS,
|
||||
builder,
|
||||
NULL));
|
||||
g_variant_builder_unref (builder);
|
||||
@@ -2419,12 +2420,12 @@ bus_ibus_impl_emit_signal (BusIBusImpl *ibus,
|
||||
const gchar *signal_name,
|
||||
GVariant *parameters)
|
||||
{
|
||||
- GDBusMessage *message = g_dbus_message_new_signal ("/org/freedesktop/IBus",
|
||||
- "org.freedesktop.IBus",
|
||||
+ GDBusMessage *message = g_dbus_message_new_signal (IBUS_PATH_IBUS,
|
||||
+ IBUS_INTERFACE_IBUS,
|
||||
signal_name);
|
||||
/* set a non-zero serial to make libdbus happy */
|
||||
g_dbus_message_set_serial (message, 1);
|
||||
- g_dbus_message_set_sender (message, "org.freedesktop.IBus");
|
||||
+ g_dbus_message_set_sender (message, IBUS_NAME_OWNER_NAME);
|
||||
if (parameters)
|
||||
g_dbus_message_set_body (message, parameters);
|
||||
bus_dbus_impl_dispatch_message_by_rule (BUS_DEFAULT_DBUS, message, NULL);
|
||||
diff --git a/bus/inputcontext.c b/bus/inputcontext.c
|
||||
index 7666f057..e0ad0742 100644
|
||||
--- a/bus/inputcontext.c
|
||||
+++ b/bus/inputcontext.c
|
||||
@@ -755,7 +755,7 @@ bus_input_context_send_signal (BusInputContext *context,
|
||||
ibus_service_get_object_path ((IBusService *)context),
|
||||
interface_name,
|
||||
signal_name);
|
||||
- g_dbus_message_set_sender (message, "org.freedesktop.IBus");
|
||||
+ g_dbus_message_set_sender (message, IBUS_NAME_OWNER_NAME);
|
||||
g_dbus_message_set_destination (
|
||||
message,
|
||||
bus_connection_get_unique_name (context->connection));
|
||||
diff --git a/bus/matchrule.c b/bus/matchrule.c
|
||||
index 4fb1d902..2381ca9e 100644
|
||||
--- a/bus/matchrule.c
|
||||
+++ b/bus/matchrule.c
|
||||
@@ -2,7 +2,8 @@
|
||||
/* vim:set et sts=4: */
|
||||
/* IBus - The Input Bus
|
||||
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
|
||||
- * Copyright (C) 2008-2010 Red Hat, Inc.
|
||||
+ * Copyright (C) 2024 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
||||
+ * Copyright (C) 2008-2024 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -407,6 +408,13 @@ bus_match_rule_set_message_type (BusMatchRule *rule,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
+const gchar *
|
||||
+bus_match_rule_get_sender (BusMatchRule *rule)
|
||||
+{
|
||||
+ g_return_val_if_fail (rule != NULL, NULL);
|
||||
+ return rule->sender;
|
||||
+}
|
||||
+
|
||||
gboolean
|
||||
bus_match_rule_set_sender (BusMatchRule *rule,
|
||||
const gchar *sender)
|
||||
diff --git a/bus/matchrule.h b/bus/matchrule.h
|
||||
index 1dd304cd..37b6347b 100644
|
||||
--- a/bus/matchrule.h
|
||||
+++ b/bus/matchrule.h
|
||||
@@ -2,7 +2,8 @@
|
||||
/* vim:set et sts=4: */
|
||||
/* IBus - The Input Bus
|
||||
* Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
|
||||
- * Copyright (C) 2008-2010 Red Hat, Inc.
|
||||
+ * Copyright (C) 2024 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
||||
+ * Copyright (C) 2008-2024 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -57,6 +58,7 @@ void bus_match_rule_free (BusMatchRule *rule);
|
||||
gboolean bus_match_rule_set_message_type
|
||||
(BusMatchRule *rule,
|
||||
gint type);
|
||||
+const gchar * bus_match_rule_get_sender (BusMatchRule *rule);
|
||||
gboolean bus_match_rule_set_sender (BusMatchRule *rule,
|
||||
const gchar *sender);
|
||||
gboolean bus_match_rule_set_interface
|
||||
--
|
||||
2.45.0
|
||||
|
||||
|
10
ibus.spec
10
ibus.spec
@ -61,7 +61,7 @@
|
||||
Name: ibus
|
||||
Version: 1.5.30
|
||||
# https://github.com/fedora-infra/rpmautospec/issues/101
|
||||
Release: 1%{?dist}
|
||||
Release: 2%{?dist}
|
||||
Summary: Intelligent Input Bus for Linux OS
|
||||
License: LGPL-2.1-or-later
|
||||
URL: https://github.com/ibus/%name/wiki
|
||||
@ -71,10 +71,8 @@ Source2: %{name}-xinput
|
||||
Source3: %{name}.conf.5
|
||||
# Patch0: %%{name}-HEAD.patch
|
||||
Patch0: %{name}-HEAD.patch
|
||||
# #2267615
|
||||
Patch1: %{name}-2267615-wayland-init-keymap.patch
|
||||
# Under testing #1349148 #1385349 #1350291 #1406699 #1432252 #1601577
|
||||
Patch2: %{name}-1385349-segv-bus-proxy.patch
|
||||
Patch1: %{name}-1385349-segv-bus-proxy.patch
|
||||
%if %{without xinit}
|
||||
# Use mutter window manager in RHEL CI
|
||||
Patch100: %{name}-xx-desktop-testing-mutter.patch
|
||||
@ -627,6 +625,10 @@ dconf update || :
|
||||
%{_datadir}/installed-tests/ibus
|
||||
|
||||
%changelog
|
||||
* Fri May 24 2024 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.30-2
|
||||
- Resolve #2252227 Fix display buffer overflow
|
||||
- Change IBus unique name to :1.0 from IBUS_SERVICE_IBUS
|
||||
|
||||
* Thu May 02 2024 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.30-1
|
||||
- Bump to 1.5.30
|
||||
|
||||
|
@ -37,8 +37,7 @@ _EOF
|
||||
}
|
||||
|
||||
if [ $TEST_RUN_IN_RAWHIDE -eq 0 ] ; then
|
||||
IS_RAWHIDE="$(grep -i rawhide /etc/fedora-release)"
|
||||
if [ x"$IS_RAWHIDE" != x ] ; then
|
||||
if grep -q -i rawhide /etc/fedora-release &> /dev/null ; then
|
||||
gen_results "0" "pass"
|
||||
echo -n PASS
|
||||
exit 0
|
||||
|
Loading…
Reference in New Issue
Block a user