add layout mappings for shift+key events

Signed-off-by: Sahil Yeole <sahilyeole93@gmail.com>
This commit is contained in:
Sahil Yeole 2023-11-07 23:44:26 +05:30
parent 03d280054b
commit d47ddac94c

View File

@ -254,55 +254,104 @@ pub mod service {
(enigo::Key::RightShift, evdev::Key::KEY_RIGHTSHIFT), (enigo::Key::RightShift, evdev::Key::KEY_RIGHTSHIFT),
]); ]);
static ref KEY_MAP_LAYOUT: HashMap<char, evdev::Key> = HashMap::from( static ref KEY_MAP_LAYOUT: HashMap<char, (evdev::Key, bool)> = HashMap::from(
[ [
('a', evdev::Key::KEY_A), ('a', (evdev::Key::KEY_A, false)),
('b', evdev::Key::KEY_B), ('b', (evdev::Key::KEY_B, false)),
('c', evdev::Key::KEY_C), ('c', (evdev::Key::KEY_C, false)),
('d', evdev::Key::KEY_D), ('d', (evdev::Key::KEY_D, false)),
('e', evdev::Key::KEY_E), ('e', (evdev::Key::KEY_E, false)),
('f', evdev::Key::KEY_F), ('f', (evdev::Key::KEY_F, false)),
('g', evdev::Key::KEY_G), ('g', (evdev::Key::KEY_G, false)),
('h', evdev::Key::KEY_H), ('h', (evdev::Key::KEY_H, false)),
('i', evdev::Key::KEY_I), ('i', (evdev::Key::KEY_I, false)),
('j', evdev::Key::KEY_J), ('j', (evdev::Key::KEY_J, false)),
('k', evdev::Key::KEY_K), ('k', (evdev::Key::KEY_K, false)),
('l', evdev::Key::KEY_L), ('l', (evdev::Key::KEY_L, false)),
('m', evdev::Key::KEY_M), ('m', (evdev::Key::KEY_M, false)),
('n', evdev::Key::KEY_N), ('n', (evdev::Key::KEY_N, false)),
('o', evdev::Key::KEY_O), ('o', (evdev::Key::KEY_O, false)),
('p', evdev::Key::KEY_P), ('p', (evdev::Key::KEY_P, false)),
('q', evdev::Key::KEY_Q), ('q', (evdev::Key::KEY_Q, false)),
('r', evdev::Key::KEY_R), ('r', (evdev::Key::KEY_R, false)),
('s', evdev::Key::KEY_S), ('s', (evdev::Key::KEY_S, false)),
('t', evdev::Key::KEY_T), ('t', (evdev::Key::KEY_T, false)),
('u', evdev::Key::KEY_U), ('u', (evdev::Key::KEY_U, false)),
('v', evdev::Key::KEY_V), ('v', (evdev::Key::KEY_V, false)),
('w', evdev::Key::KEY_W), ('w', (evdev::Key::KEY_W, false)),
('x', evdev::Key::KEY_X), ('x', (evdev::Key::KEY_X, false)),
('y', evdev::Key::KEY_Y), ('y', (evdev::Key::KEY_Y, false)),
('z', evdev::Key::KEY_Z), ('z', (evdev::Key::KEY_Z, false)),
('0', evdev::Key::KEY_0), ('0', (evdev::Key::KEY_0, false)),
('1', evdev::Key::KEY_1), ('1', (evdev::Key::KEY_1, false)),
('2', evdev::Key::KEY_2), ('2', (evdev::Key::KEY_2, false)),
('3', evdev::Key::KEY_3), ('3', (evdev::Key::KEY_3, false)),
('4', evdev::Key::KEY_4), ('4', (evdev::Key::KEY_4, false)),
('5', evdev::Key::KEY_5), ('5', (evdev::Key::KEY_5, false)),
('6', evdev::Key::KEY_6), ('6', (evdev::Key::KEY_6, false)),
('7', evdev::Key::KEY_7), ('7', (evdev::Key::KEY_7, false)),
('8', evdev::Key::KEY_8), ('8', (evdev::Key::KEY_8, false)),
('9', evdev::Key::KEY_9), ('9', (evdev::Key::KEY_9, false)),
('`', evdev::Key::KEY_GRAVE), ('`', (evdev::Key::KEY_GRAVE, false)),
('-', evdev::Key::KEY_MINUS), ('-', (evdev::Key::KEY_MINUS, false)),
('=', evdev::Key::KEY_EQUAL), ('=', (evdev::Key::KEY_EQUAL, false)),
('[', evdev::Key::KEY_LEFTBRACE), ('[', (evdev::Key::KEY_LEFTBRACE, false)),
(']', evdev::Key::KEY_RIGHTBRACE), (']', (evdev::Key::KEY_RIGHTBRACE, false)),
('\\', evdev::Key::KEY_BACKSLASH), ('\\', (evdev::Key::KEY_BACKSLASH, false)),
(',', evdev::Key::KEY_COMMA), (',', (evdev::Key::KEY_COMMA, false)),
('.', evdev::Key::KEY_DOT), ('.', (evdev::Key::KEY_DOT, false)),
('/', evdev::Key::KEY_SLASH), ('/', (evdev::Key::KEY_SLASH, false)),
(';', evdev::Key::KEY_SEMICOLON), (';', (evdev::Key::KEY_SEMICOLON, false)),
('\'', evdev::Key::KEY_APOSTROPHE), ('\'', (evdev::Key::KEY_APOSTROPHE, false)),
// Shift + key
('A', (evdev::Key::KEY_A, true)),
('B', (evdev::Key::KEY_B, true)),
('C', (evdev::Key::KEY_C, true)),
('D', (evdev::Key::KEY_D, true)),
('E', (evdev::Key::KEY_E, true)),
('F', (evdev::Key::KEY_F, true)),
('G', (evdev::Key::KEY_G, true)),
('H', (evdev::Key::KEY_H, true)),
('I', (evdev::Key::KEY_I, true)),
('J', (evdev::Key::KEY_J, true)),
('K', (evdev::Key::KEY_K, true)),
('L', (evdev::Key::KEY_L, true)),
('M', (evdev::Key::KEY_M, true)),
('N', (evdev::Key::KEY_N, true)),
('O', (evdev::Key::KEY_O, true)),
('P', (evdev::Key::KEY_P, true)),
('Q', (evdev::Key::KEY_Q, true)),
('R', (evdev::Key::KEY_R, true)),
('S', (evdev::Key::KEY_S, true)),
('T', (evdev::Key::KEY_T, true)),
('U', (evdev::Key::KEY_U, true)),
('V', (evdev::Key::KEY_V, true)),
('W', (evdev::Key::KEY_W, true)),
('X', (evdev::Key::KEY_X, true)),
('Y', (evdev::Key::KEY_Y, true)),
('Z', (evdev::Key::KEY_Z, true)),
(')', (evdev::Key::KEY_0, true)),
('!', (evdev::Key::KEY_1, true)),
('@', (evdev::Key::KEY_2, true)),
('#', (evdev::Key::KEY_3, true)),
('$', (evdev::Key::KEY_4, true)),
('%', (evdev::Key::KEY_5, true)),
('^', (evdev::Key::KEY_6, true)),
('&', (evdev::Key::KEY_7, true)),
('*', (evdev::Key::KEY_8, true)),
('(', (evdev::Key::KEY_9, true)),
('~', (evdev::Key::KEY_GRAVE, true)),
('_', (evdev::Key::KEY_MINUS, true)),
('+', (evdev::Key::KEY_EQUAL, true)),
('{', (evdev::Key::KEY_LEFTBRACE, true)),
('}', (evdev::Key::KEY_RIGHTBRACE, true)),
('|', (evdev::Key::KEY_BACKSLASH, true)),
('<', (evdev::Key::KEY_COMMA, true)),
('>', (evdev::Key::KEY_DOT, true)),
('?', (evdev::Key::KEY_SLASH, true)),
(':', (evdev::Key::KEY_SEMICOLON, true)),
('"', (evdev::Key::KEY_APOSTROPHE, true)),
]); ]);
// ((minx, maxx), (miny, maxy)) // ((minx, maxx), (miny, maxy))
@ -333,16 +382,16 @@ pub mod service {
Ok(keyboard) Ok(keyboard)
} }
fn map_key(key: &enigo::Key) -> ResultType<evdev::Key> { fn map_key(key: &enigo::Key) -> ResultType<(evdev::Key, bool)> {
if let Some(k) = KEY_MAP.get(&key) { if let Some(k) = KEY_MAP.get(&key) {
log::trace!("mapkey {:?}, get {:?}", &key, &k); log::trace!("mapkey {:?}, get {:?}", &key, &k);
return Ok(k.clone()); return Ok((k.clone(), false));
} else { } else {
match key { match key {
enigo::Key::Layout(c) => { enigo::Key::Layout(c) => {
if let Some(k) = KEY_MAP_LAYOUT.get(&c) { if let Some((k,is_shift)) = KEY_MAP_LAYOUT.get(&c) {
log::trace!("mapkey {:?}, get {:?}", &key, k); log::trace!("mapkey {:?}, get {:?}", &key, k);
return Ok(k.clone()); return Ok((k.clone(), is_shift.clone()));
} }
} }
// enigo::Key::Raw(c) => { // enigo::Key::Raw(c) => {
@ -380,19 +429,23 @@ pub mod service {
allow_err!(keyboard.emit(&[down_event])); allow_err!(keyboard.emit(&[down_event]));
} }
DataKeyboard::KeyDown(key) => { DataKeyboard::KeyDown(key) => {
if let Ok(k) = map_key(key) { if let Ok((k, is_shift)) = map_key(key) {
if is_shift {
let down_event = InputEvent::new(EventType::KEY, evdev::Key::KEY_LEFTSHIFT.code(), 1);
allow_err!(keyboard.emit(&[down_event]));
}
let down_event = InputEvent::new(EventType::KEY, k.code(), 1); let down_event = InputEvent::new(EventType::KEY, k.code(), 1);
allow_err!(keyboard.emit(&[down_event])); allow_err!(keyboard.emit(&[down_event]));
} }
} }
DataKeyboard::KeyUp(key) => { DataKeyboard::KeyUp(key) => {
if let Ok(k) = map_key(key) { if let Ok((k, _)) = map_key(key) {
let up_event = InputEvent::new(EventType::KEY, k.code(), 0); let up_event = InputEvent::new(EventType::KEY, k.code(), 0);
allow_err!(keyboard.emit(&[up_event])); allow_err!(keyboard.emit(&[up_event]));
} }
} }
DataKeyboard::KeyClick(key) => { DataKeyboard::KeyClick(key) => {
if let Ok(k) = map_key(key) { if let Ok((k, _)) = map_key(key) {
let down_event = InputEvent::new(EventType::KEY, k.code(), 1); let down_event = InputEvent::new(EventType::KEY, k.code(), 1);
let up_event = InputEvent::new(EventType::KEY, k.code(), 0); let up_event = InputEvent::new(EventType::KEY, k.code(), 0);
allow_err!(keyboard.emit(&[down_event, up_event])); allow_err!(keyboard.emit(&[down_event, up_event]));