Axis events should now behave correctly when used with modifiers

This commit is contained in:
cyber-sushi 2024-04-19 13:07:52 +02:00
parent b0bf01c5cd
commit 150db1b8f2
2 changed files with 40 additions and 22 deletions

View file

@ -109,10 +109,10 @@ fn parse_raw_config(raw_config: RawConfig) -> (Bindings, Combinations, HashMap<S
mapped_modifiers.custom.extend(custom_modifiers); mapped_modifiers.custom.extend(custom_modifiers);
let abs = [ let abs = [
"DPAD_UP", "BTN_DPAD_UP",
"DPAD_DOWN", "BTN_DPAD_DOWN",
"DPAD_LEFT", "BTN_DPAD_LEFT",
"DPAD_RIGHT", "BTN_DPAD_RIGHT",
"LSTICK_UP", "LSTICK_UP",
"LSTICK_DOWN", "LSTICK_DOWN",
"LSTICK_LEFT", "LSTICK_LEFT",
@ -213,7 +213,7 @@ fn merge_axis_bindings(mut bindings: Bindings) -> Bindings {
pad_y.extend(bindings.axis.get("BTN_DPAD_DOWN") pad_y.extend(bindings.axis.get("BTN_DPAD_DOWN")
.unwrap_or(&Vec::new())); .unwrap_or(&Vec::new()));
bindings.axis.insert("BTN_DPAD_X".to_string(), pad_x); 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<Key> = bindings.axis.get("LSTICK_LEFT") let mut lstick_x: Vec<Key> = bindings.axis.get("LSTICK_LEFT")
.unwrap_or(&Vec::new()).clone(); .unwrap_or(&Vec::new()).clone();

View file

@ -104,6 +104,8 @@ impl EventReader {
pub async fn event_loop(&self) { pub async fn event_loop(&self) {
let mut lstick_values = HashMap::from([("x", 0), ("y", 0)]); let mut lstick_values = HashMap::from([("x", 0), ("y", 0)]);
let mut rstick_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; let mut stream = self.stream.lock().await;
while let Some(Ok(event)) = stream.next().await { while let Some(Ok(event)) = stream.next().await {
match (event.event_type(), RelativeAxisType(event.code()), AbsoluteAxisType(event.code())) { match (event.event_type(), RelativeAxisType(event.code()), AbsoluteAxisType(event.code())) {
@ -236,13 +238,23 @@ impl EventReader {
}, },
(EventType::ABSOLUTE, _, AbsoluteAxisType::ABS_Z) => { (EventType::ABSOLUTE, _, AbsoluteAxisType::ABS_Z) => {
let clamped_value = if event.value() > 0 { 1 } else { 0 }; let clamped_value = if event.value() > 0 { 1 } else { 0 };
let clamped_event = InputEvent::new_now(event.event_type(), event.code(), clamped_value); if clamped_value == 1 && ltrigger_value == 0 {
self.convert_axis_events(clamped_event, &"BTN_TL2".to_string(), false).await; 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) => { (EventType::ABSOLUTE, _, AbsoluteAxisType::ABS_RZ) => {
let clamped_value = if event.value() > 0 { 1 } else { 0 }; let clamped_value = if event.value() > 0 { 1 } else { 0 };
let clamped_event = InputEvent::new_now(event.event_type(), event.code(), clamped_value); if clamped_value == 1 && rtrigger_value == 0 {
self.convert_axis_events(clamped_event, &"BTN_TR2".to_string(), false).await; 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;} _ => {self.emit_default_event(event).await;}
} }
@ -260,7 +272,8 @@ impl EventReader {
self.emit_event_without_modifiers(event_list, &modifiers, event.value()).await; self.emit_event_without_modifiers(event_list, &modifiers, event.value()).await;
return 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 let Some(command_list) = command_hashmap.get(&modifiers) {
if event.value() == 1 {self.spawn_subprocess(command_list).await}; if event.value() == 1 {self.spawn_subprocess(command_list).await};
return return
@ -268,11 +281,13 @@ impl EventReader {
} }
if let Some(event_list) = path.bindings.keys.get(&Key(event.code())) { if let Some(event_list) = path.bindings.keys.get(&Key(event.code())) {
self.emit_event(event_list, event.value()).await; self.emit_event(event_list, event.value()).await;
} else if let Some(command_list) = path.bindings.keys_sh.get(&Key(event.code())) { return
if event.value() == 1 {self.spawn_subprocess(command_list).await};
} else {
self.emit_default_event(event).await;
} }
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) { 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(); let modifiers = self.modifiers.lock().await.clone();
if let Some(event_hashmap) = path.combinations.axis.get(event_string) { if let Some(event_hashmap) = path.combinations.axis.get(event_string) {
if let Some(event_list) = event_hashmap.get(&modifiers) { 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 { if send_zero {
self.emit_event_without_modifiers(event_list, &modifiers, 0).await; self.emit_event_without_modifiers(event_list, &modifiers, 0).await;
} }
return 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 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 return
} }
} }
if let Some(event_list) = path.bindings.axis.get(event_string) { 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 { if send_zero {
self.emit_event_without_modifiers(event_list, &modifiers, 0).await; self.emit_event_without_modifiers(event_list, &modifiers, 0).await;
} }
} else if let Some(command_list) = path.bindings.axis_sh.get(event_string) { return
if event.value() == 1 {self.spawn_subprocess(command_list).await};
} else {
self.emit_default_event(event).await;
} }
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<Key>, value: i32) { async fn emit_event(&self, event_list: &Vec<Key>, value: i32) {