-- -------------------------------------------------------------------------------------- -- This is crazy windows stuff. Will attempt with OSX and Linux later) -- TODO - I think I need to make this a core main app, and the other processes are forked -- from this app. That way it can get process handles and manage them closing properly. -- Other benefits might be the ability to put their hwnd into a "master window" and thus -- drive it all much more cleanly (this will suit linux and osx more too) local ffi = require("ffi") local winu = require("editor.deps.winutils") -- Load in the user32 runtime library into the ffi.C interface local kernel32 = winu.kernel local user32 = winu.user local gdi32 = winu.gdi local comdlg32 = winu.comdlg local CreateWindow = winu.CreateWindow local GetFile = winu.GetFile local GetHwndFromProcess = winu.GetHwndFromProcess local RemoveWindowBorders = winu.RemoveWindowBorders local execute = winu.execute local shellexecute = winu.shellexecute local sleep = winu.Sleep ------------------------------------------------------------------------------------------------------------ local hproc_browser, hthread_browser, si_browser = nil local hproc_sokol, hthread_sokol, si_sokol = nil local browserhwnd = nil local sokolhwnd = nil ------------------------------------------------------------------------------------------------------------ local function SetupBrowser(rect) print("BROWSER SETUP") local browser, bsize = winu.getDefaultBrowser() local browser_path = ffi.string(browser)..[[ -new-window "http://localhost:9190/index.html"]] hproc_browser, hthread_browser, si_browser = execute(browser_path) sleep(100) -- Need to make this more generic (ie browser agnostic) local browserhwnd = GetHwndFromProcess( hthread_browser, "Mozilla Firefox" ) -- local browserhwnd = user32.FindWindowA( nil, "http://localhost:9190/index.html") print(hproc_browser, hthread_browser, si_browser) if(browserhwnd) then user32.MoveWindow(browserhwnd, rect[0].left, rect[0].top, rect[0].right-rect[0].left, rect[0].bottom-rect[0].top, 1) end return browserhwnd end ------------------------------------------------------------------------------------------------------------ local function SetupSokolLuajit(rect) print("SOKOL-LUAJIT SETUP") local sokolluajit_path = [["bin/win64/luajit.exe" "editor/editor.lua"]] hproc_sokol, hthread_sokol, si_sokol = execute(sokolluajit_path) sleep(100) print(hproc_sokol, hthread_sokol, si_sokol) local sokolhwnd = GetHwndFromProcess( hthread_sokol, "editor - sokol" ) -- local sokolhwnd = user32.FindWindowA( nil, "editor - sokol") if(sokolhwnd) then user32.MoveWindow(sokolhwnd, rect[0].left, rect[0].top, rect[0].right-rect[0].left, rect[0].bottom-rect[0].top, 1) end return sokolhwnd end ------------------------------------------------------------------------------------------------------------ local function setupWindows() local desktop = ffi.new("RECT[1]") -- Get a handle to the desktop window hDesktop = user32.GetDesktopWindow() -- Get the size of screen to the variable desktop user32.GetWindowRect(hDesktop, desktop) local l = desktop[0].left local r = desktop[0].right desktop[0].bottom = desktop[0].bottom - 50 desktop[0].left = 0 desktop[0].right = (r-l)/2 browserhwnd = SetupBrowser(desktop) sleep(100) -- Let things setup (window pos etc) desktop[0].left = (r-l)/2 desktop[0].right = r sokolhwnd = SetupSokolLuajit(desktop) sleep(100) -- Let things setup (window pos etc) end ------------------------------------------------------------------------------------------------------------ setupWindows() while true do if(user32.IsWindow(browserhwnd) == 0) then break end if(user32.IsWindow(sokolhwnd) == 0) then break end sleep(1) end if(browserhwnd) then user32.SendMessageA(browserhwnd, ffi.C.WM_CLOSE, 0, 0) end if(sokolhwnd) then user32.SendMessageA(sokolhwnd, ffi.C.WM_CLOSE, 0, 0) end print("Editor Exited.") ------------------------------------------------------------------------------------------------------------