usb_device_detection+main: Added hooks on basestation state change
A script will now run whenever the basesation is plugged/unplugged.
This commit is contained in:
parent
64d2566649
commit
ca74d51f05
3 changed files with 93 additions and 3 deletions
80
main.c
80
main.c
|
@ -1,5 +1,10 @@
|
||||||
|
// This is for asprintf support.
|
||||||
|
// TODO: Don't use asprintf and remove this.
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <libusb-1.0/libusb.h>
|
#include <libusb-1.0/libusb.h>
|
||||||
|
|
||||||
|
@ -21,6 +26,77 @@ static char const* const DEFAULT_MOTION_SENSOR =
|
||||||
static uint16_t const BASESTATION_VENDOR_ID = 0x048d;
|
static uint16_t const BASESTATION_VENDOR_ID = 0x048d;
|
||||||
static uint16_t const BASESTATION_PRODUCT_ID = 0x8911;
|
static uint16_t const BASESTATION_PRODUCT_ID = 0x8911;
|
||||||
|
|
||||||
|
static char* get_hook_path(char const* const hook_name)
|
||||||
|
{
|
||||||
|
char* path;
|
||||||
|
char* xdg_config_dir = getenv("XDG_CONFIG_HOME");
|
||||||
|
if (xdg_config_dir)
|
||||||
|
asprintf(&path, "%s/miix-wlr/hooks/%s-hook", xdg_config_dir, hook_name);
|
||||||
|
else
|
||||||
|
asprintf(&path,
|
||||||
|
"%s/.config/miix-wlr/hooks/%s-hook",
|
||||||
|
getenv("HOME"),
|
||||||
|
hook_name);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void on_basestation_connected()
|
||||||
|
{
|
||||||
|
printf("Basestation connected\n");
|
||||||
|
|
||||||
|
char* hook_path = get_hook_path("basestation-connected");
|
||||||
|
|
||||||
|
if (access(hook_path, X_OK) != 0) {
|
||||||
|
fprintf(stderr, "Couldn't read or execute hook at %s\n", hook_path);
|
||||||
|
free(hook_path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
|
||||||
|
if (pid < 0) {
|
||||||
|
// Error
|
||||||
|
fprintf(stderr, "Unable to run hook script!\n");
|
||||||
|
perror("fork");
|
||||||
|
} else if (pid == 0) {
|
||||||
|
// In the child
|
||||||
|
char* argv[] = {hook_path, 0};
|
||||||
|
execve(hook_path, argv, environ);
|
||||||
|
exit(-1);
|
||||||
|
} else {
|
||||||
|
free(hook_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void on_basestation_disconnected()
|
||||||
|
{
|
||||||
|
printf("Basestation disconnected\n");
|
||||||
|
|
||||||
|
char* hook_path = get_hook_path("basestation-disconnected");
|
||||||
|
|
||||||
|
if (access(hook_path, X_OK) != 0) {
|
||||||
|
// Hook is innaccessible
|
||||||
|
fprintf(stderr, "Couldn't read or execute hook at %s\n", hook_path);
|
||||||
|
free(hook_path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
|
||||||
|
if (pid < 0) {
|
||||||
|
// Error
|
||||||
|
fprintf(stderr, "Unable to run hook script!\n");
|
||||||
|
perror("fork");
|
||||||
|
} else if (pid == 0) {
|
||||||
|
// In the child
|
||||||
|
char* argv[] = {hook_path, 0};
|
||||||
|
execve(hook_path, argv, environ);
|
||||||
|
exit(-1);
|
||||||
|
} else {
|
||||||
|
free(hook_path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static enum accel_rotation last_accel_rotation = ACCEL_ROTATION_NO_CHANGE;
|
static enum accel_rotation last_accel_rotation = ACCEL_ROTATION_NO_CHANGE;
|
||||||
|
|
||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
|
@ -35,6 +111,10 @@ int main(int, char**)
|
||||||
struct usb_detector* base_station_detector =
|
struct usb_detector* base_station_detector =
|
||||||
create_detector(BASESTATION_VENDOR_ID, BASESTATION_PRODUCT_ID);
|
create_detector(BASESTATION_VENDOR_ID, BASESTATION_PRODUCT_ID);
|
||||||
|
|
||||||
|
base_station_detector->on_connected = &on_basestation_connected;
|
||||||
|
base_station_detector->on_disconnected = &on_basestation_disconnected;
|
||||||
|
base_station_detector->has_hotplug_callbacks = true;
|
||||||
|
|
||||||
struct miix_wlr_state* state = miix_wlr_init();
|
struct miix_wlr_state* state = miix_wlr_init();
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
|
|
@ -10,11 +10,13 @@ int hotplug_callback(struct libusb_context*,
|
||||||
{
|
{
|
||||||
struct usb_detector* detector = user_data;
|
struct usb_detector* detector = user_data;
|
||||||
|
|
||||||
if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED)
|
if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED) {
|
||||||
detector->is_connected = true;
|
detector->is_connected = true;
|
||||||
else if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT)
|
if (detector->has_hotplug_callbacks) detector->on_connected();
|
||||||
|
} else if (event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT) {
|
||||||
detector->is_connected = false;
|
detector->is_connected = false;
|
||||||
else
|
if (detector->has_hotplug_callbacks) detector->on_disconnected();
|
||||||
|
} else
|
||||||
printf("Unexpected USB device event %d\n", event);
|
printf("Unexpected USB device event %d\n", event);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -49,6 +51,8 @@ struct usb_detector* create_detector(uint16_t vendor_id, uint16_t product_id)
|
||||||
detector->is_connected = false;
|
detector->is_connected = false;
|
||||||
detector->event_handler_should_exit = false;
|
detector->event_handler_should_exit = false;
|
||||||
|
|
||||||
|
detector->has_hotplug_callbacks = false;
|
||||||
|
|
||||||
if (libusb_hotplug_register_callback(detector->usb_context,
|
if (libusb_hotplug_register_callback(detector->usb_context,
|
||||||
LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |
|
LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED |
|
||||||
LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
|
LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
#include <libusb-1.0/libusb.h>
|
#include <libusb-1.0/libusb.h>
|
||||||
|
|
||||||
|
typedef void (*hotplug_callback_f)();
|
||||||
|
|
||||||
struct usb_detector {
|
struct usb_detector {
|
||||||
atomic_bool is_connected;
|
atomic_bool is_connected;
|
||||||
|
|
||||||
|
@ -14,6 +16,10 @@ struct usb_detector {
|
||||||
|
|
||||||
struct libusb_context* usb_context;
|
struct libusb_context* usb_context;
|
||||||
libusb_hotplug_callback_handle hotplug_handle;
|
libusb_hotplug_callback_handle hotplug_handle;
|
||||||
|
|
||||||
|
atomic_bool has_hotplug_callbacks;
|
||||||
|
hotplug_callback_f on_connected;
|
||||||
|
hotplug_callback_f on_disconnected;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct usb_detector* create_detector(uint16_t vendor_id, uint16_t product_id);
|
struct usb_detector* create_detector(uint16_t vendor_id, uint16_t product_id);
|
||||||
|
|
Loading…
Reference in a new issue