87 lines
1.9 KiB
D
87 lines
1.9 KiB
D
module lunch.launch;
|
|
|
|
import std.file;
|
|
import std.path;
|
|
import std.array;
|
|
import std.process;
|
|
import luad.all;
|
|
import lunch.conf;
|
|
import lunch.logger;
|
|
|
|
version (Windows)
|
|
{
|
|
import core.sys.windows.windows;
|
|
}
|
|
|
|
|
|
void launch()
|
|
{
|
|
string old_path = getcwd();
|
|
scope (exit) chdir(old_path);
|
|
|
|
version (Windows)
|
|
{
|
|
HWND hConsole = GetConsoleWindow();
|
|
if (config.launcher.hide_when_running)
|
|
ShowWindow(hConsole, SW_HIDE);
|
|
|
|
scope (exit)
|
|
if (config.launcher.hide_when_running)
|
|
ShowWindow(hConsole, SW_SHOW);
|
|
}
|
|
|
|
if (!exists(config.launcher.workdir))
|
|
error("Launcher workdir does not exist");
|
|
|
|
if (config.launcher.use_script)
|
|
{
|
|
if (!exists(config.launcher.source_dir))
|
|
error("Lua source dir does not exist");
|
|
|
|
string source_dir = absolutePath(config.launcher.source_dir);
|
|
auto lua_root = (string path) => chainPath(source_dir, path).array;
|
|
|
|
if (!exists(lua_root(config.launcher.entry_file)))
|
|
error("Lua entry file is missing");
|
|
|
|
auto lua = new LuaState;
|
|
lua.openLibs();
|
|
|
|
auto orig_require = lua["require"].to!(LuaObject delegate(string mod));
|
|
lua["require"] = (string mod)
|
|
{
|
|
auto work_dir = getcwd();
|
|
chdir(source_dir);
|
|
|
|
auto res = orig_require(mod);
|
|
|
|
chdir(work_dir);
|
|
return res;
|
|
};
|
|
|
|
chdir(config.launcher.workdir);
|
|
try
|
|
{
|
|
lua.doFile(lua_root(config.launcher.entry_file));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
errore("Lua script failed", ex);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
info("Launching");
|
|
try
|
|
{
|
|
chdir(config.launcher.workdir);
|
|
Pid pid = spawnProcess(config.launcher.command);
|
|
wait(pid);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
errore("Failed to launch application", ex);
|
|
}
|
|
}
|
|
}
|