Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ibus for openSUSE:Factory checked in at 2022-11-21 15:28:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ibus (Old) and /work/SRC/openSUSE:Factory/.ibus.new.1597 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ibus" Mon Nov 21 15:28:45 2022 rev:119 rq:1036951 version:1.5.27 Changes: -------- --- /work/SRC/openSUSE:Factory/ibus/ibus.changes 2022-08-31 18:08:36.831316064 +0200 +++ /work/SRC/openSUSE:Factory/.ibus.new.1597/ibus.changes 2022-11-21 15:28:47.656404212 +0100 @@ -1,0 +2,8 @@ +Fri Nov 18 13:48:57 UTC 2022 - Fuminobu Takeyama <ft...@geeko.jp> + +- Switch to use systemd service file to start ibus daemon + * Fix boo#1201421 + * Add ibus-ui-gtk3-restart-via-systemd.patch + * Enable ibus-autostart for xdg-autostart-generator + +------------------------------------------------------------------- New: ---- 20-defaults-openSUSE.conf ibus-ui-gtk3-restart-via-systemd.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ibus.spec ++++++ --- /var/tmp/diff_new_pack.RXv9OZ/_old 2022-11-21 15:28:48.356407766 +0100 +++ /var/tmp/diff_new_pack.RXv9OZ/_new 2022-11-21 15:28:48.360407786 +0100 @@ -48,6 +48,7 @@ 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 ti...@suse.de # Fix lost XIM input after screenlock @@ -72,6 +73,9 @@ # 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 BuildRequires: pkgconfig(iso-codes) BuildRequires: pkgconfig(libnotify) BuildRequires: pkgconfig(systemd) @@ -229,6 +233,7 @@ %if 0%{?suse_version} <= 1500 %patch15 -p1 %endif +%patch16 -p1 %build %configure --disable-static \ @@ -279,6 +284,10 @@ 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 \ @@ -418,6 +427,7 @@ %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 ++++++ 20-defaults-openSUSE.conf ++++++ [Service] # For now, Plasma Wayland does not support /etc/xdg/Xwayland-session.d # so always enable --xim Environment="IBUS_DAEMON_ARGS=--xim" ++++++ ibus-autostart ++++++ --- /var/tmp/diff_new_pack.RXv9OZ/_old 2022-11-21 15:28:48.456408273 +0100 +++ /var/tmp/diff_new_pack.RXv9OZ/_new 2022-11-21 15:28:48.456408273 +0100 @@ -11,6 +11,6 @@ # sleep for a little while to avoid duplicate startup # sleep 2 -ibus-daemon --xim -d +ibus start --service-file org.freedesktop.IBus.session.generic.service exit 0 ++++++ ibus-autostart.desktop ++++++ --- /var/tmp/diff_new_pack.RXv9OZ/_old 2022-11-21 15:28:48.476408374 +0100 +++ /var/tmp/diff_new_pack.RXv9OZ/_new 2022-11-21 15:28:48.480408395 +0100 @@ -10,5 +10,4 @@ NoDisplay=true X-KDE-autostart-after=panel X-KDE-StartupNotify=false -X-systemd-skip=true ++++++ ibus-ui-gtk3-restart-via-systemd.patch ++++++ 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();