From de3bb0e579dd0776686323f0e6cc4e5d5716da8a Mon Sep 17 00:00:00 2001 From: Benjamin Tissoires Date: Wed, 26 Jul 2017 08:32:16 +0200 Subject: [PATCH] implement resolution active set (#249) Fixes #80 Signed-off-by: Benjamin Tissoires --- DBusInterface.md | 3 +++ ratbagd/ratbagd-resolution.c | 37 ++++++++++++++++++++++++++++++++++++ src/libratbag.c | 10 ++++++++-- tools/ratbagctl.in | 8 +++++++- tools/ratbagctl.test.in | 7 ++++--- tools/ratbagd.py | 4 ++++ 6 files changed, 63 insertions(+), 6 deletions(-) diff --git a/DBusInterface.md b/DBusInterface.md index f5471057..aa7e609e 100644 --- a/DBusInterface.md +++ b/DBusInterface.md @@ -209,6 +209,9 @@ uint for the minimum possible resolution #### `SetDefault() → () ` Set this resolution to be the default +#### `SetActive() → () ` + +Set this resolution to be the active one org.freedesktop.ratbag1.Button ============================== diff --git a/ratbagd/ratbagd-resolution.c b/ratbagd/ratbagd-resolution.c index 45d11dd0..b2de8e07 100644 --- a/ratbagd/ratbagd-resolution.c +++ b/ratbagd/ratbagd-resolution.c @@ -79,6 +79,42 @@ ratbagd_resolution_set_report_rate(sd_bus *bus, return r; } +static int ratbagd_resolution_active_signal_cb(sd_bus *bus, + struct ratbagd_resolution *resolution) +{ + struct ratbag_resolution *lib_resolution = resolution->lib_resolution; + + /* FIXME: we should cache is_active and only send the signal for + * those resolutions where it changed */ + + (void) sd_bus_emit_signal(bus, + resolution->path, + RATBAGD_NAME_ROOT ".Resolution", + "IsActive", + "b", + ratbag_resolution_is_active(lib_resolution)); + + return 0; +} + +static int ratbagd_resolution_set_active(sd_bus_message *m, + void *userdata, + sd_bus_error *error) +{ + struct ratbagd_resolution *resolution = userdata; + int r; + + r = ratbag_resolution_set_active(resolution->lib_resolution); + if (r < 0) + return r; + + ratbagd_for_each_resolution_signal(sd_bus_message_get_bus(m), + resolution->profile, + ratbagd_resolution_active_signal_cb); + + return sd_bus_reply_method_return(m, "u", r); +} + static int ratbagd_resolution_default_signal_cb(sd_bus *bus, struct ratbagd_resolution *resolution) { @@ -310,6 +346,7 @@ const sd_bus_vtable ratbagd_resolution_vtable[] = { SD_BUS_VTABLE_UNPRIVILEGED|SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE), SD_BUS_PROPERTY("Maximum", "u", ratbagd_resolution_get_maximum, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Minimum", "u", ratbagd_resolution_get_minimum, 0, SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_METHOD("SetActive", "", "u", ratbagd_resolution_set_active, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_METHOD("SetDefault", "", "u", ratbagd_resolution_set_default, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_VTABLE_END, }; diff --git a/src/libratbag.c b/src/libratbag.c index 6ecbc5c5..789955c4 100644 --- a/src/libratbag.c +++ b/src/libratbag.c @@ -1141,9 +1141,15 @@ ratbag_resolution_is_active(const struct ratbag_resolution *resolution) LIBRATBAG_EXPORT enum ratbag_error_code ratbag_resolution_set_active(struct ratbag_resolution *resolution) { + struct ratbag_profile *profile = resolution->profile; + unsigned int i; + + for (i = 0; i < profile->resolution.num_modes; i++) + profile->resolution.modes[i].is_active = false; + resolution->is_active = true; - /* FIXME: call into the driver */ - return RATBAG_ERROR_IMPLEMENTATION; + profile->dirty = true; + return RATBAG_SUCCESS; } diff --git a/tools/ratbagctl.in b/tools/ratbagctl.in index 73964db7..630f8a2a 100755 --- a/tools/ratbagctl.in +++ b/tools/ratbagctl.in @@ -429,6 +429,12 @@ def func_resolution_active_get(r, args): print(r.index) +def func_resolution_active_set(r, args): + r, p, d = find_resolution(r, args) + r.set_active() + d.commit() + + def func_resolution_default_get(r, args): p, d = find_profile(r, args) for r in p.resolutions: @@ -707,7 +713,7 @@ parser_def = [ arg_type: int, }, ], - func: func_dummy, # FIXME: func_active_resolution_set, + func: func_resolution_active_set, }, ], }, diff --git a/tools/ratbagctl.test.in b/tools/ratbagctl.test.in index 7332fb3a..5e7315ae 100755 --- a/tools/ratbagctl.test.in +++ b/tools/ratbagctl.test.in @@ -213,13 +213,14 @@ class TestRatbgagCtlResolution(TestRatbagCtl): self.launch_fail_test(command + " 10 test_device") self.launch_fail_test(command + " test_device x") - @unittest.skip("Resolution active set not implemented") def test_resolution_active_set(self): command = "Resolution active set" - r = self.launch_good_test(command + " 2 test_device") - self.assertNotEqual(r, '') r = self.launch_good_test("Resolution active get test_device") self.assertEqual(int(r), 2) + r = self.launch_good_test(command + " 0 test_device") + self.assertEqual(r, '') + r = self.launch_good_test("Resolution active get test_device") + self.assertEqual(int(r), 0) self.launch_fail_test(command) self.launch_fail_test(command + " X test_device") self.launch_fail_test(command + " 1 test_device X") diff --git a/tools/ratbagd.py b/tools/ratbagd.py index 67a4ae1c..b8a917c4 100644 --- a/tools/ratbagd.py +++ b/tools/ratbagd.py @@ -426,6 +426,10 @@ class RatbagdResolution(_RatbagdDBus): """Set this resolution to be the default.""" return self._dbus_call("SetDefault", "") + def set_active(self): + """Set this resolution to be the active one.""" + return self._dbus_call("SetActive", "") + class RatbagdButton(_RatbagdDBus): """Represents a ratbagd button."""