|
|
|
@ -6,12 +6,14 @@ local Screen = require("ui/screen")
|
|
|
|
|
local Math = require("optmath")
|
|
|
|
|
local DEBUG = require("dbg")
|
|
|
|
|
local _ = require("gettext")
|
|
|
|
|
local ffi = require("ffi")
|
|
|
|
|
local util = require("ffi/util")
|
|
|
|
|
|
|
|
|
|
-- constants from <linux/input.h>
|
|
|
|
|
local EV_SYN = 0
|
|
|
|
|
local EV_KEY = 1
|
|
|
|
|
local EV_ABS = 3
|
|
|
|
|
local EV_MSC = 4
|
|
|
|
|
|
|
|
|
|
-- key press event values (KEY.value)
|
|
|
|
|
local EVENT_VALUE_KEY_PRESS = 1
|
|
|
|
@ -211,6 +213,39 @@ function Input:initKeyMap()
|
|
|
|
|
[117] = "RPgFwd", -- normal PageDown
|
|
|
|
|
[119] = "Del", -- Delete
|
|
|
|
|
}
|
|
|
|
|
self.sdl2_event_map = {
|
|
|
|
|
[ 4] = "A", [ 5] = "B", [ 6] = "C", [ 7] = "D", [ 8] = "E", [ 9] = "F",
|
|
|
|
|
[10] = "G", [11] = "H", [12] = "I", [13] = "J", [14] = "K", [15] = "L",
|
|
|
|
|
[16] = "M", [17] = "N", [18] = "O", [19] = "P", [20] = "Q", [21] = "R",
|
|
|
|
|
[22] = "S", [23] = "T", [24] = "U", [25] = "V", [26] = "W", [27] = "X",
|
|
|
|
|
[28] = "Y", [29] = "Z", [30] = "1", [31] = "2", [32] = "3", [33] = "4",
|
|
|
|
|
[34] = "5", [35] = "6", [36] = "7", [37] = "8", [38] = "9", [39] = "0",
|
|
|
|
|
|
|
|
|
|
[42] = "Back", -- Backspace
|
|
|
|
|
[40] = "Enter", -- Enter
|
|
|
|
|
[225] = "Shift", -- left shift
|
|
|
|
|
[55] = ".",
|
|
|
|
|
[56] = "/",
|
|
|
|
|
[229] = "Sym", -- right shift key
|
|
|
|
|
[226] = "Alt", -- left alt
|
|
|
|
|
[44] = " ", -- Spacebar
|
|
|
|
|
[58] = "Menu", -- F[1]
|
|
|
|
|
[63] = "LPgBack", -- F[6]
|
|
|
|
|
[64] = "LPgFwd", -- F[7]
|
|
|
|
|
[68] = "VPlus", -- F[11]
|
|
|
|
|
[69] = "VMinus", -- F[12]
|
|
|
|
|
[230] = "AA", -- right alt key
|
|
|
|
|
[74] = "Home", -- Home
|
|
|
|
|
[82] = "Up", -- arrow up
|
|
|
|
|
[75] = "RPgBack", -- normal PageUp
|
|
|
|
|
[80] = "Left", -- arrow left
|
|
|
|
|
[79] = "Right", -- arrow right
|
|
|
|
|
[77] = "Press", -- End (above arrows)
|
|
|
|
|
[81] = "Down", -- arrow down
|
|
|
|
|
[78] = "RPgFwd", -- normal PageDown
|
|
|
|
|
[76] = "Del", -- Delete
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.modifiers = {
|
|
|
|
|
Alt = false,
|
|
|
|
|
Shift = false
|
|
|
|
@ -261,9 +296,7 @@ function Input:initTouchState()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Input:init()
|
|
|
|
|
if Device:hasKeyboard() then
|
|
|
|
|
self:initKeyMap()
|
|
|
|
|
end
|
|
|
|
|
self:initKeyMap()
|
|
|
|
|
if Device:isTouchDevice() then
|
|
|
|
|
self:initTouchState()
|
|
|
|
|
end
|
|
|
|
@ -274,12 +307,16 @@ function Input:init()
|
|
|
|
|
self.event_map[10021] = "NotCharging"
|
|
|
|
|
|
|
|
|
|
if util.isEmulated() then
|
|
|
|
|
self:initKeyMap()
|
|
|
|
|
os.remove("/tmp/emu_event")
|
|
|
|
|
os.execute("mkfifo /tmp/emu_event")
|
|
|
|
|
input.open("/tmp/emu_event")
|
|
|
|
|
-- SDL key codes
|
|
|
|
|
self.event_map = self.sdl_event_map
|
|
|
|
|
if not util.haveSDL2() then
|
|
|
|
|
self.event_map = self.sdl_event_map
|
|
|
|
|
else
|
|
|
|
|
self.event_map = self.sdl2_event_map
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
local dev_mod = Device:getModel()
|
|
|
|
|
if not Device:isKobo() then
|
|
|
|
@ -389,6 +426,10 @@ function Input:init()
|
|
|
|
|
input.open("/dev/input/event1")
|
|
|
|
|
elseif util.isAndroid() then
|
|
|
|
|
DEBUG("Auto-detected Android")
|
|
|
|
|
self:adjustAndroidEventMap()
|
|
|
|
|
function Input:handleMiscEv(ev)
|
|
|
|
|
return Input:handleAndroidMiscEvent(ev)
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
DEBUG("Not supported device model!")
|
|
|
|
|
end
|
|
|
|
@ -425,6 +466,9 @@ function Input:adjustKoboEventMap()
|
|
|
|
|
self.event_map[116] = "Power"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Input:adjustAndroidEventMap()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Input:setTimeout(cb, tv_out)
|
|
|
|
|
local item = {
|
|
|
|
|
callback = cb,
|
|
|
|
@ -486,6 +530,15 @@ function Input:handleKeyBoardEv(ev)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Input:handleMiscEv(ev)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Input:handleAndroidMiscEvent(ev)
|
|
|
|
|
if ev.code == ffi.C.APP_CMD_SAVE_STATE then
|
|
|
|
|
return "SaveState"
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function Input:setMtSlot(slot, key, val)
|
|
|
|
|
if not self.ev_slots[slot] then
|
|
|
|
|
self.ev_slots[slot] = {
|
|
|
|
@ -717,9 +770,12 @@ function Input:waitEvent(timeout_us, timeout_s)
|
|
|
|
|
end
|
|
|
|
|
ev = self:eventAdjustHook(ev)
|
|
|
|
|
if ev.type == EV_KEY then
|
|
|
|
|
DEBUG("key ev", ev)
|
|
|
|
|
return self:handleKeyBoardEv(ev)
|
|
|
|
|
elseif ev.type == EV_ABS or ev.type == EV_SYN then
|
|
|
|
|
return self:handleTouchEv(ev)
|
|
|
|
|
elseif ev.type == EV_MSC then
|
|
|
|
|
return self:handleMiscEv(ev)
|
|
|
|
|
else
|
|
|
|
|
-- some other kind of event that we do not know yet
|
|
|
|
|
return Event:new("GenericInput", ev)
|
|
|
|
|