From ab3373ab332df8d45fdca45cf18501a261af83ac Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Tue, 25 Nov 2025 10:39:37 +0100 Subject: [PATCH] fix: add manual restart for win32 console builds and fix restart for win32 gui builds closes #399 --- src/main.zig | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/main.zig b/src/main.zig index 7a73f41..4df0d49 100644 --- a/src/main.zig +++ b/src/main.zig @@ -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);