keyboard.lua

main 257 lines · 8.2 KB Raw
Alex Alex Commit Client Upload Part 2 19/10/2026 00:06
1-- @docclass
2g_keyboard = {}
3
4-- private functions
5function translateKeyCombo(keyCombo)
6 if not keyCombo or #keyCombo == 0 then return nil end
7 local keyComboDesc = ''
8 for k,v in pairs(keyCombo) do
9 local keyDesc = KeyCodeDescs[v]
10 if keyDesc == nil then return nil end
11 keyComboDesc = keyComboDesc .. '+' .. keyDesc
12 end
13 keyComboDesc = keyComboDesc:sub(2)
14 return keyComboDesc
15end
16
17local function getKeyCode(key)
18 for keyCode, keyDesc in pairs(KeyCodeDescs) do
19 if keyDesc:lower() == key:trim():lower() then
20 return keyCode
21 end
22 end
23end
24
25function retranslateKeyComboDesc(keyComboDesc)
26 if keyComboDesc == nil then
27 error('Unable to translate key combo \'' .. keyComboDesc .. '\'')
28 end
29
30 if type(keyComboDesc) == 'number' then
31 keyComboDesc = tostring(keyComboDesc)
32 end
33
34 local keyCombo = {}
35 for i,currentKeyDesc in ipairs(keyComboDesc:split('+')) do
36 for keyCode, keyDesc in pairs(KeyCodeDescs) do
37 if keyDesc:lower() == currentKeyDesc:trim():lower() then
38 table.insert(keyCombo, keyCode)
39 end
40 end
41 end
42 return translateKeyCombo(keyCombo)
43end
44
45function determineKeyComboDesc(keyCode, keyboardModifiers)
46 local keyCombo = {}
47 if keyCode == KeyCtrl or keyCode == KeyShift or keyCode == KeyAlt then
48 table.insert(keyCombo, keyCode)
49 elseif KeyCodeDescs[keyCode] ~= nil then
50 if keyboardModifiers == KeyboardCtrlModifier then
51 table.insert(keyCombo, KeyCtrl)
52 elseif keyboardModifiers == KeyboardAltModifier then
53 table.insert(keyCombo, KeyAlt)
54 elseif keyboardModifiers == KeyboardCtrlAltModifier then
55 table.insert(keyCombo, KeyCtrl)
56 table.insert(keyCombo, KeyAlt)
57 elseif keyboardModifiers == KeyboardShiftModifier then
58 table.insert(keyCombo, KeyShift)
59 elseif keyboardModifiers == KeyboardCtrlShiftModifier then
60 table.insert(keyCombo, KeyCtrl)
61 table.insert(keyCombo, KeyShift)
62 elseif keyboardModifiers == KeyboardAltShiftModifier then
63 table.insert(keyCombo, KeyAlt)
64 table.insert(keyCombo, KeyShift)
65 elseif keyboardModifiers == KeyboardCtrlAltShiftModifier then
66 table.insert(keyCombo, KeyCtrl)
67 table.insert(keyCombo, KeyAlt)
68 table.insert(keyCombo, KeyShift)
69 end
70 table.insert(keyCombo, keyCode)
71 end
72 return translateKeyCombo(keyCombo)
73end
74
75local function onWidgetKeyDown(widget, keyCode, keyboardModifiers)
76 if keyCode == KeyUnknown then return false end
77 local callback = widget.boundAloneKeyDownCombos[determineKeyComboDesc(keyCode, KeyboardNoModifier)]
78 signalcall(callback, widget, keyCode)
79 callback = widget.boundKeyDownCombos[determineKeyComboDesc(keyCode, keyboardModifiers)]
80 return signalcall(callback, widget, keyCode)
81end
82
83local function onWidgetKeyUp(widget, keyCode, keyboardModifiers)
84 if keyCode == KeyUnknown then return false end
85 local callback = widget.boundAloneKeyUpCombos[determineKeyComboDesc(keyCode, KeyboardNoModifier)]
86 signalcall(callback, widget, keyCode)
87 callback = widget.boundKeyUpCombos[determineKeyComboDesc(keyCode, keyboardModifiers)]
88 return signalcall(callback, widget, keyCode)
89end
90
91local function onWidgetKeyPress(widget, keyCode, keyboardModifiers, autoRepeatTicks)
92 if keyCode == KeyUnknown then return false end
93 local callback = widget.boundKeyPressCombos[determineKeyComboDesc(keyCode, keyboardModifiers)]
94 return signalcall(callback, widget, keyCode, autoRepeatTicks)
95end
96
97local function connectKeyDownEvent(widget)
98 if widget.boundKeyDownCombos then return end
99 connect(widget, { onKeyDown = onWidgetKeyDown })
100 widget.boundKeyDownCombos = {}
101 widget.boundAloneKeyDownCombos = {}
102end
103
104local function connectKeyUpEvent(widget)
105 if widget.boundKeyUpCombos then return end
106 connect(widget, { onKeyUp = onWidgetKeyUp })
107 widget.boundKeyUpCombos = {}
108 widget.boundAloneKeyUpCombos = {}
109end
110
111local function connectKeyPressEvent(widget)
112 if widget.boundKeyPressCombos then return end
113 connect(widget, { onKeyPress = onWidgetKeyPress })
114 widget.boundKeyPressCombos = {}
115end
116
117-- public functions
118function g_keyboard.bindKeyDown(keyComboDesc, callback, widget, alone)
119 widget = widget or rootWidget
120 connectKeyDownEvent(widget)
121 local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
122 if alone then
123 connect(widget.boundAloneKeyDownCombos, keyComboDesc, callback)
124 else
125 connect(widget.boundKeyDownCombos, keyComboDesc, callback)
126 end
127end
128
129function g_keyboard.bindKeyUp(keyComboDesc, callback, widget, alone)
130 widget = widget or rootWidget
131 connectKeyUpEvent(widget)
132 local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
133 if alone then
134 connect(widget.boundAloneKeyUpCombos, keyComboDesc, callback)
135 else
136 connect(widget.boundKeyUpCombos, keyComboDesc, callback)
137 end
138end
139
140function g_keyboard.bindKeyPress(keyComboDesc, callback, widget)
141 widget = widget or rootWidget
142 connectKeyPressEvent(widget)
143 widget.boundKeyPressCombos = widget.boundKeyPressCombos or {}
144 local translated = retranslateKeyComboDesc(keyComboDesc)
145 if not translated then
146 return -- Abort binding if translation failed.
147 end
148 connect(widget.boundKeyPressCombos, translated, callback)
149end
150
151local function getUnbindArgs(arg1, arg2)
152 local callback
153 local widget
154 if type(arg1) == 'function' then callback = arg1
155 elseif type(arg2) == 'function' then callback = arg2 end
156 if type(arg1) == 'userdata' then widget = arg1
157 elseif type(arg2) == 'userdata' then widget = arg2 end
158 widget = widget or rootWidget
159 return callback, widget
160end
161
162function g_keyboard.unbindKeyDown(keyComboDesc, arg1, arg2)
163 local callback, widget = getUnbindArgs(arg1, arg2)
164 if widget.boundKeyDownCombos == nil then return end
165 local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
166 disconnect(widget.boundKeyDownCombos, keyComboDesc, callback)
167end
168
169function g_keyboard.unbindKeyUp(keyComboDesc, arg1, arg2)
170 local callback, widget = getUnbindArgs(arg1, arg2)
171 if widget.boundKeyUpCombos == nil then return end
172 local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
173 disconnect(widget.boundKeyUpCombos, keyComboDesc, callback)
174end
175
176function g_keyboard.unbindKeyPress(keyComboDesc, arg1, arg2)
177 local callback, widget = getUnbindArgs(arg1, arg2)
178 if widget.boundKeyPressCombos == nil then return end
179 local keyComboDesc = retranslateKeyComboDesc(keyComboDesc)
180 if widget.boundKeyPressCombos[keyComboDesc] == nil then return end -- Seguridad: si no se asignó, no se desconecta.
181 disconnect(widget.boundKeyPressCombos, keyComboDesc, callback)
182end
183
184function g_keyboard.getModifiers()
185 return g_window.getKeyboardModifiers()
186end
187
188function g_keyboard.isKeyPressed(key)
189 if type(key) == 'string' then
190 key = getKeyCode(key)
191 end
192 return g_window.isKeyPressed(key)
193end
194
195function g_keyboard.areKeysPressed(keyComboDesc)
196 for i,currentKeyDesc in ipairs(keyComboDesc:split('+')) do
197 for keyCode, keyDesc in pairs(KeyCodeDescs) do
198 if keyDesc:lower() == currentKeyDesc:trim():lower() then
199 if keyDesc:lower() == "ctrl" then
200 if not g_keyboard.isCtrlPressed() then
201 return false
202 end
203 elseif keyDesc:lower() == "shift" then
204 if not g_keyboard.isShiftPressed() then
205 return false
206 end
207 elseif keyDesc:lower() == "alt" then
208 if not g_keyboard.isAltPressed() then
209 return false
210 end
211 elseif not g_window.isKeyPressed(keyCode) then
212 return false
213 end
214 end
215 end
216 end
217 return true
218end
219
220function g_keyboard.isKeySetPressed(keys, all)
221 all = all or false
222 local result = {}
223 for k,v in pairs(keys) do
224 if type(v) == 'string' then
225 v = getKeyCode(v)
226 end
227 if g_window.isKeyPressed(v) then
228 if not all then
229 return true
230 end
231 table.insert(result, true)
232 end
233 end
234 return #result == #keys
235end
236
237function g_keyboard.isInUse()
238 for i = FirstKey, LastKey do
239 if g_window.isKeyPressed(key) then
240 return true
241 end
242 end
243 return false
244end
245
246function g_keyboard.isCtrlPressed()
247 return bit32.band(g_window.getKeyboardModifiers(), KeyboardCtrlModifier) ~= 0
248end
249
250function g_keyboard.isAltPressed()
251 return bit32.band(g_window.getKeyboardModifiers(), KeyboardAltModifier) ~= 0
252end
253
254function g_keyboard.isShiftPressed()
255 return bit32.band(g_window.getKeyboardModifiers(), KeyboardShiftModifier) ~= 0
256end
257
Top