Skip to content

Commit

Permalink
input-capture: hookup ZonesChanged signal
Browse files Browse the repository at this point in the history
  • Loading branch information
3l0w authored and GeorgesStavracas committed Jan 30, 2025
1 parent 3bd6cb4 commit 0683106
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/input-capture.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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
Expand Down
14 changes: 14 additions & 0 deletions tests/templates/inputcapture.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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, {})
Expand Down
38 changes: 38 additions & 0 deletions tests/test_inputcapture.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
(
Expand Down

0 comments on commit 0683106

Please sign in to comment.