diff options
Diffstat (limited to 'backends/evdev.c')
-rw-r--r-- | backends/evdev.c | 81 |
1 files changed, 42 insertions, 39 deletions
diff --git a/backends/evdev.c b/backends/evdev.c index d2eeba8..4725ef7 100644 --- a/backends/evdev.c +++ b/backends/evdev.c @@ -1,3 +1,5 @@ +#define BACKEND_NAME "evdev" + #include <fcntl.h> #include <stdio.h> #include <errno.h> @@ -16,8 +18,6 @@ #include "midimonster.h" #include "evdev.h" -#define BACKEND_NAME "evdev" - static struct { uint8_t detect; } evdev_config = { @@ -38,12 +38,12 @@ MM_PLUGIN_API int init(){ }; if(sizeof(evdev_channel_ident) != sizeof(uint64_t)){ - fprintf(stderr, "evdev channel identification union out of bounds\n"); + LOG("Channel identification union out of bounds"); return 1; } if(mm_backend_register(evdev)){ - fprintf(stderr, "Failed to register evdev backend\n"); + LOG("Failed to register backend"); return 1; } @@ -59,7 +59,7 @@ static int evdev_configure(char* option, char* value) { return 0; } - fprintf(stderr, "Unknown configuration option %s for evdev backend\n", option); + LOGPF("Unknown backend configuration option %s", option); return 1; } @@ -71,7 +71,7 @@ static instance* evdev_instance(){ evdev_instance_data* data = calloc(1, sizeof(evdev_instance_data)); if(!data){ - fprintf(stderr, "Failed to allocate memory\n"); + LOG("Failed to allocate memory"); return NULL; } @@ -79,7 +79,7 @@ static instance* evdev_instance(){ #ifndef EVDEV_NO_UINPUT data->output_proto = libevdev_new(); if(!data->output_proto){ - fprintf(stderr, "Failed to initialize libevdev output prototype device\n"); + LOG("Failed to initialize libevdev output prototype device"); free(data); return NULL; } @@ -91,25 +91,25 @@ static instance* evdev_instance(){ static int evdev_attach(instance* inst, evdev_instance_data* data, char* node){ if(data->input_fd >= 0){ - fprintf(stderr, "Instance %s already was assigned an input device\n", inst->name); + LOGPF("Instance %s already assigned an input device", inst->name); return 1; } data->input_fd = open(node, O_RDONLY | O_NONBLOCK); if(data->input_fd < 0){ - fprintf(stderr, "Failed to open evdev input device node %s: %s\n", node, strerror(errno)); + LOGPF("Failed to open input device node %s: %s", node, strerror(errno)); return 1; } if(libevdev_new_from_fd(data->input_fd, &data->input_ev)){ - fprintf(stderr, "Failed to initialize libevdev for %s\n", node); + LOGPF("Failed to initialize libevdev for %s", node); close(data->input_fd); data->input_fd = -1; return 1; } if(data->exclusive && libevdev_grab(data->input_ev, LIBEVDEV_GRAB)){ - fprintf(stderr, "Failed to obtain exclusive device access on %s\n", node); + LOGPF("Failed to obtain exclusive device access on %s", node); } return 0; @@ -123,7 +123,7 @@ static char* evdev_find(char* name){ char device_name[UINPUT_MAX_NAME_SIZE], *result = NULL; if(!nodes){ - fprintf(stderr, "Failed to query input device nodes in %s: %s", INPUT_NODES, strerror(errno)); + LOGPF("Failed to query input device nodes in %s: %s", INPUT_NODES, strerror(errno)); return NULL; } @@ -133,12 +133,12 @@ static char* evdev_find(char* name){ fd = open(file_path, O_RDONLY); if(fd < 0){ - fprintf(stderr, "Failed to access %s: %s\n", file_path, strerror(errno)); + LOGPF("Failed to access %s: %s", file_path, strerror(errno)); continue; } if(ioctl(fd, EVIOCGNAME(sizeof(device_name)), device_name) < 0){ - fprintf(stderr, "Failed to read name for %s: %s\n", file_path, strerror(errno)); + LOGPF("Failed to read name for %s: %s", file_path, strerror(errno)); close(fd); continue; } @@ -146,7 +146,7 @@ static char* evdev_find(char* name){ close(fd); if(!strncmp(device_name, name, strlen(name))){ - fprintf(stderr, "Matched name %s for %s: %s\n", device_name, name, file_path); + LOGPF("Matched name %s for %s: %s", device_name, name, file_path); break; } } @@ -178,7 +178,7 @@ static int evdev_configure_instance(instance* inst, char* option, char* value) { else if(!strcmp(option, "input")){ next_token = evdev_find(value); if(!next_token){ - fprintf(stderr, "Failed to find evdev input device with name %s for instance %s\n", value, inst->name); + LOGPF("Failed to match input device with name %s for instance %s", value, inst->name); return 1; } if(evdev_attach(inst, data, next_token)){ @@ -190,7 +190,7 @@ static int evdev_configure_instance(instance* inst, char* option, char* value) { } else if(!strcmp(option, "exclusive")){ if(data->input_fd >= 0 && libevdev_grab(data->input_ev, LIBEVDEV_GRAB)){ - fprintf(stderr, "Failed to obtain exclusive device access on %s\n", inst->name); + LOGPF("Failed to obtain exclusive device access on %s", inst->name); } data->exclusive = 1; return 0; @@ -198,7 +198,7 @@ static int evdev_configure_instance(instance* inst, char* option, char* value) { else if(!strncmp(option, "relaxis.", 8)){ data->relative_axis = realloc(data->relative_axis, (data->relative_axes + 1) * sizeof(evdev_relaxis_config)); if(!data->relative_axis){ - fprintf(stderr, "Failed to allocate memory\n"); + LOG("Failed to allocate memory"); return 1; } data->relative_axis[data->relative_axes].inverted = 0; @@ -208,9 +208,12 @@ static int evdev_configure_instance(instance* inst, char* option, char* value) { data->relative_axis[data->relative_axes].max *= -1; data->relative_axis[data->relative_axes].inverted = 1; } + else if(data->relative_axis[data->relative_axes].max == 0){ + LOGPF("Relative axis configuration for %s.%s has invalid range", inst->name, option + 8); + } data->relative_axis[data->relative_axes].current = strtoul(next_token, NULL, 0); if(data->relative_axis[data->relative_axes].code < 0){ - fprintf(stderr, "Failed to configure relative axis extents for %s.%s\n", inst->name, option + 8); + LOGPF("Failed to configure relative axis extents for %s.%s", inst->name, option + 8); return 1; } data->relative_axes++; @@ -239,13 +242,13 @@ static int evdev_configure_instance(instance* inst, char* option, char* value) { abs_info.flat = strtol(next_token, &next_token, 0); abs_info.resolution = strtol(next_token, &next_token, 0); if(libevdev_enable_event_code(data->output_proto, EV_ABS, libevdev_event_code_from_name(EV_ABS, option + 5), &abs_info)){ - fprintf(stderr, "Failed to enable absolute axis %s for output\n", option + 5); + LOGPF("Failed to enable absolute axis %s.%s for output", inst->name, option + 5); return 1; } return 0; } #endif - fprintf(stderr, "Unknown instance configuration parameter %s for evdev instance %s\n", option, inst->name); + LOGPF("Unknown instance configuration parameter %s for instance %s", option, inst->name); return 1; } @@ -259,14 +262,14 @@ static channel* evdev_channel(instance* inst, char* spec, uint8_t flags){ }; if(!separator){ - fprintf(stderr, "Invalid evdev channel specification %s\n", spec); + LOGPF("Invalid channel specification %s", spec); return NULL; } *(separator++) = 0; if(libevdev_event_type_from_name(spec) < 0){ - fprintf(stderr, "Invalid evdev type specification: %s", spec); + LOGPF("Invalid type specification: %s", spec); return NULL; } ident.fields.type = libevdev_event_type_from_name(spec); @@ -275,7 +278,7 @@ static channel* evdev_channel(instance* inst, char* spec, uint8_t flags){ ident.fields.code = libevdev_event_code_from_name(ident.fields.type, separator); } else{ - fprintf(stderr, "evdev Code name not recognized, using as number: %s\n", separator); + LOGPF("Code name not recognized, using as number: %s.%s", inst->name, separator); ident.fields.code = strtoul(separator, NULL, 10); } @@ -285,7 +288,7 @@ static channel* evdev_channel(instance* inst, char* spec, uint8_t flags){ //enable the event on the device //the previous check is necessary to not fail while enabling axes, which require additional information if(libevdev_enable_event_code(data->output_proto, ident.fields.type, ident.fields.code, NULL)){ - fprintf(stderr, "Failed to enable output event %s.%s%s\n", + LOGPF("Failed to enable output event %s.%s%s", libevdev_event_type_get_name(ident.fields.type), libevdev_event_code_get_name(ident.fields.type, ident.fields.code), (ident.fields.type == EV_ABS) ? ": To output absolute axes, specify their details in the configuration":""); @@ -339,13 +342,13 @@ static int evdev_push_event(instance* inst, evdev_instance_data* data, struct in } if(mm_channel_event(chan, val)){ - fprintf(stderr, "Failed to push evdev channel event to core\n"); + LOG("Failed to push channel event to core"); return 1; } } if(evdev_config.detect){ - fprintf(stderr, "Incoming evdev data for channel %s.%s.%s\n", inst->name, libevdev_event_type_get_name(event.type), libevdev_event_code_get_name(event.type, event.code)); + LOGPF("Incoming data for channel %s.%s.%s", inst->name, libevdev_event_type_get_name(event.type), libevdev_event_code_get_name(event.type, event.code)); } return 0; @@ -366,7 +369,7 @@ static int evdev_handle(size_t num, managed_fd* fds){ for(fd = 0; fd < num; fd++){ inst = (instance*) fds[fd].impl; if(!inst){ - fprintf(stderr, "evdev backend signaled for unknown fd\n"); + LOG("Signaled for unknown FD"); continue; } @@ -403,29 +406,29 @@ static int evdev_start(size_t n, instance** inst){ #ifndef EVDEV_NO_UINPUT if(data->output_enabled){ if(libevdev_uinput_create_from_device(data->output_proto, LIBEVDEV_UINPUT_OPEN_MANAGED, &data->output_ev)){ - fprintf(stderr, "Failed to create evdev output device: %s\n", strerror(errno)); + LOGPF("Failed to create output device: %s", strerror(errno)); return 1; } - fprintf(stderr, "Created device node %s for instance %s\n", libevdev_uinput_get_devnode(data->output_ev), inst[u]->name); + LOGPF("Created device node %s for instance %s", libevdev_uinput_get_devnode(data->output_ev), inst[u]->name); } #endif inst[u]->ident = data->input_fd; if(data->input_fd >= 0){ if(mm_manage_fd(data->input_fd, BACKEND_NAME, 1, inst[u])){ - fprintf(stderr, "Failed to register event input descriptor for instance %s\n", inst[u]->name); + LOGPF("Failed to register input descriptor for instance %s", inst[u]->name); return 1; } fds++; } if(data->input_fd <= 0 && !data->output_ev){ - fprintf(stderr, "Instance %s has neither input nor output device set up\n", inst[u]->name); + LOGPF("Instance %s has neither input nor output device set up", inst[u]->name); } } - fprintf(stderr, "evdev backend registered %zu descriptors to core\n", fds); + LOGPF("Registered %zu descriptors to core", fds); return 0; } @@ -444,7 +447,7 @@ static int evdev_set(instance* inst, size_t num, channel** c, channel_value* v) } if(!data->output_enabled){ - fprintf(stderr, "Instance %s not enabled for output\n", inst->name); + LOGPF("Instance %s not enabled for output (%" PRIsize_t " channel events)", inst->name, num); return 0; } @@ -480,20 +483,20 @@ static int evdev_set(instance* inst, size_t num, channel** c, channel_value* v) } if(libevdev_uinput_write_event(data->output_ev, ident.fields.type, ident.fields.code, value)){ - fprintf(stderr, "Failed to output event on instance %s\n", inst->name); + LOGPF("Failed to output event on instance %s", inst->name); return 1; } } //send syn event to publish all events if(libevdev_uinput_write_event(data->output_ev, EV_SYN, SYN_REPORT, 0)){ - fprintf(stderr, "Failed to output sync event on instance %s\n", inst->name); + LOGPF("Failed to output sync event on instance %s", inst->name); return 1; } return 0; #else - fprintf(stderr, "The evdev backend does not support output on this platform\n"); + LOG("No output support on this platform"); return 1; #endif } @@ -519,9 +522,9 @@ static int evdev_shutdown(size_t n, instance** inst){ #endif data->relative_axes = 0; free(data->relative_axis); - free(data); + free(inst[u]->impl); } - fprintf(stderr, "evdev backend shut down\n"); + LOG("Backend shut down"); return 0; } |