From 9f0468f950ab48b5f1faccb491858277fab23a52 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 12 Feb 2024 16:40:06 -0600 Subject: [PATCH] generate gresource xml and dependencies at comptime rather than hardcoding --- build.zig | 56 +++--------- src/apprt/gtk/ConfigErrorsWindow.zig | 1 + src/apprt/gtk/gresource.xml | 20 ----- src/apprt/gtk/gresource.zig | 124 +++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 66 deletions(-) delete mode 100644 src/apprt/gtk/gresource.xml create mode 100644 src/apprt/gtk/gresource.zig diff --git a/build.zig b/build.zig index a03d0d8a1..c8fcd2915 100644 --- a/build.zig +++ b/build.zig @@ -1167,36 +1167,13 @@ fn addDeps( if (config.libadwaita) step.linkSystemLibrary2("adwaita-1", dynamic_link_opts); { - // TODO: find a way to dynamically update this from the output - // of `glib-compile-resources --generate-dependencies` - const extra_file_dependencies = &.{ - "src/apprt/gtk/gresource.xml", - "src/apprt/gtk/style.css", - "src/apprt/gtk/style-dark.css", - "src/apprt/gtk/style-hc.css", - "src/apprt/gtk/style-hc-dark.css", - "images/icons/icon_16x16@2x@2x.png", - "images/icons/icon_16x16.png", - "images/icons/icon_32x32@2x@2x.png", - "images/icons/icon_32x32.png", - "images/icons/icon_128x128@2x@2x.png", - "images/icons/icon_128x128.png", - "images/icons/icon_256x256@2x@2x.png", - "images/icons/icon_256x256.png", - "images/icons/icon_512x512.png", - }; + const gresource = @import("src/apprt/gtk/gresource.zig"); - const generate_resources_d = b.addSystemCommand(&.{ - "glib-compile-resources", - "--generate-dependencies", - "src/apprt/gtk/gresource.xml", - }); - - _ = generate_resources_d.captureStdOut(); - - generate_resources_d.extra_file_dependencies = &.{ - "src/apprt/gtk/gresource.xml", - }; + const wf = b.addWriteFiles(); + const gresource_xml = wf.add( + "gresource.xml", + if (config.libadwaita) gresource.gresource_xml_libadwaita else gresource.gresource_xml_gtk, + ); const generate_resources_c = b.addSystemCommand(&.{ "glib-compile-resources", @@ -1208,15 +1185,9 @@ fn addDeps( const ghostty_resources_c = generate_resources_c.addOutputFileArg("ghostty_resources.c"); - generate_resources_c.addArgs(&.{ - "src/apprt/gtk/gresource.xml", - }); + generate_resources_c.addFileArg(gresource_xml); - generate_resources_c.step.dependOn(&generate_resources_d.step); - - // TODO: find a way to dynamically update this from the output - // of `glib-compile-resources --generate-dependencies` - generate_resources_c.extra_file_dependencies = extra_file_dependencies; + generate_resources_c.extra_file_dependencies = if (config.libadwaita) &gresource.dependencies_libadwaita else &gresource.dependencies_gtk; step.addCSourceFile(.{ .file = ghostty_resources_c, @@ -1233,16 +1204,9 @@ fn addDeps( const ghostty_resources_h = generate_resources_h.addOutputFileArg("ghostty_resources.h"); - generate_resources_h.addArgs(&.{ - "src/apprt/gtk/gresource.xml", - }); + generate_resources_h.addFileArg(gresource_xml); - generate_resources_h.step.dependOn(&generate_resources_d.step); - generate_resources_h.step.dependOn(&generate_resources_c.step); - - // TODO: find a way to dynamically update this from the output - // of `glib-compile-resources --generate-dependencies` - generate_resources_h.extra_file_dependencies = extra_file_dependencies; + generate_resources_h.extra_file_dependencies = if (config.libadwaita) &gresource.dependencies_libadwaita else &gresource.dependencies_gtk; step.addIncludePath(ghostty_resources_h.dirname()); } diff --git a/src/apprt/gtk/ConfigErrorsWindow.zig b/src/apprt/gtk/ConfigErrorsWindow.zig index 5fe371c1d..563a3e51b 100644 --- a/src/apprt/gtk/ConfigErrorsWindow.zig +++ b/src/apprt/gtk/ConfigErrorsWindow.zig @@ -53,6 +53,7 @@ fn init(self: *ConfigErrors, app: *App) !void { c.gtk_window_set_title(gtk_window, "Configuration Errors"); c.gtk_window_set_default_size(gtk_window, 600, 275); c.gtk_window_set_resizable(gtk_window, 0); + c.gtk_window_set_icon_name(gtk_window, "com.mitchellh.ghostty"); _ = c.g_signal_connect_data(window, "destroy", c.G_CALLBACK(>kDestroy), self, null, c.G_CONNECT_DEFAULT); // Set some state diff --git a/src/apprt/gtk/gresource.xml b/src/apprt/gtk/gresource.xml deleted file mode 100644 index 8a3394ae7..000000000 --- a/src/apprt/gtk/gresource.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - src/apprt/gtk/style.css - src/apprt/gtk/style-dark.css - src/apprt/gtk/style-hc.css - src/apprt/gtk/style-hc-dark.css - - - images/icons/icon_16x16.png - images/icons/icon_16x16@2x@2x.png - images/icons/icon_32x32.png - images/icons/icon_32x32@2x@2x.png - images/icons/icon_128x128.png - images/icons/icon_128x128@2x@2x.png - images/icons/icon_256x256.png - images/icons/icon_256x256@2x@2x.png - images/icons/icon_512x512.png - - diff --git a/src/apprt/gtk/gresource.zig b/src/apprt/gtk/gresource.zig new file mode 100644 index 000000000..a0e3806b8 --- /dev/null +++ b/src/apprt/gtk/gresource.zig @@ -0,0 +1,124 @@ +const std = @import("std"); + +const css_files = [_][]const u8{ + "style.css", + "style-dark.css", + "style-hc.css", + "style-hc-dark.css", +}; + +const icons = [_]struct { + alias: []const u8, + source: []const u8, +}{ + .{ + .alias = "16x16", + .source = "16x16", + }, + .{ + .alias = "16x16@2", + .source = "16x16@2x@2x", + }, + .{ + .alias = "32x32", + .source = "32x32", + }, + .{ + .alias = "32x32@2", + .source = "32x32@2x@2x", + }, + .{ + .alias = "128x128", + .source = "128x128", + }, + .{ + .alias = "128x128@2", + .source = "128x128@2x@2x", + }, + .{ + .alias = "256x256", + .source = "256x256", + }, + .{ + .alias = "256x256@2", + .source = "256x256@2x@2x", + }, + .{ + .alias = "512x512", + .source = "512x512", + }, +}; + +pub const gresource_xml_gtk = comptimeGenerateGResourceXML(false); +pub const gresource_xml_libadwaita = comptimeGenerateGResourceXML(true); + +fn comptimeGenerateGResourceXML(comptime libadwaita: bool) []const u8 { + comptime { + @setEvalBranchQuota(13000); + var counter = std.io.countingWriter(std.io.null_writer); + try writeGResourceXML(libadwaita, &counter.writer()); + + var buf: [counter.bytes_written]u8 = undefined; + var stream = std.io.fixedBufferStream(&buf); + try writeGResourceXML(libadwaita, stream.writer()); + return stream.getWritten(); + } +} + +fn writeGResourceXML(libadwaita: bool, writer: anytype) !void { + try writer.writeAll( + \\ + \\ + \\ + ); + if (libadwaita) { + try writer.writeAll( + \\ + \\ + ); + for (css_files) |css_file| { + try writer.print( + " src/apprt/gtk/{s}\n", + .{ css_file, css_file }, + ); + } + try writer.writeAll( + \\ + \\ + ); + } + try writer.writeAll( + \\ + \\ + ); + for (icons) |icon| { + try writer.print( + " images/icons/icon_{s}.png\n", + .{ icon.alias, icon.source }, + ); + } + try writer.writeAll( + \\ + \\ + \\ + ); +} + +pub const dependencies_gtk = deps: { + var deps: [icons.len][]const u8 = undefined; + for (icons, 0..) |icon, i| { + deps[i] = std.fmt.comptimePrint("images/icons/icon_{s}.png", .{icon.source}); + } + break :deps deps; +}; + +pub const dependencies_libadwaita = deps: { + var deps: [css_files.len + icons.len][]const u8 = undefined; + for (css_files, 0..) |css_file, i| { + deps[i] = std.fmt.comptimePrint("src/apprt/gtk/{s}", .{css_file}); + } + for (icons, css_files.len..) |icon, i| { + deps[i] = std.fmt.comptimePrint("images/icons/icon_{s}.png", .{icon.source}); + } + break :deps deps; +};