windows: implement tick, call core.initWindow, various fixes
This commit is contained in:
parent
0ec182c3f4
commit
e15cbe63de
2 changed files with 28 additions and 8 deletions
|
|
@ -161,6 +161,7 @@ pub fn init(core: *Core) !void {
|
||||||
|
|
||||||
pub fn initWindow(core: *Core, window_id: mach.ObjectID) !void {
|
pub fn initWindow(core: *Core, window_id: mach.ObjectID) !void {
|
||||||
var core_window = core.windows.getValue(window_id);
|
var core_window = core.windows.getValue(window_id);
|
||||||
|
defer core.windows.setValueRaw(window_id, core_window);
|
||||||
|
|
||||||
core_window.instance = gpu.createInstance(null) orelse {
|
core_window.instance = gpu.createInstance(null) orelse {
|
||||||
log.err("failed to create GPU instance", .{});
|
log.err("failed to create GPU instance", .{});
|
||||||
|
|
@ -228,8 +229,6 @@ pub fn initWindow(core: *Core, window_id: mach.ObjectID) !void {
|
||||||
core_window.framebuffer_format = core_window.swap_chain_descriptor.format;
|
core_window.framebuffer_format = core_window.swap_chain_descriptor.format;
|
||||||
core_window.framebuffer_width = core_window.swap_chain_descriptor.width;
|
core_window.framebuffer_width = core_window.swap_chain_descriptor.width;
|
||||||
core_window.framebuffer_height = core_window.swap_chain_descriptor.height;
|
core_window.framebuffer_height = core_window.swap_chain_descriptor.height;
|
||||||
|
|
||||||
core.windows.setValueRaw(window_id, core_window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn tick(core: *Core, core_mod: mach.Mod(Core)) !void {
|
pub fn tick(core: *Core, core_mod: mach.Mod(Core)) !void {
|
||||||
|
|
@ -266,6 +265,7 @@ pub fn main(core: *Core, core_mod: mach.Mod(Core)) !void {
|
||||||
// The user wants mach.Core to take control of the main loop.
|
// The user wants mach.Core to take control of the main loop.
|
||||||
if (supports_non_blocking) {
|
if (supports_non_blocking) {
|
||||||
while (core.state != .exited) {
|
while (core.state != .exited) {
|
||||||
|
try Platform.tick(core);
|
||||||
core_mod.run(core.on_tick.?);
|
core_mod.run(core.on_tick.?);
|
||||||
core_mod.call(.presentFrame);
|
core_mod.call(.presentFrame);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -152,15 +152,26 @@ pub const Context = struct {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
pub fn tick(core: *Core) !void {
|
pub fn tick(core: *Core) !void {
|
||||||
_ = core; // autofix
|
var windows = core.windows.slice();
|
||||||
|
while (windows.next()) |window_id| {
|
||||||
|
const native_opt: ?Native = core.windows.get(window_id, .native);
|
||||||
|
|
||||||
|
if (native_opt) |native| {
|
||||||
|
_ = native; // autofix
|
||||||
|
|
||||||
|
// Handle resizing the window when the user changes width or height
|
||||||
|
if (core.windows.updated(window_id, .width) or core.windows.updated(window_id, .height)) {}
|
||||||
|
} else {
|
||||||
|
try initWindow(core, window_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn initWindow(
|
fn initWindow(
|
||||||
core: *Core,
|
core: *Core,
|
||||||
window_id: mach.ObjectID,
|
window_id: mach.ObjectID,
|
||||||
) !void {
|
) !void {
|
||||||
const core_window = core.windows.getValue(window_id);
|
var core_window = core.windows.getValue(window_id);
|
||||||
|
|
||||||
const hInstance = w.GetModuleHandleW(null);
|
const hInstance = w.GetModuleHandleW(null);
|
||||||
const class_name = w.L("mach");
|
const class_name = w.L("mach");
|
||||||
|
|
@ -227,11 +238,19 @@ fn initWindow(
|
||||||
|
|
||||||
_ = w.SetWindowLongPtrW(native_window, w.GWLP_USERDATA, @bitCast(@intFromPtr(&context)));
|
_ = w.SetWindowLongPtrW(native_window, w.GWLP_USERDATA, @bitCast(@intFromPtr(&context)));
|
||||||
|
|
||||||
|
_ = w.ShowWindow(native_window, w.SW_SHOW);
|
||||||
|
|
||||||
|
restoreWindowPosition(core, window_id);
|
||||||
|
|
||||||
const size = getClientRect(core, window_id);
|
const size = getClientRect(core, window_id);
|
||||||
core_window.width = size.width;
|
core_window.width = size.width;
|
||||||
core_window.height = size.height;
|
core_window.height = size.height;
|
||||||
|
|
||||||
_ = w.GetWindowRect(native.window, &native.saved_window_rect);
|
_ = w.GetWindowRect(native.window, &native.saved_window_rect);
|
||||||
|
|
||||||
|
core_window.native = native;
|
||||||
|
core.windows.setValueRaw(window_id, core_window);
|
||||||
|
try core.initWindow(window_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn update(self: *Win32) !void {
|
// pub fn update(self: *Win32) !void {
|
||||||
|
|
@ -406,12 +425,12 @@ fn wndProc(wnd: w.HWND, msg: u32, wParam: w.WPARAM, lParam: w.LPARAM) callconv(w
|
||||||
const core = context.core;
|
const core = context.core;
|
||||||
const window_id = context.window_id;
|
const window_id = context.window_id;
|
||||||
|
|
||||||
const window = core.windows.getValue(window_id);
|
var window = core.windows.getValue(window_id);
|
||||||
defer core.windows.setValueRaw(window_id, window);
|
defer core.windows.setValueRaw(window_id, window);
|
||||||
|
|
||||||
switch (msg) {
|
switch (msg) {
|
||||||
w.WM_CLOSE => {
|
w.WM_CLOSE => {
|
||||||
core.pushEvent(.close);
|
core.pushEvent(.{ .close = .{ .window_id = window_id } });
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
w.WM_SIZE => {
|
w.WM_SIZE => {
|
||||||
|
|
@ -437,7 +456,7 @@ fn wndProc(wnd: w.HWND, msg: u32, wParam: w.WPARAM, lParam: w.LPARAM) callconv(w
|
||||||
if (vkey == w.VK_PROCESSKEY) return 0;
|
if (vkey == w.VK_PROCESSKEY) return 0;
|
||||||
|
|
||||||
if (msg == w.WM_SYSKEYDOWN and vkey == w.VK_F4) {
|
if (msg == w.WM_SYSKEYDOWN and vkey == w.VK_F4) {
|
||||||
core.pushEvent(.close);
|
core.pushEvent(.{ .close = .{ .window_id = window_id } });
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -489,7 +508,7 @@ fn wndProc(wnd: w.HWND, msg: u32, wParam: w.WPARAM, lParam: w.LPARAM) callconv(w
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
w.WM_CHAR => {
|
w.WM_CHAR => {
|
||||||
if (window.native) |native| {
|
if (window.native) |*native| {
|
||||||
const char: u16 = @truncate(wParam);
|
const char: u16 = @truncate(wParam);
|
||||||
var chars: []const u16 = undefined;
|
var chars: []const u16 = undefined;
|
||||||
if (native.surrogate != 0) {
|
if (native.surrogate != 0) {
|
||||||
|
|
@ -596,6 +615,7 @@ fn wndProc(wnd: w.HWND, msg: u32, wParam: w.WPARAM, lParam: w.LPARAM) callconv(w
|
||||||
},
|
},
|
||||||
else => return w.DefWindowProcW(wnd, msg, wParam, lParam),
|
else => return w.DefWindowProcW(wnd, msg, wParam, lParam),
|
||||||
}
|
}
|
||||||
|
return w.DefWindowProcW(wnd, msg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn keyFromScancode(scancode: u9) Key {
|
fn keyFromScancode(scancode: u9) Key {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue