diff --git a/Src/Hyperion-firmware-cct-v1.0.0/boot/cct/boot.lua b/Src/Hyperion-firmware-cct-v1.0.0/boot/cct/boot.lua index d108151..e4703f6 100644 --- a/Src/Hyperion-firmware-cct-v1.0.0/boot/cct/boot.lua +++ b/Src/Hyperion-firmware-cct-v1.0.0/boot/cct/boot.lua @@ -144,8 +144,9 @@ local ok, err = xpcall(function() -- Load kernel first if it fails, we can't continue so we display an error local Kernel = load(getFile(BOOT_DRIVE_PATH.."/boot/kernel.lua"),"@Kernel") - local initFs = load(getFile(BOOT_DRIVE_PATH.."/boot/cct/initdisks","@Init_disks"))(apis) + local initFs = load(getFile(BOOT_DRIVE_PATH.."/boot/cct/initdisks"),"@Init_disks")(apis) local fs = load(getFile(BOOT_DRIVE_PATH.."/boot/initfs"),"@InitFs")() + local key = load(getFile(BOOT_DRIVE_PATH.."/boot/cct/keys.lua"),"@keyhelper")(apis) if not Kernel then displaySuperBadError("Could not load kernel.") end @@ -155,13 +156,12 @@ local ok, err = xpcall(function() if not fs then displaySuperBadError("Could not load initfs.") end + if not key then + displaySuperBadError("Could not load key helper.") + end -- Set up event queue local eventQueue = {} - local lkeys={} - lkeys[apis.keys.enter]="\n" - lkeys[apis.keys.backspace]="\b" - lkeys[apis.keys.tab]="\t" -- Function to queue events local function queueEvent(event, ...) @@ -282,15 +282,12 @@ local ok, err = xpcall(function() local exit = false while not exit do local event = {coroutine.yield()} - if event[1] == "char" then - queueEvent("keyTyped", 1, event[2]) - elseif event[1] == "key" then + if event[1] == "key" then queueEvent("keyPressed", 1, event[2]) - if lkeys[event[2]] then - queueEvent("keyTyped", 1, lkeys[event[2]]) - end + key(event, queueEvent) elseif event[1] == "key_up" then queueEvent("keyReleased", 1, event[2]) + key(event, queueEvent) elseif event[1] == "disk" then queueEvent("componentAdded", "disk") elseif event[1] == "disk_eject" then diff --git a/Src/Hyperion-firmware-cct-v1.0.0/boot/cct/keys.lua b/Src/Hyperion-firmware-cct-v1.0.0/boot/cct/keys.lua new file mode 100644 index 0000000..c810180 --- /dev/null +++ b/Src/Hyperion-firmware-cct-v1.0.0/boot/cct/keys.lua @@ -0,0 +1,202 @@ +local apis=... +local keys=apis.keys +local tKeys = {} +tKeys[keys.space] = ' ' +tKeys[keys.grave] = '`' +tKeys[keys.comma] = ',' +tKeys[keys.minus] = '-' +tKeys[keys.period] = '.' +tKeys[keys.slash] = '/' +tKeys[keys.zero] = '0' +tKeys[keys.one] = '1' +tKeys[keys.two] = '2' +tKeys[keys.three] = '3' +tKeys[keys.four] = '4' +tKeys[keys.five] = '5' +tKeys[keys.six] = '6' +tKeys[keys.seven] = '7' +tKeys[keys.eight] = '8' +tKeys[keys.nine] = '9' +tKeys[keys.semicolon or keys.semiColon] = ';' +tKeys[keys.equals] = '=' +tKeys[keys.a] = 'a' +tKeys[keys.b] = 'b' +tKeys[keys.c] = 'c' +tKeys[keys.d] = 'd' +tKeys[keys.e] = 'e' +tKeys[keys.f] = 'f' +tKeys[keys.g] = 'g' +tKeys[keys.h] = 'h' +tKeys[keys.i] = 'i' +tKeys[keys.j] = 'j' +tKeys[keys.k] = 'k' +tKeys[keys.l] = 'l' +tKeys[keys.m] = 'm' +tKeys[keys.n] = 'n' +tKeys[keys.o] = 'o' +tKeys[keys.p] = 'p' +tKeys[keys.q] = 'q' +tKeys[keys.r] = 'r' +tKeys[keys.s] = 's' +tKeys[keys.t] = 't' +tKeys[keys.u] = 'u' +tKeys[keys.v] = 'v' +tKeys[keys.w] = 'w' +tKeys[keys.x] = 'x' +tKeys[keys.y] = 'y' +tKeys[keys.z] = 'z' +tKeys[keys.leftBracket] = '[' +tKeys[keys.backslash] = '\\' +tKeys[keys.rightBracket] = ']' +tKeys[keys.apostrophe] = "'" +tKeys[keys.enter] = '\n' +tKeys[keys.tab] = '\t' +tKeys[keys.backspace] = '\b' +tKeys[keys.insert] = '\x1b[2~' +tKeys[keys.delete] = '\x1b[3~' +tKeys[keys.right] = '\x1b[C' +tKeys[keys.left] = '\x1b[D' +tKeys[keys.down] = '\x1b[B' +tKeys[keys.up] = '\x1b[A' +tKeys[keys.pageUp] = '\x1b[5~' +tKeys[keys.pageDown] = '\x1b[6~' +tKeys[keys.home] = '\x1b[1~' +tKeys[keys["end"]] = '\x1b[4~' +tKeys[keys.capsLock] = '\x1b[capsLock' +tKeys[keys.scrollLock] = '\x1b[scrollLock' +tKeys[keys.numLock] = '\x1b[numLock' +if keys.printScreen then + tKeys[keys.printScreen] = '\x1b[printScreen' +end +tKeys[keys.pause] = '\x1b[pause' +tKeys[keys.f1] = '\x1b[11~' +tKeys[keys.f2] = '\x1b[12~' +tKeys[keys.f3] = '\x1b[13~' +tKeys[keys.f4] = '\x1b[14~' +tKeys[keys.f5] = '\x1b[15~' +tKeys[keys.f6] = '\x1b[17~' +tKeys[keys.f7] = '\x1b[18~' +tKeys[keys.f8] = '\x1b[19~' +tKeys[keys.f9] = '\x1b[20~' +tKeys[keys.f10] = '\x1b[21~' +tKeys[keys.f11] = '\x1b[23~' +tKeys[keys.f12] = '\x1b[24~' +--tKeys[keys.f13] = '\x1b[25~' +--tKeys[keys.f14] = '\x1b[26~' +--tKeys[keys.f15] = '\x1b[28~' +--tKeys[keys.f16] = '\x1b[29~' +--tKeys[keys.f17] = '\x1b[31~' +--tKeys[keys.f18] = '\x1b[32~' +--tKeys[keys.f19] = '\x1b[33~' +--tKeys[keys.f20] = '\x1b[34~' +--tKeys[keys.f21] = '\x1b[42~' +--tKeys[keys.f22] = '\x1b[43~' +--tKeys[keys.f23] = '\x1b[44~' +--tKeys[keys.f24] = '\x1b[45~' +--tKeys[keys.f25] = '\x1b[46~' + +-- Numpad +tKeys[keys.numPad0] = '0' +tKeys[keys.numPad1] = '1' +tKeys[keys.numPad2] = '2' +tKeys[keys.numPad3] = '3' +tKeys[keys.numPad4] = '4' +tKeys[keys.numPad5] = '5' +tKeys[keys.numPad6] = '6' +tKeys[keys.numPad7] = '7' +tKeys[keys.numPad8] = '8' +tKeys[keys.numPad9] = '9' + +--tKeys[340] = 'leftShift' +--tKeys[341] = 'leftCtrl' +--tKeys[342] = 'leftAlt' +--tKeys[343] = 'leftSuper' +--tKeys[344] = 'rightShift' +--tKeys[345] = 'rightCtrl' +--tKeys[346] = 'rightAlt' +--tKeys[347] = 'rightSuper' +--tKeys[348] = 'menu' + +local shift = false +local ctrl = false +local alt = false + +local function s(char) + if not shift then return char end + -- Letters + if char == "a" then return "A" end + if char == "b" then return "B" end + if char == "c" then return "C" end + if char == "d" then return "D" end + if char == "e" then return "E" end + if char == "f" then return "F" end + if char == "g" then return "G" end + if char == "h" then return "H" end + if char == "i" then return "I" end + if char == "j" then return "J" end + if char == "k" then return "K" end + if char == "l" then return "L" end + if char == "m" then return "M" end + if char == "n" then return "N" end + if char == "o" then return "O" end + if char == "p" then return "P" end + if char == "q" then return "Q" end + if char == "r" then return "R" end + if char == "s" then return "S" end + if char == "t" then return "T" end + if char == "u" then return "U" end + if char == "v" then return "V" end + if char == "w" then return "W" end + if char == "x" then return "X" end + if char == "y" then return "Y" end + if char == "z" then return "Z" end + -- Symbols + if char == "`" then return "~" end + if char == "1" then return "!" end + if char == "2" then return "@" end + if char == "3" then return "#" end + if char == "4" then return "$" end + if char == "5" then return "%" end + if char == "6" then return "^" end + if char == "7" then return "&" end + if char == "8" then return "*" end + if char == "9" then return "(" end + if char == "0" then return ")" end + if char == "-" then return "_" end + if char == "=" then return "+" end + if char == "[" then return "{" end + if char == "]" then return "}" end + if char == "\\" then return "|" end + if char == ";" then return ":" end + if char == "'" then return '"' end + if char == "," then return "<" end + if char == "." then return ">" end + if char == "/" then return "?" end + return char or "" +end + +local function p() + local str = "" + if alt then + str=str.."\x1b" + end + if ctrl then + str=str.."^" + end + return str +end + +return function(event, q) + if event[1] == "key" then + if event[2]==keys.leftCtrl or event[2]==keys.rightCtrl then ctrl=true return + elseif event[2]==keys.leftAlt or event[2]==keys.rightAlt then alt=true return + elseif event[2]==keys.leftShift or event[2]==keys.rightCtrl then shift=true return + end + q("keyTyped", 1, p()..s(tKeys[event[2]])) + elseif event[1] == "key_up" then + if event[2]==keys.leftCtrl or event[2]==keys.rightCtrl then ctrl=false return + elseif event[2]==keys.leftAlt or event[2]==keys.rightAlt then alt=false return + elseif event[2]==keys.leftShift or event[2]==keys.rightCtrl then shift=false return + end + end +end \ No newline at end of file diff --git a/Src/Hyperion-kernel-v1.0.0/lib/modules/Hyperion/45_hypervisor.kmod b/Src/Hyperion-kernel-v1.0.0/lib/modules/Hyperion/45_hypervisor.kmod index 30edf86..7ef61b1 100644 --- a/Src/Hyperion-kernel-v1.0.0/lib/modules/Hyperion/45_hypervisor.kmod +++ b/Src/Hyperion-kernel-v1.0.0/lib/modules/Hyperion/45_hypervisor.kmod @@ -54,6 +54,7 @@ function sys.spawn(func, name, envars, args, tgid) numRuns=0 } table.insert(kernel.currentTask.children, tasks[tostring(id)]) + return id end function sys.sleep(ms)