From 5696033b31c9f0ffa889c1f88971c33b86efd969 Mon Sep 17 00:00:00 2001 From: fujiwarat Date: Sun, 17 Mar 2024 08:41:27 +0900 Subject: [PATCH] tools: Fix ibus start/restart in Plasma Wayland ibus start/restart frequently failed because of the timeout. Now the command waits for the "/VirtualKeyboard" on "org.kde.kwin.VirtualKeyboard" D-Bus ack signal so that the "/kwinrc" on "org.kde.kconfig.notify" D-Bus signal is completed. Also use ibusinternal.h instead of dbus.h . Fixes: https://github.com/ibus/ibus/commit/74712fa --- bindings/vala/dbus-1.vapi | 8 +++---- tools/Makefile.am | 3 +-- tools/main.vala | 47 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/bindings/vala/dbus-1.vapi b/bindings/vala/dbus-1.vapi index 516c29999..1fb29b551 100644 --- a/bindings/vala/dbus-1.vapi +++ b/bindings/vala/dbus-1.vapi @@ -1,10 +1,10 @@ -[CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "dbus/dbus.h")] +[CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "ibusinternal.h")] namespace DBus { - [CCode (cheader_filename = "dbus/dbus.h", cname = "DBUS_INTERFACE_DBUS")] + [CCode (cheader_filename = "ibusinternal.h", cname = "DBUS_INTERFACE_DBUS")] public const string INTERFACE_DBUS; - [CCode (cheader_filename = "dbus/dbus.h", cname = "DBUS_PATH_DBUS")] + [CCode (cheader_filename = "ibusinternal.h", cname = "DBUS_PATH_DBUS")] public const string PATH_DBUS; - [CCode (cheader_filename = "dbus/dbus.h", cname = "DBUS_SERVICE_DBUS")] + [CCode (cheader_filename = "ibusinternal.h", cname = "DBUS_SERVICE_DBUS")] public const string SERVICE_DBUS; } diff --git a/tools/Makefile.am b/tools/Makefile.am index 8cab53b28..8ba03e1ba 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -45,20 +45,19 @@ AM_CPPFLAGS = \ $(NULL) AM_CFLAGS = \ - @DBUS_CFLAGS@ \ @GLIB2_CFLAGS@ \ @GIO2_CFLAGS@ \ @GTHREAD2_CFLAGS@ \ -DG_LOG_DOMAIN=\"IBUS\" \ -DLIBEXECDIR=\"$(libexecdir)\" \ -DIBUS_DISABLE_DEPRECATED \ + -DIBUS_COMPILATION \ -Wno-unused-variable \ -Wno-unused-but-set-variable \ -Wno-unused-function \ $(NULL) AM_LDADD = \ - @DBUS_LIBS@ \ @GOBJECT2_LIBS@ \ @GLIB2_LIBS@ \ @GIO2_LIBS@ \ diff --git a/tools/main.vala b/tools/main.vala index 5cecb0d61..bfbc04e97 100644 --- a/tools/main.vala +++ b/tools/main.vala @@ -84,6 +84,22 @@ name_appeared_handler(GLib.DBusConnection connection, loop = null; } +private void +kde_virtual_keyboard_avail_cb(GLib.DBusConnection connection, + string? sender_name, + string object_path, + string interface_name, + string signal_name, + GLib.Variant parameters) +{ + if (verbose) { + stderr.printf("%s.%s %s returned.\n", + interface_name, signal_name, object_path); + } + loop.quit(); + loop = null; +} + GLib.DBusConnection? get_session_bus(bool verbose) { loop = new GLib.MainLoop(); @@ -103,8 +119,10 @@ GLib.DBusConnection? get_session_bus(bool verbose) { } catch(GLib.IOError e) { if (verbose) stderr.printf("The session bus error: %s\n", e.message); - if (loop != null) + if (loop != null) { loop.quit(); + loop = null; + } } }); loop.run(); @@ -234,6 +252,17 @@ start_daemon_with_dbus_systemd(GLib.DBusConnection connection, bool start_daemon_with_dbus_kde(GLib.DBusConnection connection, bool verbose) { + loop = new GLib.MainLoop(); + assert(loop != null); + uint subscripion_id = connection.signal_subscribe( + null, + "org.kde.kwin.VirtualKeyboard", + "availableChanged", + "/VirtualKeyboard", + null, + DBusSignalFlags.NONE, + kde_virtual_keyboard_avail_cb); + string wayland_values = "InputMethod"; var bytes = new GLib.VariantBuilder(new GLib.VariantType("ay")); for (int i = 0; i < wayland_values.length; i++) { @@ -251,15 +280,31 @@ start_daemon_with_dbus_kde(GLib.DBusConnection connection, new GLib.Variant("(a{saay})", array))) { if (verbose) stderr.printf("Failed to emit a KDE D-Bus signal.\n"); + connection.signal_unsubscribe(subscripion_id); + if (loop != null) { + loop.quit(); + loop = null; + } return false; } } catch (GLib.Error e) { stderr.printf("%s\n", e.message); + connection.signal_unsubscribe(subscripion_id); + if (loop != null) { + loop.quit(); + loop = null; + } return false; } + // Wait for "/VirtualKeyboard" on "org.kde.kwin.VirtualKeyboard" signal + // so that "/kwinrc" on "org.kde.kconfig.notify" signal is reached to + // kwin. + loop.run(); + connection.signal_unsubscribe(subscripion_id); return true; } + int list_engine(string[] argv) { const OptionEntry[] options = { { "name-only", 0, 0, OptionArg.NONE, out name_only,