ibus/ibus-HEAD.patch
2022-06-29 16:09:01 +09:00

2715 lines
95 KiB
Diff

From 17648f0522910480b6c5dd4f5356ca1f6c160bf5 Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Tue, 29 Mar 2022 22:48:19 +0200
Subject: [PATCH] src: Fix refcounting issues
Commit 5a455b1ead attempted to fix both GLib warnings around
floating references and other presumed refcounting issues. However
it missed 2 kinds of bugs:
- The places that take an IBusText created from a static string
were made to avoid freeing it afterwards, but the staticness refers
to the string content, not the object itself.
- The places that are documented to emit signals on floating object
references used to do the following after signal emission:
if (g_object_is_floating (object))
g_object_unref (object)
And did possibly trigger GLib warnings were changed to:
if (g_object_is_floating (object))
g_object_sink_ref (object);
g_object_unref (object);
Which fixes the GLib warning for floating references, but do
unintendedly steal one reference away for non floating references.
This commit is essentially a revert of commit 5a455b1ead, but
addressing both things differently:
- All label/tooltip/symbol IBusText properties in IBusProperty do
now always sink the reference of the stored object.
- All places documented as maybe using objects with a floating reference
on signals changed to doing:
if (g_object_is_floating (object)) {
g_object_ref_sink (object);
g_object_unref (object);
}
So the floating reference is owned and unreferenced without warnings,
but already owned references are left unchanged.
This addresses the possible GLib warnings, fixes the possible double
unrefs happening on IBusText used in signals, and fixes the missing
unrefs on IBusText objects created from static strings.
BUG=https://github.com/ibus/ibus/issues/2393
BUG=https://github.com/ibus/ibus/issues/2387
---
src/ibusinputcontext.c | 35 +++++++++++++++++++++--------------
src/ibusproperty.c | 32 +++++++++++++++++---------------
2 files changed, 38 insertions(+), 29 deletions(-)
diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c
index 4b27551b..7981de38 100644
--- a/src/ibusinputcontext.c
+++ b/src/ibusinputcontext.c
@@ -549,9 +549,10 @@ ibus_input_context_g_signal (GDBusProxy *proxy,
g_variant_unref (variant);
g_signal_emit (context, context_signals[COMMIT_TEXT], 0, text);
- if (g_object_is_floating (text))
+ if (g_object_is_floating (text)) {
g_object_ref_sink (text);
- g_object_unref (text);
+ g_object_unref (text);
+ }
return;
}
if (g_strcmp0 (signal_name, "UpdatePreeditText") == 0) {
@@ -569,9 +570,10 @@ ibus_input_context_g_signal (GDBusProxy *proxy,
cursor_pos,
visible);
- if (g_object_is_floating (text))
+ if (g_object_is_floating (text)) {
g_object_ref_sink (text);
- g_object_unref (text);
+ g_object_unref (text);
+ }
return;
}
if (g_strcmp0 (signal_name, "UpdatePreeditTextWithMode") == 0) {
@@ -592,9 +594,10 @@ ibus_input_context_g_signal (GDBusProxy *proxy,
visible,
mode);
- if (g_object_is_floating (text))
+ if (g_object_is_floating (text)) {
g_object_ref_sink (text);
- g_object_unref (text);
+ g_object_unref (text);
+ }
return;
}
@@ -621,9 +624,10 @@ ibus_input_context_g_signal (GDBusProxy *proxy,
0,
text,
visible);
- if (g_object_is_floating (text))
+ if (g_object_is_floating (text)) {
g_object_ref_sink (text);
- g_object_unref (text);
+ g_object_unref (text);
+ }
return;
}
@@ -640,9 +644,10 @@ ibus_input_context_g_signal (GDBusProxy *proxy,
0,
table,
visible);
- if (g_object_is_floating (table))
+ if (g_object_is_floating (table)) {
g_object_ref_sink (table);
- g_object_unref (table);
+ g_object_unref (table);
+ }
return;
}
@@ -659,9 +664,10 @@ ibus_input_context_g_signal (GDBusProxy *proxy,
0,
prop_list);
- if (g_object_is_floating (prop_list))
+ if (g_object_is_floating (prop_list)) {
g_object_ref_sink (prop_list);
- g_object_unref (prop_list);
+ g_object_unref (prop_list);
+ }
return;
}
@@ -673,9 +679,10 @@ ibus_input_context_g_signal (GDBusProxy *proxy,
g_signal_emit (context, context_signals[UPDATE_PROPERTY], 0, prop);
- if (g_object_is_floating (prop))
+ if (g_object_is_floating (prop)) {
g_object_ref_sink (prop);
- g_object_unref (prop);
+ g_object_unref (prop);
+ }
return;
}
diff --git a/src/ibusproperty.c b/src/ibusproperty.c
index 6d4ed088..cd8a0e2a 100644
--- a/src/ibusproperty.c
+++ b/src/ibusproperty.c
@@ -336,20 +336,17 @@ ibus_property_destroy (IBusProperty *prop)
prop->priv->icon = NULL;
if (prop->priv->label) {
- if (!ibus_text_get_is_static (prop->priv->label))
- g_object_unref (prop->priv->label);
+ g_object_unref (prop->priv->label);
prop->priv->label = NULL;
}
if (prop->priv->symbol) {
- if (!ibus_text_get_is_static (prop->priv->symbol))
- g_object_unref (prop->priv->symbol);
+ g_object_unref (prop->priv->symbol);
prop->priv->symbol = NULL;
}
if (prop->priv->tooltip) {
- if (!ibus_text_get_is_static (prop->priv->tooltip))
- g_object_unref (prop->priv->tooltip);
+ g_object_unref (prop->priv->tooltip);
prop->priv->tooltip = NULL;
}
@@ -404,7 +401,7 @@ ibus_property_deserialize (IBusProperty *prop,
g_variant_get_child (variant, retval++, "u", &prop->priv->type);
GVariant *subvar = g_variant_get_child_value (variant, retval++);
- if (prop->priv->label && !ibus_text_get_is_static (prop->priv->label)) {
+ if (prop->priv->label) {
g_object_unref (prop->priv->label);
}
prop->priv->label = IBUS_TEXT (ibus_serializable_deserialize (subvar));
@@ -414,7 +411,7 @@ ibus_property_deserialize (IBusProperty *prop,
ibus_g_variant_get_child_string (variant, retval++, &prop->priv->icon);
subvar = g_variant_get_child_value (variant, retval++);
- if (prop->priv->tooltip && !ibus_text_get_is_static (prop->priv->tooltip)) {
+ if (prop->priv->tooltip) {
g_object_unref (prop->priv->tooltip);
}
prop->priv->tooltip = IBUS_TEXT (ibus_serializable_deserialize (subvar));
@@ -435,7 +432,7 @@ ibus_property_deserialize (IBusProperty *prop,
/* Keep the serialized order for the compatibility when add new members. */
subvar = g_variant_get_child_value (variant, retval++);
- if (prop->priv->symbol && !ibus_text_get_is_static (prop->priv->symbol)) {
+ if (prop->priv->symbol) {
g_object_unref (prop->priv->symbol);
}
prop->priv->symbol = IBUS_TEXT (ibus_serializable_deserialize (subvar));
@@ -567,7 +564,7 @@ ibus_property_set_label (IBusProperty *prop,
g_assert (IBUS_IS_PROPERTY (prop));
g_return_if_fail (label == NULL || IBUS_IS_TEXT (label));
- if (prop->priv->label && !ibus_text_get_is_static (prop->priv->label)) {
+ if (prop->priv->label) {
g_object_unref (prop->priv->label);
}
@@ -575,8 +572,10 @@ ibus_property_set_label (IBusProperty *prop,
prop->priv->label = ibus_text_new_from_static_string ("");
}
else {
- prop->priv->label = g_object_ref_sink (label);
+ prop->priv->label = label;
}
+
+ g_object_ref_sink (prop->priv->label);
}
void
@@ -586,7 +585,7 @@ ibus_property_set_symbol (IBusProperty *prop,
g_assert (IBUS_IS_PROPERTY (prop));
g_return_if_fail (symbol == NULL || IBUS_IS_TEXT (symbol));
- if (prop->priv->symbol && !ibus_text_get_is_static (prop->priv->symbol)) {
+ if (prop->priv->symbol) {
g_object_unref (prop->priv->symbol);
}
@@ -594,8 +593,10 @@ ibus_property_set_symbol (IBusProperty *prop,
prop->priv->symbol = ibus_text_new_from_static_string ("");
}
else {
- prop->priv->symbol = g_object_ref_sink (symbol);
+ prop->priv->symbol = symbol;
}
+
+ g_object_ref_sink (prop->priv->symbol);
}
void
@@ -615,7 +616,7 @@ ibus_property_set_tooltip (IBusProperty *prop,
g_assert (IBUS_IS_PROPERTY (prop));
g_assert (tooltip == NULL || IBUS_IS_TEXT (tooltip));
- if (prop->priv->tooltip && !ibus_text_get_is_static (prop->priv->tooltip)) {
+ if (prop->priv->tooltip) {
g_object_unref (prop->priv->tooltip);
}
@@ -624,8 +625,9 @@ ibus_property_set_tooltip (IBusProperty *prop,
}
else {
prop->priv->tooltip = tooltip;
- g_object_ref_sink (prop->priv->tooltip);
}
+
+ g_object_ref_sink (prop->priv->tooltip);
}
void
--
2.34.1
From 1b5b9548ad418765717ce1fbdc70b3f3eaae67fc Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Mon, 14 Mar 2022 14:25:10 +0900
Subject: [PATCH] client/gtk2: Revert CCedilla change for pt-BR
gtk_im_context_simple_add_table() is deprecated in GTK4.
I decide to delete gtk_im_context_simple_add_table() here because
the change 03c9e591430c62354bbf26ef7bd4a2e6acfb7c8f is no longer needed
because IBusEngineSimple has implemented to load pt_br compose key
by locale
BUG=chromium-os:11421
BUG=http://codereview.appspot.com/3989060
---
client/gtk2/ibusimcontext.c | 33 +--------------------------------
1 file changed, 1 insertion(+), 32 deletions(-)
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
index a5e5e792..e314ae98 100644
--- a/client/gtk2/ibusimcontext.c
+++ b/client/gtk2/ibusimcontext.c
@@ -2,7 +2,7 @@
/* vim:set et sts=4: */
/* ibus - The Input Bus
* Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright (C) 2015-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright (C) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
* Copyright (C) 2008-2021 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
@@ -874,33 +874,6 @@ ibus_im_context_class_fini (IBusIMContextClass *class)
g_bus_unwatch_name (_daemon_name_watch_id);
}
-/* Copied from gtk+2.0-2.20.1/modules/input/imcedilla.c to fix crosbug.com/11421.
- * Overwrite the original Gtk+'s compose table in gtk+-2.x.y/gtk/gtkimcontextsimple.c. */
-
-/* The difference between this and the default input method is the handling
- * of C+acute - this method produces C WITH CEDILLA rather than C WITH ACUTE.
- * For languages that use CCedilla and not acute, this is the preferred mapping,
- * and is particularly important for pt_BR, where the us-intl keyboard is
- * used extensively.
- */
-static guint16 cedilla_compose_seqs[] = {
-#ifdef DEPRECATED_GDK_KEYSYMS
- GDK_dead_acute, GDK_C, 0, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
- GDK_dead_acute, GDK_c, 0, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
- GDK_Multi_key, GDK_apostrophe, GDK_C, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
- GDK_Multi_key, GDK_apostrophe, GDK_c, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
- GDK_Multi_key, GDK_C, GDK_apostrophe, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
- GDK_Multi_key, GDK_c, GDK_apostrophe, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-#else
- GDK_KEY_dead_acute, GDK_KEY_C, 0, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
- GDK_KEY_dead_acute, GDK_KEY_c, 0, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
- GDK_KEY_Multi_key, GDK_KEY_apostrophe, GDK_KEY_C, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
- GDK_KEY_Multi_key, GDK_KEY_apostrophe, GDK_KEY_c, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
- GDK_KEY_Multi_key, GDK_KEY_C, GDK_KEY_apostrophe, 0, 0, 0x00C7, /* LATIN_CAPITAL_LETTER_C_WITH_CEDILLA */
- GDK_KEY_Multi_key, GDK_KEY_c, GDK_KEY_apostrophe, 0, 0, 0x00E7, /* LATIN_SMALL_LETTER_C_WITH_CEDILLA */
-#endif
-};
-
static void
ibus_im_context_init (GObject *obj)
{
@@ -936,10 +909,6 @@ ibus_im_context_init (GObject *obj)
// Create slave im context
ibusimcontext->slave = gtk_im_context_simple_new ();
- gtk_im_context_simple_add_table (GTK_IM_CONTEXT_SIMPLE (ibusimcontext->slave),
- cedilla_compose_seqs,
- 4,
- G_N_ELEMENTS (cedilla_compose_seqs) / (4 + 2));
g_signal_connect (ibusimcontext->slave,
"commit",
--
2.34.1
From 37900574934bb01cc31860ae3ae2f668e4360838 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Mon, 28 Mar 2022 23:18:58 +0900
Subject: [PATCH] src/tests: Run ibus-daemon from CI even if GNOME desktop
gnome-shell no longer launch ibus-daemon with IBus systemd file.
This is a workaround to call ibus-daemon after GNOME fails to
launch ibus-daemon
BUG=https://gitlab.gnome.org/GNOME/gdm/-/issues/777
---
src/tests/ibus-desktop-testing-runner.in | 38 +++++++++++++++++++++---
1 file changed, 34 insertions(+), 4 deletions(-)
diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
index 48528326..6b208345 100755
--- a/src/tests/ibus-desktop-testing-runner.in
+++ b/src/tests/ibus-desktop-testing-runner.in
@@ -55,6 +55,7 @@ GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'
+
print_log()
{
if [ x"$RESULT_LOG" != x ] ; then
@@ -69,6 +70,7 @@ print_log()
fi
}
+
usage()
{
$ECHO -e \
@@ -95,6 +97,7 @@ usage()
""
}
+
parse_args()
{
# This is GNU getopt. "sudo port getopt" in BSD?
@@ -129,6 +132,7 @@ parse_args()
fi
}
+
init_desktop()
{
if [ "$RESULT_LOG" != "" ] ; then
@@ -207,6 +211,7 @@ _EOF
#export XDG_SEAT=seat0
}
+
run_dbus_daemon()
{
# Use dbus-launch --exit-with-session later instead of --sh-syntax
@@ -216,6 +221,7 @@ run_dbus_daemon()
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
}
+
init_gnome()
{
# gsettings set command needs dconf-service with the same $DISPLAY
@@ -258,6 +264,7 @@ init_gnome()
fi
}
+
run_desktop()
{
echo "$DESKTOP_COMMAND" | grep gnome-session > /dev/null
@@ -278,12 +285,28 @@ run_desktop()
$DESKTOP_COMMAND &
PID_GNOME_SESSION=$!
sleep 30
- if [ $HAS_GNOME -ne 0 ] ; then
- ibus-daemon --daemonize --verbose
- sleep 3
- fi
+
+ # 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
+ # is available, gnome-shell no longer launch ibus-daemon
+ # because gnome-shell assumes gnome-session would launch ibus-daemon
+ # with org.freedesktop.systemd1.Manager.StartUnit D-Bus method.
+ # But actually gnome-session failed to launch ibus-daemon
+ # because the IBus systemd file depends on gnome-session.target
+ # but this CI launches gnome-session directly.
+ #
+ # So ibus-dameon is now always called here after gnome-shell fails to
+ # launch ibus-daemon.
+ # It may be better this CI launches GDM autologin to run gnome-session
+ # 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
+ sleep 3
}
+
count_case_result()
{
retval=$1
@@ -298,6 +321,7 @@ count_case_result()
echo $pass $fail
}
+
echo_case_result()
{
retval=$1
@@ -311,6 +335,7 @@ echo_case_result()
fi
}
+
run_direct_test_cases()
{
pass=0
@@ -363,6 +388,7 @@ EOF_ENVS
echo $pass $fail
}
+
run_gnome_desktop_testing_runner()
{
pass=0
@@ -397,6 +423,7 @@ EOF
echo $pass $fail
}
+
run_test_suite()
{
pass=0
@@ -435,6 +462,7 @@ EOF_RUNNER
fi
}
+
finit()
{
echo "# Killing left gnome-session and Xorg"
@@ -451,6 +479,7 @@ finit()
echo "# Finished $PROGNAME testing"
}
+
main()
{
parse_args "$@"
@@ -470,5 +499,6 @@ main()
finit
}
+
# Need to enclose $@ with double quotes not to split the array.
main "$@"
--
2.34.1
From b024ea8fcee6fe1a20570a6f80cc4f9f8f420706 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Wed, 20 Apr 2022 19:36:10 +0900
Subject: [PATCH] ui/gtk3: Disable XKB engines in Plasma Wayland
Currently ibus-ui-gtk3 runs the setxkbmap command internally to set
the XKB keymaps from XKB engines but setxkbmap does not work in Wayland
session.
The IBus XKB engines are disabled at the moment in Plamsa Wayland
and ibus-ui-gtk3 asks users to use systemsettings5.
Will use libinput and libxkbcommon later but it would be better
to implement IBus in Plamsa Wayland compositor.
BUG=rhbz#2076596
---
configure.ac | 16 ++++++++++
ui/gtk3/Makefile.am | 17 ++++++++++-
ui/gtk3/panel.vala | 74 +++++++++++++++++++++++++++++++++++++++++----
3 files changed, 100 insertions(+), 7 deletions(-)
diff --git a/configure.ac b/configure.ac
index a3cdb2da..79b9c11a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -636,6 +636,21 @@ if test x"$enable_engine" = x"yes"; then
enable_engine="yes (enabled, use --disable-engine to disable)"
fi
+# --disable-libnotify
+AC_ARG_ENABLE(libnotify,
+ AS_HELP_STRING([--disable-libnotify],
+ [Disable to link libnotify]),
+ [enable_libnotify=$enableval],
+ [enable_libnotify=yes]
+)
+AM_CONDITIONAL([ENABLE_LIBNOTIFY], [test x"$enable_libnotify" = x"yes"])
+if test x"$enable_libnotify" = x"yes"; then
+ PKG_CHECK_MODULES(LIBNOTIFY, [
+ libnotify >= 0.7
+ ])
+ enable_libnotify="yes (enabled, use --disable-libnotify to disable)"
+fi
+
PKG_CHECK_MODULES(XTEST,
[x11 xtst],
[enable_xtest=yes],
@@ -871,6 +886,7 @@ Build options:
No snooper regexes "$NO_SNOOPER_APPS"
Panel icon "$IBUS_ICON_KEYBOARD"
Enable surrounding-text $enable_surrounding_text
+ Enable libnotify $enable_libnotify
Enable Emoji dict $enable_emoji_dict
Unicode Emoji directory $UNICODE_EMOJI_DIR
CLDR annotation directory $EMOJI_ANNOTATION_DIR
diff --git a/ui/gtk3/Makefile.am b/ui/gtk3/Makefile.am
index ab379328..2a9cabde 100644
--- a/ui/gtk3/Makefile.am
+++ b/ui/gtk3/Makefile.am
@@ -3,7 +3,7 @@
# ibus - The Input Bus
#
# Copyright (c) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
-# Copyright (c) 2015-2020 Takao Fujwiara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2015-2022 Takao Fujwiara <takao.fujiwara1@gmail.com>
# Copyright (c) 2007-2020 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
@@ -81,6 +81,21 @@ AM_VALAFLAGS = \
--target-glib="$(VALA_TARGET_GLIB_VERSION)" \
$(NULL)
+if ENABLE_LIBNOTIFY
+AM_CFLAGS += \
+ @LIBNOTIFY_CFLAGS@ \
+ $(NULL)
+
+AM_LDADD += \
+ @LIBNOTIFY_LIBS@ \
+ $(NULL)
+
+AM_VALAFLAGS += \
+ --pkg=libnotify \
+ -D ENABLE_LIBNOTIFY \
+ $(NULL)
+endif
+
if ENABLE_APPINDICATOR
AM_VALAFLAGS += --define=INDICATOR
endif
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
index 07ce6524..bd70d7d2 100644
--- a/ui/gtk3/panel.vala
+++ b/ui/gtk3/panel.vala
@@ -73,6 +73,7 @@ class Panel : IBus.PanelService {
private string m_icon_prop_key = "";
private int m_property_icon_delay_time = 500;
private uint m_property_icon_delay_time_id;
+ private bool m_is_wayland;
#if INDICATOR
private bool m_is_kde = is_kde();
#else
@@ -93,6 +94,18 @@ class Panel : IBus.PanelService {
m_bus = bus;
+#if USE_GDK_WAYLAND
+ Gdk.set_allowed_backends("*");
+ var display = Gdk.DisplayManager.get().open_display(null);
+ Type instance_type = display.get_type();
+ Type wayland_type = typeof(GdkWayland.Display);
+ m_is_wayland = instance_type.is_a(wayland_type);
+ Gdk.set_allowed_backends("x11");
+#else
+ m_is_wayland = false;
+ warning("Checking Wayland is disabled");
+#endif
+
init_settings();
// init ui
@@ -553,6 +566,11 @@ class Panel : IBus.PanelService {
GLib.List<IBus.EngineDesc> im_engines =
get_engines_from_locale(engines);
+ if (m_is_wayland) {
+ if (xkb_engines.length() > 0)
+ xkb_engines = new GLib.List<IBus.EngineDesc>();
+ }
+
string[] names = {};
foreach (unowned IBus.EngineDesc engine in xkb_engines)
names += engine.get_name();
@@ -728,6 +746,32 @@ class Panel : IBus.PanelService {
inited_engines_order = false;
}
+ private void update_version_1_5_26() {
+#if ENABLE_LIBNOTIFY
+ if (!Notify.is_initted()) {
+ Notify.init ("ibus");
+ }
+
+ var notification = new Notify.Notification(
+ _("IBus Attention"),
+ _("Layout changes do not work in Plasma Wayland. " +
+ "Please use systemsettings5."),
+ "ibus");
+ notification.set_timeout(30 * 1000);
+ notification.set_category("hotkey");
+
+ try {
+ notification.show();
+ } catch (GLib.Error e){
+ warning (_("Layout changes do not work in Plasma Wayland. " +
+ "Please use systemsettings5."));
+ }
+#else
+ warning (_("Layout changes do not work in Plasma Wayland. " +
+ "Please use systemsettings5."));
+#endif
+ }
+
private void set_version() {
string prev_version = m_settings_general.get_string("version");
string current_version = null;
@@ -735,6 +779,9 @@ class Panel : IBus.PanelService {
if (compare_versions(prev_version, "1.5.8") < 0)
update_version_1_5_8();
+ if (compare_versions(prev_version, "1.5.26") < 0)
+ update_version_1_5_26();
+
current_version = "%d.%d.%d".printf(IBus.MAJOR_VERSION,
IBus.MINOR_VERSION,
IBus.MICRO_VERSION);
@@ -856,7 +903,7 @@ class Panel : IBus.PanelService {
m_icon_prop_key = "";
// set xkb layout
- if (!m_use_system_keyboard_layout)
+ if (!m_use_system_keyboard_layout && !m_is_wayland)
m_xkblayout.set_layout(engine);
set_language_from_engine(engine);
@@ -960,17 +1007,25 @@ class Panel : IBus.PanelService {
string[]? order_names) {
string[]? engine_names = unowned_engine_names;
- if (engine_names == null || engine_names.length == 0)
- engine_names = {"xkb:us::eng"};
+ if (engine_names == null || engine_names.length == 0) {
+ if (m_is_wayland)
+ engine_names = {};
+ else
+ engine_names = {"xkb:us::eng"};
+ }
string[] names = {};
foreach (var name in order_names) {
+ if (m_is_wayland && name.has_prefix("xkb:"))
+ continue;
if (name in engine_names)
names += name;
}
foreach (var name in engine_names) {
+ if (m_is_wayland && name.has_prefix("xkb:"))
+ continue;
if (name in names)
continue;
names += name;
@@ -1011,9 +1066,14 @@ class Panel : IBus.PanelService {
}
if (m_engines.length == 0) {
- m_engines = engines;
- switch_engine(0, true);
- run_preload_engines(engines, 1);
+ if (engines.length > 0) {
+ m_engines = engines;
+ switch_engine(0, true);
+ run_preload_engines(engines, 1);
+ } else {
+ m_candidate_panel.set_language(new Pango.AttrLanguage(
+ Pango.Language.from_string(null)));
+ }
} else {
var current_engine = m_engines[0];
m_engines = engines;
@@ -1478,6 +1538,8 @@ class Panel : IBus.PanelService {
/* Do not change the order of m_engines during running switcher. */
if (m_switcher.is_running())
return;
+ if (m_engines.length == 0)
+ return;
if (m_icon_type == IconType.INDICATOR) {
// Wait for the callback of the session bus.
--
2.34.1
From bca7bf0f97230806a26f53c798050408108cfb3d Mon Sep 17 00:00:00 2001
From: Mike FABIAN <mfabian@redhat.com>
Date: Wed, 25 May 2022 23:07:24 +0900
Subject: [PATCH] data/dconf: Update xkb-latin-layouts in gschema
Add more keyboard layouts which cannot produce ASCII to
data/dconf/org.freedesktop.ibus.gschema.xml
Remove "mal" and "mkd", there are no such layouts.
BUG=https://github.com/ibus/ibus/issues/2404
---
data/dconf/org.freedesktop.ibus.gschema.xml | 47 ++++++++++++++++++++-
1 file changed, 46 insertions(+), 1 deletion(-)
diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
index 516f7520..8b181d76 100644
--- a/data/dconf/org.freedesktop.ibus.gschema.xml
+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
@@ -28,7 +28,52 @@
<description>The saved version number will be used to check the difference between the version of the previous installed ibus and one of the current ibus.</description>
</key>
<key name="xkb-latin-layouts" type="as">
- <default>[ 'ara', 'bg', 'cz', 'dev', 'gr', 'gur', 'in', 'jp(kana)', 'mal', 'mkd', 'ru', 'ua' ]</default>
+ <default>
+ [ 'af', 'af(fa-olpc)', 'af(ps-olpc)', 'af(ps)', 'af(uz)',
+ 'af(uz-olpc)', 'am', 'am(eastern)', 'am(eastern-alt)',
+ 'am(phonetic)', 'am(phonetic-alt)', 'am(western)', 'ara',
+ 'ara(azerty)', 'ara(azerty_digits)', 'ara(buckwalter)',
+ 'ara(digits)', 'ara(qwerty)', 'ara(qwerty_digits)',
+ 'az(cyrillic)', 'bd', 'bd(probhat)', 'bg', 'bg(bas_phonetic)',
+ 'bg(phonetic)', 'brai', 'brai(left_hand)', 'brai(right_hand)',
+ 'bt', 'by', 'by(legacy)', 'ca(ike)', 'ca(multi-2gr)',
+ 'cn(tib)', 'cn(tib_asciinum)', 'cn(ug)', 'cz', 'cz(ucw)',
+ 'de(ru)', 'dev', 'et', 'fr(geo)', 'ge', 'ge(os)', 'gr',
+ 'gr(extended)', 'gr(nodeadkeys)', 'gr(polytonic)',
+ 'gr(simple)', 'gur', 'il', 'il(biblical)', 'il(lyx)',
+ 'il(phonetic)', 'in', 'in(ben)', 'in(ben_baishakhi)',
+ 'in(ben_bornona)', 'in(ben_gitanjali)', 'in(ben_inscript)',
+ 'in(ben_probhat)', 'in(bolnagri)', 'in(deva)', 'in(guj)',
+ 'in(guru)', 'in(hin-kagapa)', 'in(hin-wx)', 'in(jhelum)',
+ 'in(kan)', 'in(kan-kagapa)', 'in(mal)', 'in(mal_enhanced)',
+ 'in(mal_lalitha)', 'in(mar-kagapa)', 'in(ori)',
+ 'in(san-kagapa)', 'in(tam)', 'in(tam_tamilnet)',
+ 'in(tam_tamilnet_TAB)', 'in(tam_tamilnet_TSCII)',
+ 'in(tam_tamilnet_with_tam_nums)', 'in(tel)', 'in(tel-kagapa)',
+ 'in(urd-phonetic)', 'in(urd-phonetic3)', 'in(urd-winkeys)',
+ 'iq', 'ir', 'ir(pes_keypad)', 'jp(kana)', 'jp(mac)', 'kg',
+ 'kg(phonetic)', 'kh', 'kz', 'kz(kazrus)', 'kz(ruskaz)', 'la',
+ 'la(stea)', 'lk', 'lk(tam_TAB)', 'lk(tam_unicode)', 'ma',
+ 'ma(tifinagh)', 'ma(tifinagh-alt)',
+ 'ma(tifinagh-alt-phonetic)', 'ma(tifinagh-extended)',
+ 'ma(tifinagh-extended-phonetic)', 'ma(tifinagh-phonetic)',
+ 'me(cyrillic)', 'me(cyrillicalternatequotes)',
+ 'me(cyrillicyz)', 'mk', 'mk(nodeadkeys)', 'mm', 'mn', 'mv',
+ 'np', 'ph(capewell-dvorak-bay)', 'ph(capewell-qwerf2k6-bay)',
+ 'ph(colemak-bay)', 'ph(dvorak-bay)', 'ph(qwerty-bay)', 'pk',
+ 'pk(ara)', 'pk(snd)', 'pk(urd-crulp)', 'pk(urd-nla)',
+ 'pl(ru_phonetic_dvorak)', 'rs', 'rs(alternatequotes)',
+ 'rs(rue)', 'rs(yz)', 'ru', 'ru(bak)', 'ru(chm)', 'ru(cv)',
+ 'ru(dos)', 'ru(kom)', 'ru(legacy)', 'ru(mac)',
+ 'ru(os_legacy)', 'ru(os_winkeys)', 'ru(phonetic)',
+ 'ru(phonetic_winkeys)', 'ru(sah)', 'ru(srp)', 'ru(tt)',
+ 'ru(typewriter)', 'ru(typewriter-legacy)', 'ru(udm)',
+ 'ru(xal)', 'se(rus)', 'se(rus_nodeadkeys)', 'se(swl)', 'sy',
+ 'sy(syc)', 'sy(syc_phonetic)', 'th', 'th(pat)', 'th(tis)',
+ 'tj', 'tj(legacy)', 'tz', 'ua', 'ua(homophonic)',
+ 'ua(legacy)', 'ua(phonetic)', 'ua(rstu)', 'ua(rstu_ru)',
+ 'ua(typewriter)', 'ua(winkeys)', 'us(chr)', 'us(rus)', 'uz' ]
+ </default>
<summary>Latin layouts which have no ASCII</summary>
<description>US layout is appended to the Latin layouts. variant can be omitted.</description>
</key>
--
2.35.3
From 16df64edadc21f50906e5442b73425b9256fbf65 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Wed, 25 May 2022 23:07:33 +0900
Subject: [PATCH] src/tests: Add xkb-latin-layouts case
BUG=https://github.com/ibus/ibus/issues/2404
---
src/tests/Makefile.am | 26 ++++++--
src/tests/runtest | 1 +
src/tests/xkb-latin-layouts | 130 ++++++++++++++++++++++++++++++++++++
3 files changed, 150 insertions(+), 8 deletions(-)
create mode 100755 src/tests/xkb-latin-layouts
diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
index f932f18f..ca5285bd 100644
--- a/src/tests/Makefile.am
+++ b/src/tests/Makefile.am
@@ -41,8 +41,9 @@ prog_ldadd =\
$(top_builddir)/src/libibus-@IBUS_API_VERSION@.la \
$(NULL)
-noinst_PROGRAMS = $(TESTS)
-TESTS = \
+noinst_PROGRAMS = $(TESTS_C)
+noinst_SCRIPTS = $(TESTS_SCRIPT)
+TESTS_C = \
ibus-bus \
ibus-config \
ibus-configservice \
@@ -56,16 +57,25 @@ TESTS = \
ibus-util \
$(NULL)
+TESTS_SCRIPT = \
+ xkb-latin-layouts \
+ $(NULL)
+
+TESTS = \
+ $(TESTS_C) \
+ $(TESTS_SCRIPT) \
+ $(NULL)
+
CLEANFILES =
if ENABLE_ENGINE
-TESTS += ibus-engine-switch
+TESTS_C += ibus-engine-switch
endif
if ENABLE_GTK3
-TESTS += ibus-compose
+TESTS_C += ibus-compose
if ENABLE_XTEST
-TESTS += ibus-keypress
+TESTS_C += ibus-keypress
endif
endif
@@ -99,9 +109,10 @@ CLEANFILES += \
org.freedesktop.IBus.Desktop.Testing.desktop \
$(NULL)
-test_execs_PROGRAMS = $(TESTS)
+test_execs_PROGRAMS = $(TESTS_C)
+test_execs_SCRIPTS = $(TESTS_SCRIPT)
if ENABLE_GTK3
-test_execs_SCRIPTS = ibus-compose-locales
+test_execs_SCRIPTS += ibus-compose-locales
CLEANFILES += \
ibus-compose-locales \
$(NULL)
@@ -138,6 +149,7 @@ ibus-desktop-testing-runner: ibus-desktop-testing-runner.in
EXTRA_DIST = \
$(test_metas_in) \
+ $(TESTS_SCRIPT) \
runtest \
ibus-compose.emoji \
ibus-compose.env \
diff --git a/src/tests/runtest b/src/tests/runtest
index a6e4194b..a229140a 100755
--- a/src/tests/runtest
+++ b/src/tests/runtest
@@ -35,6 +35,7 @@ ibus-engine-switch
ibus-compose
ibus-keypress
test-stress
+xkb-latin-layouts
"
IBUS_SCHEMA_FILE='org.freedesktop.ibus.gschema.xml'
GTK_QUERY_MODULE=gtk-query-immodules-3.0-32
diff --git a/src/tests/xkb-latin-layouts b/src/tests/xkb-latin-layouts
new file mode 100755
index 00000000..f8dced6b
--- /dev/null
+++ b/src/tests/xkb-latin-layouts
@@ -0,0 +1,130 @@
+#!/bin/bash
+
+PROGNAME=`basename $0`
+VERSION=0.1
+# POSIX sh has no 'echo -e'
+: ${ECHO:='/usr/bin/echo'}
+TMPDIR=
+INSTALLED_SCHEMAS_DIR=
+
+
+usage()
+{
+ $ECHO -e \
+"This test runs setxkbmap command for gsettings xkb-latin-layouts value\n" \
+"$PROGNAME [OPTIONS…]\n" \
+"\n" \
+"OPTIONS:\n" \
+"-h, --help This help\n" \
+"-v, --version Show version\n" \
+"-D, --schemasdir=DIR Load the latest schema file in DIR\n" \
+""
+}
+
+
+parse_args()
+{
+ # This is GNU getopt. "sudo port getopt" in BSD?
+ ARGS=`getopt -o hD:Tv --long \
+ help,schemasdir:,tap,version\
+ -- "$@"`;
+ eval set -- "$ARGS"
+ while [ 1 ] ; do
+ case "$1" in
+ -h | --help ) usage; exit 0;;
+ -D | --schemasdir ) INSTALLED_SCHEMAS_DIR="$2"; shift 2;;
+ -T | --tap ) shift;; # ignore the option
+ -v | --version ) $ECHO -e "$VERSION"; exit 0;;
+ -- ) shift; break;;
+ * ) shift;;
+ esac
+ done
+}
+
+
+init()
+{
+ set -e
+
+ # gnome-continuous doesn't have a machine-id set, which
+ # breaks dbus-launch. There's dbus-run-session which is
+ # better, but not everyone has it yet.
+ export DBUS_FATAL_WARNINGS=0
+ export TMPDIR=$(mktemp -d --tmpdir="$PWD")
+ export XDG_CONFIG_HOME="$TMPDIR/config"
+ export XDG_CACHE_HOME="$TMPDIR/cache"
+ export GSETTINGS_SCHEMA_DIR="$TMPDIR/schemas"
+ mkdir -p $XDG_CONFIG_HOME $XDG_CACHE_HOME $GSETTINGS_SCHEMA_DIR
+
+ eval `dbus-launch --sh-syntax`
+
+ trap 'rm -rf $TMPDIR; kill $DBUS_SESSION_BUS_PID; setxkbmap -layout us' ERR
+
+ # in case that schema is not installed on the system
+ glib-compile-schemas --targetdir "$GSETTINGS_SCHEMA_DIR" "$INSTALLED_SCHEMAS_DIR"
+}
+
+
+finit()
+{
+ # dbus-launch and gsettings run /usr/lib*/gvfsd-fuse $TMPDIR/cache/gvfs -f
+ # via systemd since gvfs 1.45.90 in Fedora 33
+ # and rm $TMPDIR could be failed until umount would be called.
+ if [ -d $TMPDIR/cache/gvfs ] ; then
+ umount $TMPDIR/cache/gvfs
+ fi
+ rm -rf $TMPDIR
+
+ kill $DBUS_SESSION_BUS_PID
+ exit 0
+}
+
+
+test_xkb_keymaps()
+{
+ # Loop over top level schemas since "gsettings list-recursively" only
+ # looks for direct children.
+ xkb_latin_layouts=`gsettings get org.freedesktop.ibus.general xkb-latin-layouts`
+ while read keymap ; do
+ eval keymap="$keymap"
+ HAS_VARIANT=$($ECHO "$keymap" | grep '(' 2> /dev/null) ||:
+ if [ "x$HAS_VARIANT" != "x" ] ; then
+ layout=$($ECHO "$keymap" | sed -e 's/\([^(]*\)([^)]*)/\1/')
+ variant=$($ECHO "$keymap" | sed -e 's/[^(]*(\([^)]*\))/\1/')
+ $ECHO setxkbmap -layout $layout -variant $variant
+ setxkbmap -layout $layout -variant $variant
+ else
+ layout="$keymap"
+ $ECHO setxkbmap -layout $layout
+ setxkbmap -layout $layout
+ fi
+ if [ $? -ne 0 ] ; then
+ $ECHO "Error in layout $layout variant $variant"
+ setxkbmap -layout us
+ exit 1
+ fi
+ done << EOF_READ_XKB
+ `$ECHO $xkb_latin_layouts | sed -e 's/^\[//' -e 's/\]$//' | tr "," "\n"`
+EOF_READ_XKB
+
+ setxkbmap -layout us
+}
+
+
+main()
+{
+ parse_args "$@"
+
+ if [ x"$INSTALLED_SCHEMAS_DIR" != x ] ; then
+ init
+ fi
+
+ test_xkb_keymaps
+
+ if [ x"$INSTALLED_SCHEMAS_DIR" != x ] ; then
+ finit
+ fi
+}
+
+
+main "$@"
--
2.35.3
From 233a3f4d4d3dc6782e74db5bf4e7c28fae729bc9 Mon Sep 17 00:00:00 2001
From: Hollow Man <hollowman@opensuse.org>
Date: Wed, 26 Jan 2022 09:35:11 +0800
Subject: [PATCH 1/3] Add functionality to change IBus panel themes with
available GTK themes
To allow IBus to have their own control of themes.
https://gitlab.gnome.org/GNOME/gnome-tweaks/-/blob/b9badc47b92dd73f8cedbd2efc66cbaf3ea25773/gtweak/tweaks/tweak_group_appearance.py#L69
BUG=https://github.com/ibus/ibus/pull/2327
Signed-off-by: Hollow Man <hollowman@opensuse.org>
---
data/dconf/org.freedesktop.ibus.gschema.xml | 20 +++
setup/main.py | 137 ++++++++++++++++++++
setup/setup.ui | 97 +++++++++++++-
ui/gtk3/bindingcommon.vala | 46 +++++++
ui/gtk3/panel.vala | 18 +++
ui/gtk3/panelbinding.vala | 18 +++
6 files changed, 335 insertions(+), 1 deletion(-)
diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
index 8b181d76..051f21a5 100644
--- a/data/dconf/org.freedesktop.ibus.gschema.xml
+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
@@ -210,6 +210,26 @@
<summary>Custom font</summary>
<description>Custom font name for language panel</description>
</key>
+ <key name="use-custom-theme" type="b">
+ <default>false</default>
+ <summary>Use custom theme</summary>
+ <description>Use custom theme name for language panel</description>
+ </key>
+ <key name="custom-theme" type="s">
+ <default>'Adwaita'</default>
+ <summary>Custom theme</summary>
+ <description>Custom theme name for language panel</description>
+ </key>
+ <key name="use-custom-icon" type="b">
+ <default>false</default>
+ <summary>Use custom icon</summary>
+ <description>Use custom icon name for language panel</description>
+ </key>
+ <key name="custom-icon" type="s">
+ <default>'Adwaita'</default>
+ <summary>Custom icon</summary>
+ <description>Custom icon name for language panel</description>
+ </key>
<key name="use-glyph-from-engine-lang" type="b">
<default>true</default>
<summary>Choose glyphs with input method's language on candidate window</summary>
diff --git a/setup/main.py b/setup/main.py
index 1b9056a6..71896693 100644
--- a/setup/main.py
+++ b/setup/main.py
@@ -29,6 +29,7 @@ import os
import signal
import sys
import time
+import glob
from gi import require_version as gi_require_version
gi_require_version('GLib', '2.0')
@@ -196,6 +197,79 @@ class Setup(object):
'sensitive',
Gio.SettingsBindFlags.GET)
+ # custom theme
+ self.__model_custom_theme = self.__builder.get_object(
+ "model_custom_theme")
+ self.__combobox_custom_theme = self.__builder.get_object(
+ "combobox_custom_theme")
+ self.__checkbutton_custom_theme = self.__builder.get_object(
+ "checkbutton_custom_theme")
+
+ def update_combobox_custom_theme(settings, key):
+ theme_name_list = self.__init_available_gtk_themes()
+ self.__model_custom_theme.clear()
+ for name in theme_name_list:
+ self.__model_custom_theme.append([name])
+ current_theme = self.__settings_panel.get_string(key)
+ try:
+ current_theme_number = theme_name_list.index(current_theme)
+ except ValueError:
+ self.__settings_panel.reset(key)
+ current_theme = self.__settings_panel.get_string(key)
+ current_theme_number = theme_name_list.index(current_theme)
+ self.__combobox_custom_theme.set_active(current_theme_number)
+
+ update_combobox_custom_theme(None, 'custom-theme')
+ self.__settings_panel.bind('use-custom-theme',
+ self.__checkbutton_custom_theme,
+ 'active',
+ Gio.SettingsBindFlags.DEFAULT)
+ self.__settings_panel.connect('changed::custom-theme',
+ update_combobox_custom_theme)
+ self.__settings_panel.bind('use-custom-theme',
+ self.__combobox_custom_theme,
+ 'sensitive',
+ Gio.SettingsBindFlags.DEFAULT)
+ self.__combobox_custom_theme.connect("changed",
+ self.__on_combobox_custom_theme_changed)
+
+
+ # custom icon
+ self.__model_custom_icon = self.__builder.get_object(
+ "model_custom_icon")
+ self.__combobox_custom_icon = self.__builder.get_object(
+ "combobox_custom_icon")
+ self.__checkbutton_custom_icon = self.__builder.get_object(
+ "checkbutton_custom_icon")
+
+ def update_combobox_custom_icon(settings, key):
+ icon_name_list = self.__init_available_gtk_icons()
+ self.__model_custom_icon.clear()
+ for name in icon_name_list:
+ self.__model_custom_icon.append([name])
+ current_icon = self.__settings_panel.get_string(key)
+ try:
+ current_icon_number = icon_name_list.index(current_icon)
+ except ValueError:
+ self.__settings_panel.reset(key)
+ current_icon = self.__settings_panel.get_string(key)
+ current_icon_number = icon_name_list.index(current_icon)
+ self.__combobox_custom_icon.set_active(current_icon_number)
+
+ update_combobox_custom_icon(None, 'custom-icon')
+ self.__settings_panel.bind('use-custom-icon',
+ self.__checkbutton_custom_icon,
+ 'active',
+ Gio.SettingsBindFlags.DEFAULT)
+ self.__settings_panel.connect('changed::custom-icon',
+ update_combobox_custom_icon)
+ self.__settings_panel.bind('use-custom-icon',
+ self.__combobox_custom_icon,
+ 'sensitive',
+ Gio.SettingsBindFlags.DEFAULT)
+ self.__combobox_custom_icon.connect("changed",
+ self.__on_combobox_custom_icon_changed)
+
# show icon on system tray
self.__checkbutton_show_icon_on_systray = self.__builder.get_object(
"checkbutton_show_icon_on_systray")
@@ -588,6 +662,69 @@ class Setup(object):
_("Use shortcut with shift to switch to the previous input method")
entry.set_tooltip_text(tooltip)
+ def __init_available_gtk_themes(self):
+ path_list = []
+ path_list.append(os.path.join(GLib.get_home_dir(), ".themes"))
+ path_list.append(os.path.join(GLib.get_user_data_dir(), "themes"))
+ path_list.extend(list(map(lambda x: os.path.join(
+ x, "themes"), GLib.get_system_data_dirs())))
+ theme_name_list = []
+ gtk_theme_path = []
+ for path in path_list:
+ gtk_theme_path.extend(glob.glob(path + "/*/gtk-*/gtk.css"))
+ gtk_theme_path.extend(glob.glob(path + "/*/gtk-*/gtk-dark.css"))
+ for path in gtk_theme_path:
+ filename = os.path.basename(path)
+ appendix = ""
+ if filename == "gtk-dark.css":
+ appendix = ":dark"
+ theme_name_list.append(os.path.basename(
+ os.path.dirname(os.path.dirname(path))) + appendix)
+
+ theme_name_list.extend([
+ 'Adwaita', 'Adwaita:dark',
+ 'HighContrast', 'HighContrastInverse'
+ ])
+ theme_name_list = list(set(theme_name_list))
+ theme_name_list.sort()
+
+ return theme_name_list
+
+ def __on_combobox_custom_theme_changed(self, combobox):
+ tree_iter = self.__combobox_custom_theme.get_active_iter()
+ if tree_iter is not None:
+ model = self.__combobox_custom_theme.get_model()
+ theme_name = model[tree_iter][0]
+ self.__settings_panel.set_string('custom-theme', theme_name)
+
+ def __init_available_gtk_icons(self):
+ path_list = []
+ path_list.append(os.path.join(GLib.get_home_dir(), ".icons"))
+ path_list.append(os.path.join(GLib.get_user_data_dir(), "icons"))
+ path_list.extend(list(map(lambda x: os.path.join(
+ x, "icons"), GLib.get_system_data_dirs())))
+ icon_name_list = []
+ gtk_icon_path = []
+ for path in path_list:
+ gtk_icon_path.extend(glob.glob(path + "/*/index.theme"))
+ for path in gtk_icon_path:
+ dir = os.path.dirname(path)
+ if not os.path.exists(os.path.join(dir, "cursors")):
+ icon_name_list.append(os.path.basename(dir))
+
+ icon_name_list.extend(["Adwaita"])
+ icon_name_list = list(set(icon_name_list))
+ icon_name_list.sort()
+
+ return icon_name_list
+
+ def __on_combobox_custom_icon_changed(self, combobox):
+ tree_iter = self.__combobox_custom_icon.get_active_iter()
+ if tree_iter is not None:
+ model = self.__combobox_custom_icon.get_model()
+ icon_name = model[tree_iter][0]
+ self.__settings_panel.set_string('custom-icon', icon_name)
+
def __item_started_column_toggled_cb(self, cell, path_str, model):
# get toggled iter
diff --git a/setup/setup.ui b/setup/setup.ui
index a15b9083..5a9804f9 100644
--- a/setup/setup.ui
+++ b/setup/setup.ui
@@ -55,6 +55,18 @@
</row>
</data>
</object>
+ <object class="GtkListStore" id="model_custom_theme">
+ <columns>
+ <!-- column-name gchararray -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="model_custom_icon">
+ <columns>
+ <!-- column-name gchararray -->
+ <column type="gchararray"/>
+ </columns>
+ </object>
<object class="GtkAdjustment" id="adjustment_emoji_partial_match">
<property name="value">3.0</property>
<property name="lower">1.0</property>
@@ -1318,13 +1330,96 @@
<property name="position">0</property>
</packing>
</child>
+ <child>
+ <object class="GtkGrid" id="table3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">6</property>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton_custom_theme">
+ <property name="label" translatable="yes">Use custom theme:</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combobox_custom_theme">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">model_custom_theme</property>
+ <property name="hexpand">True</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer4"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="checkbutton_custom_icon">
+ <property name="label" translatable="yes">Use custom icon:</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="combobox_custom_icon">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="model">model_custom_icon</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer5"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label20">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">&lt;b&gt;Fonts&lt;/b&gt;</property>
+ <property name="label" translatable="yes">&lt;b&gt;Font and Theme&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
diff --git a/ui/gtk3/bindingcommon.vala b/ui/gtk3/bindingcommon.vala
index 150d4c39..e825167b 100644
--- a/ui/gtk3/bindingcommon.vala
+++ b/ui/gtk3/bindingcommon.vala
@@ -212,4 +212,50 @@ class BindingCommon {
css_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
}
+
+ public static void
+ set_custom_theme(GLib.Settings? settings_panel) {
+ if (settings_panel == null)
+ return;
+
+ bool use_custom_theme = settings_panel.get_boolean("use-custom-theme");
+ string custom_theme = settings_panel.get_string("custom-theme");
+
+ Gtk.Settings gtk_settings = Gtk.Settings.get_default();
+
+ if (use_custom_theme == false)
+ custom_theme = "";
+
+ if (custom_theme == null || custom_theme == "") {
+ gtk_settings.reset_property("gtk-theme-name");
+ gtk_settings.reset_property("gtk-application-prefer-dark-theme");
+ } else {
+ string[] custom_theme_splitted = custom_theme.split(":");
+ gtk_settings.gtk_theme_name = custom_theme_splitted[0];
+ if (custom_theme_splitted.length == 2 &&
+ custom_theme_splitted[1] == "dark")
+ gtk_settings.gtk_application_prefer_dark_theme = true;
+ else
+ gtk_settings.gtk_application_prefer_dark_theme = false;
+ }
+ }
+
+ public static void
+ set_custom_icon(GLib.Settings? settings_panel) {
+ if (settings_panel == null)
+ return;
+
+ bool use_custom_icon = settings_panel.get_boolean("use-custom-icon");
+ string custom_icon = settings_panel.get_string("custom-icon");
+
+ Gtk.Settings gtk_settings = Gtk.Settings.get_default();
+
+ if (use_custom_icon == false)
+ custom_icon = "";
+
+ if (custom_icon == null || custom_icon == "")
+ gtk_settings.reset_property("gtk-icon-theme-name");
+ else
+ gtk_settings.gtk_icon_theme_name = custom_icon;
+ }
}
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
index 61bfa1b6..101c2b3d 100644
--- a/ui/gtk3/panel.vala
+++ b/ui/gtk3/panel.vala
@@ -211,6 +211,22 @@ class Panel : IBus.PanelService {
ref m_css_provider);
});
+ m_settings_panel.changed["custom-theme"].connect((key) => {
+ BindingCommon.set_custom_theme(m_settings_panel);
+ });
+
+ m_settings_panel.changed["use-custom-theme"].connect((key) => {
+ BindingCommon.set_custom_theme(m_settings_panel);
+ });
+
+ m_settings_panel.changed["custom-icon"].connect((key) => {
+ BindingCommon.set_custom_icon(m_settings_panel);
+ });
+
+ m_settings_panel.changed["use-custom-icon"].connect((key) => {
+ BindingCommon.set_custom_icon(m_settings_panel);
+ });
+
m_settings_panel.changed["use-glyph-from-engine-lang"].connect((key) =>
{
m_use_engine_lang = m_settings_panel.get_boolean(
@@ -816,6 +832,8 @@ class Panel : IBus.PanelService {
BindingCommon.set_custom_font(m_settings_panel,
null,
ref m_css_provider);
+ BindingCommon.set_custom_theme(m_settings_panel);
+ BindingCommon.set_custom_icon(m_settings_panel);
set_show_icon_on_systray();
set_lookup_table_orientation();
set_show_property_panel();
diff --git a/ui/gtk3/panelbinding.vala b/ui/gtk3/panelbinding.vala
index e63d93f2..3c516afd 100644
--- a/ui/gtk3/panelbinding.vala
+++ b/ui/gtk3/panelbinding.vala
@@ -270,6 +270,22 @@ class PanelBinding : IBus.PanelService {
ref m_css_provider);
});
+ m_settings_panel.changed["custom-theme"].connect((key) => {
+ BindingCommon.set_custom_theme(m_settings_panel);
+ });
+
+ m_settings_panel.changed["use-custom-theme"].connect((key) => {
+ BindingCommon.set_custom_theme(m_settings_panel);
+ });
+
+ m_settings_panel.changed["custom-icon"].connect((key) => {
+ BindingCommon.set_custom_icon(m_settings_panel);
+ });
+
+ m_settings_panel.changed["use-custom-icon"].connect((key) => {
+ BindingCommon.set_custom_icon(m_settings_panel);
+ });
+
m_settings_emoji.changed["unicode-hotkey"].connect((key) => {
set_emoji_hotkey();
});
@@ -422,6 +438,8 @@ class PanelBinding : IBus.PanelService {
BindingCommon.set_custom_font(m_settings_panel,
m_settings_emoji,
ref m_css_provider);
+ BindingCommon.set_custom_theme(m_settings_panel);
+ BindingCommon.set_custom_icon(m_settings_panel);
set_emoji_favorites();
if (m_load_emoji_at_startup && !m_loaded_emoji)
set_emoji_lang();
--
2.35.3
From addab9fdc7f98c172b6fcb1e24faa133368bdaf3 Mon Sep 17 00:00:00 2001
From: Hollow Man <hollowman@opensuse.org>
Date: Wed, 26 Jan 2022 10:03:04 +0800
Subject: [PATCH 2/3] Revert support for choosing GTK themes dark variant
So that the theme list won't get too messy
BUG=https://github.com/ibus/ibus/pull/2327
Signed-off-by: Hollow Man <hollowman@opensuse.org>
---
setup/main.py | 10 ++--------
ui/gtk3/bindingcommon.vala | 14 +++-----------
2 files changed, 5 insertions(+), 19 deletions(-)
diff --git a/setup/main.py b/setup/main.py
index 71896693..d0e05666 100644
--- a/setup/main.py
+++ b/setup/main.py
@@ -672,18 +672,12 @@ class Setup(object):
gtk_theme_path = []
for path in path_list:
gtk_theme_path.extend(glob.glob(path + "/*/gtk-*/gtk.css"))
- gtk_theme_path.extend(glob.glob(path + "/*/gtk-*/gtk-dark.css"))
for path in gtk_theme_path:
- filename = os.path.basename(path)
- appendix = ""
- if filename == "gtk-dark.css":
- appendix = ":dark"
theme_name_list.append(os.path.basename(
- os.path.dirname(os.path.dirname(path))) + appendix)
+ os.path.dirname(os.path.dirname(path))))
theme_name_list.extend([
- 'Adwaita', 'Adwaita:dark',
- 'HighContrast', 'HighContrastInverse'
+ 'Adwaita', 'HighContrast', 'HighContrastInverse'
])
theme_name_list = list(set(theme_name_list))
theme_name_list.sort()
diff --git a/ui/gtk3/bindingcommon.vala b/ui/gtk3/bindingcommon.vala
index e825167b..4ecb7159 100644
--- a/ui/gtk3/bindingcommon.vala
+++ b/ui/gtk3/bindingcommon.vala
@@ -226,18 +226,10 @@ class BindingCommon {
if (use_custom_theme == false)
custom_theme = "";
- if (custom_theme == null || custom_theme == "") {
+ if (custom_theme == null || custom_theme == "")
gtk_settings.reset_property("gtk-theme-name");
- gtk_settings.reset_property("gtk-application-prefer-dark-theme");
- } else {
- string[] custom_theme_splitted = custom_theme.split(":");
- gtk_settings.gtk_theme_name = custom_theme_splitted[0];
- if (custom_theme_splitted.length == 2 &&
- custom_theme_splitted[1] == "dark")
- gtk_settings.gtk_application_prefer_dark_theme = true;
- else
- gtk_settings.gtk_application_prefer_dark_theme = false;
- }
+ else
+ gtk_settings.gtk_theme_name = custom_theme;
}
public static void
--
2.35.3
From ff99828cb60915318ed0f40998a1a23d5dea42c7 Mon Sep 17 00:00:00 2001
From: Hollow Man <hollowman@opensuse.org>
Date: Wed, 26 Jan 2022 11:19:40 +0800
Subject: [PATCH 3/3] Add tooltip text for use custom icon and theme
BUG=https://github.com/ibus/ibus/pull/2327
Signed-off-by: Hollow Man <hollowman@opensuse.org>
---
setup/setup.ui | 2 ++
1 file changed, 2 insertions(+)
diff --git a/setup/setup.ui b/setup/setup.ui
index 5a9804f9..6ded2061 100644
--- a/setup/setup.ui
+++ b/setup/setup.ui
@@ -1339,6 +1339,7 @@
<child>
<object class="GtkCheckButton" id="checkbutton_custom_theme">
<property name="label" translatable="yes">Use custom theme:</property>
+ <property name="tooltip_text" translatable="yes">Choose a theme of the candidate window</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
@@ -1375,6 +1376,7 @@
<child>
<object class="GtkCheckButton" id="checkbutton_custom_icon">
<property name="label" translatable="yes">Use custom icon:</property>
+ <property name="tooltip_text" translatable="yes">Choose a theme of the arrow buttons on the candidate window</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
--
2.35.3
From 9ad063746ec3d919217ae18acce2d4768bcfca05 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Mon, 20 Jun 2022 21:01:31 +0900
Subject: [PATCH] ui/gtk3: Hide XKB engine but enable it in Plasma Wayland
IBus just cannot defer key events to the secondary input methods
to switch XKB keymaps in Plasma Wayland because IBus has to handle the
compose keys before defer the key events.
Also update the POT file.
BUG=rhbz#2088656
---
data/dconf/org.freedesktop.ibus.gschema.xml | 4 +-
ui/gtk3/panel.vala | 50 ++-
3 files changed, 248 insertions(+), 180 deletions(-)
diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
index 051f21a5..0ece2b4f 100644
--- a/data/dconf/org.freedesktop.ibus.gschema.xml
+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
@@ -223,12 +223,12 @@
<key name="use-custom-icon" type="b">
<default>false</default>
<summary>Use custom icon</summary>
- <description>Use custom icon name for language panel</description>
+ <description>Use custom icon name for arrow buttons on candidate window</description>
</key>
<key name="custom-icon" type="s">
<default>'Adwaita'</default>
<summary>Custom icon</summary>
- <description>Custom icon name for language panel</description>
+ <description>Custom icon name for arrow buttons on candidate window</description>
</key>
<key name="use-glyph-from-engine-lang" type="b">
<default>true</default>
diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
index 101c2b3d..452b14c8 100644
--- a/ui/gtk3/panel.vala
+++ b/ui/gtk3/panel.vala
@@ -41,6 +41,7 @@ class Panel : IBus.PanelService {
private Gtk.Menu m_ime_menu;
private Gtk.Menu m_sys_menu;
private IBus.EngineDesc[] m_engines = {};
+ private IBus.EngineDesc m_en_engine;
private GLib.HashTable<string, IBus.EngineDesc> m_engine_contexts =
new GLib.HashTable<string, IBus.EngineDesc>(GLib.str_hash,
GLib.str_equal);
@@ -928,13 +929,20 @@ class Panel : IBus.PanelService {
}
private void switch_engine(int i, bool force = false) {
- GLib.assert(i >= 0 && i < m_engines.length);
+ if (m_is_wayland)
+ GLib.assert(i >= 0 && i <= m_engines.length);
+ else
+ GLib.assert(i >= 0 && i < m_engines.length);
// Do not need switch
if (i == 0 && !force)
return;
- IBus.EngineDesc engine = m_engines[i];
+ IBus.EngineDesc engine;
+ if (m_is_wayland && m_engines.length == 0)
+ engine = m_en_engine;
+ else
+ engine = m_engines[i];
set_engine(engine);
}
@@ -1024,17 +1032,15 @@ class Panel : IBus.PanelService {
string[]? order_names) {
string[]? engine_names = unowned_engine_names;
- if (engine_names == null || engine_names.length == 0) {
- if (m_is_wayland)
- engine_names = {};
- else
- engine_names = {"xkb:us::eng"};
- }
+ if (engine_names == null || engine_names.length == 0)
+ engine_names = {"xkb:us::eng"};
string[] names = {};
foreach (var name in order_names) {
if (m_is_wayland && name.has_prefix("xkb:"))
+ name = "xkb:us::eng";
+ if (name in names)
continue;
if (name in engine_names)
names += name;
@@ -1042,7 +1048,7 @@ class Panel : IBus.PanelService {
foreach (var name in engine_names) {
if (m_is_wayland && name.has_prefix("xkb:"))
- continue;
+ name = "xkb:us::eng";
if (name in names)
continue;
names += name;
@@ -1083,14 +1089,20 @@ class Panel : IBus.PanelService {
}
if (m_engines.length == 0) {
- if (engines.length > 0) {
- m_engines = engines;
- switch_engine(0, true);
- run_preload_engines(engines, 1);
- } else {
- m_candidate_panel.set_language(new Pango.AttrLanguage(
- Pango.Language.from_string(null)));
+ m_engines = engines;
+ // Do not show engines in panel icon and suggest systemsettings5
+ // in Plasma Wayland in case all engines are XKB.
+ if (m_is_wayland && m_engines.length == 1 &&
+ m_engines[0].get_name() == "xkb:us::eng") {
+ m_engines = {};
+ if (m_en_engine == null) {
+ m_en_engine =
+ m_bus.get_engines_by_names({"xkb:us::eng"})[0];
+ }
}
+ switch_engine(0, true);
+ if (m_engines.length > 0)
+ run_preload_engines(m_engines, 1);
} else {
var current_engine = m_engines[0];
m_engines = engines;
@@ -1307,6 +1319,10 @@ class Panel : IBus.PanelService {
var longname = engine.get_longname();
var textdomain = engine.get_textdomain();
var transname = GLib.dgettext(textdomain, longname);
+ if (m_is_wayland && engine.get_name().has_prefix("xkb:")) {
+ language = _("Other");
+ transname = _("No input method");
+ }
var item = new Gtk.MenuItem.with_label(
"%s - %s".printf (IBus.get_language_name(language), transname));
// Make a copy of engine to workaround a bug in vala.
@@ -1584,7 +1600,7 @@ class Panel : IBus.PanelService {
if (engine != null) {
var name = engine.get_name();
- if (name.length >= 4 && name[0:4] == "xkb:")
+ if (!m_is_wayland && name.length >= 4 && name[0:4] == "xkb:")
language = m_switcher.get_xkb_language(engine);
}
--
2.35.3
From 78ce092914e00d6af3b2b90263dd6f41de75741e Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Sat, 25 Jun 2022 20:48:50 +0900
Subject: [PATCH] tools: Enable ibus restart in GNOME desktop
If ibus-daemon is called via systemd, IBus restart API cannot restart
ibus-daemon but just terminates it.
Now ibus restart command checks the systemd avaiability and restart
ibus-daemon via systemd.
ibus start command is also added to launch ibus-daemon with systemd.
---
tools/Makefile.am | 3 +-
tools/ibus.1.in | 30 +++++-
tools/main.vala | 231 ++++++++++++++++++++++++++++++++++++++++++++--
3 files changed, 252 insertions(+), 12 deletions(-)
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 5c18d3d6..e380a9aa 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -3,7 +3,7 @@
# ibus - The Input Bus
#
# Copyright (c) 2007-2013 Peng Huang <shawn.p.huang@gmail.com>
-# Copyright (c) 2015-2017 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2015-2022 Takao Fujiwara <takao.fujiwara1@gmail.com>
# Copyright (c) 2007-2017 Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
@@ -57,6 +57,7 @@ AM_LDADD = \
AM_VALAFLAGS = \
--vapidir=$(top_builddir)/bindings/vala \
--vapidir=$(top_srcdir)/bindings/vala \
+ --pkg=gio-2.0 \
--pkg=ibus-1.0 \
--pkg=posix \
--pkg=config \
diff --git a/tools/ibus.1.in b/tools/ibus.1.in
index 525d972e..0c16a0d2 100644
--- a/tools/ibus.1.in
+++ b/tools/ibus.1.in
@@ -3,7 +3,7 @@
.\" Copyright (C) Takao Fujiwara <takao.fujiwara1@gmail.com>, 2013-2017.
.\" Copyright (c) Peng Huang <shawn.p.huang@gmail.com>, 2013.
.\"
-.TH "IBUS" 1 "May 2017" "@VERSION@" "User Commands"
+.TH "IBUS" 1 "Jun 2022" "@VERSION@" "User Commands"
.SH NAME
.B ibus
\- command line utility for ibus
@@ -45,13 +45,33 @@ Exit ibus-daemon.
\fBlist-engine\fR
Show ibus engines list.
.TP
-\fBrestart\fR
-Restart ibus-daemon.
+\fBrestart\fR [\fB\-\-type=TYPE|\-\-verbose|\-\-help\fR]
+Restart ibus-daemon. This command tries to restart ibus-daemon via systemd
+firstly and directly secondary by default. If
+.B \-\-type=systemd
+is given, It tries to restart via systemd only. If
+.B \-\-type=direct
+is given, It tries to restart with an IBus API only. GNOME desktop runs
+ibus-daemon via systemd and other desktops run ibus-daemon directly.
+.TP
+\fBstart\fR [\fB\-\-type=TYPE|\-\-verbose|\-\-help\fR]
+Start ibus-daemon. This command tries to start ibus-daemon via systemd
+firstly and directly secondary by default. If
+.B \-\-type=systemd
+is given, It tries to start as a background process via systemd only. If
+.B \-\-type=direct
+is given, It tries to start directly only as a foreground process and other
+option arguments of ibus command are sent to ibus-daemon. E.g.
+ibus start
+.B \-\-type=direct
+.B \-\-xim
+&
+GNOME desktop runs ibus-daemon via systemd and other desktops run ibus-daemon directly.
.TP
\fBversion\fR
Show the ibus version.
.TP
-\fBread\-cache\fR [\fB\-\-system|\-\-file=FILE\fR]
+\fBread\-cache\fR [\fB\-\-system|\-\-file=FILE|\-\-help\fR]
Show the content of the user registry cache if
.B \-\-system
is not given.
@@ -64,7 +84,7 @@ if
.B \-\-file=FILE
is given.
.TP
-\fBwrite\-cache\fR [\fB\-\-system|\-\-file=FILE\fR]
+\fBwrite\-cache\fR [\fB\-\-system|\-\-file=FILE|\-\-help\fR]
Save the user registry cache if
.B \-\-system
is not given.
diff --git a/tools/main.vala b/tools/main.vala
index 26e7fd88..71134334 100644
--- a/tools/main.vala
+++ b/tools/main.vala
@@ -3,7 +3,7 @@
* ibus - The Input Bus
*
* Copyright(c) 2013 Peng Huang <shawn.p.huang@gmail.com>
- * Copyright(c) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ * Copyright(c) 2015-2022 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
@@ -27,17 +27,22 @@ private const string IBUS_SCHEMAS_GENERAL_HOTKEY =
private const string IBUS_SCHEMAS_PANEL = "org.freedesktop.ibus.panel";
private const string IBUS_SCHEMAS_PANEL_EMOJI =
"org.freedesktop.ibus.panel.emoji";
+private const string SYSTEMD_SESSION_GNOME_FILE =
+ "org.freedesktop.IBus.session.GNOME.service";
bool name_only = false;
/* system() exists as a public API. */
bool is_system = false;
string cache_file = null;
string engine_id = null;
+bool verbose = false;
+string daemon_type = null;
class EngineList {
public IBus.EngineDesc[] data = {};
}
+
IBus.Bus? get_bus() {
var bus = new IBus.Bus();
if (!bus.is_connected ())
@@ -45,6 +50,123 @@ IBus.Bus? get_bus() {
return bus;
}
+
+GLib.DBusConnection? get_session_bus(bool verbose) {
+ try {
+ return GLib.Bus.get_sync (GLib.BusType.SESSION, null);
+ } catch (GLib.IOError e) {
+ if (verbose)
+ stderr.printf("%s\n", e.message);
+ }
+ return null;
+}
+
+string?
+get_ibus_systemd_object_path(GLib.DBusConnection connection,
+ bool verbose) {
+ string object_path = null;
+ const string service_file = SYSTEMD_SESSION_GNOME_FILE;
+ try {
+ var variant = connection.call_sync (
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "GetUnit",
+ new GLib.Variant("(s)", service_file),
+ new GLib.VariantType("(o)"),
+ GLib.DBusCallFlags.NONE,
+ -1,
+ null);
+ variant.get("(o)", ref object_path);
+ if (verbose) {
+ stderr.printf("Succeed to get an object path \"%s\" for IBus " +
+ "systemd service file \"%s\".\n",
+ object_path, service_file);
+ }
+ return object_path;
+ } catch (GLib.Error e) {
+ if (verbose) {
+ stderr.printf("IBus systemd service file \"%s\" is not installed " +
+ "in your system: %s\n", service_file, e.message);
+ }
+ }
+ return null;
+}
+
+
+bool
+is_running_daemon_via_systemd(GLib.DBusConnection connection,
+ string object_path,
+ bool verbose) {
+ string? state = null;
+ try {
+ 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();
+ if (verbose) {
+ stderr.printf("Succeed to get the state \"%s\" for an object " +
+ "path \"%s\".\n", state, object_path);
+ }
+ } catch (GLib.Error e) {
+ if (verbose)
+ stderr.printf("%s\n", e.message);
+ return false;
+ }
+ if (state == "active")
+ return true;
+ return false;
+}
+
+
+bool
+start_daemon_via_systemd(GLib.DBusConnection connection,
+ bool restart,
+ bool verbose) {
+ string object_path = null;
+ const string service_file = SYSTEMD_SESSION_GNOME_FILE;
+ string method = "StartUnit";
+ 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)", service_file, "fail"),
+ new GLib.VariantType("(o)"),
+ GLib.DBusCallFlags.NONE,
+ -1,
+ null);
+ variant.get("(o)", ref object_path);
+ if (verbose) {
+ stderr.printf("Succeed to restart IBus daemon via IBus systemd " +
+ "service file \"%s\": \"%s\"\n",
+ service_file, object_path);
+ }
+ return true;
+ } catch (GLib.Error e) {
+ if (verbose) {
+ stderr.printf("Failed to restart IBus daemon via IBus systemd " +
+ "service file \"%s\": %s\n", service_file, e.message);
+ }
+ }
+ return false;
+}
+
+
int list_engine(string[] argv) {
const OptionEntry[] options = {
{ "name-only", 0, 0, OptionArg.NONE, out name_only,
@@ -99,6 +221,7 @@ int list_engine(string[] argv) {
return Posix.EXIT_SUCCESS;
}
+
private int exec_setxkbmap(IBus.EngineDesc engine) {
string layout = engine.get_layout();
string variant = engine.get_layout_variant();
@@ -149,6 +272,7 @@ private int exec_setxkbmap(IBus.EngineDesc engine) {
return Posix.EXIT_SUCCESS;
}
+
int get_set_engine(string[] argv) {
var bus = get_bus();
string engine = null;
@@ -182,20 +306,100 @@ int get_set_engine(string[] argv) {
return Posix.EXIT_SUCCESS;
}
+
int message_watch(string[] argv) {
return Posix.EXIT_SUCCESS;
}
-int restart_daemon(string[] argv) {
- var bus = get_bus();
- if (bus == null) {
- stderr.printf(_("Can't connect to IBus.\n"));
+
+int start_daemon_real(string[] argv,
+ bool restart) {
+ const OptionEntry[] options = {
+ { "type", 0, 0, OptionArg.STRING, out daemon_type,
+ N_("Start or restart daemon with \"direct\" or \"systemd\" TYPE."),
+ "TYPE" },
+ { "verbose", 0, 0, OptionArg.NONE, out verbose,
+ N_("Show debug messages."), null },
+ { null }
+ };
+
+ var option = new OptionContext();
+ option.add_main_entries(options, Config.GETTEXT_PACKAGE);
+ option.set_ignore_unknown_options(true);
+
+ try {
+ option.parse(ref argv);
+ } catch (OptionError e) {
+ stderr.printf("%s\n", e.message);
+ return Posix.EXIT_FAILURE;
+ }
+ if (daemon_type != null && daemon_type != "direct" &&
+ daemon_type != "systemd") {
+ stderr.printf("type argument must be \"direct\" or \"systemd\"\n");
+ return Posix.EXIT_FAILURE;
+ }
+
+ do {
+ if (daemon_type == "direct")
+ break;
+ GLib.DBusConnection? connection = get_session_bus(verbose);
+ if (connection == null)
+ break;
+ string? object_path = get_ibus_systemd_object_path(connection, verbose);
+ if (object_path == null)
+ break;
+ if (restart &&
+ !is_running_daemon_via_systemd(connection, object_path, verbose))
+ break;
+ if (start_daemon_via_systemd(connection, restart, verbose))
+ return Posix.EXIT_SUCCESS;
return Posix.EXIT_FAILURE;
+ } while (false);
+
+ if (daemon_type == "systemd")
+ return Posix.EXIT_FAILURE;
+ if (restart) {
+ var bus = get_bus();
+ if (bus == null) {
+ stderr.printf(_("Can't connect to IBus.\n"));
+ return Posix.EXIT_FAILURE;
+ }
+ bus.exit(true);
+ if (verbose) {
+ stderr.printf("Succeed to restart ibus-daemon with an IBus API " +
+ "directly.\n");
+ }
+ } else {
+ string startarg = "ibus-daemon";
+ argv[0] = startarg;
+ var paths = GLib.Environment.get_variable("PATH").split(":");
+ foreach (unowned string path in paths) {
+ var full_path = "%s/%s".printf(path, startarg);
+ if (GLib.FileUtils.test(full_path, GLib.FileTest.IS_EXECUTABLE)) {
+ startarg = full_path;
+ break;
+ }
+ }
+ // When ibus-daemon is launched by GLib.Process.spawn_async(),
+ // the parent process will be systemd
+ if (verbose) {
+ stderr.printf("Running \"%s\" directly as a foreground " +
+ "process.\n", startarg);
+ }
+ Posix.execv(startarg, argv);
}
- bus.exit(true);
return Posix.EXIT_SUCCESS;
}
+
+int restart_daemon(string[] argv) {
+ return start_daemon_real(argv, true);
+}
+
+int start_daemon(string[] argv) {
+ return start_daemon_real(argv, false);
+}
+
int exit_daemon(string[] argv) {
var bus = get_bus();
if (bus == null) {
@@ -206,11 +410,13 @@ int exit_daemon(string[] argv) {
return Posix.EXIT_SUCCESS;
}
+
int print_version(string[] argv) {
print("IBus %s\n", Config.PACKAGE_VERSION);
return Posix.EXIT_SUCCESS;
}
+
int read_cache (string[] argv) {
const OptionEntry[] options = {
{ "system", 0, 0, OptionArg.NONE, out is_system,
@@ -251,6 +457,7 @@ int read_cache (string[] argv) {
return Posix.EXIT_SUCCESS;
}
+
int write_cache (string[] argv) {
const OptionEntry[] options = {
{ "system", 0, 0, OptionArg.NONE, out is_system,
@@ -283,12 +490,14 @@ int write_cache (string[] argv) {
Posix.EXIT_SUCCESS : Posix.EXIT_FAILURE;
}
+
int print_address(string[] argv) {
string address = IBus.get_address();
print("%s\n", address != null ? address : "(null)");
return Posix.EXIT_SUCCESS;
}
+
private int read_config_options(string[] argv) {
const OptionEntry[] options = {
{ "engine-id", 0, 0, OptionArg.STRING, out engine_id,
@@ -309,6 +518,7 @@ private int read_config_options(string[] argv) {
return Posix.EXIT_SUCCESS;
}
+
private GLib.SList<string> get_ibus_schemas() {
string[] ids = {};
if (engine_id != null) {
@@ -342,6 +552,7 @@ private GLib.SList<string> get_ibus_schemas() {
return ibus_schemas;
}
+
int read_config(string[] argv) {
if (read_config_options(argv) == Posix.EXIT_FAILURE)
return Posix.EXIT_FAILURE;
@@ -370,6 +581,7 @@ int read_config(string[] argv) {
return Posix.EXIT_SUCCESS;
}
+
int reset_config(string[] argv) {
if (read_config_options(argv) == Posix.EXIT_FAILURE)
return Posix.EXIT_FAILURE;
@@ -401,6 +613,7 @@ int reset_config(string[] argv) {
return Posix.EXIT_SUCCESS;
}
+
#if EMOJI_DICT
int emoji_dialog(string[] argv) {
string cmd = Config.LIBEXECDIR + "/ibus-ui-emojier";
@@ -427,11 +640,13 @@ int emoji_dialog(string[] argv) {
}
#endif
+
int print_help(string[] argv) {
print_usage(stdout);
return Posix.EXIT_SUCCESS;
}
+
delegate int EntryFunc(string[] argv);
struct CommandEntry {
@@ -440,12 +655,14 @@ struct CommandEntry {
unowned EntryFunc entry;
}
+
const CommandEntry commands[] = {
{ "engine", N_("Set or get engine"), get_set_engine },
{ "exit", N_("Exit ibus-daemon"), exit_daemon },
{ "list-engine", N_("Show available engines"), list_engine },
{ "watch", N_("(Not implemented)"), message_watch },
{ "restart", N_("Restart ibus-daemon"), restart_daemon },
+ { "start", N_("Start ibus-daemon"), start_daemon },
{ "version", N_("Show version"), print_version },
{ "read-cache", N_("Show the content of registry cache"), read_cache },
{ "write-cache", N_("Create registry cache"), write_cache },
@@ -460,6 +677,7 @@ const CommandEntry commands[] = {
static string program_name;
+
void print_usage(FileStream stream) {
stream.printf(_("Usage: %s COMMAND [OPTION...]\n\n"), program_name);
stream.printf(_("Commands:\n"));
@@ -470,6 +688,7 @@ void print_usage(FileStream stream) {
}
}
+
public int main(string[] argv) {
GLib.Intl.setlocale(GLib.LocaleCategory.ALL, "");
GLib.Intl.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
--
2.35.3
From 6203b6c4e1d41e731bdccb1338ed45c93bc56903 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Tue, 21 Jun 2022 00:49:46 +0900
Subject: [PATCH] src/tests: Unset G_MESSAGES_DEBUG for gsettings in
xkb-latin-layouts
gsettings cannot get the key value when G_MESSAGES_DEBUG is enabled.
Add denylist.txt to engine/Makefile.am
---
engine/Makefile.am | 3 ++-
src/tests/xkb-latin-layouts | 7 +++++++
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/engine/Makefile.am b/engine/Makefile.am
index 03867f52..7256fbc8 100644
--- a/engine/Makefile.am
+++ b/engine/Makefile.am
@@ -4,7 +4,7 @@
#
# Copyright (c) 2010-2016, Google Inc. All rights reserved.
# Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com>
-# Copyright (c) 2013-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
+# Copyright (c) 2013-2021 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
@@ -88,6 +88,7 @@ CLEANFILES = \
$(NULL)
EXTRA_DIST = \
+ denylist.txt \
gensimple.py \
iso639converter.py \
simple.xml.in \
diff --git a/src/tests/xkb-latin-layouts b/src/tests/xkb-latin-layouts
index f8dced6b..92464234 100755
--- a/src/tests/xkb-latin-layouts
+++ b/src/tests/xkb-latin-layouts
@@ -82,9 +82,16 @@ finit()
test_xkb_keymaps()
{
+ # G_MESSAGES_DEBUG=all or G_MESSAGES_DEBUG=GLib-GIO-DEBUG would append
+ # debug messages to gsettings output and could not get the result correctly.
+ backup_G_MESSAGES_DEBUG="$G_MESSAGES_DEBUG"
+ unset G_MESSAGES_DEBUG
# Loop over top level schemas since "gsettings list-recursively" only
# looks for direct children.
xkb_latin_layouts=`gsettings get org.freedesktop.ibus.general xkb-latin-layouts`
+ if [ x"$backup_G_MESSAGES_DEBUG" != x ] ; then
+ export G_MESSAGES_DEBUG=$backup_G_MESSAGES_DEBUG
+ fi
while read keymap ; do
eval keymap="$keymap"
HAS_VARIANT=$($ECHO "$keymap" | grep '(' 2> /dev/null) ||:
--
2.35.3
From 65a70a49416a5a2f0fe75815cafce68ca39ee1f1 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Wed, 29 Jun 2022 15:36:12 +0900
Subject: [PATCH] tools: Add ibus im-module command
ibus im-module command can retrive gtk-im-module value from an
instance of GtkIMMultiContext.
The GTK version can be specified by --type option and the default
is --type=gtk3 and GTK3 im-ibus.so is dlopened.
---
client/gtk2/ibusim.c | 20 +++++++
client/gtk4/ibusim.c | 20 +++++++
tools/IBusIMModule-1.0.metadata | 1 +
tools/Makefile.am | 92 ++++++++++++++++++++++++++++++---
tools/ibusimmodule.c | 84 ++++++++++++++++++++++++++++++
tools/ibusimmodule.h | 36 +++++++++++++
tools/main.vala | 15 ++++++
7 files changed, 262 insertions(+), 6 deletions(-)
create mode 100644 tools/IBusIMModule-1.0.metadata
create mode 100644 tools/ibusimmodule.c
create mode 100644 tools/ibusimmodule.h
diff --git a/client/gtk2/ibusim.c b/client/gtk2/ibusim.c
index 55609ce7..e196d536 100644
--- a/client/gtk2/ibusim.c
+++ b/client/gtk2/ibusim.c
@@ -77,3 +77,23 @@ im_module_list (const GtkIMContextInfo ***contexts,
*n_contexts = G_N_ELEMENTS (info_list);
}
+G_MODULE_EXPORT const char *
+im_get_context_id (int *argc,
+ char ***argv)
+{
+ GtkIMContext *context;
+ char *preedit_string = NULL;
+ PangoAttrList *preedit_attrs = NULL;
+ const char *context_id;
+
+ gtk_init (argc, argv);
+ context = gtk_im_multicontext_new ();
+ gtk_im_context_get_preedit_string (context,
+ &preedit_string,
+ &preedit_attrs,
+ 0);
+ context_id = gtk_im_multicontext_get_context_id (
+ GTK_IM_MULTICONTEXT (context));
+ return context_id;
+}
+
diff --git a/client/gtk4/ibusim.c b/client/gtk4/ibusim.c
index 5ecf9778..562bdf2d 100644
--- a/client/gtk4/ibusim.c
+++ b/client/gtk4/ibusim.c
@@ -50,3 +50,23 @@ g_io_im_ibus_unload (GTypeModule *type_module)
g_type_module_unuse (type_module);
}
+G_MODULE_EXPORT const char *
+im_get_context_id (int *argc,
+ char ***argv)
+{
+ GtkIMContext *context;
+ char *preedit_string = NULL;
+ PangoAttrList *preedit_attrs = NULL;
+ const char *context_id;
+
+ gtk_init ();
+ context = gtk_im_multicontext_new ();
+ gtk_im_context_get_preedit_string (context,
+ &preedit_string,
+ &preedit_attrs,
+ 0);
+ context_id = gtk_im_multicontext_get_context_id (
+ GTK_IM_MULTICONTEXT (context));
+ return context_id;
+}
+
diff --git a/tools/IBusIMModule-1.0.metadata b/tools/IBusIMModule-1.0.metadata
new file mode 100644
index 00000000..14adc9ee
--- /dev/null
+++ b/tools/IBusIMModule-1.0.metadata
@@ -0,0 +1 @@
+IBusIMModule cheader_filename="ibusimmodule.h" name="IBusIMModule"
diff --git a/tools/Makefile.am b/tools/Makefile.am
index e380a9aa..f96f2ba2 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -22,6 +22,12 @@
# USA
NULL =
+noinst_LTLIBRARIES =
+noinst_DATA =
+INTROSPECTION_GIRS =
+MAINTAINERCLEANFILES =
+DISTCLEANFILES =
+VAPIGEN_VAPIS =
libibus = $(top_builddir)/src/libibus-@IBUS_API_VERSION@.la
libibus_emoji_dialog = \
@@ -57,6 +63,8 @@ AM_LDADD = \
AM_VALAFLAGS = \
--vapidir=$(top_builddir)/bindings/vala \
--vapidir=$(top_srcdir)/bindings/vala \
+ --vapidir=$(builddir) \
+ --vapidir=$(srcdir) \
--pkg=gio-2.0 \
--pkg=ibus-1.0 \
--pkg=posix \
@@ -91,14 +99,17 @@ man_onedir = $(mandir)/man1
$(AM_V_GEN) gzip -c $< > $@.tmp && mv $@.tmp $@
EXTRA_DIST = \
- $(man_one_in_files) \
- ibus.bash \
- $(NULL)
+ $(man_one_in_files) \
+ ibus.bash \
+ ibusimmodule.c \
+ ibusimmodule.h \
+ IBusIMModule-1.0.metadata \
+ $(NULL)
CLEANFILES = \
- $(man_one_DATA) \
- $(man_one_files) \
- $(NULL)
+ $(man_one_DATA) \
+ $(man_one_files) \
+ $(NULL)
if ENABLE_EMOJI_DICT
if ENABLE_UI
@@ -108,4 +119,73 @@ AM_VALAFLAGS += \
endif
endif
+if HAVE_INTROSPECTION
+BUILT_SOURCES = $(INTROSPECTION_GIRS) $(VAPIGEN_VAPIS)
+libibusimmodule = libibusimmodule.la
+noinst_LTLIBRARIES += $(libibusimmodule)
+
+AM_LDADD += $(libibusimmodule)
+AM_VALAFLAGS += \
+ --define=LIB_IBUS_MODULE \
+ --pkg=ibus-immodule-1.0 \
+ $(NULL)
+
+libibusimmodule_la_SOURCES = \
+ ibusimmodule.c \
+ ibusimmodule.h \
+ $(NULL)
+libibusimmodule_la_CFLAGS = \
+ @GLIB2_CFLAGS@ \
+ -DGTK2_IM_MODULEDIR=\"$(GTK2_IM_MODULEDIR)\" \
+ -DGTK3_IM_MODULEDIR=\"$(GTK3_IM_MODULEDIR)\" \
+ -DGTK4_IM_MODULEDIR=\"$(GTK4_IM_MODULEDIR)\" \
+ $(NULL)
+libibusimmodule_la_LIBADD = \
+ @GLIB2_LIBS@ \
+ $(NULL)
+libibusimmodule_la_LDFLAGS = \
+ -no-undefined \
+ -export-symbols-regex "ibus_.*" \
+ $(NULL)
+
+-include $(INTROSPECTION_MAKEFILE)
+INTROSPECTION_SCANNER_ARGS =
+INTROSPECTION_COMPILER_ARGS = \
+ --includedir=$(srcdir) \
+ --includedir=. \
+ $(NULL)
+
+IBusIMModule-1.0.gir: $(libibusimmodule) Makefile
+IBusIMModule_1_0_gir_SCANNERFLAGS = \
+ --pkg=glib-2.0 \
+ $(IBUS_GIR_SCANNERFLAGS) \
+ $(NULL)
+IBusIMModule_1_0_gir_INCLUDES = GLib-2.0
+IBusIMModule_1_0_gir_LIBS = $(libibusimmodule)
+IBusIMModule_1_0_gir_FILES = ibusimmodule.h
+IBusIMModule_1_0_gir_CFLAGS = \
+ -I$(srcdir) \
+ -I$(builddir) \
+ $(NULL)
+
+ibusimmodule_gir = IBusIMModule-1.0.gir
+INTROSPECTION_GIRS += $(ibusimmodule_gir)
+noinst_DATA += $(ibusimmodule_gir)
+EXTRA_DIST += $(ibusimmodule_gir)
+MAINTAINERCLEANFILES += $(ibusimmodule_gir)
+DISTCLEANFILES += $(ibusimmodule_gir)
+
+-include $(VAPIGEN_MAKEFILE)
+ibus-immodule-1.0.vapi: $(ibusimmodule_gir) IBusIMModule-1.0.metadata
+ibus_immodule_vapi = ibus-immodule-1.0.vapi
+ibus_immodule_1_0_vapi_DEPS = glib-2.0
+ibus_immodule_1_0_vapi_METADATADIRS = $(srcdir)
+ibus_immodule_1_0_vapi_FILES = IBusIMModule-1.0.gir
+VAPIGEN_VAPIS += $(ibus_immodule_vapi)
+noinst_DATA += $(ibus_immodule_vapi)
+EXTRA_DIST += $(ibus_immodule_vapi)
+MAINTAINERCLEANFILES += $(ibus_immodule_vapi)
+DISTCLEANFILES += $(ibus_immodule_vapi)
+
+endif
-include $(top_srcdir)/git.mk
diff --git a/tools/ibusimmodule.c b/tools/ibusimmodule.c
new file mode 100644
index 00000000..1587af3d
--- /dev/null
+++ b/tools/ibusimmodule.c
@@ -0,0 +1,84 @@
+#include <glib.h>
+#include <glib/gi18n-lib.h>
+#include <dlfcn.h>
+
+#ifndef DEFAULT_IM_MODULE_TYPE
+#define DEFAULT_IM_MODULE_TYPE "gtk3"
+#endif
+
+typedef const char * (* IBusIMGetContextIdFunc) (int *argc, char ***argv);
+
+static char *im_module_type;
+
+
+char *
+ibus_im_module_get_id (int argc, char *argv[])
+{
+ static const GOptionEntry options[3] = {
+ { "type", (char)0, (int)0, G_OPTION_ARG_STRING, &im_module_type,
+ N_ ("Type im-module TYPE = \"gtk2\", \"gtk3\", \"gtk4\". " \
+ "Default is \"" DEFAULT_IM_MODULE_TYPE "\"."),
+ "TYPE"},
+ { NULL }
+ };
+ GOptionContext *option;
+ GError *error = NULL;
+ void *module;
+ char *im_context_id;
+ IBusIMGetContextIdFunc im_get_context_id;
+
+ if (!(option = g_option_context_new (NULL))) {
+ g_critical ("malloc GOptionContext is failed.");
+ return NULL;
+ }
+ g_option_context_add_main_entries (option, options, GETTEXT_PACKAGE);
+ g_option_context_parse (option, &argc, &argv, &error);
+ if (error) {
+ g_critical ("%s", error->message);
+ g_clear_error (&error);
+ return NULL;
+ }
+ g_option_context_free (option);
+ if (!im_module_type)
+ im_module_type = g_strdup (DEFAULT_IM_MODULE_TYPE);
+
+ if (G_LIKELY (!g_strcmp0 (im_module_type, "gtk3"))) {
+ module = dlopen (GTK3_IM_MODULEDIR "/im-ibus.so",
+ RTLD_LAZY);
+ } else if (!g_strcmp0 (im_module_type, "gtk4")) {
+ const char *module_path_env = g_getenv ("GTK_PATH");
+ char *module_path;
+ if (module_path_env) {
+ module_path = g_build_filename (module_path_env,
+ GTK4_IM_MODULEDIR "/libim-ibus.so",
+ NULL);
+ } else {
+ module_path = g_strdup (GTK4_IM_MODULEDIR "/libim-ibus.so");
+ }
+ module = dlopen (module_path, RTLD_LAZY);
+ g_free (module_path);
+ } else if (!g_strcmp0 (im_module_type, "gtk2")) {
+ module = dlopen (GTK2_IM_MODULEDIR "/im-ibus.so",
+ RTLD_LAZY);
+ } else {
+ module = dlopen (im_module_type, RTLD_LAZY);
+ }
+ if (!module) {
+ g_warning ("Not found module: %s", dlerror ());
+ return NULL;
+ }
+
+ im_get_context_id = dlsym (module, "im_get_context_id");
+ if (!im_get_context_id) {
+ g_warning ("Not found im_get_context_id: %s", dlerror ());
+ dlclose (module);
+ return NULL;
+ }
+
+ im_context_id = strdup (im_get_context_id (&argc, &argv));
+ dlclose (module);
+ return im_context_id;
+}
+
+#undef DEFAULT_IM_MODULE_TYPE
+
diff --git a/tools/ibusimmodule.h b/tools/ibusimmodule.h
new file mode 100644
index 00000000..e762a747
--- /dev/null
+++ b/tools/ibusimmodule.h
@@ -0,0 +1,36 @@
+/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
+/* vim:set et sts=4: */
+/* ibus - The Input Bus
+ * Copyright (C) 2022 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
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ */
+
+#ifndef __IBUS_IM_MODULE_CONTEXT_H_
+#define __IBUS_IM_MODULE_CONTEXT_H_
+
+/**
+ * ibus_im_module_get_id:
+ * @argc: The length of argv
+ * @argv: (array length=argc) (element-type utf8): argv from main()
+ *
+ * Retrieve im-module value from GTK instance.
+ *
+ * Returns: (nullable): im-module value.
+ */
+char * ibus_im_module_get_id (int argc, char *argv[]);
+
+#endif
diff --git a/tools/main.vala b/tools/main.vala
index 71134334..587f3a09 100644
--- a/tools/main.vala
+++ b/tools/main.vala
@@ -641,6 +641,19 @@ int emoji_dialog(string[] argv) {
#endif
+int read_im_module(string[] argv) {
+#if LIB_IBUS_MODULE
+ string? im_module = IBusIMModule.im_module_get_id(argv);
+ if (im_module == null)
+ return Posix.EXIT_FAILURE;
+ print("%s\n".printf(im_module));
+#else
+ print("%s\n".printf(_("Not supported in your system.")));
+#endif
+ return Posix.EXIT_SUCCESS;
+}
+
+
int print_help(string[] argv) {
print_usage(stdout);
return Posix.EXIT_SUCCESS;
@@ -672,6 +685,8 @@ const CommandEntry commands[] = {
#if EMOJI_DICT
{ "emoji", N_("Save emoji on dialog to clipboard"), emoji_dialog },
#endif
+ { "im-module", N_("Retrieve im-module value from GTK instance"),
+ read_im_module },
{ "help", N_("Show this information"), print_help }
};
--
2.35.3