Sync from SUSE:SLFO:Main ibus revision be89ef0c48e961bc3990b5ce7fb266ce
This commit is contained in:
commit
74a31ff011
23
.gitattributes
vendored
Normal file
23
.gitattributes
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
## Default LFS
|
||||||
|
*.7z filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bsp filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gem filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.gz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.jar filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.lz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.lzma filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.obscpio filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.oxt filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.pdf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.png filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.rpm filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tbz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tbz2 filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.ttf filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.txz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.whl filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.xz filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||||
|
*.zst filter=lfs diff=lfs merge=lfs -text
|
4
20-defaults-openSUSE.conf
Normal file
4
20-defaults-openSUSE.conf
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
[Service]
|
||||||
|
# For now, Plasma Wayland does not support /etc/xdg/Xwayland-session.d
|
||||||
|
# so always enable --xim
|
||||||
|
Environment="IBUS_DAEMON_ARGS=--xim"
|
72
README.SUSE
Normal file
72
README.SUSE
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
ibus README for SuSE
|
||||||
|
How to start using ibus
|
||||||
|
|
||||||
|
English:
|
||||||
|
|
||||||
|
0:Note: ibus don't support QT3 immodule,
|
||||||
|
If you use qt3-base applications, modify your /usr/etc/X11/xim.d/ibus to
|
||||||
|
export QT_IM_MODULE=xim
|
||||||
|
|
||||||
|
1.openSUSE can start ibus automatically when your locale is set to en, zh_TW, zh_CN, zh_HK, zh_SG, ko_KR and ja_JP.
|
||||||
|
The setup script is a link in /usr/etc/X11/xim.d/YOUR-LOCALE/40-ibus which link to /usr/etc/X11/xim.d/ibus.
|
||||||
|
The number "40" makes ibus have priority over other input-method (e.g 50-scim or 90-xcin ).
|
||||||
|
If you prefer not using ibus, mv 40-ibus to 80-ibus (for example). Or see 2.
|
||||||
|
|
||||||
|
2.If for some reason can't start ibus when login Xwindow
|
||||||
|
There is another input-method who has higher priority then ibus (e.g 10-oxim)
|
||||||
|
You can edit ~/.xim, see ~/.xim.template for more informations.
|
||||||
|
Or edit ~/.profile, add
|
||||||
|
export INPUT_METHOD="ibus"
|
||||||
|
After installing ibus, there's a template for ibus: /usr/share/doc/packages/ibus/xim.ibus.suse.template
|
||||||
|
copy this file to ~/.xim, then you can use ibus next login X.
|
||||||
|
|
||||||
|
3.You want to use your own input-method other than system setting
|
||||||
|
(1)System setting:
|
||||||
|
Edit /etc/sysconfig/language , set INPUT_METHOD="scim-bridge", or whatever you want,Make sure your start-up script is put in /usr/etc/X11/xim.d/ with same name ypu mention.
|
||||||
|
(2)For specific language setting:
|
||||||
|
Link a start-up script in /usr/etc/X11/xim.d/ to your locale with a higher priority (smaller number), eg
|
||||||
|
ln -s /usr/etc/X11/xim.d/scim-bridge /usr/etc/X11/xim.d/zh_TW/20-scim-bridge
|
||||||
|
(3)Personal setting:
|
||||||
|
Edit ~/.profile add
|
||||||
|
export INPUT_METHOD="scim-bridge" or whatever script in /usr/etc/X11/xim.d/
|
||||||
|
or white your own ~/.xim, see ~/.xim.template for more informations.
|
||||||
|
|
||||||
|
4.Bug report or any suggestion to
|
||||||
|
https://github.com/ibus/ibus/issues
|
||||||
|
|
||||||
|
|
||||||
|
Chinese:
|
||||||
|
|
||||||
|
0:注意:ibus 不支援 QT3 immodule,
|
||||||
|
若您使用 qt3-based 應用程式,請修改 /usr/etc/X11/xim.d/ibus 設定
|
||||||
|
export QT_IM_MODULE=xim
|
||||||
|
|
||||||
|
1.當您使用的語系是en 或zh_*時,SuSE 會自動啟動ibus
|
||||||
|
啟動的script是/usr/etc/X11/xim.d/YOUR-LOCALE/40-ibus,這是一個到上層目錄ibus的連結
|
||||||
|
"40"這個數字使他的優先順序高於90-xcin及50-scim
|
||||||
|
如果您不喜歡這個順序,修改連結的名稱為(例如:80-ibus),或參考2.
|
||||||
|
|
||||||
|
2.重新登入X後,如果不能用ibus...可能是:
|
||||||
|
有別的輸入法的優先順序高於ibus(例如:10-oxim)
|
||||||
|
您可以編輯~/.xim,請參考~/.xim.template
|
||||||
|
安裝ibus後,會有一個範本:/usr/share/doc/packages/ibus/xim.ibus.suse.template
|
||||||
|
將這個檔案複製到您的~/.xim,當您下次登入X時就可以使用ibus了
|
||||||
|
或編輯~/.profile,加入
|
||||||
|
export INPUT_METHOD="ibus"
|
||||||
|
|
||||||
|
3.如果您想要自己選擇輸入法而非使用系統設定
|
||||||
|
(1)全系統設定:
|
||||||
|
編輯 /etc/sysconfig/language, 設定 INPUT_METHOD="ibus" 或其他你想用的輸入法,
|
||||||
|
請注意你的啟動程序必須位於 /usr/etc/X11/xim.d/,並和您指定的名稱相同
|
||||||
|
(2)針對特定語言:
|
||||||
|
將您的啟動程序連結到你的語系中,並前置較高的優先順序(較小數字),例如
|
||||||
|
ln -s /usr/etc/X11/xim.d/ibus /usr/etc/X11/xim.d/zh_TW/20-ibus
|
||||||
|
(3)個人設定:
|
||||||
|
編輯 ~/.profile 加入
|
||||||
|
export INPUT_METHOD="ibus" 或其他在 /usr/etc/X11/xim.d/ 的啟動程序
|
||||||
|
或自行編寫啟動程序 ~/.xim,請參考 ~/.xim.template
|
||||||
|
|
||||||
|
5.臭蟲回報或建議請至
|
||||||
|
https://github.com/ibus/ibus/issues
|
||||||
|
|
||||||
|
|
4
_multibuild
Normal file
4
_multibuild
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<multibuild>
|
||||||
|
<package>gtk4</package>
|
||||||
|
</multibuild>
|
||||||
|
|
27
baselibs.conf
Normal file
27
baselibs.conf
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
ibus-gtk
|
||||||
|
post "%if "%_lib" == "lib64""
|
||||||
|
post "<prefix>%{_bindir}/gtk-query-immodules-2.0-64 --update-cache"
|
||||||
|
post "%else"
|
||||||
|
post "<prefix>%{_bindir}/gtk-query-immodules-2.0 --update-cache"
|
||||||
|
post "%endif"
|
||||||
|
postun "%if "%_lib" == "lib64""
|
||||||
|
postun "<prefix>%{_bindir}/gtk-query-immodules-2.0-64 --update-cache"
|
||||||
|
postun "%else"
|
||||||
|
postun "<prefix>%{_bindir}/gtk-query-immodules-2.0 --update-cache"
|
||||||
|
postun "%endif"
|
||||||
|
supplements "(ibus and gtk2-<targettype>)"
|
||||||
|
ibus-gtk3
|
||||||
|
post "%if "%_lib" == "lib64""
|
||||||
|
post "<prefix>%{_bindir}/gtk-query-immodules-3.0-64 --update-cache"
|
||||||
|
post "%else"
|
||||||
|
post "<prefix>%{_bindir}/gtk-query-immodules-3.0 --update-cache"
|
||||||
|
post "%endif"
|
||||||
|
postun "%if "%_lib" == "lib64""
|
||||||
|
postun "<prefix>%{_bindir}/gtk-query-immodules-3.0-64 --update-cache"
|
||||||
|
postun "%else"
|
||||||
|
postun "<prefix>%{_bindir}/gtk-query-immodules-3.0 --update-cache"
|
||||||
|
postun "%endif"
|
||||||
|
supplements "(ibus and gtk3-<targettype>)"
|
||||||
|
libibus-1_0-5
|
||||||
|
obsoletes "libibus2-<targettype> < <version>"
|
||||||
|
|
11
hide-setup-menu.patch
Normal file
11
hide-setup-menu.patch
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
diff -Nura ibus-1.5.21/setup/ibus-setup.desktop ibus-1.5.21_new/setup/ibus-setup.desktop
|
||||||
|
--- ibus-1.5.21/setup/ibus-setup.desktop 2019-08-23 13:08:34.000000000 +0200
|
||||||
|
+++ ibus-1.5.21_new/setup/ibus-setup.desktop 2019-09-20 07:21:33.505022653 +0200
|
||||||
|
@@ -4,6 +4,7 @@
|
||||||
|
Exec=ibus-setup
|
||||||
|
Icon=ibus-setup
|
||||||
|
Terminal=false
|
||||||
|
+NoDisplay=true
|
||||||
|
Type=Application
|
||||||
|
StartupNotify=true
|
||||||
|
Categories=Settings;
|
BIN
ibus-1.5.28.tar.gz
(Stored with Git LFS)
Normal file
BIN
ibus-1.5.28.tar.gz
(Stored with Git LFS)
Normal file
Binary file not shown.
15
ibus-autostart
Normal file
15
ibus-autostart
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test x"$INPUT_METHOD" = x"ibus" || exit 0
|
||||||
|
|
||||||
|
# GNOME starts ibus by itself
|
||||||
|
case "$WINDOWMANAGER" in
|
||||||
|
*gnome*)
|
||||||
|
exit 0;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# sleep for a little while to avoid duplicate startup
|
||||||
|
# sleep 2
|
||||||
|
|
||||||
|
ibus start --service-file org.freedesktop.IBus.session.generic.service
|
||||||
|
exit 0
|
12
ibus-autostart.desktop
Normal file
12
ibus-autostart.desktop
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Name=IBus
|
||||||
|
GenericName=IBus Daemon
|
||||||
|
Comment=Start IBus daemon
|
||||||
|
Exec=ibus-autostart
|
||||||
|
Icon=ibus-setup
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
StartupNotify=false
|
||||||
|
NoDisplay=true
|
||||||
|
X-KDE-autostart-after=panel
|
||||||
|
X-KDE-StartupNotify=false
|
21
ibus-disable-engines-preload-in-GNOME.patch
Normal file
21
ibus-disable-engines-preload-in-GNOME.patch
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
diff -Nura ibus-1.5.16/xim.d-ibus-121 ibus-1.5.16_new/xim.d-ibus-121
|
||||||
|
--- ibus-1.5.16/xim.d-ibus-121 2017-06-05 14:38:10.728021247 +0800
|
||||||
|
+++ ibus-1.5.16_new/xim.d-ibus-121 2017-06-05 14:40:44.380353362 +0800
|
||||||
|
@@ -13,17 +13,6 @@
|
||||||
|
# G-S-D. see bnc#873016.
|
||||||
|
*gnome*)
|
||||||
|
SOURCES=$(gsettings get org.freedesktop.ibus.general preload-engines)
|
||||||
|
- if [ "$SOURCES" == '@as []' ]; then
|
||||||
|
- echo "initial GNOME startup, ibus default configuration applied"
|
||||||
|
- ibus-daemon -d
|
||||||
|
- timer=5
|
||||||
|
- while [ "$SOURCES" == '@as []' ] && [ ${timer} -gt 0 ]; do
|
||||||
|
- sleep 1
|
||||||
|
- timer=$[${timer}-1]
|
||||||
|
- SOURCES=$(gsettings get org.freedesktop.ibus.general preload-engines)
|
||||||
|
- done
|
||||||
|
- ibus exit
|
||||||
|
- fi
|
||||||
|
# make sure G-S-D keyboard plugin is active
|
||||||
|
echo "ibus will be managed by GNOME."
|
||||||
|
gsettings set org.gnome.settings-daemon.plugins.keyboard active true
|
12
ibus-fix-Signal-does-not-exist.patch
Normal file
12
ibus-fix-Signal-does-not-exist.patch
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
diff -Nur ibus-1.5.22/ui/gtk3/panel.vala ibus-1.5.22-new/ui/gtk3/panel.vala
|
||||||
|
--- ibus-1.5.22/ui/gtk3/panel.vala 2020-02-21 20:46:17.000000000 +0800
|
||||||
|
+++ ibus-1.5.22-new/ui/gtk3/panel.vala 2020-02-24 17:55:17.718453204 +0800
|
||||||
|
@@ -1053,7 +1053,7 @@
|
||||||
|
|
||||||
|
private void show_setup_dialog() {
|
||||||
|
if (m_setup_pid != 0) {
|
||||||
|
- if (Posix.kill(m_setup_pid, Posix.Signal.USR1) == 0)
|
||||||
|
+ if (Posix.kill(m_setup_pid, Posix.SIGUSR1) == 0)
|
||||||
|
return;
|
||||||
|
m_setup_pid = 0;
|
||||||
|
}
|
411
ibus-fix-key-release.patch
Normal file
411
ibus-fix-key-release.patch
Normal file
@ -0,0 +1,411 @@
|
|||||||
|
From 7da18d08ce85405e41ba7bf363661292bc97ca39 Mon Sep 17 00:00:00 2001
|
||||||
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||||
|
Date: Wed, 22 Feb 2023 23:53:35 +0900
|
||||||
|
Subject: [PATCH] src: Call IBUS_TYPE_EMOJI_DATA in ibus_init()
|
||||||
|
|
||||||
|
Seems the evaluation of IBUS_EMOJI_DATA() depends on the compiler
|
||||||
|
optimization.
|
||||||
|
|
||||||
|
BUG=https://github.com/ibus/ibus/issues/2476
|
||||||
|
---
|
||||||
|
src/ibusshare.c | 5 ++++-
|
||||||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/ibusshare.c b/src/ibusshare.c
|
||||||
|
index 340168c8..bb59f3cb 100644
|
||||||
|
--- a/src/ibusshare.c
|
||||||
|
+++ b/src/ibusshare.c
|
||||||
|
@@ -308,12 +308,15 @@ ibus_init (void)
|
||||||
|
IBUS_TYPE_TEXT;
|
||||||
|
IBUS_TYPE_ATTRIBUTE;
|
||||||
|
IBUS_TYPE_ATTR_LIST;
|
||||||
|
- IBUS_TYPE_LOOKUP_TABLE;
|
||||||
|
IBUS_TYPE_COMPONENT;
|
||||||
|
+ IBUS_TYPE_EMOJI_DATA;
|
||||||
|
IBUS_TYPE_ENGINE_DESC;
|
||||||
|
+ IBUS_TYPE_LOOKUP_TABLE;
|
||||||
|
IBUS_TYPE_OBSERVED_PATH;
|
||||||
|
IBUS_TYPE_REGISTRY;
|
||||||
|
IBUS_TYPE_X_EVENT;
|
||||||
|
+ IBUS_TYPE_UNICODE_BLOCK;
|
||||||
|
+ IBUS_TYPE_UNICODE_DATA;
|
||||||
|
_ibus_register_resource ();
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
||||||
|
From 9d9dca9e103e88b33e786c4a46f44123a6cf11c6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||||
|
Date: Wed, 8 Mar 2023 19:44:16 +0900
|
||||||
|
Subject: [PATCH] client/x11: Fix Key typing order
|
||||||
|
|
||||||
|
ibus-x11 now also uses the hybrid process key events with
|
||||||
|
IBUS_ENABLE_SYNC_MODE=2 and it waits for the async API
|
||||||
|
with GSource and g_main_context_iteration() in xim_forward_event().
|
||||||
|
|
||||||
|
But g_main_context_iteration() calls gdk_event_source_dispatch()
|
||||||
|
and it can call another xim_forward_event() and the callbacks
|
||||||
|
of ibus_input_context_process_key_event_async() can be nested.
|
||||||
|
So if the forwarding API is called out of the callbacks of
|
||||||
|
ibus_input_context_process_key_event_async(), the key events
|
||||||
|
order is swapped due to the delayed return of
|
||||||
|
g_main_context_iteration().
|
||||||
|
|
||||||
|
To resolve this issue, the forwarding API should be called in
|
||||||
|
the callbacks of ibus_input_context_process_key_event_async().
|
||||||
|
|
||||||
|
BUG=https://github.com/ibus/ibus/issues/2480
|
||||||
|
---
|
||||||
|
client/x11/main.c | 160 ++++++++++++++++++++++++----------------------
|
||||||
|
1 file changed, 83 insertions(+), 77 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/client/x11/main.c b/client/x11/main.c
|
||||||
|
index 905fd251..83d95cb7 100644
|
||||||
|
--- a/client/x11/main.c
|
||||||
|
+++ b/client/x11/main.c
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
/* vim:set et sts=4: */
|
||||||
|
/* ibus
|
||||||
|
* Copyright (C) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
|
||||||
|
- * Copyright (C) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
||||||
|
+ * Copyright (C) 2015-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
|
||||||
|
* Copyright (C) 2007-2015 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* main.c:
|
||||||
|
@@ -49,6 +49,8 @@
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
|
#define ESC_SEQUENCE_ISO10646_1 "\033%G"
|
||||||
|
+/* Wait for about 120 secs to return a key from async process-key-event. */
|
||||||
|
+#define MAX_WAIT_KEY_TIME 120000
|
||||||
|
|
||||||
|
#define LOG(level, fmt_args...) \
|
||||||
|
if (g_debug_level >= (level)) { \
|
||||||
|
@@ -461,11 +463,39 @@ xim_unset_ic_focus (XIMS xims, IMChangeFocusStruct *call_data)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+_xim_forward_key_event_done (X11IC *x11ic,
|
||||||
|
+ XEvent *event,
|
||||||
|
+ gboolean processed)
|
||||||
|
+{
|
||||||
|
+ IMForwardEventStruct fe;
|
||||||
|
+ if (processed) {
|
||||||
|
+ if (!x11ic->has_preedit_area) {
|
||||||
|
+ _xim_set_cursor_location (x11ic);
|
||||||
|
+ }
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ g_assert (x11ic);
|
||||||
|
+ g_assert (event);
|
||||||
|
+
|
||||||
|
+ memset (&fe, 0, sizeof (fe));
|
||||||
|
+ fe.major_code = XIM_FORWARD_EVENT;
|
||||||
|
+ fe.icid = x11ic->icid;
|
||||||
|
+ fe.connect_id = x11ic->connect_id;
|
||||||
|
+ fe.sync_bit = 0;
|
||||||
|
+ fe.serial_number = 0L;
|
||||||
|
+ fe.event = *event;
|
||||||
|
+ IMForwardEvent (_xims, (XPointer) &fe);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
typedef struct {
|
||||||
|
- IMForwardEventStruct *pfe;
|
||||||
|
int count;
|
||||||
|
guint count_cb_id;
|
||||||
|
gboolean retval;
|
||||||
|
+ X11IC *x11ic;
|
||||||
|
+ CARD16 connect_id;
|
||||||
|
+ XEvent event;
|
||||||
|
} ProcessKeyEventReplyData;
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -474,7 +504,7 @@ _process_key_event_done (GObject *object,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
IBusInputContext *context = (IBusInputContext *)object;
|
||||||
|
- IMForwardEventStruct *pfe = (IMForwardEventStruct*) user_data;
|
||||||
|
+ ProcessKeyEventReplyData *data = (ProcessKeyEventReplyData *)user_data;
|
||||||
|
|
||||||
|
GError *error = NULL;
|
||||||
|
gboolean retval = ibus_input_context_process_key_event_async_finish (
|
||||||
|
@@ -488,16 +518,15 @@ _process_key_event_done (GObject *object,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_hash_table_lookup (_connections,
|
||||||
|
- GINT_TO_POINTER ((gint) pfe->connect_id))
|
||||||
|
+ GINT_TO_POINTER ((gint)data->connect_id))
|
||||||
|
== NULL) {
|
||||||
|
- g_slice_free (IMForwardEventStruct, pfe);
|
||||||
|
+ g_slice_free (ProcessKeyEventReplyData, data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (retval == FALSE) {
|
||||||
|
- IMForwardEvent (_xims, (XPointer) pfe);
|
||||||
|
- }
|
||||||
|
- g_slice_free (IMForwardEventStruct, pfe);
|
||||||
|
+ if (retval == FALSE)
|
||||||
|
+ _xim_forward_key_event_done (data->x11ic, &data->event, retval);
|
||||||
|
+ g_slice_free (ProcessKeyEventReplyData, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -518,6 +547,21 @@ _process_key_event_reply_done (GObject *object,
|
||||||
|
}
|
||||||
|
g_return_if_fail (data);
|
||||||
|
data->retval = retval;
|
||||||
|
+ if (g_hash_table_lookup (_connections,
|
||||||
|
+ GINT_TO_POINTER ((gint)data->connect_id))
|
||||||
|
+ == NULL) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ /* _xim_forward_key_event_done() should be called in
|
||||||
|
+ * _process_key_event_reply_done() because g_main_context_iteration()
|
||||||
|
+ * can call another xim_forward_event() and xim_forward_event() can be
|
||||||
|
+ * nested and the first _process_key_event_reply_done() is returned
|
||||||
|
+ * at last with g_main_context_iteration() so
|
||||||
|
+ * if _xim_forward_key_event_done() is called out of
|
||||||
|
+ * _process_key_event_reply_done(), the key events order
|
||||||
|
+ * can be swapped.
|
||||||
|
+ */
|
||||||
|
+ _xim_forward_key_event_done (data->x11ic, &data->event, retval);
|
||||||
|
data->count = 0;
|
||||||
|
g_source_remove (data->count_cb_id);
|
||||||
|
}
|
||||||
|
@@ -529,9 +573,8 @@ _process_key_event_count_cb (gpointer user_data)
|
||||||
|
g_return_val_if_fail (data, G_SOURCE_REMOVE);
|
||||||
|
if (!data->count)
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
- /* Wait for about 10 secs. */
|
||||||
|
- if (data->count++ == 10000) {
|
||||||
|
- data->count = 0;
|
||||||
|
+ if (data->count++ == MAX_WAIT_KEY_TIME) {
|
||||||
|
+ g_warning ("Key event is not returned for %usecs.", MAX_WAIT_KEY_TIME);
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
return G_SOURCE_CONTINUE;
|
||||||
|
@@ -571,32 +614,13 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
|
||||||
|
event.keyval,
|
||||||
|
event.hardware_keycode - 8,
|
||||||
|
event.state);
|
||||||
|
- if (retval) {
|
||||||
|
- if (!x11ic->has_preedit_area) {
|
||||||
|
- _xim_set_cursor_location (x11ic);
|
||||||
|
- }
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- IMForwardEventStruct fe;
|
||||||
|
- memset (&fe, 0, sizeof (fe));
|
||||||
|
-
|
||||||
|
- fe.major_code = XIM_FORWARD_EVENT;
|
||||||
|
- fe.icid = x11ic->icid;
|
||||||
|
- fe.connect_id = x11ic->connect_id;
|
||||||
|
- fe.sync_bit = 0;
|
||||||
|
- fe.serial_number = 0L;
|
||||||
|
- fe.event = call_data->event;
|
||||||
|
-
|
||||||
|
- IMForwardEvent (_xims, (XPointer) &fe);
|
||||||
|
-
|
||||||
|
+ _xim_forward_key_event_done (x11ic, &call_data->event, retval);
|
||||||
|
retval = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: {
|
||||||
|
GSource *source = g_timeout_source_new (1);
|
||||||
|
ProcessKeyEventReplyData *data = NULL;
|
||||||
|
- IMForwardEventStruct fe;
|
||||||
|
|
||||||
|
if (source)
|
||||||
|
data = g_slice_new0 (ProcessKeyEventReplyData);
|
||||||
|
@@ -610,11 +634,13 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
|
||||||
|
if (source)
|
||||||
|
g_source_destroy (source);
|
||||||
|
} else {
|
||||||
|
- CARD16 connect_id = x11ic->connect_id;
|
||||||
|
data->count = 1;
|
||||||
|
g_source_attach (source, NULL);
|
||||||
|
g_source_unref (source);
|
||||||
|
data->count_cb_id = g_source_get_id (source);
|
||||||
|
+ data->connect_id = call_data->connect_id;
|
||||||
|
+ data->x11ic = x11ic;
|
||||||
|
+ data->event = *((XEvent*)xevent);
|
||||||
|
ibus_input_context_process_key_event_async (
|
||||||
|
x11ic->context,
|
||||||
|
event.keyval,
|
||||||
|
@@ -626,7 +652,7 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
|
||||||
|
data);
|
||||||
|
g_source_set_callback (source, _process_key_event_count_cb,
|
||||||
|
data, NULL);
|
||||||
|
- while (data->count)
|
||||||
|
+ while (data->count > 0 && data->count < MAX_WAIT_KEY_TIME)
|
||||||
|
g_main_context_iteration (NULL, TRUE);
|
||||||
|
if (source->ref_count > 0) {
|
||||||
|
/* g_source_get_id() could causes a SEGV */
|
||||||
|
@@ -634,46 +660,33 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
|
||||||
|
"issue in %p.", source);
|
||||||
|
}
|
||||||
|
retval = data->retval;
|
||||||
|
- g_slice_free (ProcessKeyEventReplyData, data);
|
||||||
|
-
|
||||||
|
- if (g_hash_table_lookup (_connections,
|
||||||
|
- GINT_TO_POINTER ((gint)connect_id))
|
||||||
|
- == NULL) {
|
||||||
|
+ if (data->count == 0) {
|
||||||
|
+ g_slice_free (ProcessKeyEventReplyData, data);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (retval) {
|
||||||
|
- if (! x11ic->has_preedit_area) {
|
||||||
|
- _xim_set_cursor_location (x11ic);
|
||||||
|
- }
|
||||||
|
- return 1;
|
||||||
|
+ g_slice_free (ProcessKeyEventReplyData, data);
|
||||||
|
+ if (g_hash_table_lookup (_connections,
|
||||||
|
+ GINT_TO_POINTER ((gint)call_data->connect_id))
|
||||||
|
+ == NULL) {
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- memset (&fe, 0, sizeof (fe));
|
||||||
|
-
|
||||||
|
- fe.major_code = XIM_FORWARD_EVENT;
|
||||||
|
- fe.icid = x11ic->icid;
|
||||||
|
- fe.connect_id = x11ic->connect_id;
|
||||||
|
- fe.sync_bit = 0;
|
||||||
|
- fe.serial_number = 0L;
|
||||||
|
- fe.event = call_data->event;
|
||||||
|
-
|
||||||
|
- IMForwardEvent (_xims, (XPointer) &fe);
|
||||||
|
-
|
||||||
|
+ _xim_forward_key_event_done (x11ic, &call_data->event, retval);
|
||||||
|
retval = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
- IMForwardEventStruct *pfe;
|
||||||
|
+ ProcessKeyEventReplyData *data;
|
||||||
|
|
||||||
|
- pfe = g_slice_new0 (IMForwardEventStruct);
|
||||||
|
- pfe->major_code = XIM_FORWARD_EVENT;
|
||||||
|
- pfe->icid = x11ic->icid;
|
||||||
|
- pfe->connect_id = x11ic->connect_id;
|
||||||
|
- pfe->sync_bit = 0;
|
||||||
|
- pfe->serial_number = 0L;
|
||||||
|
- pfe->event = call_data->event;
|
||||||
|
+ if (!(data = g_slice_new0 (ProcessKeyEventReplyData))) {
|
||||||
|
+ g_warning ("Cannot allocate async data");
|
||||||
|
+ _xim_forward_key_event_done (x11ic, &call_data->event, 0);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ data->connect_id = call_data->connect_id;
|
||||||
|
+ data->x11ic = x11ic;
|
||||||
|
+ data->event = call_data->event;
|
||||||
|
|
||||||
|
ibus_input_context_process_key_event_async (
|
||||||
|
x11ic->context,
|
||||||
|
@@ -683,7 +696,7 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data)
|
||||||
|
-1,
|
||||||
|
NULL,
|
||||||
|
_process_key_event_done,
|
||||||
|
- pfe);
|
||||||
|
+ data);
|
||||||
|
retval = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -962,11 +975,10 @@ _xim_forward_key_event (X11IC *x11ic,
|
||||||
|
guint keycode,
|
||||||
|
guint state)
|
||||||
|
{
|
||||||
|
- g_return_if_fail (x11ic != NULL);
|
||||||
|
-
|
||||||
|
- IMForwardEventStruct fe = {0};
|
||||||
|
XEvent xkp = {0};
|
||||||
|
|
||||||
|
+ g_return_if_fail (x11ic != NULL);
|
||||||
|
+
|
||||||
|
xkp.xkey.type = (state & IBUS_RELEASE_MASK) ? KeyRelease : KeyPress;
|
||||||
|
xkp.xkey.serial = 0L;
|
||||||
|
xkp.xkey.send_event = False;
|
||||||
|
@@ -975,20 +987,14 @@ _xim_forward_key_event (X11IC *x11ic,
|
||||||
|
xkp.xkey.window =
|
||||||
|
x11ic->focus_window ? x11ic->focus_window : x11ic->client_window;
|
||||||
|
xkp.xkey.subwindow = None;
|
||||||
|
- xkp.xkey.root = DefaultRootWindow (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
|
||||||
|
+ xkp.xkey.root = DefaultRootWindow (
|
||||||
|
+ GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
|
||||||
|
|
||||||
|
xkp.xkey.time = 0;
|
||||||
|
xkp.xkey.state = state;
|
||||||
|
xkp.xkey.keycode = (keycode == 0) ? 0 : keycode + 8;
|
||||||
|
|
||||||
|
- fe.major_code = XIM_FORWARD_EVENT;
|
||||||
|
- fe.icid = x11ic->icid;
|
||||||
|
- fe.connect_id = x11ic->connect_id;
|
||||||
|
- fe.sync_bit = 0;
|
||||||
|
- fe.serial_number = 0L;
|
||||||
|
- fe.event = xkp;
|
||||||
|
-
|
||||||
|
- IMForwardEvent (_xims, (XPointer) & fe);
|
||||||
|
+ _xim_forward_key_event_done (x11ic, &xkp, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
--
|
||||||
|
2.38.1
|
||||||
|
|
||||||
|
From 5b5d0795f297e330fdc84b6be6beab1305b0cda9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||||
|
Date: Wed, 15 Mar 2023 10:22:05 +0900
|
||||||
|
Subject: [PATCH] util/IMdkit: Disable while loop before call
|
||||||
|
ForwardEventMessageProc()
|
||||||
|
|
||||||
|
Seems ProcessQueue() had a wrong XFree() with async process-key-event.
|
||||||
|
Fixes: c0fec89ae76f9522319f58107ab234992b249ec6
|
||||||
|
|
||||||
|
BUG=https://github.com/ibus/ibus/issues/2484
|
||||||
|
---
|
||||||
|
util/IMdkit/i18nPtHdr.c | 9 +++------
|
||||||
|
1 file changed, 3 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/util/IMdkit/i18nPtHdr.c b/util/IMdkit/i18nPtHdr.c
|
||||||
|
index 8dc52714..ec20e322 100644
|
||||||
|
--- a/util/IMdkit/i18nPtHdr.c
|
||||||
|
+++ b/util/IMdkit/i18nPtHdr.c
|
||||||
|
@@ -1747,11 +1747,13 @@ static void ProcessQueue (XIMS ims, CARD16 connect_id)
|
||||||
|
XimProtoHdr *hdr = (XimProtoHdr *) client->pending->p;
|
||||||
|
unsigned char *p1 = (unsigned char *) (hdr + 1);
|
||||||
|
IMProtocol call_data;
|
||||||
|
+ XIMPending *old = client->pending;
|
||||||
|
|
||||||
|
call_data.major_code = hdr->major_opcode;
|
||||||
|
call_data.any.minor_code = hdr->minor_opcode;
|
||||||
|
call_data.any.connect_id = connect_id;
|
||||||
|
|
||||||
|
+ client->pending = old->next;
|
||||||
|
switch (hdr->major_opcode)
|
||||||
|
{
|
||||||
|
case XIM_FORWARD_EVENT:
|
||||||
|
@@ -1760,12 +1762,7 @@ static void ProcessQueue (XIMS ims, CARD16 connect_id)
|
||||||
|
}
|
||||||
|
/*endswitch*/
|
||||||
|
XFree (hdr);
|
||||||
|
- {
|
||||||
|
- XIMPending *old = client->pending;
|
||||||
|
-
|
||||||
|
- client->pending = old->next;
|
||||||
|
- XFree (old);
|
||||||
|
- }
|
||||||
|
+ XFree (old);
|
||||||
|
}
|
||||||
|
/*endwhile*/
|
||||||
|
return;
|
||||||
|
--
|
||||||
|
2.39.2
|
||||||
|
|
249
ibus-socket-name-compatibility.patch
Normal file
249
ibus-socket-name-compatibility.patch
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
diff -Naur ibus-1.5.25/src/ibusshare.c ibus-1.5.25.new/src/ibusshare.c
|
||||||
|
--- ibus-1.5.25/src/ibusshare.c 2021-08-20 02:48:40.000000000 +0200
|
||||||
|
+++ ibus-1.5.25.new/src/ibusshare.c 2021-09-08 19:41:27.233077477 +0200
|
||||||
|
@@ -90,79 +90,132 @@
|
||||||
|
return g_getenv("IBUS_SESSION_ID");
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const gchar *ibus_get_socket_path_internal (gboolean compat, gchar *client_display);
|
||||||
|
+
|
||||||
|
const gchar *
|
||||||
|
ibus_get_socket_path (void)
|
||||||
|
{
|
||||||
|
static gchar *path = NULL;
|
||||||
|
|
||||||
|
if (path == NULL) {
|
||||||
|
- gchar *hostname = "unix";
|
||||||
|
- gchar *display;
|
||||||
|
- gchar *displaynumber = "0";
|
||||||
|
- /* gchar *screennumber = "0"; */
|
||||||
|
- gboolean is_wayland = FALSE;
|
||||||
|
- gchar *p;
|
||||||
|
-
|
||||||
|
- path = g_strdup (g_getenv ("IBUS_ADDRESS_FILE"));
|
||||||
|
- if (path != NULL) {
|
||||||
|
- return path;
|
||||||
|
+ path = ibus_get_socket_path_internal (FALSE, NULL);
|
||||||
|
+ }
|
||||||
|
+ return path;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const gchar *
|
||||||
|
+ibus_get_socket_path_x11_compat (void)
|
||||||
|
+{
|
||||||
|
+ static gchar *path = NULL;
|
||||||
|
+ if (path == NULL)
|
||||||
|
+ path = ibus_get_socket_path_internal (TRUE, NULL);
|
||||||
|
+ return path;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const gchar *
|
||||||
|
+ibus_get_socket_path_gnome_xwayland_compat (void)
|
||||||
|
+{
|
||||||
|
+ static gchar *path = NULL;
|
||||||
|
+ if (path == NULL) {
|
||||||
|
+ gint setup_display_number;
|
||||||
|
+ gchar *client_display;
|
||||||
|
+ gchar **tokens;
|
||||||
|
+
|
||||||
|
+ tokens = g_strsplit (ibus_get_socket_path_x11_compat (), "-", 3);
|
||||||
|
+ if (tokens[0] != NULL && tokens[1] != NULL && tokens[2] != NULL) {
|
||||||
|
+ setup_display_number = g_strtod(tokens[2], NULL);
|
||||||
|
+ if (setup_display_number > 0) {
|
||||||
|
+ client_display = g_strdup_printf (":%d", setup_display_number - 1);
|
||||||
|
+ path = ibus_get_socket_path_internal (TRUE, client_display);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (_display == NULL) {
|
||||||
|
+ g_strfreev (tokens);
|
||||||
|
+ }
|
||||||
|
+ return path;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const gchar *
|
||||||
|
+ibus_get_socket_path_internal (gboolean compat, gchar *client_display)
|
||||||
|
+{
|
||||||
|
+ gchar *path = NULL;
|
||||||
|
+
|
||||||
|
+ gchar *hostname = "unix";
|
||||||
|
+ gchar *display;
|
||||||
|
+ gchar *displaynumber = "0";
|
||||||
|
+ /* gchar *screennumber = "0"; */
|
||||||
|
+ gboolean is_wayland = FALSE;
|
||||||
|
+ gchar *p;
|
||||||
|
+
|
||||||
|
+ path = g_strdup (g_getenv ("IBUS_ADDRESS_FILE"));
|
||||||
|
+ if (path != NULL) {
|
||||||
|
+ return path;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (_display == NULL) {
|
||||||
|
+ if (compat) {
|
||||||
|
+ if (client_display == NULL)
|
||||||
|
+ display = g_strdup (g_getenv ("DISPLAY"));
|
||||||
|
+ else
|
||||||
|
+ display = client_display;
|
||||||
|
+ } else {
|
||||||
|
display = g_strdup (g_getenv ("WAYLAND_DISPLAY"));
|
||||||
|
if (display)
|
||||||
|
is_wayland = TRUE;
|
||||||
|
- else
|
||||||
|
+ else if (client_display == NULL)
|
||||||
|
display = g_strdup (g_getenv ("DISPLAY"));
|
||||||
|
+ else
|
||||||
|
+ display = client_display;
|
||||||
|
}
|
||||||
|
- else {
|
||||||
|
- display = g_strdup (_display);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (is_wayland) {
|
||||||
|
- displaynumber = display;
|
||||||
|
- } else if (display) {
|
||||||
|
- p = display;
|
||||||
|
- hostname = display;
|
||||||
|
- for (; *p != ':' && *p != '\0'; p++);
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ display = g_strdup (_display);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (*p == ':') {
|
||||||
|
- *p = '\0';
|
||||||
|
- p++;
|
||||||
|
- displaynumber = p;
|
||||||
|
- }
|
||||||
|
+ if (is_wayland) {
|
||||||
|
+ displaynumber = display;
|
||||||
|
+ } else if (display) {
|
||||||
|
+ p = display;
|
||||||
|
+ hostname = display;
|
||||||
|
+ for (; *p != ':' && *p != '\0'; p++);
|
||||||
|
+
|
||||||
|
+ if (*p == ':') {
|
||||||
|
+ *p = '\0';
|
||||||
|
+ p++;
|
||||||
|
+ displaynumber = p;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- for (; *p != '.' && *p != '\0'; p++);
|
||||||
|
+ for (; *p != '.' && *p != '\0'; p++);
|
||||||
|
|
||||||
|
- if (*p == '.') {
|
||||||
|
- *p = '\0';
|
||||||
|
- p++;
|
||||||
|
- /* Do not use screennumber
|
||||||
|
- screennumber = p; */
|
||||||
|
- }
|
||||||
|
+ if (*p == '.') {
|
||||||
|
+ *p = '\0';
|
||||||
|
+ p++;
|
||||||
|
+ /* Do not use screennumber
|
||||||
|
+ screennumber = p; */
|
||||||
|
}
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (hostname[0] == '\0')
|
||||||
|
- hostname = "unix";
|
||||||
|
+ if (hostname[0] == '\0')
|
||||||
|
+ hostname = "unix";
|
||||||
|
+
|
||||||
|
+ p = g_strdup_printf ("%s-%s-%s",
|
||||||
|
+ ibus_get_local_machine_id (),
|
||||||
|
+ hostname,
|
||||||
|
+ displaynumber);
|
||||||
|
+ /* Qt5 IBus module has a hard-coded path and we cannot change this
|
||||||
|
+ * for the back compatibility.
|
||||||
|
+ * XDG_RUNTIME_DIR is not useful because it's generated by
|
||||||
|
+ * login but not `su` command and ibus-daemon can be run with `su`
|
||||||
|
+ * and we may change the path to XDG_CACHE_HOME in the future.
|
||||||
|
+ */
|
||||||
|
+ path = g_build_filename (g_get_user_config_dir (),
|
||||||
|
+ "ibus",
|
||||||
|
+ "bus",
|
||||||
|
+ p,
|
||||||
|
+ NULL);
|
||||||
|
+ g_free (p);
|
||||||
|
+ g_free (display);
|
||||||
|
|
||||||
|
- p = g_strdup_printf ("%s-%s-%s",
|
||||||
|
- ibus_get_local_machine_id (),
|
||||||
|
- hostname,
|
||||||
|
- displaynumber);
|
||||||
|
- /* Qt5 IBus module has a hard-coded path and we cannot change this
|
||||||
|
- * for the back compatibility.
|
||||||
|
- * XDG_RUNTIME_DIR is not useful because it's generated by
|
||||||
|
- * login but not `su` command and ibus-daemon can be run with `su`
|
||||||
|
- * and we may change the path to XDG_CACHE_HOME in the future.
|
||||||
|
- */
|
||||||
|
- path = g_build_filename (g_get_user_config_dir (),
|
||||||
|
- "ibus",
|
||||||
|
- "bus",
|
||||||
|
- p,
|
||||||
|
- NULL);
|
||||||
|
- g_free (p);
|
||||||
|
- g_free (display);
|
||||||
|
- }
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -243,14 +296,42 @@
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void ibus_write_address_internal (const gchar *address, const gchar *socket_path);
|
||||||
|
+
|
||||||
|
void
|
||||||
|
ibus_write_address (const gchar *address)
|
||||||
|
{
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ const gchar *socket_path;
|
||||||
|
+ const gchar *socket_path_compat;
|
||||||
|
+
|
||||||
|
+ socket_path = ibus_get_socket_path ();
|
||||||
|
+ ibus_write_address_internal (address, socket_path);
|
||||||
|
+
|
||||||
|
+ if (g_getenv ("WAYLAND_DISPLAY") != NULL) {
|
||||||
|
+ socket_path_compat = ibus_get_socket_path_x11_compat ();
|
||||||
|
+ ibus_write_address_internal (address, socket_path_compat);
|
||||||
|
+
|
||||||
|
+ if (g_getenv ("GNOME_SETUP_DISPLAY") != NULL &&
|
||||||
|
+ strcmp (g_getenv ("GNOME_SETUP_DISPLAY"), g_getenv ("DISPLAY")) == 0) {
|
||||||
|
+ /* Running from gnome-shell with the setup display; write the socket
|
||||||
|
++ * address to an additional path for X11 clients */
|
||||||
|
+ socket_path_compat = ibus_get_socket_path_gnome_xwayland_compat ();
|
||||||
|
+ if (socket_path_compat != NULL)
|
||||||
|
+ ibus_write_address_internal (address, socket_path_compat);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+ibus_write_address_internal (const gchar *address, const gchar *socket_path)
|
||||||
|
+{
|
||||||
|
FILE *pf;
|
||||||
|
gchar *path;
|
||||||
|
g_return_if_fail (address != NULL);
|
||||||
|
|
||||||
|
- path = g_path_get_dirname (ibus_get_socket_path ());
|
||||||
|
+ path = g_path_get_dirname (socket_path);
|
||||||
|
errno = 0;
|
||||||
|
if (g_mkdir_with_parents (path, 0700)) {
|
||||||
|
g_warning ("Failed to mkdir %s: %s", path, g_strerror (errno));
|
||||||
|
@@ -260,11 +341,11 @@
|
||||||
|
g_free (path);
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
- if (g_unlink (ibus_get_socket_path ())) {
|
||||||
|
+ if (g_unlink (socket_path)) {
|
||||||
|
g_warning ("Failed to unlink %s: %s",
|
||||||
|
- ibus_get_socket_path (), g_strerror (errno));
|
||||||
|
+ socket_path, g_strerror (errno));
|
||||||
|
}
|
||||||
|
- pf = fopen (ibus_get_socket_path (), "w");
|
||||||
|
+ pf = fopen (socket_path, "w");
|
||||||
|
g_return_if_fail (pf != NULL);
|
||||||
|
|
||||||
|
fprintf (pf,
|
158
ibus-ui-gtk3-restart-via-systemd.patch
Normal file
158
ibus-ui-gtk3-restart-via-systemd.patch
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
|
||||||
|
index 452b14c8..81c246a2 100644
|
||||||
|
--- a/ui/gtk3/panel.vala
|
||||||
|
+++ b/ui/gtk3/panel.vala
|
||||||
|
@@ -1292,7 +1292,7 @@ class Panel : IBus.PanelService {
|
||||||
|
m_sys_menu.append(new Gtk.SeparatorMenuItem());
|
||||||
|
|
||||||
|
item = new Gtk.MenuItem.with_label(_("Restart"));
|
||||||
|
- item.activate.connect((i) => m_bus.exit(true));
|
||||||
|
+ item.activate.connect((i) => restart_daemon());
|
||||||
|
m_sys_menu.append(item);
|
||||||
|
|
||||||
|
item = new Gtk.MenuItem.with_label(_("Quit"));
|
||||||
|
@@ -1305,6 +1305,144 @@ class Panel : IBus.PanelService {
|
||||||
|
return m_sys_menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ private const string systemd_service_file = "org.freedesktop.IBus.session.generic.service";
|
||||||
|
+
|
||||||
|
+ GLib.DBusConnection? get_session_bus() {
|
||||||
|
+ try {
|
||||||
|
+ return GLib.Bus.get_sync (GLib.BusType.SESSION, null);
|
||||||
|
+ } catch (GLib.IOError e) {
|
||||||
|
+ debug("%s\n", e.message);
|
||||||
|
+ }
|
||||||
|
+ return null;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ string?
|
||||||
|
+ get_ibus_systemd_object_path(GLib.DBusConnection connection) {
|
||||||
|
+ string object_path = null;
|
||||||
|
+ assert(systemd_service_file != null);
|
||||||
|
+ try {
|
||||||
|
+ var variant = connection.call_sync (
|
||||||
|
+ "org.freedesktop.systemd1",
|
||||||
|
+ "/org/freedesktop/systemd1",
|
||||||
|
+ "org.freedesktop.systemd1.Manager",
|
||||||
|
+ "GetUnit",
|
||||||
|
+ new GLib.Variant("(s)", systemd_service_file),
|
||||||
|
+ new GLib.VariantType("(o)"),
|
||||||
|
+ GLib.DBusCallFlags.NONE,
|
||||||
|
+ -1,
|
||||||
|
+ null);
|
||||||
|
+ variant.get("(o)", ref object_path);
|
||||||
|
+ debug("Succeed to get an object path \"%s\" for IBus " +
|
||||||
|
+ "systemd service file \"%s\".\n",
|
||||||
|
+ object_path, systemd_service_file);
|
||||||
|
+ return object_path;
|
||||||
|
+ } catch (GLib.Error e) {
|
||||||
|
+ debug("IBus systemd service file \"%s\" is not installed " +
|
||||||
|
+ "in your system: %s\n",
|
||||||
|
+ systemd_service_file, e.message);
|
||||||
|
+ }
|
||||||
|
+ return null;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ bool
|
||||||
|
+ is_running_daemon_via_systemd(GLib.DBusConnection connection,
|
||||||
|
+ string object_path) {
|
||||||
|
+ string? state = null;
|
||||||
|
+ try {
|
||||||
|
+ while (true) {
|
||||||
|
+ var variant = connection.call_sync (
|
||||||
|
+ "org.freedesktop.systemd1",
|
||||||
|
+ object_path,
|
||||||
|
+ "org.freedesktop.DBus.Properties",
|
||||||
|
+ "Get",
|
||||||
|
+ new GLib.Variant("(ss)",
|
||||||
|
+ "org.freedesktop.systemd1.Unit",
|
||||||
|
+ "ActiveState"),
|
||||||
|
+ new GLib.VariantType("(v)"),
|
||||||
|
+ GLib.DBusCallFlags.NONE,
|
||||||
|
+ -1,
|
||||||
|
+ null);
|
||||||
|
+ GLib.Variant child = null;
|
||||||
|
+ variant.get("(v)", ref child);
|
||||||
|
+ state = child.dup_string();
|
||||||
|
+ debug("systemd state is \"%s\" for an object " +
|
||||||
|
+ "path \"%s\".\n", state, object_path);
|
||||||
|
+ if (state != "activating")
|
||||||
|
+ break;
|
||||||
|
+ Posix.sleep(1);
|
||||||
|
+ }
|
||||||
|
+ } catch (GLib.Error e) {
|
||||||
|
+ debug("%s\n", e.message);
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ if (state == "active")
|
||||||
|
+ return true;
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ bool
|
||||||
|
+ start_daemon_via_systemd(GLib.DBusConnection connection,
|
||||||
|
+ bool restart) {
|
||||||
|
+ string object_path = null;
|
||||||
|
+ string method = "StartUnit";
|
||||||
|
+ assert(systemd_service_file != null);
|
||||||
|
+ if (restart)
|
||||||
|
+ method = "RestartUnit";
|
||||||
|
+ try {
|
||||||
|
+ var variant = connection.call_sync (
|
||||||
|
+ "org.freedesktop.systemd1",
|
||||||
|
+ "/org/freedesktop/systemd1",
|
||||||
|
+ "org.freedesktop.systemd1.Manager",
|
||||||
|
+ method,
|
||||||
|
+ new GLib.Variant("(ss)", systemd_service_file, "fail"),
|
||||||
|
+ new GLib.VariantType("(o)"),
|
||||||
|
+ GLib.DBusCallFlags.NONE,
|
||||||
|
+ -1,
|
||||||
|
+ null);
|
||||||
|
+ variant.get("(o)", ref object_path);
|
||||||
|
+ debug("Succeed to restart IBus daemon via IBus systemd " +
|
||||||
|
+ "service file \"%s\": \"%s\"\n",
|
||||||
|
+ systemd_service_file, object_path);
|
||||||
|
+ return true;
|
||||||
|
+ } catch (GLib.Error e) {
|
||||||
|
+ debug("Failed to %s IBus daemon via IBus systemd " +
|
||||||
|
+ "service file \"%s\": %s\n",
|
||||||
|
+ restart ? "restart" : "start",
|
||||||
|
+ systemd_service_file, e.message);
|
||||||
|
+ }
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ private void restart_daemon() {
|
||||||
|
+ do {
|
||||||
|
+ GLib.DBusConnection? connection = get_session_bus();
|
||||||
|
+ if (connection == null)
|
||||||
|
+ break;
|
||||||
|
+ var object_path = get_ibus_systemd_object_path(connection);
|
||||||
|
+ if (object_path == null)
|
||||||
|
+ break;
|
||||||
|
+ if (is_running_daemon_via_systemd(connection,
|
||||||
|
+ object_path)) {
|
||||||
|
+ var result = start_daemon_via_systemd(connection, true);
|
||||||
|
+ if (!result) {
|
||||||
|
+ var dialog = new Gtk.MessageDialog(
|
||||||
|
+ null,
|
||||||
|
+ Gtk.DialogFlags.DESTROY_WITH_PARENT,
|
||||||
|
+ Gtk.MessageType.ERROR,
|
||||||
|
+ Gtk.ButtonsType.CLOSE,
|
||||||
|
+ "Failed to restart IBus daemon via IBus systemd");
|
||||||
|
+ dialog.response.connect((id) => {
|
||||||
|
+ dialog.destroy();
|
||||||
|
+ });
|
||||||
|
+ dialog.show_all();
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return;
|
||||||
|
+ } while (false);
|
||||||
|
+ // ibus-daemon is not launched via systemd
|
||||||
|
+ m_bus.exit(true);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
private Gtk.Menu create_activate_menu() {
|
||||||
|
m_ime_menu = new Gtk.Menu();
|
||||||
|
|
16
ibus-xim-fix-re-focus-after-lock.patch
Normal file
16
ibus-xim-fix-re-focus-after-lock.patch
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
client/x11/main.c | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
--- a/client/x11/main.c
|
||||||
|
+++ b/client/x11/main.c
|
||||||
|
@@ -421,6 +421,9 @@ xim_set_ic_focus (XIMS xims, IMChangeFoc
|
||||||
|
GINT_TO_POINTER ((gint) call_data->icid));
|
||||||
|
g_return_val_if_fail (x11ic != NULL, 0);
|
||||||
|
|
||||||
|
+ /* make sure that focus has been already out */
|
||||||
|
+ ibus_input_context_focus_out (x11ic->context);
|
||||||
|
+
|
||||||
|
ibus_input_context_focus_in (x11ic->context);
|
||||||
|
_xim_set_cursor_location (x11ic);
|
||||||
|
|
1402
ibus.changes
Normal file
1402
ibus.changes
Normal file
File diff suppressed because it is too large
Load Diff
483
ibus.spec
Normal file
483
ibus.spec
Normal file
@ -0,0 +1,483 @@
|
|||||||
|
#
|
||||||
|
# spec file
|
||||||
|
#
|
||||||
|
# Copyright (c) 2023 SUSE LLC
|
||||||
|
#
|
||||||
|
# All modifications and additions to the file contributed by third parties
|
||||||
|
# remain the property of their copyright owners, unless otherwise agreed
|
||||||
|
# upon. The license for this file, and modifications and additions to the
|
||||||
|
# file, is the same license as for the pristine package itself (unless the
|
||||||
|
# license for the pristine package is not an Open Source License, in which
|
||||||
|
# case the license is the MIT License). An "Open Source License" is a
|
||||||
|
# license that conforms to the Open Source Definition (Version 1.9)
|
||||||
|
# published by the Open Source Initiative.
|
||||||
|
|
||||||
|
# Please submit bugfixes or comments via https://bugs.opensuse.org/
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
%define flavor @BUILD_FLAVOR@%nil
|
||||||
|
|
||||||
|
%define with_gtk4 0
|
||||||
|
%define with_wayland 1
|
||||||
|
%define with_emoji 1
|
||||||
|
|
||||||
|
%if "%{flavor}" == "gtk4"
|
||||||
|
%define with_gtk4 1
|
||||||
|
%define nsuffix _%{flavor}
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! %{defined _distconfdir}
|
||||||
|
%define _distconfdir %{_sysconfdir}
|
||||||
|
%else
|
||||||
|
%define use_usretc 1
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%define _name ibus
|
||||||
|
Name: %{_name}%{?nsuffix}
|
||||||
|
Version: 1.5.28
|
||||||
|
Release: 0
|
||||||
|
Summary: The "Intelligent Input Bus" input method
|
||||||
|
License: LGPL-2.1-or-later
|
||||||
|
Group: System/I18n/Chinese
|
||||||
|
URL: https://github.com/ibus/
|
||||||
|
Source: https://github.com/ibus/ibus/releases/download/%{version}/%{_name}-%{version}.tar.gz
|
||||||
|
Source2: README.SUSE
|
||||||
|
Source3: xim.ibus.suse.template
|
||||||
|
Source4: xim.d-ibus-121
|
||||||
|
Source7: macros.ibus
|
||||||
|
Source10: ibus-autostart
|
||||||
|
Source11: ibus-autostart.desktop
|
||||||
|
Source12: 20-defaults-openSUSE.conf
|
||||||
|
Source99: baselibs.conf
|
||||||
|
# PATFH-FIX-OPENSUSE ibus-xim-fix-re-focus-after-lock.patch bnc#874869 tiwai@suse.de
|
||||||
|
# Fix lost XIM input after screenlock
|
||||||
|
Patch4: ibus-xim-fix-re-focus-after-lock.patch
|
||||||
|
# PATCH-FIX-UPSTREAM ftake@geeko.jp
|
||||||
|
# Select an IM engine instead of xkb engine at the first login
|
||||||
|
Patch8: im-engines-precede-xkb.patch
|
||||||
|
# PATCH-FIX-OPENSUSE ibus-fix-Signal-does-not-exist.patch hillwood@opensuse.org
|
||||||
|
# panel.vala: The name `Signal' does not exist in the context of `Posix' in Leap 15.1 and below
|
||||||
|
Patch9: ibus-fix-Signal-does-not-exist.patch
|
||||||
|
# PATCH-FIX-SLE hide-setup-menu.patch bnc#899259 qzhao@suse.com
|
||||||
|
# ibus-setup should not launch from main menu.
|
||||||
|
Patch10: hide-setup-menu.patch
|
||||||
|
# PATCH-FIX-SLE setup-switch-im.patch bnc#899259 qzhao@suse.com
|
||||||
|
# switch to ibus when ibus not running.
|
||||||
|
Patch11: setup-switch-im.patch
|
||||||
|
# PATCH-FIX-SLE ibus-disable-engines-preload-in-GNOME.patch bnc#1036729 qzhao@suse.com
|
||||||
|
# Disable ibus engines preload in GNOME for These works are handled by gnome-shell.
|
||||||
|
Patch12: ibus-disable-engines-preload-in-GNOME.patch
|
||||||
|
# PATCH-FIX-UPSTREAM ibus-socket-name-compatibility.patch bsc#1171442, gh#ibus/ibus#2195 qkzhu@suse
|
||||||
|
# Compatibility workaround for ibus-use-wayland-display-for-socket-name.patch
|
||||||
|
# Qt5 does not be update to the new version and patch for ibus on Leap 15,
|
||||||
|
# it still needs this patch on leap 15. (boo#1187202)
|
||||||
|
Patch15: ibus-socket-name-compatibility.patch
|
||||||
|
# PATCH-FIX-UPSTREAM ibus-ui-gtk3-restart-via-systemd.patch
|
||||||
|
# Allow ibus-ui-gtk3 to restart ibus-daemon when it is launched by systemd
|
||||||
|
Patch16: ibus-ui-gtk3-restart-via-systemd.patch
|
||||||
|
# PATCH-FIX-UPSTREAM ibus-fix-key-release.patch
|
||||||
|
# Fixes a problem that wine/proton (steam) got a key stuck
|
||||||
|
Patch17: ibus-fix-key-release.patch
|
||||||
|
BuildRequires: pkgconfig(iso-codes)
|
||||||
|
BuildRequires: pkgconfig(libnotify)
|
||||||
|
BuildRequires: pkgconfig(systemd)
|
||||||
|
%if ! 0%{?with_gtk4}
|
||||||
|
BuildRequires: fdupes
|
||||||
|
BuildRequires: gettext-devel
|
||||||
|
BuildRequires: gobject-introspection-devel >= 0.9.6
|
||||||
|
BuildRequires: gtk-doc >= 1.9
|
||||||
|
BuildRequires: libtool
|
||||||
|
BuildRequires: pkgconfig
|
||||||
|
BuildRequires: python3-dbus-python-devel
|
||||||
|
BuildRequires: python3-gobject-devel
|
||||||
|
BuildRequires: unicode-ucd
|
||||||
|
BuildRequires: update-desktop-files
|
||||||
|
BuildRequires: pkgconfig(dbus-glib-1)
|
||||||
|
BuildRequires: pkgconfig(dconf) >= 0.7.5
|
||||||
|
BuildRequires: pkgconfig(glib-2.0) >= 2.34.0
|
||||||
|
BuildRequires: pkgconfig(gtk+-2.0)
|
||||||
|
BuildRequires: pkgconfig(libnotify) >= 0.7
|
||||||
|
BuildRequires: pkgconfig(python3)
|
||||||
|
# copy_deep method is supported since 0.31.1
|
||||||
|
BuildRequires: vala >= 0.31.1
|
||||||
|
BuildRequires: systemd-rpm-macros
|
||||||
|
BuildRequires: x11-tools
|
||||||
|
BuildRequires: pkgconfig(json-glib-1.0)
|
||||||
|
BuildRequires: pkgconfig(vapigen)
|
||||||
|
BuildRequires: pkgconfig(xkbcommon)
|
||||||
|
%if %{with_emoji}
|
||||||
|
Requires: %{_name}-dict-emoji = %{version}
|
||||||
|
%endif
|
||||||
|
Requires: dconf
|
||||||
|
Requires: iso-codes
|
||||||
|
Requires: libibus-1_0-5 = %{version}
|
||||||
|
Requires: python3-dbus-python
|
||||||
|
Requires: python3-gobject
|
||||||
|
Requires: python3-gobject-Gdk
|
||||||
|
# ibus-setup will require typelib(Gdk) typelib(GdkX11), typelib(Gtk)
|
||||||
|
# which are provided by two packages in openSUSE, so we limit their
|
||||||
|
# versions to 3.0 only.
|
||||||
|
Requires: typelib-1_0-Gtk-3_0
|
||||||
|
Provides: locale(ja;ko;zh)
|
||||||
|
%if %{with_wayland}
|
||||||
|
BuildRequires: pkgconfig(wayland-client) >= 1.2.0
|
||||||
|
%endif
|
||||||
|
%if %{with_emoji}
|
||||||
|
BuildRequires: unicode-emoji
|
||||||
|
BuildRequires: pkgconfig(cldr-emoji-annotation)
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%description
|
||||||
|
IBus, short for Intelligent Input Bus, is an input framework. IBus
|
||||||
|
plugins then provide the particular logic how to translate keypresses
|
||||||
|
to input characters and possibly show disambiguation windows around
|
||||||
|
the text cursor.
|
||||||
|
|
||||||
|
%if ! 0%{?with_gtk4}
|
||||||
|
%package -n libibus-1_0-5
|
||||||
|
Summary: IBus libraries
|
||||||
|
Group: System/Libraries
|
||||||
|
|
||||||
|
%description -n libibus-1_0-5
|
||||||
|
This package contains the libraries for IBus
|
||||||
|
|
||||||
|
%package -n typelib-1_0-IBus-1_0
|
||||||
|
Summary: Introspection bindings for IBus
|
||||||
|
Group: System/Libraries
|
||||||
|
|
||||||
|
%description -n typelib-1_0-IBus-1_0
|
||||||
|
This package contains the introspection bindings for the IBus library.
|
||||||
|
|
||||||
|
%if %{with_emoji}
|
||||||
|
%package dict-emoji
|
||||||
|
Summary: Emoji dictionary for IBus
|
||||||
|
Group: System/I18n/Chinese
|
||||||
|
BuildArch: noarch
|
||||||
|
# make sure old ibus package containing emoji dict files is updated
|
||||||
|
Conflicts: ibus < 1.5.22
|
||||||
|
|
||||||
|
%description dict-emoji
|
||||||
|
This package contains data of emoji dictionary for IBus and other applications
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%package gtk
|
||||||
|
Summary: IBus input method support for gtk2 applications
|
||||||
|
Group: System/I18n/Chinese
|
||||||
|
Requires: %{_name} = %{version}
|
||||||
|
Supplements: (ibus and gtk2)
|
||||||
|
%{gtk2_immodule_requires}
|
||||||
|
|
||||||
|
%description gtk
|
||||||
|
This package contains ibus im module for use by gtk2.
|
||||||
|
|
||||||
|
%package gtk3
|
||||||
|
Summary: IBus input method support for gtk3 applications
|
||||||
|
Group: System/I18n/Chinese
|
||||||
|
BuildRequires: pkgconfig(gtk+-3.0)
|
||||||
|
Requires: %{_name} = %{version}
|
||||||
|
Supplements: (ibus and gtk3)
|
||||||
|
%{gtk3_immodule_requires}
|
||||||
|
|
||||||
|
%description gtk3
|
||||||
|
This package contains ibus im module for use by gtk3.
|
||||||
|
|
||||||
|
%package devel
|
||||||
|
Summary: Development tools for ibus
|
||||||
|
Group: Development/Libraries/Other
|
||||||
|
Requires: dbus-1-devel
|
||||||
|
Requires: glib2-devel
|
||||||
|
Requires: gtk-doc
|
||||||
|
Requires: ibus = %{version}
|
||||||
|
Requires: libibus-1_0-5 = %{version}
|
||||||
|
Requires: typelib-1_0-IBus-1_0 = %{version}
|
||||||
|
|
||||||
|
%description devel
|
||||||
|
The ibus-devel package contains the header files and developer
|
||||||
|
docs for ibus.
|
||||||
|
|
||||||
|
%lang_package
|
||||||
|
|
||||||
|
%else
|
||||||
|
|
||||||
|
%package -n %{_name}-gtk4
|
||||||
|
Summary: IBus input method support for gtk4 applications
|
||||||
|
# on 15.4, both gtk4-devel and gtk4-devel-32bit provide pkgconfig(gtk4)
|
||||||
|
Group: System/I18n/Chinese
|
||||||
|
BuildRequires: gtk4-devel
|
||||||
|
BuildRequires: pkgconfig(dbus-1)
|
||||||
|
Requires: %{_name} = %{version}
|
||||||
|
Supplements: (ibus and gtk4)
|
||||||
|
%{gtk4_immodule_requires}
|
||||||
|
|
||||||
|
%description -n %{_name}-gtk4
|
||||||
|
This package contains ibus im module for use by gtk4.
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q -n %{_name}-%{version}
|
||||||
|
%patch4 -p1
|
||||||
|
%patch8 -p1
|
||||||
|
%if 0%{?sle_version} < 150200 && 0%{?suse_version} <=1500
|
||||||
|
%patch9 -p1
|
||||||
|
%endif
|
||||||
|
|
||||||
|
cp -r %{SOURCE2} .
|
||||||
|
cp -r %{SOURCE3} .
|
||||||
|
cp -r %{SOURCE4} .
|
||||||
|
sed -i 1i"SYS_LIB=%{_lib}" xim.d-ibus-121
|
||||||
|
cp -r %{SOURCE10} .
|
||||||
|
cp -r %{SOURCE11} .
|
||||||
|
|
||||||
|
%patch10 -p1
|
||||||
|
%patch11 -p1
|
||||||
|
%patch12 -p1
|
||||||
|
%if 0%{?suse_version} <= 1500
|
||||||
|
%patch15 -p1
|
||||||
|
%endif
|
||||||
|
%patch16 -p1
|
||||||
|
%patch17 -p1
|
||||||
|
|
||||||
|
%build
|
||||||
|
%configure --disable-static \
|
||||||
|
--libexecdir=%{_libdir}/ibus \
|
||||||
|
%if %{with_wayland}
|
||||||
|
--enable-wayland \
|
||||||
|
%endif
|
||||||
|
%if %{with_emoji}
|
||||||
|
--enable-emoji-dict \
|
||||||
|
%else
|
||||||
|
--disable-emoji-dict \
|
||||||
|
%endif
|
||||||
|
--disable-python2 \
|
||||||
|
%if ! 0%{?with_gtk4}
|
||||||
|
--enable-gtk3 \
|
||||||
|
--enable-vala \
|
||||||
|
--enable-appindicator \
|
||||||
|
--with-python=python3 \
|
||||||
|
--enable-python-library \
|
||||||
|
--enable-introspection \
|
||||||
|
--enable-gtk-doc \
|
||||||
|
--enable-surrounding-text \
|
||||||
|
%else
|
||||||
|
--disable-dconf \
|
||||||
|
--disable-emoji-dict \
|
||||||
|
--disable-unicode-dict \
|
||||||
|
--disable-xim \
|
||||||
|
--disable-gtk2 \
|
||||||
|
--disable-gtk3 \
|
||||||
|
--enable-gtk4 \
|
||||||
|
%endif
|
||||||
|
|
||||||
|
# non-parallel to have reproducible results in spite of non-deterministic build scripts https://github.com/ibus/ibus/issues/2272
|
||||||
|
make
|
||||||
|
|
||||||
|
%install
|
||||||
|
%make_install
|
||||||
|
|
||||||
|
# Remove libtool archives
|
||||||
|
find %{buildroot} -type f -name "*.la" -delete -print
|
||||||
|
|
||||||
|
%if ! 0%{?with_gtk4}
|
||||||
|
# autostart
|
||||||
|
mkdir -p %{buildroot}%{_distconfdir}/X11/xim.d/
|
||||||
|
install -m 644 xim.d-ibus-121 %{buildroot}%{_distconfdir}/X11/xim.d/ibus
|
||||||
|
mkdir -p %{buildroot}%{_bindir}
|
||||||
|
install -c -m 0755 ibus-autostart %{buildroot}%{_bindir}/ibus-autostart
|
||||||
|
mkdir -p %{buildroot}%{_sysconfdir}/xdg/autostart
|
||||||
|
install -c -m 0644 ibus-autostart.desktop %{buildroot}%{_sysconfdir}/xdg/autostart/ibus-autostart.desktop
|
||||||
|
|
||||||
|
# systemd conf
|
||||||
|
mkdir -p %{buildroot}%{_userunitdir}/org.freedesktop.IBus.session.generic.service.d
|
||||||
|
install -c -m 0644 %{SOURCE12} %{buildroot}%{_userunitdir}/org.freedesktop.IBus.session.generic.service.d
|
||||||
|
|
||||||
|
PRIORITY=40
|
||||||
|
pushd %{buildroot}%{_distconfdir}/X11/xim.d/
|
||||||
|
for lang in am ar as bn el fa gu he hi hr ja ka kk kn ko lo ml my \
|
||||||
|
pa ru sk vi zh_TW zh_CN zh_HK zh_SG \
|
||||||
|
de fr it es nl cs pl da nn nb fi en sv
|
||||||
|
do
|
||||||
|
mkdir $lang
|
||||||
|
pushd $lang
|
||||||
|
ln -s ../ibus $PRIORITY-ibus
|
||||||
|
popd
|
||||||
|
done
|
||||||
|
popd
|
||||||
|
|
||||||
|
mkdir -p %{buildroot}%{_datadir}/pixmaps
|
||||||
|
ln -sf %{_datadir}/icons/hicolor/48x48/apps/ibus-keyboard.png \
|
||||||
|
%{buildroot}%{_datadir}/pixmaps/ibus-keyboard.png
|
||||||
|
|
||||||
|
# touch for %%ghost
|
||||||
|
touch %{buildroot}/%{_sysconfdir}/dconf/db/ibus
|
||||||
|
|
||||||
|
# install macros
|
||||||
|
mkdir -p %{buildroot}%{_rpmmacrodir}
|
||||||
|
install -m 644 %{SOURCE7} %{buildroot}%{_rpmmacrodir}
|
||||||
|
|
||||||
|
%suse_update_desktop_file -r org.freedesktop.IBus.Setup Settings DesktopSettings X-SuSE-Core-System
|
||||||
|
|
||||||
|
%fdupes %{buildroot}
|
||||||
|
|
||||||
|
%find_lang ibus10 %{?no_lang_C}
|
||||||
|
|
||||||
|
%pre
|
||||||
|
%systemd_user_pre org.freedesktop.IBus.session.GNOME.service org.freedesktop.IBus.session.generic.service
|
||||||
|
|
||||||
|
%post
|
||||||
|
%glib2_gsettings_schema_post
|
||||||
|
%systemd_user_post org.freedesktop.IBus.session.GNOME.service org.freedesktop.IBus.session.generic.service
|
||||||
|
|
||||||
|
%posttrans
|
||||||
|
dconf update
|
||||||
|
|
||||||
|
%preun
|
||||||
|
%systemd_user_preun org.freedesktop.IBus.session.GNOME.service org.freedesktop.IBus.session.generic.service
|
||||||
|
|
||||||
|
%postun
|
||||||
|
%glib2_gsettings_schema_postun
|
||||||
|
dconf update
|
||||||
|
%systemd_user_postun org.freedesktop.IBus.session.GNOME.service org.freedesktop.IBus.session.generic.service
|
||||||
|
|
||||||
|
%post gtk
|
||||||
|
%{gtk2_immodule_post}
|
||||||
|
|
||||||
|
%postun gtk
|
||||||
|
%{gtk2_immodule_postun}
|
||||||
|
|
||||||
|
%post -n libibus-1_0-5 -p /sbin/ldconfig
|
||||||
|
%postun -n libibus-1_0-5 -p /sbin/ldconfig
|
||||||
|
|
||||||
|
%post gtk3
|
||||||
|
%{gtk3_immodule_post}
|
||||||
|
|
||||||
|
%postun gtk3
|
||||||
|
%{gtk3_immodule_postun}
|
||||||
|
|
||||||
|
%else
|
||||||
|
|
||||||
|
# cleanup stuff that is packaged as part of the main ibus flavor
|
||||||
|
rm -rf %{buildroot}%{_datadir}
|
||||||
|
rm -rf %{buildroot}%{_includedir}
|
||||||
|
rm -rf %{buildroot}%{_bindir}
|
||||||
|
rm -rf %{buildroot}%{_libdir}/ibus
|
||||||
|
rm -rf %{buildroot}%{_libdir}/libibus*
|
||||||
|
rm -rf %{buildroot}%{_libdir}/pkgconfig
|
||||||
|
rm -rf %{buildroot}%{_prefix}/lib/systemd
|
||||||
|
rm -rf %{buildroot}%{_sysconfdir}/xdg
|
||||||
|
|
||||||
|
%post -n %{_name}-gtk4
|
||||||
|
%{gtk4_immodule_post}
|
||||||
|
|
||||||
|
%postun -n %{_name}-gtk4
|
||||||
|
#{gtk4_immodule_postun} there is a syntax error in the macro from gtk4-devel
|
||||||
|
if [ $1 -eq 0 ]; then
|
||||||
|
if [[ -x %{_bindir}/gio-querymodules-64 ]]; then
|
||||||
|
%{_bindir}/gio-querymodules-64 %{_libdir}/gtk-4.0/4.0.0/immodules
|
||||||
|
else
|
||||||
|
%{_bindir}/gio-querymodules %{_libdir}/gtk-4.0/4.0.0/immodules
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if ! 0%{?with_gtk4}
|
||||||
|
%files
|
||||||
|
%doc AUTHORS README README.SUSE xim.ibus.suse.template
|
||||||
|
%license COPYING
|
||||||
|
%{_rpmmacrodir}/macros.ibus
|
||||||
|
%if %{defined use_usretc}
|
||||||
|
%dir %{_distconfdir}/X11
|
||||||
|
%dir %{_distconfdir}/X11/xim.d
|
||||||
|
%{_distconfdir}/X11/xim.d/*
|
||||||
|
%else
|
||||||
|
%config %{_sysconfdir}/X11/xim.d/*
|
||||||
|
%endif
|
||||||
|
%dir %{_sysconfdir}/xdg/Xwayland-session.d
|
||||||
|
%{_sysconfdir}/xdg/Xwayland-session.d/10-ibus-x11
|
||||||
|
%{_bindir}/ibus
|
||||||
|
%{_bindir}/ibus-autostart
|
||||||
|
%{_bindir}/ibus-daemon
|
||||||
|
%{_bindir}/ibus-setup
|
||||||
|
%dir %{_datadir}/ibus
|
||||||
|
%{_datadir}/ibus/component
|
||||||
|
%dir %{_datadir}/ibus/dicts
|
||||||
|
%{_datadir}/ibus/dicts/unicode-*.dict
|
||||||
|
%{_datadir}/ibus/engine
|
||||||
|
%{_datadir}/ibus/keymaps
|
||||||
|
%{_datadir}/ibus/setup
|
||||||
|
%{_datadir}/applications/org.freedesktop.IBus.Setup.desktop
|
||||||
|
%dir %{_datadir}/GConf
|
||||||
|
%dir %{_datadir}/GConf/gsettings
|
||||||
|
%{_datadir}/GConf/gsettings/ibus.convert
|
||||||
|
%{_datadir}/glib-2.0/schemas/org.freedesktop.ibus.gschema.xml
|
||||||
|
%{_datadir}/icons/hicolor/*/apps/ibus*.*
|
||||||
|
%{_datadir}/pixmaps/ibus-keyboard.png
|
||||||
|
%{_libdir}/ibus
|
||||||
|
%{_datadir}/bash-completion/completions/ibus.bash
|
||||||
|
%{_datadir}/dbus-1/services/*.service
|
||||||
|
# This file is generated by dconf update
|
||||||
|
%ghost %{_sysconfdir}/dconf/db/ibus
|
||||||
|
%dir %{_sysconfdir}/dconf/db/ibus.d
|
||||||
|
# This file is not a config file. Users may not modify it.
|
||||||
|
%config %{_sysconfdir}/dconf/db/ibus.d/00-upstream-settings
|
||||||
|
%config %{_sysconfdir}/dconf/profile/ibus
|
||||||
|
%config %{_sysconfdir}/xdg/autostart/ibus-autostart.desktop
|
||||||
|
%{_mandir}/man1/ibus.1%{ext_man}
|
||||||
|
%{_mandir}/man1/ibus-daemon.1%{ext_man}
|
||||||
|
%{_mandir}/man1/ibus-setup.1%{ext_man}
|
||||||
|
%{_mandir}/man5/00-upstream-settings.5%{ext_man}
|
||||||
|
%{_mandir}/man5/ibus.5%{ext_man}
|
||||||
|
%dir %{_userunitdir}/gnome-session.target.wants
|
||||||
|
%{_userunitdir}/gnome-session.target.wants/org.freedesktop.IBus.session.GNOME.service
|
||||||
|
%{_userunitdir}/*.service
|
||||||
|
%{_userunitdir}/org.freedesktop.IBus.session.generic.service.d
|
||||||
|
|
||||||
|
%if %{with_emoji}
|
||||||
|
%{_datadir}/applications/org.freedesktop.IBus.Panel.Emojier.desktop
|
||||||
|
%{_datadir}/applications/org.freedesktop.IBus.Panel.Extension.Gtk3.desktop
|
||||||
|
%{_mandir}/man7/ibus-emoji.7%{ext_man}
|
||||||
|
%endif
|
||||||
|
%{python3_sitearch}/gi/overrides/IBus.py
|
||||||
|
%{python3_sitearch}/gi/overrides/__pycache__/IBus.cpython-*.opt-1.pyc
|
||||||
|
%{python3_sitearch}/gi/overrides/__pycache__/IBus.cpython-*.pyc
|
||||||
|
|
||||||
|
%files lang -f ibus10.lang
|
||||||
|
|
||||||
|
%files -n libibus-1_0-5
|
||||||
|
%{_libdir}/libibus-1.0.so.*
|
||||||
|
|
||||||
|
%if %{with_emoji}
|
||||||
|
%files dict-emoji
|
||||||
|
|
||||||
|
%dir %{_datadir}/ibus/dicts
|
||||||
|
%{_datadir}/ibus/dicts/emoji-*.dict
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%files -n typelib-1_0-IBus-1_0
|
||||||
|
%{_libdir}/girepository-1.0/IBus-1.0.typelib
|
||||||
|
|
||||||
|
%files gtk
|
||||||
|
%{_libdir}/gtk-2.0/*/immodules/im-ibus.so
|
||||||
|
|
||||||
|
%files gtk3
|
||||||
|
%{_libdir}/gtk-3.0/3.0.0/immodules/im-ibus.so
|
||||||
|
|
||||||
|
%files devel
|
||||||
|
%{_libdir}/libibus-1.0.so
|
||||||
|
%{_includedir}/ibus-1.0
|
||||||
|
%{_datadir}/gtk-doc/html/ibus
|
||||||
|
%{_libdir}/pkgconfig/ibus-1.0.pc
|
||||||
|
%{_datadir}/gettext/its/ibus.*
|
||||||
|
%{_datadir}/gir-1.0/IBus-1.0.gir
|
||||||
|
%{_datadir}/vala/vapi/ibus-1.0.deps
|
||||||
|
%{_datadir}/vala/vapi/ibus-1.0.vapi
|
||||||
|
|
||||||
|
%else
|
||||||
|
|
||||||
|
%files -n %{_name}-gtk4
|
||||||
|
%dir %{_libdir}/gtk-4.0/4.0.0/immodules
|
||||||
|
%{_libdir}/gtk-4.0/4.0.0/immodules/libim-ibus.so
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%changelog
|
14
im-engines-precede-xkb.patch
Normal file
14
im-engines-precede-xkb.patch
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
--- ibus-1.5.27/ui/gtk3/panel.vala.org 2022-08-23 00:32:16.000000000 +0900
|
||||||
|
+++ ibus-1.5.27/ui/gtk3/panel.vala 2022-08-27 11:48:21.086332809 +0900
|
||||||
|
@@ -589,9 +589,9 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] names = {};
|
||||||
|
- foreach (unowned IBus.EngineDesc engine in xkb_engines)
|
||||||
|
- names += engine.get_name();
|
||||||
|
foreach (unowned IBus.EngineDesc engine in im_engines)
|
||||||
|
+ names += engine.get_name();
|
||||||
|
+ foreach (unowned IBus.EngineDesc engine in xkb_engines)
|
||||||
|
names += engine.get_name();
|
||||||
|
|
||||||
|
m_settings_general.set_strv("preload-engines", names);
|
34
macros.ibus
Normal file
34
macros.ibus
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# RPM macros for ibus
|
||||||
|
# You should use %%{_ibus_icondir} and %%{_ibus_tabledir}
|
||||||
|
# in %%files section
|
||||||
|
# For ibus table packaging, you have to:
|
||||||
|
# Use %%ibus_table_requires as requires
|
||||||
|
# Use %%ibus_table_index_post %%DB_NAME in %%post to create
|
||||||
|
# table indexes for your table package.
|
||||||
|
%_ibus_includedir %{_includedir}/ibus-1.0
|
||||||
|
%_ibus_libdir %{_libdir}/ibus
|
||||||
|
%_ibus_libexecdir %{_ibus_libdir}
|
||||||
|
%_ibus_datadir %{_datadir}/ibus
|
||||||
|
%_ibus_componentdir %{_ibus_datadir}/component
|
||||||
|
%_ibus_enginedir %{_ibus_datadir}/engine
|
||||||
|
%_ibus_keymapdir %{_ibus_datadir}/keymaps
|
||||||
|
%_ibus_setupdir %{_ibus_datadir}/setup
|
||||||
|
%_ibus_autostartdir %{_sysconfdir}/X11/xim.d
|
||||||
|
%_ibus_tabledir %{_datadir}/ibus-table/tables
|
||||||
|
%_ibus_icondir %{_datadir}/ibus-table/icons
|
||||||
|
|
||||||
|
%ibus_requires \
|
||||||
|
Requires: ibus
|
||||||
|
|
||||||
|
%ibus_table_requires \
|
||||||
|
Requires: ibus-table
|
||||||
|
Requires(post): ibus-table
|
||||||
|
|
||||||
|
%ibus_table_index_post() \
|
||||||
|
%if "x%1" != "x%%1" \
|
||||||
|
DB_NAME="%1" \
|
||||||
|
%else \
|
||||||
|
echo "Missing argument DB_NAME in call to %%ibus_table_create_index." \
|
||||||
|
false \
|
||||||
|
%endif \
|
||||||
|
/usr/bin/ibus-table-createdb -i -n %{_ibus_tabledir}/${DB_NAME}.db || true
|
65
setup-switch-im.patch
Normal file
65
setup-switch-im.patch
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
--- ibus-1.5.26/setup/main.py.org 2022-03-14 14:15:48.000000000 +0900
|
||||||
|
+++ ibus-1.5.26/setup/main.py 2022-08-21 23:04:59.698814168 +0900
|
||||||
|
@@ -508,11 +508,16 @@
|
||||||
|
self.__engine_setup_exec_list[name] = os.spawnl(os.P_NOWAIT, *args)
|
||||||
|
|
||||||
|
def __init_bus(self):
|
||||||
|
+ method_name="ibus"
|
||||||
|
+ filename=".i18n"
|
||||||
|
+ usr_home =os.path.expanduser('~')
|
||||||
|
+
|
||||||
|
self.__bus = IBus.Bus()
|
||||||
|
if self.__bus.is_connected():
|
||||||
|
return
|
||||||
|
|
||||||
|
- message = _("The IBus daemon is not running. Do you wish to start it?")
|
||||||
|
+ message = _("Could not connect to IBus daemon.\n"
|
||||||
|
+ "Do you wish to switch to IBus on next login?")
|
||||||
|
dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.QUESTION,
|
||||||
|
buttons = Gtk.ButtonsType.YES_NO,
|
||||||
|
text = message)
|
||||||
|
@@ -522,39 +527,11 @@
|
||||||
|
if id != Gtk.ResponseType.YES:
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
- main_loop = GLib.MainLoop()
|
||||||
|
-
|
||||||
|
- timeout = 5
|
||||||
|
- GLib.timeout_add_seconds(timeout, lambda *args: main_loop.quit())
|
||||||
|
- self.__bus.connect("connected", lambda *args: main_loop.quit())
|
||||||
|
-
|
||||||
|
- os.spawnlp(os.P_NOWAIT, "ibus-daemon", "ibus-daemon", "--xim", "--daemonize")
|
||||||
|
-
|
||||||
|
- main_loop.run()
|
||||||
|
-
|
||||||
|
- if self.__bus.is_connected():
|
||||||
|
- message = _("IBus has been started! "
|
||||||
|
- "If you cannot use IBus, add the following lines to your $HOME/.bashrc; then relog into your desktop.\n"
|
||||||
|
- " export GTK_IM_MODULE=ibus\n"
|
||||||
|
- " export XMODIFIERS=@im=ibus\n"
|
||||||
|
- " export QT_IM_MODULE=ibus"
|
||||||
|
- )
|
||||||
|
- dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.INFO,
|
||||||
|
- buttons = Gtk.ButtonsType.OK,
|
||||||
|
- text = message)
|
||||||
|
- id = dlg.run()
|
||||||
|
- dlg.destroy()
|
||||||
|
- self.__flush_gtk_events()
|
||||||
|
- else:
|
||||||
|
- # Translators: %d == 5 currently
|
||||||
|
- message = _("IBus daemon could not be started in %d seconds.")
|
||||||
|
- dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.INFO,
|
||||||
|
- buttons = Gtk.ButtonsType.OK,
|
||||||
|
- text = message % timeout)
|
||||||
|
- id = dlg.run()
|
||||||
|
- dlg.destroy()
|
||||||
|
- self.__flush_gtk_events()
|
||||||
|
- sys.exit(0)
|
||||||
|
+ filename = os.path.join(usr_home, filename)
|
||||||
|
+ with open(filename, "w+") as f:
|
||||||
|
+ cmd = 'export INPUT_METHOD=\"' + method_name + '\"'
|
||||||
|
+ f.writelines(cmd)
|
||||||
|
+ sys.exit(0)
|
||||||
|
|
||||||
|
def __shortcut_button_clicked_cb(self, button, name, section, _name, entry):
|
||||||
|
buttons = (_("_Cancel"), Gtk.ResponseType.CANCEL,
|
57
xim.d-ibus-121
Normal file
57
xim.d-ibus-121
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
if ! type ibus-daemon > /dev/null 2>&1 ; then
|
||||||
|
echo "ibus is not available."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# explicitly set below, as referred in xdg autostart
|
||||||
|
export INPUT_METHOD=ibus
|
||||||
|
|
||||||
|
case "$WINDOWMANAGER" in
|
||||||
|
# GNOME 3 Settings Daemon keyboard plugin manages all ibus settings itself,
|
||||||
|
# so don't do manual setup&startup of ibus otherwise it would conflict with
|
||||||
|
# G-S-D. see bnc#873016.
|
||||||
|
*gnome*)
|
||||||
|
SOURCES=$(gsettings get org.freedesktop.ibus.general preload-engines)
|
||||||
|
if [ "$SOURCES" == '@as []' ]; then
|
||||||
|
echo "initial GNOME startup, ibus default configuration applied"
|
||||||
|
ibus-daemon -d
|
||||||
|
timer=5
|
||||||
|
while [ "$SOURCES" == '@as []' ] && [ ${timer} -gt 0 ]; do
|
||||||
|
sleep 1
|
||||||
|
timer=$[${timer}-1]
|
||||||
|
SOURCES=$(gsettings get org.freedesktop.ibus.general preload-engines)
|
||||||
|
done
|
||||||
|
ibus exit
|
||||||
|
fi
|
||||||
|
# make sure G-S-D keyboard plugin is active
|
||||||
|
echo "ibus will be managed by GNOME."
|
||||||
|
gsettings set org.gnome.settings-daemon.plugins.keyboard active true
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
|
||||||
|
export XMODIFIERS="@im=ibus"
|
||||||
|
export GTK_IM_MODULE=ibus
|
||||||
|
export QT_IM_SWITCHER=imsw-multi
|
||||||
|
# Qt5
|
||||||
|
export QT_IM_MODULE=ibus
|
||||||
|
# Qt4
|
||||||
|
if [ -e /usr/$SYS_LIB/qt4/plugins/inputmethods/libqtim-ibus.so ]; then
|
||||||
|
export QT4_IM_MODULE=ibus
|
||||||
|
else
|
||||||
|
export QT4_IM_MODULE=xim
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$WINDOWMANAGER" in
|
||||||
|
*kde*|*plasma*|*xfce*|*lxde*)
|
||||||
|
# started via xdg autostart
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# FIXME: a little bit of delay is required to avoid race
|
||||||
|
(sleep 2; ibus-daemon --xim -d) &
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# success:
|
||||||
|
return 0
|
26
xim.ibus.suse.template
Normal file
26
xim.ibus.suse.template
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#~/.xim template for users to set ibus as default input method
|
||||||
|
#copy this file to ~/.xim
|
||||||
|
#logout and login again, that's all
|
||||||
|
#for more infomations, see ~/.xim.template
|
||||||
|
|
||||||
|
#if any program can't input Chinese, try export #LC_CTYPE=zh_TW.UTF-8, e.g
|
||||||
|
|
||||||
|
export LC_CTYPE=$LANG
|
||||||
|
export XMODIFIERS="@im=ibus"
|
||||||
|
export GTK_IM_MODULE=ibus
|
||||||
|
export QT_IM_SWITCHER=imsw-multi
|
||||||
|
os_type=`uname -i`
|
||||||
|
if [ $os_type = "x86_64" ]; then
|
||||||
|
if [ -e /usr/lib64/qt4/plugins/inputmethods/libqtim-ibus.so ]; then
|
||||||
|
export QT_IM_MODULE=ibus
|
||||||
|
else
|
||||||
|
export QT_IM_MODULE=xim
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ -e /usr/lib/qt4/plugins/inputmethods/libqtim-ibus.so ]; then
|
||||||
|
export QT_IM_MODULE=ibus
|
||||||
|
else
|
||||||
|
export QT_IM_MODULE=xim
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
ibus-daemon --xim &
|
Loading…
Reference in New Issue
Block a user