From 150db1b8f20e3ecd908b1e5ff31567fbf7616b1c Mon Sep 17 00:00:00 2001 From: cyber-sushi Date: Fri, 19 Apr 2024 13:07:52 +0200 Subject: [PATCH] Axis events should now behave correctly when used with modifiers --- src/config.rs | 10 ++++----- src/event_reader.rs | 52 ++++++++++++++++++++++++++++++--------------- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/config.rs b/src/config.rs index a18aa97..0472cc6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -109,10 +109,10 @@ fn parse_raw_config(raw_config: RawConfig) -> (Bindings, Combinations, HashMap Bindings { pad_y.extend(bindings.axis.get("BTN_DPAD_DOWN") .unwrap_or(&Vec::new())); bindings.axis.insert("BTN_DPAD_X".to_string(), pad_x); - bindings.axis.insert("BTN_DPAD_y".to_string(), pad_y); + bindings.axis.insert("BTN_DPAD_Y".to_string(), pad_y); let mut lstick_x: Vec = bindings.axis.get("LSTICK_LEFT") .unwrap_or(&Vec::new()).clone(); diff --git a/src/event_reader.rs b/src/event_reader.rs index 1086def..28daf46 100644 --- a/src/event_reader.rs +++ b/src/event_reader.rs @@ -104,6 +104,8 @@ impl EventReader { pub async fn event_loop(&self) { let mut lstick_values = HashMap::from([("x", 0), ("y", 0)]); let mut rstick_values = HashMap::from([("x", 0), ("y", 0)]); + let mut ltrigger_value = 0; + let mut rtrigger_value = 0; let mut stream = self.stream.lock().await; while let Some(Ok(event)) = stream.next().await { match (event.event_type(), RelativeAxisType(event.code()), AbsoluteAxisType(event.code())) { @@ -236,13 +238,23 @@ impl EventReader { }, (EventType::ABSOLUTE, _, AbsoluteAxisType::ABS_Z) => { let clamped_value = if event.value() > 0 { 1 } else { 0 }; - let clamped_event = InputEvent::new_now(event.event_type(), event.code(), clamped_value); - self.convert_axis_events(clamped_event, &"BTN_TL2".to_string(), false).await; + if clamped_value == 1 && ltrigger_value == 0 { + ltrigger_value = 1; + let clamped_event = InputEvent::new_now(event.event_type(), event.code(), clamped_value); + self.convert_axis_events(clamped_event, &"BTN_TL2".to_string(), false).await; + } else if clamped_value == 0 { + ltrigger_value = 0; + } }, (EventType::ABSOLUTE, _, AbsoluteAxisType::ABS_RZ) => { let clamped_value = if event.value() > 0 { 1 } else { 0 }; - let clamped_event = InputEvent::new_now(event.event_type(), event.code(), clamped_value); - self.convert_axis_events(clamped_event, &"BTN_TR2".to_string(), false).await; + if clamped_value == 1 && rtrigger_value == 0 { + rtrigger_value = 1; + let clamped_event = InputEvent::new_now(event.event_type(), event.code(), clamped_value); + self.convert_axis_events(clamped_event, &"BTN_TR2".to_string(), false).await; + } else if clamped_value == 0 { + rtrigger_value = 0; + } }, _ => {self.emit_default_event(event).await;} } @@ -260,7 +272,8 @@ impl EventReader { self.emit_event_without_modifiers(event_list, &modifiers, event.value()).await; return } - } else if let Some(command_hashmap) = path.combinations.keys_sh.get(&Key(event.code())) { + } + if let Some(command_hashmap) = path.combinations.keys_sh.get(&Key(event.code())) { if let Some(command_list) = command_hashmap.get(&modifiers) { if event.value() == 1 {self.spawn_subprocess(command_list).await}; return @@ -268,11 +281,13 @@ impl EventReader { } if let Some(event_list) = path.bindings.keys.get(&Key(event.code())) { self.emit_event(event_list, event.value()).await; - } else if let Some(command_list) = path.bindings.keys_sh.get(&Key(event.code())) { - if event.value() == 1 {self.spawn_subprocess(command_list).await}; - } else { - self.emit_default_event(event).await; + return } + if let Some(command_list) = path.bindings.keys_sh.get(&Key(event.code())) { + if event.value() == 1 {self.spawn_subprocess(command_list).await}; + return + } + self.emit_default_event(event).await; } async fn convert_axis_events(&self, event: InputEvent, event_string: &String, send_zero: bool) { @@ -280,28 +295,31 @@ impl EventReader { let modifiers = self.modifiers.lock().await.clone(); if let Some(event_hashmap) = path.combinations.axis.get(event_string) { if let Some(event_list) = event_hashmap.get(&modifiers) { - self.emit_event_without_modifiers(event_list, &modifiers, event.value()).await; + self.emit_event_without_modifiers(event_list, &modifiers, event.value().abs()).await; if send_zero { self.emit_event_without_modifiers(event_list, &modifiers, 0).await; } return } - } else if let Some(command_hashmap) = path.combinations.axis_sh.get(event_string) { + } + if let Some(command_hashmap) = path.combinations.axis_sh.get(event_string) { if let Some(command_list) = command_hashmap.get(&modifiers) { - if event.value() == 1 {self.spawn_subprocess(command_list).await}; + if event.value().abs() == 1 {self.spawn_subprocess(command_list).await}; return } } if let Some(event_list) = path.bindings.axis.get(event_string) { - self.emit_event(event_list, event.value()).await; + self.emit_event(event_list, event.value().abs()).await; if send_zero { self.emit_event_without_modifiers(event_list, &modifiers, 0).await; } - } else if let Some(command_list) = path.bindings.axis_sh.get(event_string) { - if event.value() == 1 {self.spawn_subprocess(command_list).await}; - } else { - self.emit_default_event(event).await; + return } + if let Some(command_list) = path.bindings.axis_sh.get(event_string) { + if event.value().abs() == 1 {self.spawn_subprocess(command_list).await}; + return + } + self.emit_default_event(event).await; } async fn emit_event(&self, event_list: &Vec, value: i32) {