From a6b29e4fe90fd6c5b0668d0cad17ba7c46c6623c Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Mon, 6 Jan 2025 10:05:19 +0100 Subject: [PATCH] feat(win32 gui): issue quit command on window close and exit cleanly --- src/renderer/win32/renderer.zig | 4 ++-- src/win32/gui.zig | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/renderer/win32/renderer.zig b/src/renderer/win32/renderer.zig index 719eebf..dda2aaa 100644 --- a/src/renderer/win32/renderer.zig +++ b/src/renderer/win32/renderer.zig @@ -125,8 +125,8 @@ pub fn render(self: *Self) error{}!void { } } pub fn stop(self: *Self) void { - _ = self; - std.log.warn("TODO: implement stop", .{}); + gui.stop(); + if (self.thread) |thread| thread.join(); } pub fn stdplane(self: *Self) Plane { diff --git a/src/win32/gui.zig b/src/win32/gui.zig index 0040289..53e756a 100644 --- a/src/win32/gui.zig +++ b/src/win32/gui.zig @@ -16,6 +16,8 @@ const windowmsg = @import("windowmsg.zig"); const HResultError = ddui.HResultError; +const WM_APP_EXIT = win32.WM_APP + 1; + pub const DropWriter = struct { pub const WriteError = error{}; pub const Writer = std.io.Writer(DropWriter, WriteError, write); @@ -492,6 +494,11 @@ pub const Win32Error = struct { } }; +pub fn stop() void { + const hwnd = global.hwnd orelse return; + _ = win32.SendMessageW(hwnd, WM_APP_EXIT, 0, 0); +} + pub fn setWindowTitle(title: [*:0]const u16, err: *Win32Error) error{ NoWindow, Win32 }!void { global.mutex.lock(); defer global.mutex.unlock(); @@ -1116,6 +1123,11 @@ fn WndProc( return 1; // background erased }, win32.WM_CLOSE => { + const state = stateFromHwnd(hwnd); + state.pid.send(.{ "cmd", "quit" }) catch |e| onexit(e); + return 0; + }, + WM_APP_EXIT => { win32.PostQuitMessage(0); return 0; },