From 9f3333c6237f53475731ff002d2b0f1d5a2517c7 Mon Sep 17 00:00:00 2001 From: Werner Sembach Date: Wed, 16 Dec 2020 16:38:26 +0100 Subject: [PATCH] Initial commit --- .gitignore | 1 + CMakeLists.txt | 3 + tuxedo-touchpad-switch.cpp | 114 +++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 tuxedo-touchpad-switch.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..84c048a --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..479762b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,3 @@ +project(tuxedo-touchpad-switch) +add_executable(tuxedo-touchpad-switch tuxedo-touchpad-switch.cpp) +target_link_libraries(tuxedo-touchpad-switch udev) diff --git a/tuxedo-touchpad-switch.cpp b/tuxedo-touchpad-switch.cpp new file mode 100644 index 0000000..6303359 --- /dev/null +++ b/tuxedo-touchpad-switch.cpp @@ -0,0 +1,114 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +const char *bus_str(int bus); + +static int get_touchpad_hidraw_devices(std::vector *devnodes) { + struct udev *udev_context = udev_new(); + if (!udev_context) { + perror("udev_new"); + return -1; + } + + struct udev_enumerate *hidraw_devices = udev_enumerate_new(udev_context); + if (!hidraw_devices) { + perror("udev_enumerate_new"); + udev_unref(udev_context); + return -1; + } + + if (udev_enumerate_add_match_subsystem(hidraw_devices, "hidraw") < 0) { + perror("udev_enumerate_add_match_subsystem"); + udev_enumerate_unref(hidraw_devices); + udev_unref(udev_context); + return -1; + } + + if (udev_enumerate_scan_devices(hidraw_devices) < 0) { + perror("udev_enumerate_scan_devices"); + udev_enumerate_unref(hidraw_devices); + udev_unref(udev_context); + return -1; + } + + struct udev_list_entry *hidraw_devices_iterator = udev_enumerate_get_list_entry(hidraw_devices); + if (!hidraw_devices_iterator) { + udev_enumerate_unref(hidraw_devices); + udev_unref(udev_context); + return -1; + } + struct udev_list_entry *hidraw_device_entry; + udev_list_entry_foreach(hidraw_device_entry, hidraw_devices_iterator) { + if (strstr(udev_list_entry_get_name(hidraw_device_entry), "i2c-UNIW0001")) { + struct udev_device *hidraw_device = udev_device_new_from_syspath(udev_context, udev_list_entry_get_name(hidraw_device_entry)); + if (!hidraw_device) { + perror("udev_device_new_from_syspath"); + continue; + } + + std::string devnode = udev_device_get_devnode(hidraw_device); + devnodes->push_back(devnode); + + udev_device_unref(hidraw_device); + } + } + + udev_enumerate_unref(hidraw_devices); + udev_unref(udev_context); + + return devnodes->size();; +} + +int main(int argc, char *argv[]) { + if (argc < 2) { + printf("Usage: %s \n", argv[0]); + return EXIT_SUCCESS; + } + + std::vector devnodes; + int touchpad_count = get_touchpad_hidraw_devices(&devnodes); + if (touchpad_count < 0) { + return EXIT_FAILURE; + } + if (touchpad_count == 0) { + printf("No compatible touchpads found.\n"); + return EXIT_SUCCESS; + } + + int result = EXIT_SUCCESS; + for (auto it = devnodes.begin(); it != devnodes.end(); ++it) { + int hidraw = open((*it).c_str(), O_RDWR|O_NONBLOCK); + if (hidraw < 0) { + perror("open"); + result = EXIT_FAILURE; + continue; + } + + char buffer[2] = {0x07, 0x03}; + if (argv[1][0] == 'd') { + buffer[1] = 0x00; + } + int result = ioctl(hidraw, HIDIOCSFEATURE(sizeof(buffer)/sizeof(buffer[0])), buffer); + if (result < 0) { + perror("ioctl"); + close(hidraw); + result = EXIT_FAILURE; + continue; + } + else { + printf("ioctl returned: %d\n", result); + } + + close(hidraw); + } + + return result; +}