114 lines
3.3 KiB
Plaintext
114 lines
3.3 KiB
Plaintext
--:Minify:--
|
|
local kernel=...
|
|
kernel.oc.keyboards={}
|
|
local kbs=kernel.oc.keyboards
|
|
|
|
local kbidx=0
|
|
local keyboard = {}
|
|
|
|
keyboard.keys = {
|
|
back = 0x0E, -- backspace
|
|
delete = 0xD3,
|
|
down = 0xD0,
|
|
enter = 0x1C,
|
|
home = 0xC7,
|
|
lcontrol = 0x1D,
|
|
left = 0xCB,
|
|
lmenu = 0x38, -- left Alt
|
|
lshift = 0x2A,
|
|
pageDown = 0xD1,
|
|
rcontrol = 0x9D,
|
|
right = 0xCD,
|
|
rmenu = 0xB8, -- right Alt
|
|
rshift = 0x36,
|
|
space = 0x39,
|
|
tab = 0x0F,
|
|
up = 0xC8,
|
|
["end"] = 0xCF,
|
|
numpadenter = 0x9C,
|
|
}
|
|
kernel.oc.keys=keyboard.keys
|
|
|
|
for i=0, 255 do
|
|
kernel.oc.keys[string.char(i)]=i
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
function keyboard.isAltDown(addr)
|
|
return kbs[addr].pressedCodes[keyboard.keys.lmenu] or kbs[addr].pressedCodes[keyboard.keys.rmenu]
|
|
end
|
|
|
|
function keyboard.isControl(char)
|
|
return type(char) == "number" and (char < 0x20 or (char >= 0x7F and char <= 0x9F))
|
|
end
|
|
|
|
function keyboard.isControlDown(addr)
|
|
return kbs[addr].pressedCodes[keyboard.keys.lcontrol] or kbs[addr].pressedCodes[keyboard.keys.rcontrol]
|
|
end
|
|
|
|
function keyboard.isKeyDown(addr,charOrCode)
|
|
if type(charOrCode) == "string" then
|
|
return kbs[addr].pressedChars[utf8 and utf8.codepoint(charOrCode) or charOrCode:byte()]
|
|
elseif type(charOrCode) == "number" then
|
|
return kbs[addr].pressedCodes[charOrCode]
|
|
end
|
|
end
|
|
|
|
function keyboard.isShiftDown(addr)
|
|
return kbs[addr].pressedCodes[keyboard.keys.lshift] or kbs[addr].pressedCodes[keyboard.keys.rshift]
|
|
end
|
|
kernel.oc.keyboard=keyboard
|
|
|
|
local function serializeBool(bool)
|
|
if bool then
|
|
return "T"
|
|
else
|
|
return "F"
|
|
end
|
|
end
|
|
|
|
for addr, typ in kernel.oc.component.list("keyboard") do
|
|
if typ=="keyboard" then
|
|
kbidx=kbidx+1
|
|
kbs[addr]={pressedChars = {}, pressedCodes = {}, events=kernel.newFifo()}
|
|
kernel.devfs.data["input"]["keyboard"..tostring(kbidx)]=function(op,mode)
|
|
if op=="type" then
|
|
return "Keyboard"
|
|
elseif op=="open" then
|
|
local h = {
|
|
read=function(amount)
|
|
local rv=""
|
|
for i=1, amount or 1 do
|
|
local event = {kernel.oc.keyboards[addr].events.pop()}
|
|
if event[1] then
|
|
rv=rv..event[1]
|
|
end
|
|
end
|
|
if rv=="" then rv=nil end
|
|
return rv
|
|
end,
|
|
write=function(content)
|
|
end,
|
|
gctrl=function()
|
|
return serializeBool(keyboard.isControlDown(addr))..";"..serializeBool(keyboard.isAltDown(addr))
|
|
end,
|
|
isKeyDown=function(char)
|
|
return keyboard.isKeyDown(addr,char)
|
|
end
|
|
}
|
|
if mode=="rw" then
|
|
return h
|
|
elseif mode=="r" then
|
|
h["write"]=nil
|
|
return h
|
|
elseif mode=="w" then
|
|
h["read"]=nil
|
|
return h
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|