123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- -- Keyboard driver
- Modifiers = {'lctrl', 'rctrl', 'lalt', 'ralt', 'lshift', 'rshift', 'lgui', 'rgui'}
- function App.keypressed(key, scancode, isrepeat)
- 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)
- 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
- 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.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
|