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;
+};