some mice have a per axis "sensitivity" control which adapts the hardware resolution without changing the DPI (looking at you Etekcity and Roccat). buttons need a couple of has_capability() functions to check which action types and actions are possible light support: - on/off - color - patterns some epollfd-like thing for the caller to check if events are available. Needed for notification when the mouse changes through someone else manipulating settings. This is on backburner for now, it'll make the library more complicated, require HID parsing in libratbag for relatively little benefit. The only advantage we really get out of it is that a configuration UI would be able to update itself if a user presses a button to e.g. change the profile while the UI is running. We should actually drop the "key" functionality in favor of macros: - either a device supports real hardware macro, then there is no point in having a special set of keys exported to the user space while the driver can just figure out which way is most efficient - if the device does not support macros, then all of the supported keys should be RATBAG_SPECIAL, so the UI can enumerate them and get a capability on the current button if it supports this particular action (example: the UI is interested in sending "Volume Up", not KEY_VOLUMEUP. Macro support: - enhance doctext - add API support for name/groups - revamp the API? - add command to set a macro in ratbag-command ratbag-command needs a revamp of the arguments into a tree type, e.g. instead of switch-dpi something like "ratbag command resolution set" decide on a stable set of arguments, build the installed version of the command with that set, add a set of debug arguments (e.g. the etekcity-specific ones) only available in the build. interactive shell mode for ratbag-command? dbus proxy - allows parallel access to the devices without interference, and provides a single instance for root permissions. python bindings - depends on the dbus decision, python bindings could be wrappers around libratbag itself, or a wrapper around the dbus protocol to speak to the dbus daemon