From 20f8163d8f25ae2b5f4507b970ad734d91af608e Mon Sep 17 00:00:00 2001 From: creare Date: Tue, 11 Nov 2025 15:58:58 -0500 Subject: [PATCH 01/10] Show error message in error prompt --- src/gui/windows/error_prompt.zig | 30 +++++++++++++++++++++++++++++- src/main.zig | 7 ++----- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index 96473633d8..5792029ee8 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -13,6 +13,9 @@ const VerticalList = @import("../components/VerticalList.zig"); const Button = @import("../components/Button.zig"); var fileExplorerIcon: Texture = undefined; +var errorText: []const u8 = ""; +var isOpen: bool = false; +var errorCount: u32 = 0; pub var window = GuiWindow{ .contentSize = Vec2f{128, 64}, @@ -26,16 +29,32 @@ pub var window = GuiWindow{ pub fn init() void { fileExplorerIcon = Texture.initFromFile("assets/cubyz/ui/file_explorer_icon.png"); + errorText = main.globalAllocator.dupe(u8, ""); } pub fn deinit() void { fileExplorerIcon.deinit(); + main.globalAllocator.free(errorText); } fn openLog() void { main.files.openDirInWindow("logs"); } +pub fn raiseError(newText: []const u8) void { + if(isOpen) { + gui.closeWindow("error_prompt"); + errorCount += 1; + gui.openWindow("error_prompt"); + } else { + // openWindow can take time + main.globalAllocator.free(errorText); + errorText = main.globalAllocator.dupe(u8, newText); + errorCount = 0; + gui.openWindow("error_prompt"); + } +} + const padding: f32 = 8; pub fn update() void { if (main.Window.Gamepad.wereControllerMappingsDownloaded()) { @@ -43,9 +62,17 @@ pub fn update() void { } } +const plainErrorText = "#ffff00The game encountered errors.\nCheck the logs for details."; +const singleErrorFmtText = "#ff0000{s}"; +const multipleErrorFmtText = "#ff0000{s}\n#ffff00And {d} more...\nCheck the logs for details."; + pub fn onOpen() void { + isOpen = true; const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); - list.add(Label.init(.{padding, 16 + padding}, 128, "#ffff00The game encountered errors. Check the logs for details", .center)); + var buf: [256]u8 = undefined; + const str = if(errorCount == 0) std.fmt.bufPrint(&buf, singleErrorFmtText, .{errorText}) catch plainErrorText + else std.fmt.bufPrint(&buf, multipleErrorFmtText, .{errorText, errorCount}) catch plainErrorText; + list.add(Label.init(.{padding, 16 + padding}, 256, str, .center)); list.add(Button.initIcon(.{0, 0}, .{16, 16}, fileExplorerIcon, false, .init(openLog))); list.finish(.center); window.rootComponent = list.toComponent(); @@ -54,6 +81,7 @@ pub fn onOpen() void { } pub fn onClose() void { + isOpen = false; if (window.rootComponent) |*comp| { comp.deinit(); } diff --git a/src/main.zig b/src/main.zig index 60402ab016..966fc5e28f 100644 --- a/src/main.zig +++ b/src/main.zig @@ -87,7 +87,6 @@ fn cacheString(comptime str: []const u8) []const u8 { var logFile: ?std.Io.File = undefined; var logFileTs: ?std.Io.File = undefined; var supportsANSIColors: bool = undefined; -var openingErrorWindow: bool = false; // overwrite the log function: pub const std_options: std.Options = .{ // MARK: std_options .log_level = .debug, @@ -136,10 +135,8 @@ noinline fn runtimeLogFn(level: std.log.Level, format: []const u8, args: []const logToStdErr("[{s}]: {s}{s}", .{filePrefix, writer.buffered(), fileSuffix}); } - if (level == .err and !openingErrorWindow and !settings.launchConfig.headlessServer) { - openingErrorWindow = true; - gui.openWindow("error_prompt"); - openingErrorWindow = false; + if (level == .err and !settings.launchConfig.headlessServer) { + gui.windowlist.error_prompt.raiseError(writer.buffered()); } } From c4e9263bc66ee8531499faac04940a01c5bf3c44 Mon Sep 17 00:00:00 2001 From: creare Date: Tue, 11 Nov 2025 18:15:53 -0500 Subject: [PATCH 02/10] fixes --- src/gui/windows/error_prompt.zig | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index 5792029ee8..fe2748f836 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -12,10 +12,10 @@ const Label = @import("../components/Label.zig"); const VerticalList = @import("../components/VerticalList.zig"); const Button = @import("../components/Button.zig"); -var fileExplorerIcon: Texture = undefined; +var errorCount: u32 = 0; var errorText: []const u8 = ""; +var fileExplorerIcon: Texture = undefined; var isOpen: bool = false; -var errorCount: u32 = 0; pub var window = GuiWindow{ .contentSize = Vec2f{128, 64}, @@ -43,15 +43,14 @@ fn openLog() void { pub fn raiseError(newText: []const u8) void { if(isOpen) { - gui.closeWindow("error_prompt"); errorCount += 1; - gui.openWindow("error_prompt"); + onClose(); + onOpen(); } else { - // openWindow can take time main.globalAllocator.free(errorText); errorText = main.globalAllocator.dupe(u8, newText); errorCount = 0; - gui.openWindow("error_prompt"); + gui.openWindowFromRef(&window); } } From 6ec5bcc3e3614366ef77c854f7051bdf8892c01f Mon Sep 17 00:00:00 2001 From: creare Date: Tue, 11 Nov 2025 18:21:29 -0500 Subject: [PATCH 03/10] Fix fmt --- src/gui/windows/error_prompt.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index fe2748f836..512b520278 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -63,7 +63,7 @@ pub fn update() void { const plainErrorText = "#ffff00The game encountered errors.\nCheck the logs for details."; const singleErrorFmtText = "#ff0000{s}"; -const multipleErrorFmtText = "#ff0000{s}\n#ffff00And {d} more...\nCheck the logs for details."; +const multipleErrorFmtText = "#ff0000{s}\n#ffff00And {d} more...\nCheck the logs for details."; pub fn onOpen() void { isOpen = true; From 892abd5881be6abd0976bf2b47a290167e05e841 Mon Sep 17 00:00:00 2001 From: creare Date: Thu, 20 Nov 2025 14:56:16 -0500 Subject: [PATCH 04/10] Use allocPrint --- src/gui/windows/error_prompt.zig | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index 512b520278..366dc987a3 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -68,9 +68,13 @@ const multipleErrorFmtText = "#ff0000{s}\n#ffff00And {d} more...\nCheck the logs pub fn onOpen() void { isOpen = true; const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); - var buf: [256]u8 = undefined; - const str = if(errorCount == 0) std.fmt.bufPrint(&buf, singleErrorFmtText, .{errorText}) catch plainErrorText - else std.fmt.bufPrint(&buf, multipleErrorFmtText, .{errorText, errorCount}) catch plainErrorText; + var str: []const u8 = undefined; + if(errorCount == 0) { + str = std.fmt.allocPrint(main.stackAllocator.allocator, singleErrorFmtText, .{errorText}) catch unreachable; + } else { + str = std.fmt.allocPrint(main.stackAllocator.allocator, multipleErrorFmtText, .{errorText, errorCount}) catch unreachable; + } + defer main.stackAllocator.free(str); list.add(Label.init(.{padding, 16 + padding}, 256, str, .center)); list.add(Button.initIcon(.{0, 0}, .{16, 16}, fileExplorerIcon, false, .init(openLog))); list.finish(.center); From 6e1a310d310b0b155b5e1f543d83a53d598f1a92 Mon Sep 17 00:00:00 2001 From: creare Date: Sun, 30 Nov 2025 09:46:54 -0500 Subject: [PATCH 05/10] Handle errorText allocation better --- src/gui/windows/error_prompt.zig | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index 366dc987a3..86c82a8257 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -13,7 +13,7 @@ const VerticalList = @import("../components/VerticalList.zig"); const Button = @import("../components/Button.zig"); var errorCount: u32 = 0; -var errorText: []const u8 = ""; +var errorText: ?[]const u8 = null; var fileExplorerIcon: Texture = undefined; var isOpen: bool = false; @@ -29,12 +29,14 @@ pub var window = GuiWindow{ pub fn init() void { fileExplorerIcon = Texture.initFromFile("assets/cubyz/ui/file_explorer_icon.png"); - errorText = main.globalAllocator.dupe(u8, ""); } pub fn deinit() void { fileExplorerIcon.deinit(); - main.globalAllocator.free(errorText); + if(errorText != null) { + main.globalAllocator.free(errorText.?); + errorText = null; + } } fn openLog() void { @@ -47,7 +49,7 @@ pub fn raiseError(newText: []const u8) void { onClose(); onOpen(); } else { - main.globalAllocator.free(errorText); + if(errorText != null) main.globalAllocator.free(errorText.?); errorText = main.globalAllocator.dupe(u8, newText); errorCount = 0; gui.openWindowFromRef(&window); @@ -70,9 +72,9 @@ pub fn onOpen() void { const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); var str: []const u8 = undefined; if(errorCount == 0) { - str = std.fmt.allocPrint(main.stackAllocator.allocator, singleErrorFmtText, .{errorText}) catch unreachable; + str = std.fmt.allocPrint(main.stackAllocator.allocator, singleErrorFmtText, .{errorText.?}) catch unreachable; } else { - str = std.fmt.allocPrint(main.stackAllocator.allocator, multipleErrorFmtText, .{errorText, errorCount}) catch unreachable; + str = std.fmt.allocPrint(main.stackAllocator.allocator, multipleErrorFmtText, .{errorText.?, errorCount}) catch unreachable; } defer main.stackAllocator.free(str); list.add(Label.init(.{padding, 16 + padding}, 256, str, .center)); From b199c67ce1c8481b0c34b6eb289ebd165379038b Mon Sep 17 00:00:00 2001 From: thecreare Date: Sat, 9 May 2026 20:59:27 -0400 Subject: [PATCH 06/10] run newest formatter --- src/gui/windows/error_prompt.zig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index 86c82a8257..018266d284 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -33,7 +33,7 @@ pub fn init() void { pub fn deinit() void { fileExplorerIcon.deinit(); - if(errorText != null) { + if (errorText != null) { main.globalAllocator.free(errorText.?); errorText = null; } @@ -44,12 +44,12 @@ fn openLog() void { } pub fn raiseError(newText: []const u8) void { - if(isOpen) { + if (isOpen) { errorCount += 1; onClose(); onOpen(); } else { - if(errorText != null) main.globalAllocator.free(errorText.?); + if (errorText != null) main.globalAllocator.free(errorText.?); errorText = main.globalAllocator.dupe(u8, newText); errorCount = 0; gui.openWindowFromRef(&window); @@ -71,7 +71,7 @@ pub fn onOpen() void { isOpen = true; const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); var str: []const u8 = undefined; - if(errorCount == 0) { + if (errorCount == 0) { str = std.fmt.allocPrint(main.stackAllocator.allocator, singleErrorFmtText, .{errorText.?}) catch unreachable; } else { str = std.fmt.allocPrint(main.stackAllocator.allocator, multipleErrorFmtText, .{errorText.?, errorCount}) catch unreachable; From e2126a2e11411313e911a009945c2be74a69ae3d Mon Sep 17 00:00:00 2001 From: thecreare Date: Sat, 9 May 2026 21:10:27 -0400 Subject: [PATCH 07/10] remove unused variable --- src/gui/windows/error_prompt.zig | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index 018266d284..859bc29236 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -63,7 +63,6 @@ pub fn update() void { } } -const plainErrorText = "#ffff00The game encountered errors.\nCheck the logs for details."; const singleErrorFmtText = "#ff0000{s}"; const multipleErrorFmtText = "#ff0000{s}\n#ffff00And {d} more...\nCheck the logs for details."; From d144b2d2208b33e1d0d18c51c30a5aa49cf6986f Mon Sep 17 00:00:00 2001 From: creare <33350279+thecreare@users.noreply.github.com> Date: Mon, 11 May 2026 16:55:49 -0400 Subject: [PATCH 08/10] Apply Wunka's suggestions Co-authored-by: Wunka <56411012+Wunka@users.noreply.github.com> --- src/gui/windows/error_prompt.zig | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index 859bc29236..34939705fa 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -33,8 +33,8 @@ pub fn init() void { pub fn deinit() void { fileExplorerIcon.deinit(); - if (errorText != null) { - main.globalAllocator.free(errorText.?); + if (errorText) |text| { + main.globalAllocator.free(text); errorText = null; } } @@ -49,7 +49,7 @@ pub fn raiseError(newText: []const u8) void { onClose(); onOpen(); } else { - if (errorText != null) main.globalAllocator.free(errorText.?); + if (errorText) |text| main.globalAllocator.free(text); errorText = main.globalAllocator.dupe(u8, newText); errorCount = 0; gui.openWindowFromRef(&window); From 43dc1ac2ba750aef4de7f7a1a5e4a0a9542aad93 Mon Sep 17 00:00:00 2001 From: thecreare Date: Mon, 11 May 2026 16:50:44 -0400 Subject: [PATCH 09/10] Fix error prompt immediately closing if controller mappings are downloaded --- src/gui/windows/error_prompt.zig | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index 34939705fa..27a7228ad6 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -57,11 +57,6 @@ pub fn raiseError(newText: []const u8) void { } const padding: f32 = 8; -pub fn update() void { - if (main.Window.Gamepad.wereControllerMappingsDownloaded()) { - gui.closeWindowFromRef(&window); - } -} const singleErrorFmtText = "#ff0000{s}"; const multipleErrorFmtText = "#ff0000{s}\n#ffff00And {d} more...\nCheck the logs for details."; From e91a84fbc438d0a6ee65c9b103d2be73545a9de5 Mon Sep 17 00:00:00 2001 From: thecreare Date: Mon, 11 May 2026 16:51:12 -0400 Subject: [PATCH 10/10] Rename errorCount to overflowErrorCount --- src/gui/windows/error_prompt.zig | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/gui/windows/error_prompt.zig b/src/gui/windows/error_prompt.zig index 27a7228ad6..f3356bd4e8 100644 --- a/src/gui/windows/error_prompt.zig +++ b/src/gui/windows/error_prompt.zig @@ -12,7 +12,7 @@ const Label = @import("../components/Label.zig"); const VerticalList = @import("../components/VerticalList.zig"); const Button = @import("../components/Button.zig"); -var errorCount: u32 = 0; +var overflowErrorCount: u32 = 0; var errorText: ?[]const u8 = null; var fileExplorerIcon: Texture = undefined; var isOpen: bool = false; @@ -45,13 +45,13 @@ fn openLog() void { pub fn raiseError(newText: []const u8) void { if (isOpen) { - errorCount += 1; + overflowErrorCount += 1; onClose(); onOpen(); } else { if (errorText) |text| main.globalAllocator.free(text); errorText = main.globalAllocator.dupe(u8, newText); - errorCount = 0; + overflowErrorCount = 0; gui.openWindowFromRef(&window); } } @@ -65,10 +65,10 @@ pub fn onOpen() void { isOpen = true; const list = VerticalList.init(.{padding, 16 + padding}, 300, 16); var str: []const u8 = undefined; - if (errorCount == 0) { + if (overflowErrorCount == 0) { str = std.fmt.allocPrint(main.stackAllocator.allocator, singleErrorFmtText, .{errorText.?}) catch unreachable; } else { - str = std.fmt.allocPrint(main.stackAllocator.allocator, multipleErrorFmtText, .{errorText.?, errorCount}) catch unreachable; + str = std.fmt.allocPrint(main.stackAllocator.allocator, multipleErrorFmtText, .{errorText.?, overflowErrorCount}) catch unreachable; } defer main.stackAllocator.free(str); list.add(Label.init(.{padding, 16 + padding}, 256, str, .center));