From 068310633fb1e3b2e365c31d2e3fef38febc60b0 Mon Sep 17 00:00:00 2001 From: Gwilherm Folliot Date: Sun, 26 Jan 2025 22:06:40 +0100 Subject: [PATCH] input-capture: hookup ZonesChanged signal --- src/input-capture.c | 31 +++++++++++++++++++++++++++ tests/templates/inputcapture.py | 14 ++++++++++++ tests/test_inputcapture.py | 38 +++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+) diff --git a/src/input-capture.c b/src/input-capture.c index 45e5c9fd1..3599b806c 100644 --- a/src/input-capture.c +++ b/src/input-capture.c @@ -1115,6 +1115,36 @@ on_deactivated_cb (XdpDbusImplInputCapture *impl, } } +static void +on_zones_changed_cb (XdpDbusImplInputCapture *impl, + const char *session_id, + GVariant *options, + gpointer data) +{ + g_autoptr(XdpSession) session = xdp_session_lookup (session_id); + InputCaptureSession *input_capture_session; + + if (!IS_INPUT_CAPTURE_SESSION (session)) + { + g_critical ("Invalid session type for signal"); + return; + } + + input_capture_session = (InputCaptureSession*)session; + + switch (input_capture_session->state) + { + case INPUT_CAPTURE_SESSION_STATE_INIT: + case INPUT_CAPTURE_SESSION_STATE_ENABLED: + case INPUT_CAPTURE_SESSION_STATE_ACTIVE: + case INPUT_CAPTURE_SESSION_STATE_DISABLED: + pass_signal (impl, "ZonesChanged", session_id, options, data); + break; + case INPUT_CAPTURE_SESSION_STATE_CLOSED: + break; + } +} + static void input_capture_init (InputCapture *input_capture) { @@ -1130,6 +1160,7 @@ input_capture_init (InputCapture *input_capture) g_signal_connect (impl, "disabled", G_CALLBACK (on_disabled_cb), input_capture); g_signal_connect (impl, "activated", G_CALLBACK (on_activated_cb), input_capture); g_signal_connect (impl, "deactivated", G_CALLBACK (on_deactivated_cb), input_capture); + g_signal_connect (impl, "zones-changed", G_CALLBACK (on_zones_changed_cb), input_capture); } static void diff --git a/tests/templates/inputcapture.py b/tests/templates/inputcapture.py index f3efadd99..b4ab535a6 100644 --- a/tests/templates/inputcapture.py +++ b/tests/templates/inputcapture.py @@ -42,6 +42,7 @@ def load(mock, parameters={}): mock.disable_delay = parameters.get("disable-delay", 0) mock.activated_delay = parameters.get("activated-delay", 0) mock.deactivated_delay = parameters.get("deactivated-delay", 0) + mock.zones_changed_delay = parameters.get("zones-changed-delay", 0) mock.AddProperties( MAIN_IFACE, @@ -240,6 +241,19 @@ def deactivated(): GLib.timeout_add(self.deactivated_delay, deactivated) + if self.zones_changed_delay > 0: + + def zones_changed(): + logger.debug("emitting ZonesChanged") + options = { + "zone_set": dbus.UInt32(activation_id, variant_level=1), + } + self.EmitSignal( + MAIN_IFACE, "ZonesChanged", "oa{sv}", [session_handle, options] + ) + + GLib.timeout_add(self.zones_changed_delay, zones_changed) + except Exception as e: logger.critical(e) return (2, {}) diff --git a/tests/test_inputcapture.py b/tests/test_inputcapture.py index 0983834d3..b38e12a49 100644 --- a/tests/test_inputcapture.py +++ b/tests/test_inputcapture.py @@ -562,6 +562,44 @@ def cb_deactivated(session_handle, options): self.disable(dbus_con) assert not disabled_signal_received + @pytest.mark.parametrize( + "template_params", + ( + { + "inputcapture": { + "zones-changed-delay": 200, + }, + }, + ), + ) + def test_zones_changed_signal(self, portals, dbus_con): + inputcapture_intf = xdp.get_portal_iface(dbus_con, "InputCapture") + + self.create_session(dbus_con) + self.get_zones(dbus_con) + # The default zone is 1920x1080 + barriers = [ + { + "barrier_id": dbus.UInt32(10, variant_level=1), + "position": dbus.Struct( + [0, 0, 1920, 0], signature="iiii", variant_level=1 + ), + }, + ] + self.set_pointer_barriers(dbus_con, barriers) + self.connect_to_eis(dbus_con) + + zones_changed_signal_received = False + + def cb_zones_changed(session_handle, options): + nonlocal zones_changed_signal_received + zones_changed_signal_received = True + assert session_handle == session_handle + + inputcapture_intf.connect_to_signal("ZonesChanged", cb_zones_changed) + self.enable(dbus_con) + xdp.wait_for(lambda: zones_changed_signal_received) + @pytest.mark.parametrize( "template_params", (