1
0
Fork 0
mirror of https://github.com/ctruLua/ctruLua.git synced 2025-10-27 16:39:29 +00:00
ctruLua/sdcard/3ds/ctruLua/keyboard.lua

106 lines
No EOL
3.4 KiB
Lua

local hid = require("ctr.hid")
local gfx = require("ctr.gfx")
-- Options
local keyWidth, keyHeight = 25, 25
local layout = {
["default"] = {
{ "&", "é", "\"", "'", "(", "-", "è", "_", "ç", "à", ")", "=", "Back" },
{ "a", "z", "e", "r", "t", "y", "u", "i", "o", "p", "^", "$", "Enter" },
{ "q", "s", "d", "f", "g", "h", "j", "k", "l", "m", "ù", "*", "Enter" },
{ "Shift", "<", "w", "x", "c", "v", "b", "n", ",", ";", ":", "!", "Tab" },
{ "CpLck", ">", "+", "/", " ", " ", " ", " ", " ", "{", "}", ".", "AltGr" }
},
["Shift"] = {
{ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "°", "+", "Back" },
{ "A", "Z", "E", "R", "T", "Y", "U", "I", "O", "P", "¨", "£", "Enter" },
{ "Q", "S", "D", "F", "G", "H", "J", "K", "L", "M", "%", "µ", "Enter" },
{ "Shift", ">", "W", "X", "C", "V", "B", "N", "?", ".", "/", "§", "Tab" },
{ "CpLck", "~", "#", "[", " ", " ", " ", " ", " ", "]", "|", "@", "AltGr" }
},
["AltGr"] = {
{ "²", "~", "#", "{", "[", "|", "`", "\\", "^", "@", "]", "}", "Back" },
{ "a", "z", "", "r", "t", "y", "u", "i", "o", "p", "", "¤", "Enter" },
{ "q", "s", "d", "f", "g", "h", "j", "k", "l", "m", "", "", "Enter" },
{ "Shift", "", "w", "x", "c", "v", "b", "n", "", "", "", "", "Tab" },
{ "CpLck", "", "", "", " ", " ", " ", " ", " ", "", "", "", "AltGr" }
},
}
local alias = {
["Tab"] = "\t",
["Enter"] = "\n",
["Back"] = "BACK"
}
local sticky = {
["CpLck"] = "Shift"
}
local keys = {
["l"] = "Shift",
["r"] = "Shift"
}
-- Variables
local currentModifier = { "default", "sticky" }
local buffer = ""
return {
draw = function(x, y)
local hidKeys = hid.keys()
local xTouch, yTouch
if hidKeys.down.touch then xTouch, yTouch = hid.touch() end
for key, modifier in pairs(keys) do
if hidKeys.down[key] then
currentModifier = { modifier, "key" }
elseif hidKeys.up[key] and currentModifier[2] == "key" and currentModifier[1] == modifier then
currentModifier = { "default", "sticky" }
end
end
for row, rowKeys in pairs(layout[currentModifier[1]]) do
for column, key in pairs(rowKeys) do
local xKey, yKey = x + (column-1)*(keyWidth-1), y + (row-1)*(keyHeight-1)
gfx.rectangle(xKey, yKey, keyWidth, keyHeight, 0, 0xFFFFFFFF)
gfx.rectangle(xKey + 1, yKey + 1, keyWidth - 2, keyHeight - 2, 0, 0x000000FF)
gfx.text(xKey + 2, yKey + 2, key)
if xTouch then
if xTouch > xKey and xTouch < xKey + keyWidth then
if yTouch > yKey and yTouch < yKey + keyHeight then
gfx.rectangle(xKey, yKey, keyWidth, keyHeight, 0, 0xFFFFFFDD)
local k = alias[key] or key
if sticky[k] and layout[sticky[k]] then
if currentModifier[1] == sticky[k] and currentModifier[2] == "sticky" then
currentModifier = { "default", "sticky" }
else
currentModifier = { sticky[k], "sticky" }
end
elseif layout[k] then
if currentModifier[1] == k and currentModifier[2] == "normal" then
currentModifier = { "default", "sticky" }
else
currentModifier = { k, "normal" }
end
else
buffer = buffer .. k
if currentModifier[1] ~= "default" and currentModifier[2] == "normal" then
currentModifier = { "default", "sticky" }
end
end
end
end
end
end
end
end,
read = function()
local ret = buffer
buffer = ""
return ret ~= "" and ret or nil
end
}