From 27fd1c7788a3ebdf347b54c5bc9c1c329f175397 Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Wed, 18 Mar 2026 03:19:22 +0800 Subject: [PATCH] gtk/winproto: fix memleak & other tweaks --- src/apprt/gtk/class/window.zig | 2 +- src/apprt/gtk/winproto.zig | 4 +- src/apprt/gtk/winproto/BlurRegion.zig | 8 ++-- src/apprt/gtk/winproto/noop.zig | 3 +- src/apprt/gtk/winproto/wayland.zig | 6 +-- src/apprt/gtk/winproto/x11.zig | 66 ++++++++++++++------------- 6 files changed, 47 insertions(+), 42 deletions(-) diff --git a/src/apprt/gtk/class/window.zig b/src/apprt/gtk/class/window.zig index 8cef7b765..bf2a2fe7c 100644 --- a/src/apprt/gtk/class/window.zig +++ b/src/apprt/gtk/class/window.zig @@ -1235,7 +1235,7 @@ pub const Window = extern struct { fn finalize(self: *Self) callconv(.c) void { const priv = self.private(); priv.tab_bindings.unref(); - priv.winproto.deinit(Application.default().allocator()); + priv.winproto.deinit(); gobject.Object.virtual_methods.finalize.call( Class.parent, diff --git a/src/apprt/gtk/winproto.zig b/src/apprt/gtk/winproto.zig index 6731bfb31..d409d6c26 100644 --- a/src/apprt/gtk/winproto.zig +++ b/src/apprt/gtk/winproto.zig @@ -117,9 +117,9 @@ pub const Window = union(Protocol) { }; } - pub fn deinit(self: *Window, alloc: Allocator) void { + pub fn deinit(self: *Window) void { switch (self.*) { - inline else => |*v| v.deinit(alloc), + inline else => |*v| v.deinit(), } } diff --git a/src/apprt/gtk/winproto/BlurRegion.zig b/src/apprt/gtk/winproto/BlurRegion.zig index e7d8ff7a5..f3041dae0 100644 --- a/src/apprt/gtk/winproto/BlurRegion.zig +++ b/src/apprt/gtk/winproto/BlurRegion.zig @@ -63,9 +63,11 @@ pub fn calcForWindow( var x: f64 = 0; var y: f64 = 0; native.getSurfaceTransform(&x, &y); - // Slightly inset the corners - x += 1; - y += 1; + // Slightly inset the corners if we're using CSDs + if (csd) { + x += 1; + y += 1; + } break :off .{ @intFromFloat(x), @intFromFloat(y) }; }; diff --git a/src/apprt/gtk/winproto/noop.zig b/src/apprt/gtk/winproto/noop.zig index 0d8cc18ce..950ee0f37 100644 --- a/src/apprt/gtk/winproto/noop.zig +++ b/src/apprt/gtk/winproto/noop.zig @@ -46,9 +46,8 @@ pub const Window = struct { return .{}; } - pub fn deinit(self: Window, alloc: Allocator) void { + pub fn deinit(self: *Window) void { _ = self; - _ = alloc; } pub fn updateConfigEvent( diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index ac4a3ea50..12c7fb8a2 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -185,8 +185,8 @@ pub const Window = struct { }; } - pub fn deinit(self: Window, alloc: Allocator) void { - _ = alloc; + pub fn deinit(self: *Window) void { + self.blur_region.deinit(self.globals.alloc); if (self.bg_effect) |bg| bg.destroy(); if (self.decoration) |deco| deco.release(); if (self.slide) |slide| slide.release(); @@ -203,7 +203,7 @@ pub const Window = struct { log.err("failed to sync blur={}", .{err}); }; self.syncDecoration() catch |err| { - log.err("failed to sync blur={}", .{err}); + log.err("failed to sync decoration={}", .{err}); }; if (self.apprt_window.isQuickTerminal()) { diff --git a/src/apprt/gtk/winproto/x11.zig b/src/apprt/gtk/winproto/x11.zig index 92ecf2700..8109959da 100644 --- a/src/apprt/gtk/winproto/x11.zig +++ b/src/apprt/gtk/winproto/x11.zig @@ -200,24 +200,25 @@ pub const Window = struct { }; } - pub fn deinit(self: Window, alloc: Allocator) void { - _ = self; - _ = alloc; + pub fn deinit(self: *Window) void { + self.blur_region.deinit(self.alloc); } pub fn resizeEvent(self: *Window) !void { // The blur region must update with window resizes - try self.syncBlur(); + self.syncBlur() catch |err| { + log.err("failed to sync blur={}", .{err}); + }; } pub fn syncAppearance(self: *Window) !void { // The user could have toggled between CSDs and SSDs, // therefore we need to recalculate the blur region offset. self.syncBlur() catch |err| { - log.err("failed to synchronize blur={}", .{err}); + log.err("failed to sync blur={}", .{err}); }; self.syncDecorations() catch |err| { - log.err("failed to synchronize decorations={}", .{err}); + log.err("failed to sync decorations={}", .{err}); }; } @@ -233,19 +234,16 @@ pub const Window = struct { // When blur is disabled, remove the property if it was previously set const blur = config.@"background-blur"; - if (!blur.enabled()) { - self.blur_region.deinit(self.alloc); - self.blur_region = .empty; - try self.deleteProperty(self.app.atoms.kde_blur); - return; - } - var region: BlurRegion = try .calcForWindow( - self.alloc, - self.apprt_window, - self.clientSideDecorationEnabled(), - true, - ); + var region: BlurRegion = if (blur.enabled()) + try .calcForWindow( + self.alloc, + self.apprt_window, + self.clientSideDecorationEnabled(), + true, + ) + else + .empty; errdefer region.deinit(self.alloc); // Only update X11 properties when the blur region actually changes @@ -254,20 +252,26 @@ pub const Window = struct { return; } - log.debug("set blur={}, window xid={}, region={}", .{ - blur, - self.x11_surface.getXid(), - self.blur_region, - }); + if (region.slices.items.len > 0) { + log.debug("set blur={}, window xid={}, region={}", .{ + blur, + self.x11_surface.getXid(), + region, + }); - try self.changeProperty( - BlurRegion.Slice, - self.app.atoms.kde_blur, - c.XA_CARDINAL, - ._32, - .{ .mode = .replace }, - self.blur_region.slices.items, - ); + try self.changeProperty( + BlurRegion.Slice, + self.app.atoms.kde_blur, + c.XA_CARDINAL, + ._32, + .{ .mode = .replace }, + region.slices.items, + ); + } else { + try self.deleteProperty(self.app.atoms.kde_blur); + } + + self.blur_region.deinit(self.alloc); self.blur_region = region; }