Added dvorak keymap (#752)

Keymaps are passed as arguments to ps2d.
To select the dvorak keymap use `ps2d dvorak`,
otherwise the kymap will default to english.
This commit is contained in:
Waylon Cude 2016-11-10 07:56:38 -08:00 committed by Jeremy Soller
parent fb739faece
commit 2d6b7b4564
2 changed files with 162 additions and 75 deletions

View file

@ -1,72 +1,148 @@
static ENGLISH: [[char; 2]; 58] = [ pub mod english {
['\0', '\0'], static ENGLISH: [[char; 2]; 58] = [
['\x1B', '\x1B'], ['\0', '\0'],
['1', '!'], ['\x1B', '\x1B'],
['2', '@'], ['1', '!'],
['3', '#'], ['2', '@'],
['4', '$'], ['3', '#'],
['5', '%'], ['4', '$'],
['6', '^'], ['5', '%'],
['7', '&'], ['6', '^'],
['8', '*'], ['7', '&'],
['9', '('], ['8', '*'],
['0', ')'], ['9', '('],
['-', '_'], ['0', ')'],
['=', '+'], ['-', '_'],
['\x7F', '\x7F'], ['=', '+'],
['\t', '\t'], ['\x7F', '\x7F'],
['q', 'Q'], ['\t', '\t'],
['w', 'W'], ['q', 'Q'],
['e', 'E'], ['w', 'W'],
['r', 'R'], ['e', 'E'],
['t', 'T'], ['r', 'R'],
['y', 'Y'], ['t', 'T'],
['u', 'U'], ['y', 'Y'],
['i', 'I'], ['u', 'U'],
['o', 'O'], ['i', 'I'],
['p', 'P'], ['o', 'O'],
['[', '{'], ['p', 'P'],
[']', '}'], ['[', '{'],
['\n', '\n'], [']', '}'],
['\0', '\0'], ['\n', '\n'],
['a', 'A'], ['\0', '\0'],
['s', 'S'], ['a', 'A'],
['d', 'D'], ['s', 'S'],
['f', 'F'], ['d', 'D'],
['g', 'G'], ['f', 'F'],
['h', 'H'], ['g', 'G'],
['j', 'J'], ['h', 'H'],
['k', 'K'], ['j', 'J'],
['l', 'L'], ['k', 'K'],
[';', ':'], ['l', 'L'],
['\'', '"'], [';', ':'],
['`', '~'], ['\'', '"'],
['\0', '\0'], ['`', '~'],
['\\', '|'], ['\0', '\0'],
['z', 'Z'], ['\\', '|'],
['x', 'X'], ['z', 'Z'],
['c', 'C'], ['x', 'X'],
['v', 'V'], ['c', 'C'],
['b', 'B'], ['v', 'V'],
['n', 'N'], ['b', 'B'],
['m', 'M'], ['n', 'N'],
[',', '<'], ['m', 'M'],
['.', '>'], [',', '<'],
['/', '?'], ['.', '>'],
['\0', '\0'], ['/', '?'],
['\0', '\0'], ['\0', '\0'],
['\0', '\0'], ['\0', '\0'],
[' ', ' '] ['\0', '\0'],
]; [' ', ' ']
];
pub fn get_char(scancode: u8, shift: bool) -> char { pub fn get_char(scancode: u8, shift: bool) -> char {
if let Some(c) = ENGLISH.get(scancode as usize) { if let Some(c) = ENGLISH.get(scancode as usize) {
if shift { if shift {
c[1] c[1]
} else {
c[0]
}
} else { } else {
c[0] '\0'
}
}
}
pub mod dvorak {
static DVORAK: [[char; 2]; 58] = [
['\0', '\0'],
['\x1B', '\x1B'],
['1', '!'],
['2', '@'],
['3', '#'],
['4', '$'],
['5', '%'],
['6', '^'],
['7', '&'],
['8', '*'],
['9', '('],
['0', ')'],
['[', '{'],
[']', '}'],
['\x7F', '\x7F'],
['\t', '\t'],
['\'', '"'],
[',', '<'],
['.', '>'],
['p', 'P'],
['y', 'Y'],
['f', 'F'],
['g', 'G'],
['c', 'C'],
['r', 'R'],
['l', 'L'],
['/', '?'],
['=', '+'],
['\n', '\n'],
['\0', '\0'],
['a', 'A'],
['o', 'O'],
['e', 'E'],
['u', 'U'],
['i', 'I'],
['d', 'D'],
['h', 'H'],
['t', 'T'],
['n', 'N'],
['s', 'S'],
['-', '_'],
['`', '~'],
['\0', '\0'],
['\\', '|'],
[';', ':'],
['q', 'Q'],
['j', 'J'],
['k', 'K'],
['x', 'X'],
['b', 'B'],
['m', 'M'],
['w', 'W'],
['v', 'V'],
['z', 'Z'],
['\0', '\0'],
['\0', '\0'],
['\0', '\0'],
[' ', ' ']
];
pub fn get_char(scancode: u8, shift: bool) -> char {
if let Some(c) = DVORAK.get(scancode as usize) {
if shift {
c[1]
} else {
c[0]
}
} else {
'\0'
} }
} else {
'\0'
} }
} }

View file

@ -7,6 +7,7 @@ extern crate io;
extern crate orbclient; extern crate orbclient;
extern crate syscall; extern crate syscall;
use std::env;
use std::fs::File; use std::fs::File;
use std::io::{Read, Write, Result}; use std::io::{Read, Write, Result};
use std::os::unix::io::AsRawFd; use std::os::unix::io::AsRawFd;
@ -32,24 +33,27 @@ bitflags! {
} }
} }
struct Ps2d { struct Ps2d<'a> {
input: File, input: File,
lshift: bool, lshift: bool,
rshift: bool, rshift: bool,
packets: [u8; 4], packets: [u8; 4],
packet_i: usize, packet_i: usize,
extra_packet: bool extra_packet: bool,
//Keymap function
get_char: &'a Fn(u8,bool) -> char
} }
impl Ps2d { impl<'a> Ps2d<'a> {
fn new(input: File, extra_packet: bool) -> Self { fn new(input: File, extra_packet: bool, keymap: &'a Fn(u8,bool) -> char) -> Self {
Ps2d { Ps2d {
input: input, input: input,
lshift: false, lshift: false,
rshift: false, rshift: false,
packets: [0; 4], packets: [0; 4],
packet_i: 0, packet_i: 0,
extra_packet: extra_packet extra_packet: extra_packet,
get_char: keymap
} }
} }
@ -68,7 +72,7 @@ impl Ps2d {
} }
self.input.write(&KeyEvent { self.input.write(&KeyEvent {
character: keymap::get_char(scancode, self.lshift || self.rshift), character: (self.get_char)(scancode, self.lshift || self.rshift),
scancode: scancode, scancode: scancode,
pressed: pressed pressed: pressed
}.to_event()).expect("ps2d: failed to write key event"); }.to_event()).expect("ps2d: failed to write key event");
@ -128,8 +132,15 @@ fn main() {
let input = File::open("display:input").expect("ps2d: failed to open display:input"); let input = File::open("display:input").expect("ps2d: failed to open display:input");
let extra_packet = controller::Ps2::new().init(); let extra_packet = controller::Ps2::new().init();
let keymap = match env::args().skip(1).next() {
let mut ps2d = Ps2d::new(input, extra_packet); Some(k) => match k.to_lowercase().as_ref() {
"dvorak" => (keymap::dvorak::get_char),
"english" => (keymap::english::get_char),
&_ => (keymap::english::get_char)
},
None => (keymap::english::get_char)
};
let mut ps2d = Ps2d::new(input, extra_packet,&keymap);
let mut event_queue = EventQueue::<(bool, u8)>::new().expect("ps2d: failed to create event queue"); let mut event_queue = EventQueue::<(bool, u8)>::new().expect("ps2d: failed to create event queue");