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);
let abs = [
"DPAD_UP",
"DPAD_DOWN",
"DPAD_LEFT",
"DPAD_RIGHT",
"BTN_DPAD_UP",
"BTN_DPAD_DOWN",
"BTN_DPAD_LEFT",
"BTN_DPAD_RIGHT",
"LSTICK_UP",
"LSTICK_DOWN",
"LSTICK_LEFT",
@ -213,7 +213,7 @@ fn merge_axis_bindings(mut bindings: Bindings) -> 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<Key> = bindings.axis.get("LSTICK_LEFT")
.unwrap_or(&Vec::new()).clone();

View file

@ -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<Key>, value: i32) {