diff --git a/libevdev/_clib.py b/libevdev/_clib.py index 12a916282b551a8ff31a3be234c056def217d347..839787491d116aaa57ef0ebf3565fccc299a29c0 100644 --- a/libevdev/_clib.py +++ b/libevdev/_clib.py @@ -143,6 +143,16 @@ class Libevdev(_LibraryWrapper): "argtypes": (c_uint, c_char_p,), "restype": c_int }, + # const char *libevdev_event_value_get_name(unsigned int type, unsigned int code, int value); + "libevdev_event_value_get_name": { + "argtypes": (c_uint, c_uint, c_int,), + "restype": c_char_p + }, + # int libevdev_event_value_from_name(unsigned int type, unsigned int code, const char *name); + "libevdev_event_value_from_name": { + "argtypes": (c_uint, c_uint, c_char_p,), + "restype": c_int + }, # const char *libevdev_property_get_name(unsigned int prop); "libevdev_property_get_name": { "argtypes": (c_uint,), @@ -644,17 +654,20 @@ class Libevdev(_LibraryWrapper): return m if m > -1 else None @classmethod - def event_to_name(cls, event_type, event_code=None): + def event_to_name(cls, event_type, event_code=None, event_value=None): """ :param event_type: the numerical event type value :param event_code: optional, the numerical event code value + :param event_value: optional, the numerical event value :return: the event code name if a code is given otherwise the event type name. - This function is the equivalent to ``libevdev_event_code_get_name()`` - and ``libevdev_event_type_get_name()`` + This function is the equivalent to ``libevdev_event_value_get_name()``, + ``libevdev_event_code_get_name()``, and ``libevdev_event_type_get_name()`` """ - if event_code is not None: + if event_code is not None and event_value is not None: + name = cls._event_value_get_name(event_type, event_code, event_value) + elif event_code is not None: name = cls._event_code_get_name(event_type, event_code) else: name = cls._event_type_get_name(event_type) @@ -663,17 +676,24 @@ class Libevdev(_LibraryWrapper): return name.decode("iso8859-1") @classmethod - def event_to_value(cls, event_type, event_code=None): + def event_to_value(cls, event_type, event_code=None, event_value=None): """ :param event_type: the event type as string :param event_code: optional, the event code as string + :param event_value: optional, the numerical event value :return: the event code value if a code is given otherwise the event type value. - This function is the equivalent to ``libevdev_event_code_from_name()`` - and ``libevdev_event_type_from_name()`` + This function is the equivalent to ``libevdev_event_value_from_name()``, + ``libevdev_event_code_from_name()`` and ``libevdev_event_type_from_name()`` """ - if event_code is not None: + if event_code is not None and event_value is not None: + if not isinstance(event_type, int): + event_type = cls.event_to_value(event_type) + v = cls._event_value_from_name(event_type, + event_code.encode("iso8859-1"), + event_value.encode("iso8859-1")) + elif event_code is not None: if not isinstance(event_type, int): event_type = cls.event_to_value(event_type) v = cls._event_code_from_name(event_type, event_code.encode("iso8859-1")) diff --git a/test/test_clib.py b/test/test_clib.py index 87125f9b8dacdadb6a0494329439ff26b52121d2..165a821d8870c7b8006cd672f60a8d99999316ed 100644 --- a/test/test_clib.py +++ b/test/test_clib.py @@ -76,6 +76,21 @@ class TestNameConversion(unittest.TestCase): with self.assertRaises(ctypes.ArgumentError): name = Libevdev.event_to_name(0, "foo") + def test_value_to_name(self): + name = Libevdev.event_to_name(3, 0x37, 0) + self.assertEqual(name, "MT_TOOL_FINGER") + + name = Libevdev.event_to_name(3, 0x37, 1) + self.assertEqual(name, "MT_TOOL_PEN") + + def test_value_to_name_invalid(self): + name = Libevdev.event_to_name(3, 0x37, 1000) + self.assertIsNone(name) + name = Libevdev.event_to_name(3, 0x37, -1) + self.assertIsNone(name) + with self.assertRaises(ctypes.ArgumentError): + name = Libevdev.event_to_name(0, "foo") + def test_type_to_value(self): v = Libevdev.event_to_value("EV_REL") self.assertEqual(v, 2)