From bf291b79cbde6010892a27087f613b2e469e45b5 Mon Sep 17 00:00:00 2001 From: icefox Date: Sat, 10 Jan 2026 10:26:37 -0300 Subject: [PATCH 1/4] wip: wayland resize --- src/core/linux/Wayland.zig | 44 +++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/src/core/linux/Wayland.zig b/src/core/linux/Wayland.zig index acca423fef..79dd83ecf8 100644 --- a/src/core/linux/Wayland.zig +++ b/src/core/linux/Wayland.zig @@ -173,9 +173,6 @@ pub fn initWindow( return error.ListenerHasAlreadyBeenSet; } - // Wait for events to get pushed - _ = libwaylandclient.?.wl_display_roundtrip(wl.display); - core_window = core.windows.getValue(window_id); wl = &core_window.native.?.wayland; @@ -203,10 +200,16 @@ pub fn initWindow( // Commit changes to surface c.wl_surface_commit(wl.surface); - _ = libwaylandclient.?.wl_display_roundtrip(wl.display); + // _ = libwaylandclient.?.wl_display_roundtrip(wl.display); + // // Wait for events to get pushed + // _ = libwaylandclient.?.wl_display_roundtrip(wl.display); core.windows.setValue(window_id, core_window); try core.initWindow(window_id); + _ = libwaylandclient.?.wl_display_roundtrip(wl.display); + + core_window = core.windows.getValue(window_id); + core.windows.setValue(window_id, core_window); } pub fn tick(window_id: mach.ObjectID) !void { @@ -805,15 +808,40 @@ const xdg_surface_listener = struct { var core_window = core_ptr.windows.getValue(window_id); const wl = &core_window.native.?.wayland; - if (wl.configured) { - c.wl_surface_commit(wl.surface); - } else { + if (!wl.configured) { + std.log.debug("not configure\n", .{}); wl.configured = true; core_ptr.windows.setValue(window_id, core_window); - core_window = core_ptr.windows.getValue(window_id); + // core_window = core_ptr.windows.getValue(window_id); + return; } setContentAreaOpaque(wl, Core.Size{ .width = core_window.width, .height = core_window.height }); + + std.log.debug("configure\n", .{}); + if (core_window.framebuffer_width != core_window.width or core_window.framebuffer_height != core_window.height) { + std.log.debug("recreating\n", .{}); + core_window.framebuffer_width = core_window.width; + core_window.framebuffer_height = core_window.height; + + core_window.swap_chain_descriptor.width = core_window.framebuffer_width; + core_window.swap_chain_descriptor.height = core_window.framebuffer_height; + + core_window.swap_chain.release(); + core_window.swap_chain = core_window.device.createSwapChain(core_window.surface, &core_window.swap_chain_descriptor); + core_ptr.windows.setValueRaw(window_id, core_window); + + core_ptr.pushEvent(.{ + .window_resize = .{ + .window_id = window_id, + .size = .{ + .width = core_window.width, + .height = core_window.height, + }, + }, + }); + } + c.wl_surface_commit(wl.surface); } const listener = c.xdg_surface_listener{ .configure = @ptrCast(&xdgSurfaceHandleConfigure) }; From b31f471fb40e06915e3cad86a0e107888112e05f Mon Sep 17 00:00:00 2001 From: icefox Date: Sat, 10 Jan 2026 16:24:40 -0300 Subject: [PATCH 2/4] call c.xdg_toplevel_set_title before first commit of surface --- src/core/linux/Wayland.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/linux/Wayland.zig b/src/core/linux/Wayland.zig index 79dd83ecf8..0106dff23f 100644 --- a/src/core/linux/Wayland.zig +++ b/src/core/linux/Wayland.zig @@ -176,6 +176,8 @@ pub fn initWindow( core_window = core.windows.getValue(window_id); wl = &core_window.native.?.wayland; + c.xdg_toplevel_set_title(wl.toplevel, @ptrCast(core_window.title)); + // Commit changes to surface c.wl_surface_commit(wl.surface); @@ -188,8 +190,6 @@ pub fn initWindow( if (result != -1 and wl.configured) break; } - c.xdg_toplevel_set_title(wl.toplevel, @ptrCast(core_window.title)); - const decoration = c.zxdg_decoration_manager_v1_get_toplevel_decoration( wl.interfaces.zxdg_decoration_manager_v1, wl.toplevel, From 0c360e6e231e7431c910712f5442d05845cffce9 Mon Sep 17 00:00:00 2001 From: icefox Date: Sat, 10 Jan 2026 16:32:30 -0300 Subject: [PATCH 3/4] Allow setting XDG application ID on wayland --- src/Core.zig | 3 +++ src/core/linux/Wayland.zig | 1 + 2 files changed, 4 insertions(+) diff --git a/src/Core.zig b/src/Core.zig index b361c4076b..6881037203 100644 --- a/src/Core.zig +++ b/src/Core.zig @@ -24,6 +24,9 @@ windows: mach.Objects( // TODO: allocation/free strategy title: [:0]const u8 = "Mach Window", + // XDG application ID of the window + app_id: [:0]const u8 = "", + /// Texture format of the framebuffer (read-only) framebuffer_format: gpu.Texture.Format = .bgra8_unorm, diff --git a/src/core/linux/Wayland.zig b/src/core/linux/Wayland.zig index 0106dff23f..812a96ef3f 100644 --- a/src/core/linux/Wayland.zig +++ b/src/core/linux/Wayland.zig @@ -177,6 +177,7 @@ pub fn initWindow( wl = &core_window.native.?.wayland; c.xdg_toplevel_set_title(wl.toplevel, @ptrCast(core_window.title)); + c.xdg_toplevel_set_app_id(wl.toplevel, @ptrCast(core_window.app_id)); // Commit changes to surface c.wl_surface_commit(wl.surface); From d72bee86f6761e467c4ef25cf573c0be581b4015 Mon Sep 17 00:00:00 2001 From: icefox Date: Sat, 10 Jan 2026 16:38:12 -0300 Subject: [PATCH 4/4] remove log statements --- src/core/linux/Wayland.zig | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/core/linux/Wayland.zig b/src/core/linux/Wayland.zig index 812a96ef3f..d6ca736562 100644 --- a/src/core/linux/Wayland.zig +++ b/src/core/linux/Wayland.zig @@ -810,7 +810,6 @@ const xdg_surface_listener = struct { const wl = &core_window.native.?.wayland; if (!wl.configured) { - std.log.debug("not configure\n", .{}); wl.configured = true; core_ptr.windows.setValue(window_id, core_window); // core_window = core_ptr.windows.getValue(window_id); @@ -819,9 +818,7 @@ const xdg_surface_listener = struct { setContentAreaOpaque(wl, Core.Size{ .width = core_window.width, .height = core_window.height }); - std.log.debug("configure\n", .{}); if (core_window.framebuffer_width != core_window.width or core_window.framebuffer_height != core_window.height) { - std.log.debug("recreating\n", .{}); core_window.framebuffer_width = core_window.width; core_window.framebuffer_height = core_window.height;