remove direct2d dependency and update zigwin32

Since we removed the direct2d renderer we no longer need to reference
the direct2d-zig repository.  Instead we now directly reference the
zigwin32 repository.  I've also updated that repository with a few fixes
and additions which allowed us to remove some code from flow.
This commit is contained in:
Jonathan Marler 2025-01-20 14:57:03 -07:00 committed by CJ van den Berg
parent 142f6e51ae
commit 99aefc8d22
5 changed files with 25 additions and 62 deletions

View file

@ -318,16 +318,13 @@ pub fn build_exe(
const renderer_mod = blk: {
if (gui) switch (target.result.os.tag) {
.windows => {
const direct2d_dep = b.lazyDependency("direct2d", .{}) orelse break :blk tui_renderer_mod;
const win32_dep = direct2d_dep.builder.dependency("win32", .{});
const win32_mod = win32_dep.module("zigwin32");
const win32_dep = b.lazyDependency("win32", .{}) orelse break :blk tui_renderer_mod;
const win32_mod = win32_dep.module("win32");
const gui_mod = b.createModule(.{
.root_source_file = b.path("src/win32/gui.zig"),
.imports = &.{
.{ .name = "build_options", .module = options_mod },
.{ .name = "win32", .module = win32_mod },
.{ .name = "ddui", .module = direct2d_dep.module("ddui") },
.{ .name = "cbor", .module = cbor_mod },
.{ .name = "thespian", .module = thespian_mod },
.{ .name = "input", .module = input_mod },

View file

@ -37,9 +37,9 @@
.url = "https://github.com/rockorager/zeit/archive/9cca8ec620a54c3b07cd249f25e5bcb3153d03d7.tar.gz",
.hash = "1220755ea2a5aa6bb3713437aaafefd44812169fe43f1da755c3ee6101b85940f441",
},
.direct2d = .{
.url = "https://github.com/marler8997/direct2d-zig/archive/0d031389a26653bb71f81c2340d1b8ba6bd339c3.tar.gz",
.hash = "122069b40656962c6ba9b9b3f9f882ba2e9cf4c5e1afebac7b7501404129e6bb4705",
.win32 = .{
.url = "https://github.com/marlersoft/zigwin32/archive/259b6f353a48968d7e3171573db4fd898b046188.tar.gz",
.hash = "1220925614447b54ccc9894bbba8b202c6a8b750267890edab7732064867e46f3217",
.lazy = true,
},
},

View file

@ -19,6 +19,8 @@ const gui = @import("gui");
const DropWriter = gui.DropWriter;
pub const style = StyleBits;
pub const panic = win32.messageBoxThenPanic(.{ .title = "Flow Panic" });
allocator: std.mem.Allocator,
vx: vaxis.Vaxis,
@ -84,25 +86,6 @@ pub fn deinit(self: *Self) void {
self.title_buf.deinit();
}
threadlocal var thread_is_panicing = false;
pub fn panic(
msg: []const u8,
error_return_trace: ?*std.builtin.StackTrace,
ret_addr: ?usize,
) noreturn {
if (!thread_is_panicing) {
thread_is_panicing = true;
const msg_z: [:0]const u8 = if (std.fmt.allocPrintZ(
std.heap.page_allocator,
"{s}",
.{msg},
)) |msg_z| msg_z else |_| "failed allocate error message";
_ = win32.MessageBoxA(null, msg_z, "Flow Panic", .{ .ICONASTERISK = 1 });
}
std.builtin.default_panic(msg, error_return_trace, ret_addr);
}
pub fn run(self: *Self) !void {
if (self.thread) |_| return;
@ -353,7 +336,7 @@ fn update_window_title(self: *Self) void {
const title = self.title_buf.toOwnedSliceSentinel(0) catch @panic("OOM:update_window_title");
if (win32.SetWindowTextW(hwnd, title) == 0) {
std.log.warn("SetWindowText failed with {}", .{win32.GetLastError().fmt()});
std.log.warn("SetWindowText failed, error={}", .{win32.GetLastError()});
self.title_buf = std.ArrayList(u16).fromOwnedSlice(self.allocator, title);
} else {
self.allocator.free(title);

View file

@ -123,7 +123,7 @@ fn getIcons(dpi: XY(u32)) Icons {
small_x,
small_y,
win32.LR_SHARED,
) orelse fatalWin32("LoadImage for small icon", win32.GetLastError());
) orelse win32.panicWin32("LoadImage for small icon", win32.GetLastError());
const large = win32.LoadImageW(
win32.GetModuleHandleW(null),
@ptrFromInt(c.ID_ICON_FLOW),
@ -131,7 +131,7 @@ fn getIcons(dpi: XY(u32)) Icons {
large_x,
large_y,
win32.LR_SHARED,
) orelse fatalWin32("LoadImage for large icon", win32.GetLastError());
) orelse win32.panicWin32("LoadImage for large icon", win32.GetLastError());
return .{ .small = @ptrCast(small), .large = @ptrCast(large) };
}
@ -268,7 +268,7 @@ fn calcWindowPlacement(
var info: win32.MONITORINFO = undefined;
info.cbSize = @sizeOf(win32.MONITORINFO);
if (0 == win32.GetMonitorInfoW(monitor, &info)) {
std.log.warn("GetMonitorInfo failed with {}", .{win32.GetLastError().fmt()});
std.log.warn("GetMonitorInfo failed, error={}", .{win32.GetLastError()});
return result;
}
break :blk info.rcWork;
@ -335,7 +335,7 @@ fn entry(pid: thespian.pid) !void {
},
win32.MONITOR_DEFAULTTOPRIMARY,
) orelse {
std.log.warn("MonitorFromPoint failed with {}", .{win32.GetLastError().fmt()});
std.log.warn("MonitorFromPoint failed, error={}", .{win32.GetLastError()});
break :blk null;
};
};
@ -384,7 +384,7 @@ fn entry(pid: thespian.pid) !void {
.lpszClassName = CLASS_NAME,
.hIconSm = global.icons.small,
};
if (0 == win32.RegisterClassExW(&wc)) fatalWin32(
if (0 == win32.RegisterClassExW(&wc)) win32.panicWin32(
"RegisterClass for main window",
win32.GetLastError(),
);
@ -403,7 +403,7 @@ fn entry(pid: thespian.pid) !void {
null, // Menu
win32.GetModuleHandleW(null),
@ptrCast(&create_args),
) orelse fatalWin32("CreateWindow", win32.GetLastError());
) orelse win32.panicWin32("CreateWindow", win32.GetLastError());
// NEVER DESTROY THE WINDOW!
// This allows us to send the hwnd to other thread/parts
// of the app and it will always be valid.
@ -430,7 +430,7 @@ fn entry(pid: thespian.pid) !void {
);
}
if (0 == win32.UpdateWindow(hwnd)) fatalWin32("UpdateWindow", win32.GetLastError());
if (0 == win32.UpdateWindow(hwnd)) win32.panicWin32("UpdateWindow", win32.GetLastError());
_ = win32.ShowWindow(hwnd, win32.SW_SHOWNORMAL);
// try some things to bring our window to the top
@ -547,7 +547,7 @@ fn updateWindowSize(
const cell_size = font.getCellSize(i32);
var window_rect: win32.RECT = undefined;
if (0 == win32.GetWindowRect(hwnd, &window_rect)) fatalWin32(
if (0 == win32.GetWindowRect(hwnd, &window_rect)) win32.panicWin32(
"GetWindowRect",
win32.GetLastError(),
);
@ -646,7 +646,7 @@ fn sendMouse(
) void {
const frame = tracy.initZone(@src(), .{ .name = "gui sendMouse" });
defer frame.deinit();
const point = win32ext.pointFromLparam(lparam);
const point = win32.pointFromLparam(lparam);
const state = stateFromHwnd(hwnd);
const dpi = win32.dpiFromHwnd(hwnd);
const cell_size = getFont(dpi, getFontSize(), getFontFace()).getCellSize(i32);
@ -699,7 +699,7 @@ fn sendMouseWheel(
) void {
const frame = tracy.initZone(@src(), .{ .name = "gui sendMouseWheel" });
defer frame.deinit();
var point = win32ext.pointFromLparam(lparam);
var point = win32.pointFromLparam(lparam);
_ = win32.ScreenToClient(hwnd, &point);
const state = stateFromHwnd(hwnd);
const dpi = win32.dpiFromHwnd(hwnd);
@ -754,7 +754,7 @@ fn sendKey(
const state = stateFromHwnd(hwnd);
var keyboard_state: [256]u8 = undefined;
if (0 == win32.GetKeyboardState(&keyboard_state)) fatalWin32(
if (0 == win32.GetKeyboardState(&keyboard_state)) win32.panicWin32(
"GetKeyboardState",
win32.GetLastError(),
);
@ -1065,8 +1065,8 @@ fn WndProc(
const client_size = getClientSize(u32, hwnd);
var ps: win32.PAINTSTRUCT = undefined;
_ = win32.BeginPaint(hwnd, &ps) orelse return fatalWin32("BeginPaint", win32.GetLastError());
defer if (0 == win32.EndPaint(hwnd, &ps)) fatalWin32("EndPaint", win32.GetLastError());
_ = win32.BeginPaint(hwnd, &ps) orelse return win32.panicWin32("BeginPaint", win32.GetLastError());
defer if (0 == win32.EndPaint(hwnd, &ps)) win32.panicWin32("EndPaint", win32.GetLastError());
global.render_cells.resize(
global.render_cells_arena.allocator(),
@ -1343,19 +1343,13 @@ fn renderColorFromVaxis(color: vaxis.Color) render.Color {
};
}
fn fatalWin32(what: []const u8, err: win32.WIN32_ERROR) noreturn {
std.debug.panic("{s} failed with {}", .{ what, err.fmt() });
}
fn fatalHr(what: []const u8, hresult: win32.HRESULT) noreturn {
std.debug.panic("{s} failed, hresult=0x{x}", .{ what, @as(u32, @bitCast(hresult)) });
}
fn deleteObject(obj: ?win32.HGDIOBJ) void {
if (0 == win32.DeleteObject(obj)) fatalWin32("DeleteObject", win32.GetLastError());
if (0 == win32.DeleteObject(obj)) win32.panicWin32("DeleteObject", win32.GetLastError());
}
fn getClientSize(comptime T: type, hwnd: win32.HWND) XY(T) {
var rect: win32.RECT = undefined;
if (0 == win32.GetClientRect(hwnd, &rect))
fatalWin32("GetClientRect", win32.GetLastError());
win32.panicWin32("GetClientRect", win32.GetLastError());
std.debug.assert(rect.left == 0);
std.debug.assert(rect.top == 0);
return .{ .x = @intCast(rect.right), .y = @intCast(rect.bottom) };
@ -1428,7 +1422,7 @@ fn getClientInset(dpi: u32) XY(i32) {
0,
window_style_ex,
dpi,
)) fatalWin32(
)) win32.panicWin32(
"AdjustWindowRect",
win32.GetLastError(),
);
@ -1456,5 +1450,5 @@ fn setWindowPosRect(hwnd: win32.HWND, rect: win32.RECT) void {
rect.right - rect.left,
rect.bottom - rect.top,
.{ .NOZORDER = 1 },
)) fatalWin32("SetWindowPos", win32.GetLastError());
)) win32.panicWin32("SetWindowPos", win32.GetLastError());
}

View file

@ -1,17 +1,6 @@
const std = @import("std");
const win32 = @import("win32").everything;
// todo: these should be available in zigwin32
fn xFromLparam(lparam: win32.LPARAM) i16 {
return @bitCast(win32.loword(lparam));
}
fn yFromLparam(lparam: win32.LPARAM) i16 {
return @bitCast(win32.hiword(lparam));
}
pub fn pointFromLparam(lparam: win32.LPARAM) win32.POINT {
return win32.POINT{ .x = xFromLparam(lparam), .y = yFromLparam(lparam) };
}
// TODO: update zigwin32 with a way to get the corresponding IID for any COM interface
pub fn queryInterface(obj: anytype, comptime Interface: type) *Interface {
const obj_basename_start: usize = comptime if (std.mem.lastIndexOfScalar(u8, @typeName(@TypeOf(obj)), '.')) |i| (i + 1) else 0;