-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathkeychord.lua
More file actions
137 lines (122 loc) · 2.96 KB
/
keychord.lua
File metadata and controls
137 lines (122 loc) · 2.96 KB
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
-- Keyboard driver
Modifiers = {'lctrl', 'rctrl', 'lalt', 'ralt', 'lshift', 'rshift', 'lgui', 'rgui'}
function App.keypressed(key, scancode, is_repeat)
if array.find(Modifiers, key) then
-- do nothing when the modifier is pressed
return
end
-- include the modifier(s) when the non-modifer is pressed
App.keychord_press(App.combine_modifiers(key), key, scancode, is_repeat)
end
function App.combine_modifiers(key)
if love.keyboard.isModifierActive then -- waiting for LÖVE v12
if key:match('^kp') then
key = App.translate_numlock(key)
end
end
local result = ''
if App.ctrl_down() then
result = result..'C-'
end
if App.alt_down() then
result = result..'M-'
end
if App.shift_down() then
result = result..'S-' -- don't try to use this with letters/digits
end
if App.cmd_down() then
result = result..'s-'
end
result = result..key
return result
end
-- use idiomatic cmd key on Mac OS, ctrl elsewhere
function App.default_modifier(key)
if OS == 'OS X' and not App.run_tests then
return 's-'..key
else
return 'C-'..key
end
end
function App.any_modifier_down()
return App.ctrl_down() or App.alt_down() or App.shift_down() or App.cmd_down()
end
function App.ctrl_down()
return App.key_down('lctrl') or App.key_down('rctrl')
end
function App.alt_down()
return App.key_down('lalt') or App.key_down('ralt')
end
function App.shift_down()
return App.key_down('lshift') or App.key_down('rshift')
end
function App.cmd_down()
return App.key_down('lgui') or App.key_down('rgui')
end
function App.default_modifier_down()
if OS == 'OS X' then
return App.cmd_down()
else
return App.ctrl_down()
end
end
function App.is_cursor_movement(key)
return array.find({'left', 'right', 'up', 'down', 'home', 'end', 'pageup', 'pagedown'}, key)
end
-- mappings only to non-printable keys; leave out mappings that textinput will handle
Numlock_off = {
kp0='insert',
kp1='end',
kp2='down',
kp3='pagedown',
kp4='left',
-- numpad 5 translates to nothing
kp6='right',
kp7='home',
kp8='up',
kp9='pageup',
['kp.']='delete',
-- LÖVE handles keypad operators in textinput
-- what's with the `kp=` and `kp,` keys? None of my keyboards have one.
-- Hopefully LÖVE handles them as well in textinput.
kpenter='enter',
kpdel='delete',
}
Numlock_on = {
kpenter='enter',
kpdel='delete',
}
function App.translate_numlock(key)
if love.keyboard.isModifierActive('numlock') then
return Numlock_on[key] or key
else
return Numlock_off[key] or key
end
return key
end
array = {}
function array.find(arr, elem)
if type(elem) == 'function' then
for i,x in ipairs(arr) do
if elem(x) then
return i
end
end
else
for i,x in ipairs(arr) do
if x == elem then
return i
end
end
end
return nil
end
function array.any(arr, f)
for i,x in ipairs(arr) do
local result = f(x)
if result then
return result
end
end
return false
end