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:
parent
fb739faece
commit
2d6b7b4564
|
@ -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'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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");
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue