/** * Copyright (c) 2025 favewa * SPDX-License-Identifier: BSD-3-Clause */ #pragma once #include #include typedef struct { int fd; uint8_t idx; char path[256]; } ratazana_device_t; typedef enum { RATAZANA_OK = 0, RATAZANA_ERROR_INVALID_ARG = -1, RATAZANA_ERROR_IO = -2, RATAZANA_ERROR_TIMEOUT = -3, RATAZANA_ERROR_NOT_FOUND = -4, RATAZANA_ERROR_PROTOCOL = -5, RATAZANA_ERROR_ACCESS = -6, } ratazana_result_t; typedef enum { HIDPP20, // mainly Logitech G-series gaming mice } protocol_t; typedef struct { unsigned int vendor_id; unsigned int product_id; unsigned int bus_type; char path[256]; // /dev/hidrawX path char name[256]; // human-readable name } ratazana_hid_device_t; typedef bool (*ratazana_device_matcher_t)(ratazana_hid_device_t *info); ratazana_result_t ratazana_hid_enumerate(ratazana_hid_device_t *out, ratazana_device_matcher_t matcher); ratazana_result_t ratazana_device_open(ratazana_device_t *restrict dev, const char *restrict path, uint8_t device_index); void ratazana_device_close(ratazana_device_t *dev); void ratazana_cleanup(ratazana_device_t *dev); const char *ratazana_strerror(ratazana_result_t result); [[gnu::format(printf, 1, 2)]] _Noreturn void ratazana_fatal(const char *fmt, ...);