working on builder

This commit is contained in:
David Lannan 2024-11-16 18:42:47 +10:30
parent 363b34fff4
commit 91d1145e61
4 changed files with 209 additions and 11 deletions

View File

@ -98,6 +98,8 @@ local date_selected = 0
local sel_time = os.date ("*t") local sel_time = os.date ("*t")
local sel_date = sel_time local sel_date = sel_time
local popup_active = ffi.new("int[1]")
-- -------------------------------------------------------------------------------------- -- --------------------------------------------------------------------------------------
local function draw_demo_ui(ctx) local function draw_demo_ui(ctx)
@ -822,7 +824,6 @@ local function draw_demo_ui(ctx)
color = ffi.new("struct nk_color[1]", {{255,0,0, 255}}) color = ffi.new("struct nk_color[1]", {{255,0,0, 255}})
select = ffi.new("int[4]") select = ffi.new("int[4]")
popup_active = ffi.new("int[1]")
inp = ctx[0].input inp = ctx[0].input
bounds = ffi.new("struct nk_rect[1]") bounds = ffi.new("struct nk_rect[1]")
@ -868,10 +869,10 @@ local function draw_demo_ui(ctx)
if (nk.nk_contextual_begin(ctx, 0, nk.nk_vec2(350, 60), bounds) == true) then if (nk.nk_contextual_begin(ctx, 0, nk.nk_vec2(350, 60), bounds) == true) then
nk.nk_layout_row_dynamic(ctx, 30, 4) nk.nk_layout_row_dynamic(ctx, 30, 4)
color.r = nk.nk_propertyi(ctx, "#r", 0, color.r, 255, 1, 1) color[0].r = nk.nk_propertyi(ctx, "#r", 0, color[0].r, 255, 1, 1)
color.g = nk.nk_propertyi(ctx, "#g", 0, color.g, 255, 1, 1) color[0].g = nk.nk_propertyi(ctx, "#g", 0, color[0].g, 255, 1, 1)
color.b = nk.nk_propertyi(ctx, "#b", 0, color.b, 255, 1, 1) color[0].b = nk.nk_propertyi(ctx, "#b", 0, color[0].b, 255, 1, 1)
color.a = nk.nk_propertyi(ctx, "#a", 0, color.a, 255, 1, 1) color[0].a = nk.nk_propertyi(ctx, "#a", 0, color[0].a, 255, 1, 1)
nk.nk_contextual_end(ctx) nk.nk_contextual_end(ctx)
end end
@ -881,29 +882,29 @@ local function draw_demo_ui(ctx)
nk.nk_label(ctx, "Popup:", nk.NK_TEXT_LEFT) nk.nk_label(ctx, "Popup:", nk.NK_TEXT_LEFT)
nk.nk_layout_row_push(ctx, 50) nk.nk_layout_row_push(ctx, 50)
if (nk.nk_button_label(ctx, "Popup")) then if (nk.nk_button_label(ctx, "Popup")) then
popup_active = 1 popup_active[0] = 1
end end
nk.nk_layout_row_end(ctx) nk.nk_layout_row_end(ctx)
if (popup_active == 1) then if (popup_active[0] == 1) then
local s = ffi.new("struct nk_rect[1]",{{20, 100, 220, 90}}) local s = ffi.new("struct nk_rect[1]",{{20, 100, 220, 90}})
if (nk.nk_popup_begin(ctx, nk.NK_POPUP_STATIC, "Error", 0, s) == true) then if (nk.nk_popup_begin(ctx, nk.NK_POPUP_STATIC, "Error", 0, s[0]) == true) then
nk.nk_layout_row_dynamic(ctx, 25, 1) nk.nk_layout_row_dynamic(ctx, 25, 1)
nk.nk_label(ctx, "A terrible error as occured", nk.NK_TEXT_LEFT) nk.nk_label(ctx, "A terrible error as occured", nk.NK_TEXT_LEFT)
nk.nk_layout_row_dynamic(ctx, 25, 2) nk.nk_layout_row_dynamic(ctx, 25, 2)
if (nk.nk_button_label(ctx, "OK")) then if (nk.nk_button_label(ctx, "OK")) then
popup_active = 0 popup_active[0] = 0
nk.nk_popup_close(ctx) nk.nk_popup_close(ctx)
end end
if (nk.nk_button_label(ctx, "Cancel")) then if (nk.nk_button_label(ctx, "Cancel")) then
popup_active = 0 popup_active[0] = 0
nk.nk_popup_close(ctx) nk.nk_popup_close(ctx)
end end
nk.nk_popup_end(ctx) nk.nk_popup_end(ctx)
else else
popup_active = nk.nk_false popup_active[0] = nk.nk_false
end end
end end

View File

@ -0,0 +1,77 @@
-- A simple build script using lua to make a standalone exe using srlua
-- Use ffi for arch and os detection
local ffi = require("ffi")
-- ----------------------------------------------------------------------------------
local function run_cmd(command)
print(command)
local fh = io.popen( command, "r" )
if(fh) then
local output = fh:read("*a")
fh:close()
io.write(output)
print("[Success]")
else
print("[Error] Cannot execute command: "..command)
end
end
-- ----------------------------------------------------------------------------------
-- srlua and glue for each os
local plaform_cmds = {
["Windows"] = {
srlua = ".\\tools\\srlua\\win64\\srlua.exe",
glue = ".\\tools\\srlua\\win64\\glue.exe",
ext = ".exe",
sep = "\\",
luajit = ".\\bin\\win64\\luajit.exe",
src_dll = ".\\bin\\win64\\*.dll",
src_cfg = ".\\config",
},
["OSX"] = {
srlua = "./tools/srlua/macos/srlua",
glue = "./tools/srlua/macos/glue",
ext = "",
sep = "/",
luajit = "./bin/macos/luajit",
src_dll = "./bin/macos/*.dylib",
src_cfg = "./config",
},
["Linux"] = {
srlua = "./tools/srlua/linux/srlua",
glue = "./tools/srlua/linux/glue",
ext = "",
sep = "/",
luajit = "./bin/linux/luajit",
src_dll = "./bin/linux/*.so",
src_cfg = "./config",
},
}
local cmds = plaform_cmds[ffi.os]
local outputfolder = "."..cmds.sep.."tools"..cmds.sep.."bin"..cmds.sep..string.lower(ffi.os)..cmds.sep
local outputexe = "minikeybd_"..ffi.os..cmds.ext
-- Have to build a bytecode "chunk" first.
local buildchunk = cmds.luajit.." ."..cmds.sep.."tools"..cmds.sep.."combine.lua "
buildchunk = buildchunk.."."..cmds.sep.."lua"..cmds.sep.."minikeybd.lua -L "
buildchunk = buildchunk.."."..cmds.sep.."ffi"..cmds.sep.."hidwin.lua "
buildchunk = buildchunk.."."..cmds.sep.."ffi"..cmds.sep.."lusb.lua "
buildchunk = buildchunk.."."..cmds.sep.."lua"..cmds.sep.."mapcodes.lua "
buildchunk = buildchunk.."."..cmds.sep.."lua"..cmds.sep.."wchar_win.lua "
run_cmd(buildchunk)
-- Build the exe
local command = cmds.glue.." "..cmds.srlua.." luac.out "..outputfolder..outputexe
run_cmd(command)
local copycmd = "cp -rf "..cmds.src_dll.." "..outputfolder
if(ffi.os == "Windows") then copycmd = "xcopy /C /I /Y "..cmds.src_dll.." "..outputfolder end
-- Copy in the dlls/dylib/sos
run_cmd(copycmd)
-- Copy in config folder
local copyconfig = "cp -rf "..cmds.src_cfg.." "..outputfolder..cmds.sep.."config"
if(ffi.os == "Windows") then copyconfig = "xcopy /S /E /C /I /Y "..cmds.src_cfg.." "..outputfolder.."config" end
run_cmd(copyconfig)

View File

@ -0,0 +1,74 @@
-- usage: lua luac.lua [file.lua]* [-L [module.lua]*]
--
-- creates a precompiled chunk that preloads all modules listed after
-- -L and then runs all programs listed before -L.
--
-- assumptions:
-- file xxx.lua contains module xxx
-- '/' is the directory separator (could have used package.config)
-- int and size_t take 4 bytes (could have read sizes from header)
-- does not honor package.path
--
-- Luiz Henrique de Figueiredo <lhf@tecgraf.puc-rio.br>
-- Tue Aug 5 22:57:33 BRT 2008
-- This code is hereby placed in the public domain.
--
-- This has been hevily midified to utilize a different method to concatenate the
-- chunks without losing the package module mapping.
-- ref: https://www.lua-users.org/wiki/LuaCompilerInLua
-- ---------------------------------------------------------------------------------------------------
local NAME="luac"
local OUTPUT=NAME..".out"
local n=#arg
local m=n
-- ---------------------------------------------------------------------------------------------------
-- Load a chunk manually so we can name it
local function loader(filepath)
local data = ""
local fh = io.open(filepath, "r")
if(fh) then
data = fh:read("*a")
fh:close()
end
return data
end
-- ---------------------------------------------------------------------------------------------------
-- Process args
for i=1,n do
if arg[i]=="-L" then m=i-1 break end
end
-- ---------------------------------------------------------------------------------------------------
-- Iterate libs to prepend them to the chunk list
local ts = {}
table.insert(ts, 1, "local t=package.preload;")
for i=m+2,n do
local modulename = string.gsub(arg[i], "^%.[/\\]", "")
modulename = string.gsub(modulename, "[/\\]", "%.")
modulename = string.gsub(modulename, "%.lua", "")
local loaded_chunk = assert(load( loader(arg[i]),modulename ))
table.insert(ts, ("t['%s']=load(%q);"):format(modulename, string.dump(loaded_chunk)) )
end
-- ---------------------------------------------------------------------------------------------------
-- Add core scripts that will be executed
for i=1,m do
table.insert(ts, ("load(%q)(...);"):format(string.dump(assert(loadfile(arg[i])))) )
end
-- ---------------------------------------------------------------------------------------------------
-- Assemble chunks into one file to dump.
local chunks = assert(load(table.concat(ts)))
local f=assert(io.open(OUTPUT,"wb"))
local data = string.dump(chunks)
f:write(data)
assert(f:close())
-- ---------------------------------------------------------------------------------------------------

View File

@ -0,0 +1,46 @@
module(..., package.seeall)
local crypto = require 'crypto'
local dtypes = {"md5", "md4", "md2", "sha1", "sha", "sha256", "sha512"}
local function load(modulename)
-- Find source
local filename
local file,hashfile,hashtype
local errmsg = ""
for path in string.gmatch(package.path..";", "([^;]*);") do
filename = string.gsub(path, "%?", (string.gsub(modulename, "%.", "\\")))
file = io.open(filename, "rb")
-- If we found a module check if it has a hash file
if file then
for _,dtype in ipairs(dtypes) do
hashfile = io.open(filename.."."..dtype, "rb")
if hashfile then
hashtype = dtype
break
end
end
end
if hashfile then
break
end
errmsg = errmsg.."\n\tno file '"..filename.."' (signed)"
end
if not file then
return errmsg
end
-- Read source file
local source = file:read("*a")
-- Read saved hash
local hash = hashfile:read("*a"):gsub("[^%x]", "")
-- Check that the saved hash match the file hash
assert(crypto.evp.digest(hashtype, source)==hash,
"module "..modulename.." (from file '"..filename.."')"
.." does not match its "..hashtype.." hash")
-- Compile and return the module
return assert(loadstring(source, filename))
end
-- Install the loader so that it's called just before the normal Lua loader
table.insert(package.loaders, 2, load)