Axis events should now behave correctly when used with modifiers
This commit is contained in:
parent
b0bf01c5cd
commit
150db1b8f2
2 changed files with 40 additions and 22 deletions
|
@ -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();
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue