fix: add manual restart for win32 console builds and fix restart for win32 gui builds

closes #399
This commit is contained in:
CJ van den Berg 2025-11-25 10:39:37 +01:00
parent b3efc952ee
commit ab3373ab33
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -1119,6 +1119,7 @@ fn resolve_executable(executable: [:0]const u8) [:0]const u8 {
}
fn restart() noreturn {
if (builtin.os.tag == .windows) return restart_win32();
const executable = resolve_executable(std.mem.span(std.os.argv[0]));
const argv = [_]?[*:0]const u8{
executable,
@ -1143,6 +1144,40 @@ fn restart_with_sudo() noreturn {
restart_failed(ret);
}
fn restart_win32() noreturn {
if (!build_options.gui) return restart_manual();
const executable = resolve_executable(std.mem.span(std.os.argv[0]));
const argv = [_][]const u8{
executable,
"--restore-session",
};
const a = std.heap.c_allocator;
var child = std.process.Child.init(&argv, a);
child.stdin_behavior = .Inherit;
child.stdout_behavior = .Inherit;
child.stderr_behavior = .Inherit;
child.spawn() catch {
std.os.windows.kernel32.ExitProcess(1);
};
std.os.windows.kernel32.ExitProcess(0);
}
fn restart_manual() noreturn {
const executable = resolve_executable(std.mem.span(std.os.argv[0]));
var stderr_buffer: [1024]u8 = undefined;
var stderr_writer = std.fs.File.stderr().writer(&stderr_buffer);
stderr_writer.interface.print(
\\
\\ Manual restart required. Run:
\\ > {s} --restore-session
\\ to restart now.
\\
\\
, .{executable}) catch {};
stderr_writer.interface.flush() catch {};
exit(234);
}
fn restart_failed(ret: c_int) noreturn {
var stderr_buffer: [1024]u8 = undefined;
var stderr_writer = std.fs.File.stderr().writer(&stderr_buffer);