From 397e47c274fb5077e16b37f28c8f9327cc995b2e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 27 Sep 2025 14:32:45 -0700 Subject: [PATCH] terminal: use LibEnum for the command keys --- src/lib/enum.zig | 4 +++- src/terminal/build_options.zig | 3 +++ src/terminal/main.zig | 2 +- src/terminal/osc.zig | 32 +++++++++++++++++++++++++++++++- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/lib/enum.zig b/src/lib/enum.zig index 01006f46f..063232176 100644 --- a/src/lib/enum.zig +++ b/src/lib/enum.zig @@ -35,7 +35,8 @@ pub fn Enum( fields_i += 1; } - return @Type(.{ .@"enum" = .{ + // Assigned to var so that the type name is nicer in stack traces. + const Result = @Type(.{ .@"enum" = .{ .tag_type = switch (target) { .c => c_int, .zig => std.math.IntFittingRange(0, fields_i - 1), @@ -44,6 +45,7 @@ pub fn Enum( .decls = &.{}, .is_exhaustive = true, } }); + return Result; } pub const Target = union(enum) { diff --git a/src/terminal/build_options.zig b/src/terminal/build_options.zig index 1b0449bbf..2085e2243 100644 --- a/src/terminal/build_options.zig +++ b/src/terminal/build_options.zig @@ -1,5 +1,8 @@ const std = @import("std"); +/// True if we're building the C library libghostty-vt. +pub const is_c_lib = @import("root") == @import("../lib_vt.zig"); + pub const Options = struct { /// The target artifact to build. This will gate some functionality. artifact: Artifact, diff --git a/src/terminal/main.zig b/src/terminal/main.zig index 832fe6a29..70b5742cd 100644 --- a/src/terminal/main.zig +++ b/src/terminal/main.zig @@ -63,7 +63,7 @@ pub const Attribute = sgr.Attribute; pub const isSafePaste = sanitize.isSafePaste; /// This is set to true when we're building the C library. -pub const is_c_lib = @import("root") == @import("../lib_vt.zig"); +pub const is_c_lib = @import("build_options.zig").is_c_lib; pub const c_api = @import("c/main.zig"); test { diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 5b0ea0847..9ba394c67 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -10,6 +10,8 @@ const builtin = @import("builtin"); const mem = std.mem; const assert = std.debug.assert; const Allocator = mem.Allocator; +const LibEnum = @import("../lib/enum.zig").Enum; +const is_c_lib = @import("build_options.zig").is_c_lib; const RGB = @import("color.zig").RGB; const kitty_color = @import("kitty/color.zig"); const osc_color = @import("osc/color.zig"); @@ -17,7 +19,7 @@ pub const color = osc_color; const log = std.log.scoped(.osc); -pub const Command = union(enum) { +pub const Command = union(Key) { /// This generally shouldn't ever be set except as an initial zero value. /// Ignore it. invalid, @@ -172,6 +174,34 @@ pub const Command = union(enum) { /// ConEmu GUI macro (OSC 9;6) conemu_guimacro: []const u8, + pub const Key = LibEnum( + if (is_c_lib) .c else .zig, + // NOTE: Order matters, see LibEnum documentation. + &.{ + "invalid", + "change_window_title", + "change_window_icon", + "prompt_start", + "prompt_end", + "end_of_input", + "end_of_command", + "clipboard_contents", + "report_pwd", + "mouse_shape", + "color_operation", + "kitty_color_protocol", + "show_desktop_notification", + "hyperlink_start", + "hyperlink_end", + "conemu_sleep", + "conemu_show_message_box", + "conemu_change_tab_title", + "conemu_progress_report", + "conemu_wait_input", + "conemu_guimacro", + }, + ); + pub const ProgressReport = struct { pub const State = enum(c_int) { remove,