77787d99c6
- Fix compose sequences beyond U10000
1587 lines
61 KiB
Diff
1587 lines
61 KiB
Diff
From 4059b9f43f4505c855677abde1b59fc13241ca58 Mon Sep 17 00:00:00 2001
|
||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||
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.
|
||
---
|
||
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
|
||
--- a/src/tests/ibus-desktop-testing-runner.in
|
||
+++ b/src/tests/ibus-desktop-testing-runner.in
|
||
@@ -45,6 +45,7 @@ TEST_LOG_STDOUT=0
|
||
RESULT_LOG=""
|
||
SCREEN_LOG=""
|
||
HAVE_GRAPHICS=1
|
||
+VERBOSE=0
|
||
DESKTOP_COMMAND="dbus-launch --exit-with-session gnome-session"
|
||
PID_XORG=0
|
||
PID_GNOME_SESSION=0
|
||
@@ -83,6 +84,7 @@ usage()
|
||
"-b, --builddir=BUILDDIR Set the BUILDDIR\n" \
|
||
"-s, --srcdir=SOURCEDIR Set the SOURCEDIR\n" \
|
||
"-c, --no-graphics Use Xvfb instead of Xorg\n" \
|
||
+"-V, --verbose Verbose log for ibus-daemon\n" \
|
||
"-d, --desktop=DESKTOP Run DESTKTOP. The default is gnome-session.\n" \
|
||
" Suffix '-with-dbus' can run DESKTOP with dbus session." \
|
||
" E.g. --desktop=mutter-with-dbus" \
|
||
@@ -101,8 +103,8 @@ usage()
|
||
parse_args()
|
||
{
|
||
# This is GNU getopt. "sudo port getopt" in BSD?
|
||
- ARGS=`getopt -o hvb:s:cd:t:r:T:o:O:S: --long \
|
||
- help,version,builddir:,srcdir:,no-graphics,desktop:,tests:,runner:,timeout:,output:,result:,screendump:\
|
||
+ ARGS=`getopt -o hvb:s:cVd:t:r:T:o:O:S: --long \
|
||
+ help,version,builddir:,srcdir:,no-graphics,verbose,desktop:,tests:,runner:,timeout:,output:,result:,screendump:\
|
||
-- "$@"`;
|
||
eval set -- "$ARGS"
|
||
while [ 1 ] ; do
|
||
@@ -112,6 +114,7 @@ parse_args()
|
||
-b | --builddir ) BUILDDIR="$2"; shift 2;;
|
||
-s | --srcdir ) SRCDIR="$2"; shift 2;;
|
||
-c | --no-graphics ) HAVE_GRAPHICS=0; shift;;
|
||
+ -V | --verbose ) VERBOSE=1; shift;;
|
||
-d | --desktop ) DESKTOP_COMMAND="$2"; shift 2;;
|
||
-t | --tests ) TESTS="$2"; shift 2;;
|
||
-r | --runner ) TESTING_RUNNER="$2"; shift 2;;
|
||
@@ -286,6 +289,7 @@ run_desktop()
|
||
PID_GNOME_SESSION=$!
|
||
sleep 30
|
||
|
||
+ IBUS_ARGS="--verbose --panel disable"
|
||
# gnome-shell 42 checks if org.freedesktop.IBus.session.GNOME.service
|
||
# systemd file is available with org.freedesktop.systemd1.Manager.GetUnit
|
||
# D-Bus method, which is provided by IBus 1.5.26, and if the file
|
||
@@ -302,8 +306,15 @@ run_desktop()
|
||
# with gnome-session.target systemd file.
|
||
# But `systemctl start gdm` terminates the parent script forcibly
|
||
# and the script cannot get the CI result.
|
||
- ibus-daemon --daemonize --verbose
|
||
+ if test $VERBOSE -eq 1 ; then
|
||
+ ibus-daemon $IBUS_ARGS &
|
||
+ else
|
||
+ ibus-daemon $IBUS_ARGS --daemonize
|
||
+ fi
|
||
sleep 3
|
||
+ if test $VERBOSE -eq 1 ; then
|
||
+ ps -ef | grep ibus
|
||
+ fi
|
||
}
|
||
|
||
|
||
--
|
||
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 aea035a96261f9c3a36f5cd9c30b84b1d7609103 Mon Sep 17 00:00:00 2001
|
||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||
Date: Sat, 8 Jun 2024 10:23:31 +0900
|
||
Subject: [PATCH] ui/gtk3: Fix Super-space in Wayland
|
||
|
||
ibus_bus_set_global_shortcut_keys_async() was not called in Plasma
|
||
Wayland after "Fix to unref GdkDisplay in Wayland" patch is applied.
|
||
Now it's called correctly and the event handler is disabled instead.
|
||
|
||
BUG=rhbz#2290842
|
||
BUG=https://github.com/ibus/ibus/issues/2644
|
||
Fixes: https://github.com/ibus/ibus/commit/627e7cc
|
||
---
|
||
ui/gtk3/keybindingmanager.vala | 9 +++++----
|
||
ui/gtk3/panel.vala | 5 ++---
|
||
2 files changed, 7 insertions(+), 7 deletions(-)
|
||
|
||
diff --git a/ui/gtk3/keybindingmanager.vala b/ui/gtk3/keybindingmanager.vala
|
||
index 71b4acb2..d4c7636a 100644
|
||
--- a/ui/gtk3/keybindingmanager.vala
|
||
+++ b/ui/gtk3/keybindingmanager.vala
|
||
@@ -60,8 +60,9 @@ public class KeybindingManager : GLib.Object {
|
||
public delegate void KeybindingHandlerFunc(Gdk.Event event);
|
||
|
||
|
||
- private KeybindingManager() {
|
||
- Gdk.Event.handler_set(event_handler);
|
||
+ private KeybindingManager(bool is_wayland_im) {
|
||
+ if (!is_wayland_im)
|
||
+ Gdk.Event.handler_set(event_handler);
|
||
}
|
||
|
||
/**
|
||
@@ -107,9 +108,9 @@ public class KeybindingManager : GLib.Object {
|
||
m_bindings.remove (binding);
|
||
}
|
||
|
||
- public static KeybindingManager get_instance () {
|
||
+ public static KeybindingManager get_instance (bool is_wayland_im=false) {
|
||
if (m_instance == null)
|
||
- m_instance = new KeybindingManager ();
|
||
+ m_instance = new KeybindingManager (is_wayland_im);
|
||
return m_instance;
|
||
}
|
||
|
||
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
|
||
index 534a9d37..b24c23ac 100644
|
||
--- a/ui/gtk3/panel.vala
|
||
+++ b/ui/gtk3/panel.vala
|
||
@@ -446,11 +446,10 @@ 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();
|
||
+ var keybinding_manager =
|
||
+ KeybindingManager.get_instance(m_is_wayland_im);
|
||
|
||
BindingCommon.KeyEventFuncType ftype =
|
||
BindingCommon.KeyEventFuncType.IME_SWITCHER;
|
||
--
|
||
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 1/6] 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
|
||
|
||
From a4d58cb859cad4a0c12e2c2a34f440f77cd73bae Mon Sep 17 00:00:00 2001
|
||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||
Date: Sat, 1 Jun 2024 20:20:19 +0900
|
||
Subject: [PATCH 2/6] portal: Let Flatpak application accept new IBus unique name
|
||
|
||
ibus-portal can accept the connection from IBUS_SERVICE_IBUS only
|
||
but now the IBus unique name is changed to IBUS_NAME_OWNER_NAME
|
||
as the D-Bus name owner and probably I think the name check is
|
||
not needed and just delete it.
|
||
|
||
BUG=https://github.com/ibus/ibus/issues/2639
|
||
Fixes: https://github.com/ibus/ibus/commit/759105d
|
||
---
|
||
portal/portal.c | 3 ---
|
||
1 file changed, 3 deletions(-)
|
||
|
||
diff --git a/portal/portal.c b/portal/portal.c
|
||
index c2e4fc7f..34da9679 100644
|
||
--- a/portal/portal.c
|
||
+++ b/portal/portal.c
|
||
@@ -400,9 +400,6 @@ portal_context_g_signal (GDBusProxy *proxy,
|
||
GError *error = NULL;
|
||
GDBusConnection *connection;
|
||
|
||
- if (g_strcmp0 (sender_name, IBUS_SERVICE_IBUS) != 0)
|
||
- return;
|
||
-
|
||
connection = g_dbus_interface_skeleton_get_connection (
|
||
G_DBUS_INTERFACE_SKELETON (portal_context));
|
||
if (!g_dbus_connection_emit_signal (connection,
|
||
--
|
||
2.45.0
|
||
|
||
From 02632ccdd430fdc3d1a58025d31c5ec72d9a7989 Mon Sep 17 00:00:00 2001
|
||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||
Date: Sat, 1 Jun 2024 20:32:29 +0900
|
||
Subject: [PATCH 3/6] portal: Support new sync ibus_input_context_process_key_event()
|
||
|
||
IBus clients have been enhanced with the new synchronous
|
||
"ProcessKeyEvent" to fix the long-standing issues and ibus-portal
|
||
also needs to support it.
|
||
|
||
Fixes: https://github.com/ibus/ibus/commit/38f09c6
|
||
---
|
||
portal/org.freedesktop.IBus.Portal.xml | 7 +++-
|
||
portal/portal.c | 54 ++++++++++++++++++++++++--
|
||
2 files changed, 56 insertions(+), 5 deletions(-)
|
||
|
||
diff --git a/portal/org.freedesktop.IBus.Portal.xml b/portal/org.freedesktop.IBus.Portal.xml
|
||
index 376ad424..0b3f6864 100644
|
||
--- a/portal/org.freedesktop.IBus.Portal.xml
|
||
+++ b/portal/org.freedesktop.IBus.Portal.xml
|
||
@@ -1,6 +1,6 @@
|
||
<?xml version="1.0"?>
|
||
<!--
|
||
- Copyright (C) 2017-2019 Red Hat, Inc.
|
||
+ Copyright (C) 2017-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
|
||
@@ -128,8 +128,13 @@
|
||
<arg type='v' name='prop' />
|
||
</signal>
|
||
|
||
+ <property name='PostProcessKeyEvent' type='(a(yv))' access='read'>
|
||
+ </property>
|
||
<property name='ContentType' type='(uu)' access='write' />
|
||
<property name='ClientCommitPreedit' type='(b)' access='write' />
|
||
+ <property name='EffectivePostProcessKeyEvent' type='(b)' access='write'>
|
||
+ </property>
|
||
+
|
||
</interface>
|
||
|
||
<interface name='org.freedesktop.IBus.Service'>
|
||
diff --git a/portal/portal.c b/portal/portal.c
|
||
index 34da9679..5cd38779 100644
|
||
--- a/portal/portal.c
|
||
+++ b/portal/portal.c
|
||
@@ -1,7 +1,7 @@
|
||
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
|
||
/* vim:set et sts=4: */
|
||
/* ibus - The Input Bus
|
||
- * Copyright (C) 2017-2021 Red Hat, Inc.
|
||
+ * Copyright (C) 2017-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
|
||
@@ -66,8 +66,10 @@ struct _IBusPortalClass
|
||
|
||
enum
|
||
{
|
||
- PROP_CONTENT_TYPE = 1,
|
||
+ PROP_POST_PROCESS_KEY_EVENT = 1,
|
||
+ PROP_CONTENT_TYPE,
|
||
PROP_CLIENT_COMMIT_PREEDIT,
|
||
+ PROP_EFFECTIVE_POST_PROCESS_KEY_EVENT,
|
||
N_PROPERTIES
|
||
};
|
||
|
||
@@ -330,6 +332,23 @@ ibus_portal_context_set_property (IBusPortalContext *portal_context,
|
||
NULL /* user_data */
|
||
);
|
||
break;
|
||
+ case PROP_EFFECTIVE_POST_PROCESS_KEY_EVENT:
|
||
+ g_dbus_proxy_call (G_DBUS_PROXY (portal_context->context),
|
||
+ "org.freedesktop.DBus.Properties.Set",
|
||
+ g_variant_new ("(ssv)",
|
||
+ IBUS_INTERFACE_INPUT_CONTEXT,
|
||
+ "EffectivePostProcessKeyEvent",
|
||
+ g_value_get_variant (value)),
|
||
+ G_DBUS_CALL_FLAGS_NONE,
|
||
+ -1,
|
||
+ NULL, /* cancellable */
|
||
+ NULL, /* callback */
|
||
+ NULL /* user_data */
|
||
+ );
|
||
+ break;
|
||
+ case PROP_POST_PROCESS_KEY_EVENT:
|
||
+ g_warning ("No support for setting content type");
|
||
+ break;
|
||
default:
|
||
G_OBJECT_WARN_INVALID_PROPERTY_ID (portal_context, prop_id, pspec);
|
||
}
|
||
@@ -341,10 +360,37 @@ ibus_portal_context_get_property (IBusPortalContext *portal_context,
|
||
GValue *value,
|
||
GParamSpec *pspec)
|
||
{
|
||
+ GVariant *result;
|
||
+ GVariant *variant = NULL;
|
||
+ GError *error = NULL;
|
||
switch (prop_id) {
|
||
+ case PROP_POST_PROCESS_KEY_EVENT:
|
||
+ result = g_dbus_proxy_call_sync (G_DBUS_PROXY (portal_context->context),
|
||
+ "org.freedesktop.DBus.Properties.Get",
|
||
+ g_variant_new (
|
||
+ "(ss)",
|
||
+ IBUS_INTERFACE_INPUT_CONTEXT,
|
||
+ "PostProcessKeyEvent"),
|
||
+ G_DBUS_CALL_FLAGS_NONE,
|
||
+ -1,
|
||
+ NULL, /* cancellable */
|
||
+ &error);
|
||
+ if (error) {
|
||
+ g_warning ("Error PostProcessKeyEvent: %s", error->message);
|
||
+ g_error_free (error);
|
||
+ break;
|
||
+ }
|
||
+ g_variant_get (result, "(v)", &variant);
|
||
+ if (!variant) {
|
||
+ g_warning ("No child in PostProcessKeyEvent");
|
||
+ break;
|
||
+ }
|
||
+ g_value_set_variant (value, variant);
|
||
+ break;
|
||
case PROP_CONTENT_TYPE:
|
||
case PROP_CLIENT_COMMIT_PREEDIT:
|
||
- g_warning ("No support for setting content type");
|
||
+ case PROP_EFFECTIVE_POST_PROCESS_KEY_EVENT:
|
||
+ g_warning ("No support for getting content type");
|
||
break;
|
||
default:
|
||
G_OBJECT_WARN_INVALID_PROPERTY_ID (portal_context, prop_id, pspec);
|
||
@@ -387,7 +433,7 @@ ibus_portal_context_class_init (IBusPortalContextClass *klass)
|
||
skeleton_class->g_authorize_method = ibus_portal_context_g_authorize_method;
|
||
|
||
ibus_dbus_input_context_override_properties (gobject_class,
|
||
- PROP_CONTENT_TYPE);
|
||
+ PROP_POST_PROCESS_KEY_EVENT);
|
||
}
|
||
|
||
static void
|
||
--
|
||
2.45.0
|
||
|
||
From 871c8312aa4bd6b785d7d9c779a1f9f51b709802 Mon Sep 17 00:00:00 2001
|
||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||
Date: Sat, 1 Jun 2024 21:27:38 +0900
|
||
Subject: [PATCH 5/6] Fix Flatpak build for dnf and pyoverridesdir
|
||
|
||
`dnf` is not available during Flatpak builds with `flatpak-builder` and
|
||
the steps are omitted in autogen.sh to check FLATPAK_ID environment
|
||
variable.
|
||
|
||
When IBus is built with the Json files in test directory, the build
|
||
tries to install IBus.py file into pyoverridesdir likes
|
||
/usr/lib*/python3.12/site-packages/gi/overrides
|
||
|
||
But the directory is readonly with `flatpak-builder` and could be
|
||
failed.
|
||
Now `--disable-pygobject` option is added to `configure`.
|
||
|
||
IBus modules are embedded in Flatpak platforms likes GNOME, Freedesktop
|
||
and this issue might not happen in the platform builds since
|
||
the pyoverridesdir does not exist yet so this might fix the build
|
||
issues with Json files only in test directory.
|
||
---
|
||
autogen.sh | 2 +-
|
||
configure.ac | 15 +++++++++++++--
|
||
4 files changed, 40 insertions(+), 9 deletions(-)
|
||
|
||
diff --git a/autogen.sh b/autogen.sh
|
||
index 90e126ec..cde8aaef 100755
|
||
--- a/autogen.sh
|
||
+++ b/autogen.sh
|
||
@@ -42,7 +42,7 @@ cd "$srcdir"
|
||
touch ChangeLog
|
||
}
|
||
|
||
-(test "x$DISABLE_INSTALL_PKGS" = "x") && {
|
||
+(test "x$DISABLE_INSTALL_PKGS" = "x") && (test "x$FLATPAK_ID" = "x" ) && {
|
||
(test -f /etc/fedora-release ) && {
|
||
rpm -q $FEDORA_PKG1 || exit 1
|
||
rpm -q $FEDORA_PKG2 || exit 1
|
||
diff --git a/configure.ac b/configure.ac
|
||
index a5210004..fd1d15f7 100644
|
||
--- a/configure.ac
|
||
+++ b/configure.ac
|
||
@@ -509,9 +509,20 @@ AM_CONDITIONAL([ENABLE_DAEMON], [true])
|
||
|
||
PYGOBJECT_REQUIRED=3.0.0
|
||
|
||
-PKG_CHECK_EXISTS([pygobject-3.0 >= $PYGOBJECT_REQUIRED],
|
||
- [enable_pygobject=yes], [enable_pygobject=no])
|
||
+# When IBus is built with the Json files in test directory, the build
|
||
+# tries to install IBus.py file into pyoverridesdir
|
||
+# but the directory is readonly with `flatpak-builder`
|
||
+AC_ARG_ENABLE(pygobject,
|
||
+ AS_HELP_STRING([--disable-pygobject],
|
||
+ [Disable pygobject.]),
|
||
+ [enable_pygobject=$enableval],
|
||
+ [enable_pygobject=yes]
|
||
+)
|
||
|
||
+if test "x$enable_pygobject" = "xyes"; then
|
||
+ PKG_CHECK_EXISTS([pygobject-3.0 >= $PYGOBJECT_REQUIRED],
|
||
+ [enable_pygobject=yes], [enable_pygobject=no])
|
||
+fi
|
||
if test "x$enable_pygobject" = "xyes"; then
|
||
PKG_CHECK_MODULES(PYTHON, [pygobject-3.0 >= $PYGOBJECT_REQUIRED])
|
||
|
||
--
|
||
2.45.0
|
||
|
||
From 8d314d749f5ab83eb6de189faba184108fbccd61 Mon Sep 17 00:00:00 2001
|
||
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||
Date: Sat, 8 Jun 2024 11:46:57 +0900
|
||
Subject: [PATCH 1/2] src/ibuscomposetable: Fix UFDD5 key for compose seq with fr(bepo_afnor)
|
||
|
||
AltGr-t with fr(bepo_afnor) keymap has no keysym name but can be
|
||
used in the compose key sequences.
|
||
Most Unicode format (UXXXX) should be supported in the compose sequences
|
||
in case they are not used in XKB options except for 'Pointer_*' XKB option
|
||
names.
|
||
Also refactor compose sequences with each range beyond U10000.
|
||
Also update ibus_keyval_name() can output keysym names beyond U10000.
|
||
|
||
BUG=https://github.com/ibus/ibus/issues/2646
|
||
Fixes: https://github.com/ibus/ibus/commit/ad883dc
|
||
---
|
||
src/ibuscomposetable.c | 35 +++++++++++++++++++++++++++++------
|
||
src/ibusenginesimpleprivate.h | 1 +
|
||
src/ibuskeynames.c | 7 +------
|
||
src/tests/ibus-compose.basic | 10 ++++++++++
|
||
4 files changed, 41 insertions(+), 12 deletions(-)
|
||
|
||
diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
|
||
index 9d4377a9..2c97fd3b 100644
|
||
--- a/src/ibuscomposetable.c
|
||
+++ b/src/ibuscomposetable.c
|
||
@@ -1,7 +1,7 @@
|
||
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
|
||
/* ibus - The Input Bus
|
||
* Copyright (C) 2013-2014 Peng Huang <shawn.p.huang@gmail.com>
|
||
- * Copyright (C) 2013-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
||
+ * Copyright (C) 2013-2024 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
||
*
|
||
* This library is free software; you can redistribute it and/or
|
||
* modify it under the terms of the GNU Lesser General Public
|
||
@@ -222,6 +222,12 @@ parse_compose_sequence (IBusComposeData *compose_data,
|
||
compose_data->sequence[n] = codepoint;
|
||
}
|
||
|
||
+ if (codepoint >= 0x10000) {
|
||
+ if (!ibus_compose_key_flag (0xffff & codepoint)) {
|
||
+ g_warning ("The keysym %s > 0xffff is not supported: %s",
|
||
+ match, line);
|
||
+ }
|
||
+ }
|
||
if (codepoint == IBUS_KEY_VoidSymbol) {
|
||
g_warning ("Could not get code point of keysym %s: %s",
|
||
match, line);
|
||
@@ -603,6 +609,7 @@ ibus_compose_list_check_duplicated (GList *compose_list,
|
||
|
||
/*
|
||
* Actual typed keysyms have a flag against the definition.
|
||
+ * https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/keysymdef.h?ref_type=heads#L82
|
||
* https://gitlab.freedesktop.org/xorg/lib/libx11/-/blob/master/nls/en_US.UTF-8/Compose.pre#L4559
|
||
*/
|
||
guint
|
||
@@ -611,11 +618,27 @@ ibus_compose_key_flag (guint key)
|
||
const char *name;
|
||
if (key <= 0xff)
|
||
return 0;
|
||
+ switch (key) {
|
||
+ /* <Aogonek> is not used in UTF-8 compose sequences but <ohorn> in EN
|
||
+ * compose file and vn keymap is assumed instead.
|
||
+ */
|
||
+ case 0x1a1:
|
||
+ /* <Zabovedot> is not used in UTF-8 compose sequences but <Uhorn> in EN
|
||
+ * compose file and vn keymap s assumed instead.
|
||
+ */
|
||
+ case 0x1af:
|
||
+ /* <caron> is not used in UTF-8 compose sequences but <EZH> in EN compose
|
||
+ * file and fr(nodeadkeys) keymap is assumed instead.
|
||
+ */
|
||
+ case 0x1b7:
|
||
+ return 0x1000000;
|
||
+ default:;
|
||
+ }
|
||
name = ibus_keyval_name (key);
|
||
/* If name is null, the key sequence is expressed as "<Uxxxx>" format in
|
||
* the Compose file and the typed keysym has the flag.
|
||
*/
|
||
- if (!name)
|
||
+ if (!name || g_str_has_prefix (name, "0x"))
|
||
return 0x1000000;
|
||
/* "<Pointer_EnableKeys>" is not described in the Compose file but <UFEF9>
|
||
* in the file.
|
||
@@ -648,8 +671,8 @@ ibus_compose_data_compare (gpointer a,
|
||
gunichar code_a = compose_data_a->sequence[i];
|
||
gunichar code_b = compose_data_b->sequence[i];
|
||
|
||
- code_a += ibus_compose_key_flag (code_a);
|
||
- code_b += ibus_compose_key_flag (code_b);
|
||
+ code_a &= 0xffff;
|
||
+ code_b &= 0xffff;
|
||
if (code_a != code_b)
|
||
return code_a - code_b;
|
||
if (code_a == 0 && code_b == 0)
|
||
@@ -1581,9 +1604,9 @@ compare_seq (const void *key, const void *value)
|
||
guint saved_key = (guint)seq[i];
|
||
guint flag = ibus_compose_key_flag (saved_key);
|
||
if (typed_key < (saved_key + flag))
|
||
- return -1;
|
||
+ return (0xffff & typed_key) - saved_key;
|
||
else if (typed_key > (saved_key + flag))
|
||
- return 1;
|
||
+ return (0xffff & typed_key) - saved_key;
|
||
|
||
i++;
|
||
}
|
||
diff --git a/src/ibusenginesimpleprivate.h b/src/ibusenginesimpleprivate.h
|
||
index fd600853..ae42342b 100644
|
||
--- a/src/ibusenginesimpleprivate.h
|
||
+++ b/src/ibusenginesimpleprivate.h
|
||
@@ -42,6 +42,7 @@ struct _IBusComposeTablePrivate
|
||
};
|
||
|
||
|
||
+guint ibus_compose_key_flag (guint key);
|
||
gboolean ibus_check_algorithmically (const guint *compose_buffer,
|
||
int n_compose,
|
||
gunichar *output);
|
||
diff --git a/src/ibuskeynames.c b/src/ibuskeynames.c
|
||
index 544c6ade..2925bdec 100644
|
||
--- a/src/ibuskeynames.c
|
||
+++ b/src/ibuskeynames.c
|
||
@@ -47,12 +47,7 @@ ibus_keyval_name (guint keyval)
|
||
static gchar buf[100];
|
||
gdk_key *found;
|
||
|
||
- /* Check for directly encoded 24-bit UCS characters: */
|
||
- if ((keyval & 0xff000000) == 0x01000000)
|
||
- {
|
||
- g_sprintf (buf, "U+%.04X", (keyval & 0x00ffffff));
|
||
- return buf;
|
||
- }
|
||
+ /* <ohorn> with 0x01000000 is supported in gdk_keys_by_keyval */
|
||
|
||
found = bsearch (&keyval, gdk_keys_by_keyval,
|
||
IBUS_NUM_KEYS, sizeof (gdk_key),
|
||
diff --git a/src/tests/ibus-compose.basic b/src/tests/ibus-compose.basic
|
||
index 0735d4ea..4e8cb9ab 100644
|
||
--- a/src/tests/ibus-compose.basic
|
||
+++ b/src/tests/ibus-compose.basic
|
||
@@ -8,6 +8,13 @@
|
||
<dead_macron> <U0227> : "ǟ" U01DE
|
||
<Multi_key> <macron> <U0227> : "ǟ" U01DE
|
||
<Multi_key> <underscore> <U0227> : "ǟ" U01DE
|
||
+# AltGr-t, Shift-asterisk with fr(bepo_afnor) keymap outputs
|
||
+# <UFDD5> <0>
|
||
+# Support Unicode keysyms in case they are not used in XKB options except
|
||
+# for 'Pointer_*' XKB option names.
|
||
+<UFDD5> <0> : "⁰" U2070
|
||
+#
|
||
+### Multibyte chars tests
|
||
# Khmer digraphs
|
||
# This case swaps U17fe and U17ff in en-US
|
||
<U17fe> : "ាំ"
|
||
@@ -22,3 +29,6 @@
|
||
# This case swaps c_h and C_h in en-US
|
||
<c_h> : "C’h"
|
||
<C_h> : "c’h"
|
||
+# Some <U10000> are supported for musical composer in en-US
|
||
+<Multi_key> <U1D157> <U1D165> : "𝇒" U1D1D2 # MUSICAL SYMBOL SQUARE B
|
||
+
|
||
--
|
||
2.45.0
|
||
|
||
From 909dff4fd50d86492fb7f42a09bbd04625fa60f4 Mon Sep 17 00:00:00 2001
|
||
From: Wismill <dev@wismill.eu>
|
||
Date: Sat, 8 Jun 2024 11:47:01 +0900
|
||
Subject: [PATCH 2/2] src/tests/ibus-compose: Add some Unicode boundary tests
|
||
|
||
BUG=https://github.com/ibus/ibus/pull/2649
|
||
---
|
||
src/tests/ibus-compose.basic | 8 +++++++-
|
||
src/tests/ibus-compose.emoji | 4 ++++
|
||
2 files changed, 11 insertions(+), 1 deletion(-)
|
||
|
||
diff --git a/src/tests/ibus-compose.basic b/src/tests/ibus-compose.basic
|
||
index 4e8cb9ab..d904dbb4 100644
|
||
--- a/src/tests/ibus-compose.basic
|
||
+++ b/src/tests/ibus-compose.basic
|
||
@@ -3,7 +3,9 @@
|
||
<Multi_key> <quotedbl> <Cyrillic_zhe> : "Ӝ" U04DC
|
||
<Multi_key> <quotedbl> <Cyrillic_ZHE> : "ӝ" U04DD
|
||
#
|
||
-# Unicode tests of Uxxxx
|
||
+# A Unicode keysym <Uxxxx> has a real value 0x01000000 + xxxx.
|
||
+# https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/keysymdef.h?ref_type=heads#L82
|
||
+#
|
||
# en-US is "ǡ" U01E1 but this case is "ǟ" U01DE
|
||
<dead_macron> <U0227> : "ǟ" U01DE
|
||
<Multi_key> <macron> <U0227> : "ǟ" U01DE
|
||
@@ -13,6 +15,10 @@
|
||
# Support Unicode keysyms in case they are not used in XKB options except
|
||
# for 'Pointer_*' XKB option names.
|
||
<UFDD5> <0> : "⁰" U2070
|
||
+# ohorn, grave with vn keymap
|
||
+# IBus does not distingish ohorn and Aogonek
|
||
+<ohorn> <grave> : "Ờ" U1EDC
|
||
+<U01A1> <grave> : "Ờ" U1EDC
|
||
#
|
||
### Multibyte chars tests
|
||
# Khmer digraphs
|
||
diff --git a/src/tests/ibus-compose.emoji b/src/tests/ibus-compose.emoji
|
||
index 7fbf82cf..fdd560f8 100644
|
||
--- a/src/tests/ibus-compose.emoji
|
||
+++ b/src/tests/ibus-compose.emoji
|
||
@@ -1,3 +1,4 @@
|
||
+# Emoji tests
|
||
<Multi_key> <Multi_key> <l> <e> <o> : "♌" U264C # LEO
|
||
<Multi_key> <Multi_key> <v> <i> <r> <g> <o> : "♍" U264D # VIRGO
|
||
<Multi_key> <Multi_key> <I> <n> <t> : "∫"
|
||
@@ -9,3 +10,6 @@
|
||
<Multi_key> <Multi_key> <o> <I> <n> <t> : "∮"
|
||
<Multi_key> <Multi_key> <o> <I> <I> <n> <t> : "∯"
|
||
<Multi_key> <Multi_key> <o> <I> <I> <I> <n> <t> : "∰"
|
||
+# Unicode boundary tests
|
||
+<U2800> <0> : "a"
|
||
+<braille_blank> <0> : "a"
|
||
--
|
||
2.45.0
|
||
|