aboutsummaryrefslogtreecommitdiffhomepage
path: root/backends/evdev.c
diff options
context:
space:
mode:
authorcbdev <cb@cbcdn.com>2019-08-01 20:54:17 +0200
committercbdev <cb@cbcdn.com>2019-08-01 20:54:17 +0200
commita23ce7718ab61e73586d2738329d6bbace0b764b (patch)
treeaf922cd4801b299067d0b871b687de6474a4d4e6 /backends/evdev.c
parent4e604b493e0dc855b6ea6978e5cf8e2de5d2b8d5 (diff)
downloadmidimonster-a23ce7718ab61e73586d2738329d6bbace0b764b.tar.gz
midimonster-a23ce7718ab61e73586d2738329d6bbace0b764b.tar.bz2
midimonster-a23ce7718ab61e73586d2738329d6bbace0b764b.zip
Implement evdev relative axis inversion
Diffstat (limited to 'backends/evdev.c')
-rw-r--r--backends/evdev.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/backends/evdev.c b/backends/evdev.c
index 565eb17..7a7913d 100644
--- a/backends/evdev.c
+++ b/backends/evdev.c
@@ -205,8 +205,13 @@ static int evdev_configure_instance(instance* inst, char* option, char* value) {
fprintf(stderr, "Failed to allocate memory\n");
return 1;
}
+ data->relative_axis[data->relative_axes].inverted = 0;
data->relative_axis[data->relative_axes].code = libevdev_event_code_from_name(EV_REL, option + 8);
- data->relative_axis[data->relative_axes].max = strtoul(value, &next_token, 0);
+ data->relative_axis[data->relative_axes].max = strtoll(value, &next_token, 0);
+ if(data->relative_axis[data->relative_axes].max < 0){
+ data->relative_axis[data->relative_axes].max *= -1;
+ data->relative_axis[data->relative_axes].inverted = 1;
+ }
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);
@@ -313,6 +318,9 @@ static int evdev_push_event(instance* inst, evdev_instance_data* data, struct in
case EV_REL:
for(axis = 0; axis < data->relative_axes; axis++){
if(data->relative_axis[axis].code == event.code){
+ if(data->relative_axis[axis].inverted){
+ event.value *= -1;
+ }
data->relative_axis[axis].current = clamp(data->relative_axis[axis].current + event.value, data->relative_axis[axis].max, 0);
val.normalised = (double) data->relative_axis[axis].current / (double) data->relative_axis[axis].max;
break;
@@ -374,6 +382,11 @@ static int evdev_handle(size_t num, managed_fd* fds){
read_flags = LIBEVDEV_READ_FLAG_SYNC;
}
+ //exclude synchronization events
+ if(ev.type == EV_SYN){
+ continue;
+ }
+
//handle event
if(evdev_push_event(inst, data, ev)){
return 1;