/
key_mapper.rb
115 lines (100 loc) · 2.98 KB
/
key_mapper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
require 'java'
KeyEvent = java.awt.event.KeyEvent
module KeyMapper
QWERTY =[
['ESCAPE', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12' ],
['`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 'BACK_SPACE' ],
['TAB', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', '\\' ],
['CAPS_LOCK', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', '\'', 'ENTER' ],
['SHIFT', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ',', '.', '/', 'SHIFT' ]
]
DVORAK = [
['ESCAPE', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12' ],
['`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '[', ']', 'BACK_SPACE' ],
['TAB', '\'', ',', '.', 'P', 'Y', 'F', 'G', 'C', 'R', 'L', '/', '=', '\\' ],
['CAPS_LOCK', 'A', 'O', 'E', 'U', 'I', 'D', 'H', 'T', 'N', 'S', '-', 'ENTER' ],
['SHIFT', ';', 'Q', 'J', 'K', 'X', 'B', 'M', 'W', 'V', 'Z', 'SHIFT' ]
]
SHIFT_MAP = {
'<' => ',',
'>' => '.',
'"' => "'",
'~' => '`',
'{' => '[',
'}' => ']',
'?' => '/',
'+' => '=',
'_' => '-',
'|' => '\\',
':' => ';'
}
#DVORAK = [
# ['ESCAPE', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'F10', 'F11', 'F12' ],
# ['`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '[', ']', 'BACK_SPACE' ],
# ['\'', ',', '.', 'P', 'Y', 'F', 'G', 'C', 'R', 'L', '/', '=', '\\' ],
# ['A', 'O', 'E', 'U', 'I', 'D', 'H', 'T', 'N', 'S', '-', 'ENTER' ],
# [';', 'Q', 'J', 'K', 'X', 'B', 'M', 'W', 'V', 'Z', ]
#]
class Key
attr_accessor :symbol, :row, :col
def initialize(symbol, row, col)
@symbol = symbol
@row = row
@col = col
end
def to_s
@symbol
end
end
# KeyMapper maps a KeyEvent to a human readable key symbol
class Mapper
attr_accessor :keyboard
def initialize(keyboard)
@keyboard = keyboard
create_code_map
create_keyboard_map
end
def create_code_map
@code_map = {}
KeyEvent.constants.select{|c| c.index('VK_') == 0}.each do |const|
name = const[3..const.size]
@code_map[KeyEvent.const_get(const)] = name
end
end
def create_keyboard_map
@keyboard_map = {}
@keyboard.each_with_index do |row, i|
row.each_with_index do |key, j|
@keyboard_map[key] = Key.new(key, @keyboard.size - i, j)
end
end
end
def key_name(code)
@code_map[code]
end
def shift(chr)
if SHIFT_MAP.has_key?(chr)
return SHIFT_MAP[chr]
else
return chr.upcase
end
end
def key_char(char)
if (char == 65535) then nil
else shift(char.chr)
end
end
def key(key)
@keyboard_map[key]
end
def key_code_for_event(event)
name = key_name(event.getKeyCode)
char = key_char(event.getKeyChar)
(char and char > ' ') ? char : name
end
def key_for_event(event)
code = key_code_for_event(event)
key(code)
end
end
end