Order mapping entries precedence based on number of modifiers (#262)

* Order mapping entries precedence based on number of modifiers

* Fix format

* Rename variables

* More renaming
This commit is contained in:
TrueDoctor 2021-07-15 00:40:37 +02:00 committed by Keavon Chambers
parent e0f049ab00
commit f7e5dd1a4f
2 changed files with 33 additions and 11 deletions

View File

@ -61,8 +61,8 @@ impl Default for KeyMappingEntries {
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
struct Mapping { struct Mapping {
up: [KeyMappingEntries; NUMBER_OF_KEYS], key_up: [KeyMappingEntries; NUMBER_OF_KEYS],
down: [KeyMappingEntries; NUMBER_OF_KEYS], key_down: [KeyMappingEntries; NUMBER_OF_KEYS],
pointer_move: KeyMappingEntries, pointer_move: KeyMappingEntries,
mouse_scroll: KeyMappingEntries, mouse_scroll: KeyMappingEntries,
} }
@ -91,26 +91,26 @@ macro_rules! entry {
macro_rules! mapping { macro_rules! mapping {
//[$(<action=$action:expr; message=$key:expr; $(modifiers=[$($m:ident),* $(,)?];)?>)*] => {{ //[$(<action=$action:expr; message=$key:expr; $(modifiers=[$($m:ident),* $(,)?];)?>)*] => {{
[$($entry:expr),* $(,)?] => {{ [$($entry:expr),* $(,)?] => {{
let mut up = KeyMappingEntries::key_array(); let mut key_up = KeyMappingEntries::key_array();
let mut down = KeyMappingEntries::key_array(); let mut key_down = KeyMappingEntries::key_array();
let mut pointer_move: KeyMappingEntries = Default::default(); let mut pointer_move: KeyMappingEntries = Default::default();
let mut mouse_scroll: KeyMappingEntries = Default::default(); let mut mouse_scroll: KeyMappingEntries = Default::default();
$( $(
let arr = match $entry.trigger { let arr = match $entry.trigger {
InputMapperMessage::KeyDown(key) => &mut down[key as usize], InputMapperMessage::KeyDown(key) => &mut key_down[key as usize],
InputMapperMessage::KeyUp(key) => &mut up[key as usize], InputMapperMessage::KeyUp(key) => &mut key_up[key as usize],
InputMapperMessage::PointerMove => &mut pointer_move, InputMapperMessage::PointerMove => &mut pointer_move,
InputMapperMessage::MouseScroll => &mut mouse_scroll, InputMapperMessage::MouseScroll => &mut mouse_scroll,
}; };
arr.push($entry); arr.push($entry);
)* )*
(up, down, pointer_move, mouse_scroll) (key_up, key_down, pointer_move, mouse_scroll)
}}; }};
} }
impl Default for Mapping { impl Default for Mapping {
fn default() -> Self { fn default() -> Self {
let (up, down, pointer_move, mouse_scroll) = mapping![ let mappings = mapping![
entry! {action=DocumentMessage::PasteLayers, key_down=KeyV, modifiers=[KeyControl]}, entry! {action=DocumentMessage::PasteLayers, key_down=KeyV, modifiers=[KeyControl]},
entry! {action=DocumentMessage::EnableSnapping, key_down=KeyShift}, entry! {action=DocumentMessage::EnableSnapping, key_down=KeyShift},
entry! {action=DocumentMessage::DisableSnapping, key_up=KeyShift}, entry! {action=DocumentMessage::DisableSnapping, key_up=KeyShift},
@ -238,7 +238,22 @@ impl Default for Mapping {
entry! {action=GlobalMessage::LogDebug, key_down=Key2}, entry! {action=GlobalMessage::LogDebug, key_down=Key2},
entry! {action=GlobalMessage::LogTrace, key_down=Key3}, entry! {action=GlobalMessage::LogTrace, key_down=Key3},
]; ];
Self { up, down, pointer_move, mouse_scroll }
let (mut key_up, mut key_down, mut pointer_move, mut mouse_scroll) = mappings;
let sort = |list: &mut KeyMappingEntries| list.0.sort_by(|u, v| v.modifiers.ones().cmp(&u.modifiers.ones()));
for list in [&mut key_up, &mut key_down] {
for sublist in list {
sort(sublist);
}
}
sort(&mut pointer_move);
sort(&mut mouse_scroll);
Self {
key_up,
key_down,
pointer_move,
mouse_scroll,
}
} }
} }
@ -246,8 +261,8 @@ impl Mapping {
fn match_message(&self, message: InputMapperMessage, keys: &KeyStates, actions: ActionList) -> Option<Message> { fn match_message(&self, message: InputMapperMessage, keys: &KeyStates, actions: ActionList) -> Option<Message> {
use InputMapperMessage::*; use InputMapperMessage::*;
let list = match message { let list = match message {
KeyDown(key) => &self.down[key as usize], KeyDown(key) => &self.key_down[key as usize],
KeyUp(key) => &self.up[key as usize], KeyUp(key) => &self.key_up[key as usize],
PointerMove => &self.pointer_move, PointerMove => &self.pointer_move,
MouseScroll => &self.mouse_scroll, MouseScroll => &self.mouse_scroll,
}; };

View File

@ -116,6 +116,13 @@ impl<const LENGTH: usize> BitVector<LENGTH> {
} }
result == 0 result == 0
} }
pub fn ones(&self) -> u32 {
let mut result = 0;
for storage in self.0.iter() {
result += storage.count_ones();
}
result
}
} }
impl<const LENGTH: usize> Default for BitVector<LENGTH> { impl<const LENGTH: usize> Default for BitVector<LENGTH> {