From ca2f32ea58b4a7f1276032fed3ff1526bc705797 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 15 Mar 2016 11:21:09 +1000 Subject: [PATCH] device: switch the capabilities to an enum Strings can suffer from locale issues, the official recommendation for DBus APIs is to use enums here. Signed-off-by: Peter Hutterer --- README.md | 3 +- python/ratbagctl.py | 10 ++++- python/ratbagd/__init__.py | 25 ++++------- src/ratbagd-device.c | 90 +++++++++++++++++++++----------------- 4 files changed, 69 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index 830df8fb..4f5ff694 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,7 @@ The **org.freedesktop.ratbag1.Manager** interface provides: The **org.freedesktop.ratbag1.Device** interface provides: - Properties: - Id -> unique ID of this device - - CapSwitchableResolution, CapSwitchableProfile, CapButtonKeys, - CapButtonMacros, CapDefaultProfile -> booleans to signal capabilities + - Capabilities -> array of uints with the capabilities enum from libratbag - Description -> device name - Svg -> device SVG name (file only) - SvgPath -> device SVG name (full absolute path) diff --git a/python/ratbagctl.py b/python/ratbagctl.py index a8f2c45e..69a939fd 100755 --- a/python/ratbagctl.py +++ b/python/ratbagctl.py @@ -77,9 +77,17 @@ def find_button(r, args): def show_device(r, args): d = find_device(r, args) + + caps = { RatbagdDevice.CAP_SWITCHABLE_RESOLUTION : "switchable-resolution", + RatbagdDevice.CAP_SWITCHABLE_PROFILE : "switchable-profile", + RatbagdDevice.CAP_BUTTON_KEY : "button-keys", + RatbagdDevice.CAP_BUTTON_MACROS : "button-macros", + RatbagdDevice.CAP_DEFAULT_PROFILE : "default-profile" } + capabilities = [caps[c] for c in d.capabilities] + print("{} - {}".format(d.id, d.description)) print(" SVG: {}".format(d.svg)) - print(" Capabilities: {}".format(", ".join(d.capabilities))) + print(" Capabilities: {}".format(", ".join(capabilities))) print("Number of Profiles: {}".format(len(d.profiles))) active = -1 for i, p in enumerate(d.profiles): diff --git a/python/ratbagd/__init__.py b/python/ratbagd/__init__.py index a3c6271b..726cfebb 100644 --- a/python/ratbagd/__init__.py +++ b/python/ratbagd/__init__.py @@ -76,6 +76,12 @@ class Ratbagd(_RatbagdDBus): return self._devices class RatbagdDevice(_RatbagdDBus): + CAP_SWITCHABLE_RESOLUTION = 1 + CAP_SWITCHABLE_PROFILE = 2 + CAP_BUTTON_KEY = 3 + CAP_BUTTON_MACROS = 4 + CAP_DEFAULT_PROFILE = 5 + """ Represents a ratbagd device. """ @@ -93,16 +99,7 @@ class RatbagdDevice(_RatbagdDBus): self._profiles = [RatbagdProfile(objpath) for objpath in result] self._active_profile = self.dbus_property("ActiveProfile") - caps = [ "switchable-resolution", - "switchable-profile", - "button-keys", - "button-macros", - "default-profile"] - self._caps = [] - for c in caps: - cname = "Cap" + "".join([n.capitalize() for n in c.split("-")]) - if self.dbus_property(cname): - self._caps.append(c) + self._caps = self.dbus_property("Capabilities") @property def profiles(self): @@ -154,14 +151,10 @@ class RatbagdDevice(_RatbagdDBus): @property def capabilities(self): """ - Return the capabilities of this device as a list of identifier strings. + Return the capabilities of this device as an array. Capabilities not present on the device are not in the list. Thus use - if "capability" is in deivce.caps: + if "capability" is in device.caps: do something - - Capabilities supported: "switchable-resolution", - "switchable-profile", "button-keys", "button-macros", - "default-profile" """ return self._caps diff --git a/src/ratbagd-device.c b/src/ratbagd-device.c index 3fee6209..05b98bf7 100644 --- a/src/ratbagd-device.c +++ b/src/ratbagd-device.c @@ -47,14 +47,6 @@ struct ratbagd_device { sd_bus_slot *profile_enum_slot; unsigned int n_profiles; struct ratbagd_profile **profiles; - - struct { - bool switchable_resolution; - bool switchable_profile; - bool button_keys; - bool button_macros; - bool default_profile; - } capabilities; }; #define ratbagd_device_from_node(_ptr) \ @@ -272,24 +264,59 @@ static int ratbagd_device_get_profile_by_index(sd_bus_message *m, ratbagd_profile_get_path(profile)); } +static int +ratbagd_device_get_capabilities(sd_bus *bus, + const char *path, + const char *interface, + const char *property, + sd_bus_message *reply, + void *userdata, + sd_bus_error *error) +{ + struct ratbagd_device *device = userdata; + struct ratbag_device *lib_device = device->lib_device; + enum ratbag_device_capability cap; + int r; + + r = sd_bus_message_open_container(reply, 'a', "u"); + if (r < 0) + return r; + + cap = RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION; + if (ratbag_device_has_capability(lib_device, cap)) { + r = sd_bus_message_append(reply, "u", cap); + if (r < 0) + return r; + } + + cap = RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE; + if (ratbag_device_has_capability(lib_device, cap)) { + r = sd_bus_message_append(reply, "u", cap); + if (r < 0) + return r; + } + + cap = RATBAG_DEVICE_CAP_BUTTON_MACROS; + if (ratbag_device_has_capability(lib_device, cap)) { + r = sd_bus_message_append(reply, "u", cap); + if (r < 0) + return r; + } + + cap = RATBAG_DEVICE_CAP_DEFAULT_PROFILE; + if (ratbag_device_has_capability(lib_device, cap)) { + r = sd_bus_message_append(reply, "u", cap); + if (r < 0) + return r; + } + + return sd_bus_message_close_container(reply); +} + const sd_bus_vtable ratbagd_device_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("Id", "s", NULL, offsetof(struct ratbagd_device, name), SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("CapSwitchableResolution", "b", NULL, - offsetof(struct ratbagd_device, capabilities.switchable_resolution), - SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("CapSwitchableProfile", "b", NULL, - offsetof(struct ratbagd_device, capabilities.switchable_profile), - SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("CapButtonKeys", "b", NULL, - offsetof(struct ratbagd_device, capabilities.button_keys), - SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("CapButtonMacros", "b", NULL, - offsetof(struct ratbagd_device, capabilities.button_macros), - SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("CapDefaultProfile", "b", NULL, - offsetof(struct ratbagd_device, capabilities.default_profile), - SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("Capabilities", "au", ratbagd_device_get_capabilities, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Description", "s", ratbagd_device_get_description, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("Svg", "s", ratbagd_device_get_svg, 0, SD_BUS_VTABLE_PROPERTY_CONST), SD_BUS_PROPERTY("SvgPath", "s", ratbagd_device_get_svg_path, 0, SD_BUS_VTABLE_PROPERTY_CONST), @@ -358,23 +385,6 @@ int ratbagd_device_new(struct ratbagd_device **out, } } - - device->capabilities.switchable_resolution = - ratbag_device_has_capability(lib_device, - RATBAG_DEVICE_CAP_SWITCHABLE_RESOLUTION); - device->capabilities.switchable_profile = - ratbag_device_has_capability(lib_device, - RATBAG_DEVICE_CAP_SWITCHABLE_PROFILE); - device->capabilities.button_keys = - ratbag_device_has_capability(lib_device, - RATBAG_DEVICE_CAP_BUTTON_MACROS); - device->capabilities.button_macros = - ratbag_device_has_capability(lib_device, - RATBAG_DEVICE_CAP_BUTTON_MACROS); - device->capabilities.default_profile = - ratbag_device_has_capability(lib_device, - RATBAG_DEVICE_CAP_DEFAULT_PROFILE); - *out = device; device = NULL; return 0;