From 9099c2a399c08d4030c378dd46b83657d7b06961 Mon Sep 17 00:00:00 2001 From: Zedwil Date: Tue, 29 Sep 2026 00:04:38 -0500 Subject: [PATCH] fix: unpack OpenWave's Changed signal as its four parts so pushes arrive org.gtk.Actions.Changed is (as a{sb} a{sv} a{s(bgav)}); unpacking three names raised ValueError, which the relay swallowed, so every push was dropped and the deck only refreshed on its 1 s poll. Co-Authored-By: Claude Opus 5.5 (1M context) --- dev.openwave.sdPlugin/owdeck/ipc.py | 4 +++- tests/test_plugin.py | 25 +++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/dev.openwave.sdPlugin/owdeck/ipc.py b/dev.openwave.sdPlugin/owdeck/ipc.py index b71b7df..7fdb0ae 100644 --- a/dev.openwave.sdPlugin/owdeck/ipc.py +++ b/dev.openwave.sdPlugin/owdeck/ipc.py @@ -83,8 +83,10 @@ def _attach(proxy): def _relay(_proxy, _sender, signal, params): if signal != "Changed" or _on_changed is None: return + # org.gtk.Actions.Changed is (as a{sb} a{sv} a{s(bgav)}): removed, + # enabled, state, added. Only the state map matters here. try: - _removed, _enabled, states = params.unpack() + _removed, _enabled, states, _added = params.unpack() except (TypeError, ValueError): return _on_changed(dict(states or {})) diff --git a/tests/test_plugin.py b/tests/test_plugin.py index 49d0f76..f590670 100644 --- a/tests/test_plugin.py +++ b/tests/test_plugin.py @@ -1082,3 +1082,28 @@ def test_garbage_push_is_ignored(self): self.plugin._snapshot = {"stale": True} self.plugin._on_push({"snapshot": "{not json"}) self.assertIn("stale", self.plugin._snapshot) + + +@unittest.skipUnless(ipc._HAVE_GI, "needs PyGObject") +class TestChangedSignal(unittest.TestCase): + """The relay must unpack org.gtk.Actions.Changed as the bus sends it.""" + + def setUp(self): + self.addCleanup(setattr, ipc, "_on_changed", ipc._on_changed) + self.got = [] + ipc._on_changed = self.got.append + + def _relay(self): + class Proxy: + def connect(inner, _name, handler): + inner.handler = handler + proxy = Proxy() + ipc._attach(proxy) + return proxy.handler + + def test_the_real_four_part_signal_reaches_the_subscriber(self): + GLib = ipc.GLib + params = GLib.Variant("(asa{sb}a{sv}a{s(bgav)})", ( + [], {}, {"snapshot": GLib.Variant("s", "{}")}, {})) + self._relay()(None, ":1.1", "Changed", params) + self.assertEqual(self.got, [{"snapshot": "{}"}])