From bc1544a3f015a3f10b5b29e53132032ca666ae77 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Wed, 10 Jan 2024 16:35:26 -0600 Subject: [PATCH 1/5] add ability to specify RGB colors as names from the X11 rgb name list --- build.zig | 53 ++++++++++++++++ build.zig.zon | 4 ++ src/cli/action.zig | 5 ++ src/cli/list_colors.zig | 32 ++++++++++ src/config/Config.zig | 12 +++- src/generate_rgb_names.zig | 120 +++++++++++++++++++++++++++++++++++++ src/terminal/color.zig | 20 +++++++ 7 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 src/cli/list_colors.zig create mode 100644 src/generate_rgb_names.zig diff --git a/build.zig b/build.zig index 5a998bdbd..32fd07eb1 100644 --- a/build.zig +++ b/build.zig @@ -213,6 +213,8 @@ pub fn build(b: *std.Build) !void { exe_options.addOption(renderer.Impl, "renderer", renderer_impl); exe_options.addOption(bool, "libadwaita", libadwaita); + createRGBNames(b); + // Exe if (exe_) |exe| { exe.root_module.addOptions("build_options", exe_options); @@ -220,6 +222,8 @@ pub fn build(b: *std.Build) !void { // Add the shared dependencies _ = try addDeps(b, exe, static); + addRGBNames(exe); + // If we're in NixOS but not in the shell environment then we issue // a warning because the rpath may not be setup properly. const is_nixos = is_nixos: { @@ -461,6 +465,8 @@ pub fn build(b: *std.Build) !void { lib.linkLibC(); lib.root_module.addOptions("build_options", exe_options); + addRGBNames(lib); + // Create a single static lib with all our dependencies merged var lib_list = try addDeps(b, lib, true); try lib_list.append(lib.getEmittedBin()); @@ -490,6 +496,8 @@ pub fn build(b: *std.Build) !void { lib.linkLibC(); lib.root_module.addOptions("build_options", exe_options); + addRGBNames(lib); + // Create a single static lib with all our dependencies merged var lib_list = try addDeps(b, lib, true); try lib_list.append(lib.getEmittedBin()); @@ -603,6 +611,9 @@ pub fn build(b: *std.Build) !void { .root_source_file = .{ .path = "src/main_wasm.zig" }, .target = b.resolveTargetQuery(wasm_crosstarget), }); + + addRGBNames(main_test); + main_test.root_module.addOptions("build_options", exe_options); _ = try addDeps(b, main_test, true); test_step.dependOn(&main_test.step); @@ -638,6 +649,9 @@ pub fn build(b: *std.Build) !void { .target = target, .filter = test_filter, }); + + addRGBNames(main_test); + { if (emit_test_exe) b.installArtifact(main_test); _ = try addDeps(b, main_test, true); @@ -916,6 +930,45 @@ fn addDeps( return static_libs; } +var generate_rgb_names: *std.Build.Step.Run = undefined; +var generate_rgb_names_output: std.Build.LazyPath = undefined; + +fn createRGBNames(b: *std.Build) void { + const gen = b.addExecutable( + .{ + .name = "generate-rgb-names", + .root_source_file = .{ + .path = "src/generate_rgb_names.zig", + }, + .target = b.host, + }, + ); + + const rgb = b.dependency("rgb", .{}); + + gen.root_module.addAnonymousImport( + "rgb", + .{ + .root_source_file = .{ + .path = rgb.builder.pathFromRoot("rgb.txt"), + }, + }, + ); + + generate_rgb_names = b.addRunArtifact(gen); + generate_rgb_names_output = generate_rgb_names.captureStdOut(); +} + +fn addRGBNames(exe: *std.Build.Step.Compile) void { + exe.step.dependOn(&generate_rgb_names.step); + exe.root_module.addAnonymousImport( + "rgb_names", + .{ + .root_source_file = generate_rgb_names_output, + }, + ); +} + fn benchSteps( b: *std.Build, target: std.Build.ResolvedTarget, diff --git a/build.zig.zon b/build.zig.zon index c1472894d..b55b1cba5 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -48,5 +48,9 @@ .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/53acae071801e0de6ed160315869abb9bdaf20fa.tar.gz", .hash = "12201575c5a2b21c2e110593773040cddcd357544038092d18bd98fc5a2141354bbd", }, + .rgb = .{ + .url = "https://gitlab.freedesktop.org/xorg/app/rgb/-/archive/master/rgb-master.tar.gz", + .hash = "12201ecce35845b829edf31f5b1b751b24efe6bdc20a8acf06f5c0f2bd83fdd69158", + }, }, } diff --git a/src/cli/action.zig b/src/cli/action.zig index 1297d640b..f97a5d2cf 100644 --- a/src/cli/action.zig +++ b/src/cli/action.zig @@ -5,6 +5,7 @@ const list_fonts = @import("list_fonts.zig"); const version = @import("version.zig"); const list_keybinds = @import("list_keybinds.zig"); const list_themes = @import("list_themes.zig"); +const list_colors = @import("list_colors.zig"); /// Special commands that can be invoked via CLI flags. These are all /// invoked by using `+` as a CLI flag. The only exception is @@ -22,6 +23,9 @@ pub const Action = enum { /// List available themes @"list-themes", + /// List named RGB colors + @"list-colors", + pub const Error = error{ /// Multiple actions were detected. You can specify at most one /// action on the CLI otherwise the behavior desired is ambiguous. @@ -62,6 +66,7 @@ pub const Action = enum { .@"list-fonts" => try list_fonts.run(alloc), .@"list-keybinds" => try list_keybinds.run(alloc), .@"list-themes" => try list_themes.run(alloc), + .@"list-colors" => try list_colors.run(alloc), }; } }; diff --git a/src/cli/list_colors.zig b/src/cli/list_colors.zig new file mode 100644 index 000000000..4479c8f68 --- /dev/null +++ b/src/cli/list_colors.zig @@ -0,0 +1,32 @@ +const std = @import("std"); +const inputpkg = @import("../input.zig"); +const args = @import("args.zig"); +const RGBName = @import("rgb_names").RGBName; + +pub const Options = struct { + pub fn deinit(self: Options) void { + _ = self; + } +}; + +/// The "list-colors" command is used to list all the named RGB colors in +/// Ghostty. +pub fn run(alloc: std.mem.Allocator) !u8 { + var opts: Options = .{}; + defer opts.deinit(); + + { + var iter = try std.process.argsWithAllocator(alloc); + defer iter.deinit(); + try args.parse(Options, alloc, &opts, &iter); + } + + const stdout = std.io.getStdOut().writer(); + + inline for (std.meta.fields(RGBName)) |f| { + const rgb = @field(RGBName, f.name).toRGB(); + try stdout.print("{s} = #{x:0>2}{x:0>2}{x:0>2}\n", .{ f.name, rgb.r, rgb.g, rgb.b }); + } + + return 0; +} diff --git a/src/config/Config.zig b/src/config/Config.zig index 6edfe8ea4..e274550f5 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -20,6 +20,7 @@ const Key = @import("key.zig").Key; const KeyValue = @import("key.zig").Value; const ErrorList = @import("ErrorList.zig"); const MetricModifier = fontpkg.face.Metrics.Modifier; +const RGBName = @import("rgb_names").RGBName; const log = std.log.scoped(.config); @@ -2139,7 +2140,12 @@ pub const Color = packed struct(u24) { } pub fn parseCLI(input: ?[]const u8) !Color { - return fromHex(input orelse return error.ValueRequired); + if (input == null) return error.ValueRequred; + if (RGBName.fromString(input.?)) |name| { + const rgb = name.toRGB(); + return Color{ .r = rgb.r, .g = rgb.g, .b = rgb.b }; + } + return fromHex(input.?); } /// Deep copy of the struct. Required by Config. @@ -2188,6 +2194,10 @@ pub const Color = packed struct(u24) { try testing.expectEqual(Color{ .r = 10, .g = 11, .b = 12 }, try Color.fromHex("0A0B0C")); try testing.expectEqual(Color{ .r = 255, .g = 255, .b = 255 }, try Color.fromHex("FFFFFF")); } + + test "fromName" { + try std.testing.expectEqual(Color{ .r = 0, .g = 0, .b = 0 }, try Color.parseCLI("black")); + } }; /// Palette is the 256 color palette for 256-color mode. This is still diff --git a/src/generate_rgb_names.zig b/src/generate_rgb_names.zig new file mode 100644 index 000000000..c60aa34da --- /dev/null +++ b/src/generate_rgb_names.zig @@ -0,0 +1,120 @@ +const std = @import("std"); +const rgb = @embedFile("rgb"); + +const RGB = struct { + r: u8, + g: u8, + b: u8, +}; + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + var arena = std.heap.ArenaAllocator.init(gpa.allocator()); + const alloc = arena.allocator(); + + const stdout_file = std.io.getStdOut().writer(); + var bw = std.io.bufferedWriter(stdout_file); + const stdout = bw.writer(); + + var set = std.StringHashMap(RGB).init(alloc); + defer set.deinit(); + var list = std.ArrayList([]const u8).init(alloc); + defer list.deinit(); + + try stdout.writeAll( + \\// THIS FILE IS AUTO-GENERATED! DO NOT MAKE ANY CHANGES! + \\ + \\const std = @import("std"); + \\ + \\pub const RGB = struct { + \\ r: u8, + \\ g: u8, + \\ b: u8, + \\}; + \\ + \\/// RGB color names, taken from the X11 rgb.txt file. + \\pub const RGBName = enum { + \\ + \\ const Self = @This(); + \\ + \\ + ); + + var iter = std.mem.splitScalar(u8, rgb, '\n'); + while (iter.next()) |line| { + if (line.len < 12) continue; + const r = try std.fmt.parseInt(u8, std.mem.trim(u8, line[0..3], &std.ascii.whitespace), 10); + const g = try std.fmt.parseInt(u8, std.mem.trim(u8, line[4..7], &std.ascii.whitespace), 10); + const b = try std.fmt.parseInt(u8, std.mem.trim(u8, line[8..11], &std.ascii.whitespace), 10); + var n = try alloc.alloc(u8, line[12..].len); + defer alloc.free(n); + var i: usize = 0; + for (line[12..]) |c| { + if (std.ascii.isWhitespace(c)) continue; + n[i] = std.ascii.toLower(c); + i += 1; + } + const m = try alloc.dupe(u8, n[0..i]); + if (set.get(m) == null) { + try set.put(m, RGB{ .r = r, .g = g, .b = b }); + try list.append(m); + try stdout.print(" {s},\n", .{ + m, + }); + } + } + + try stdout.writeAll( + \\ + \\ pub fn fromString(str: []const u8) ?Self { + \\ const max = 64; + \\ var n: [max]u8 = undefined; + \\ var i: usize = 0; + \\ for (str, 0..) |c, j| { + \\ if (std.ascii.isWhitespace(c)) continue; + \\ n[i] = std.ascii.toLower(c); + \\ i += 1; + \\ if (i == max) { + \\ if (j >= str.len - 1) std.log.warn("color name '{s}' longer than {d} characters", .{str, max}); + \\ break; + \\ } + \\ } + \\ return std.meta.stringToEnum(Self, n[0..i]); + \\ } + \\ + \\ pub fn toRGB(self: Self) RGB { + \\ return switch(self) { + \\ + ); + + for (list.items) |name| { + if (set.get(name)) |value| { + try stdout.print(" .{s} => RGB{{ .r = {d}, .g = {d}, .b = {d} }},\n", .{ name, value.r, value.g, value.b }); + } + } + + try stdout.writeAll( + \\ }; + \\ } + \\}; + \\ + \\test "RGBName" { + \\ try std.testing.expectEqual(null, RGBName.fromString("nosuchcolor")); + \\ try std.testing.expectEqual(RGBName.white, RGBName.fromString("white")); + \\ try std.testing.expectEqual(RGBName.mediumspringgreen, RGBName.fromString("medium spring green")); + \\ try std.testing.expectEqual(RGBName.forestgreen, RGBName.fromString("ForestGreen")); + \\ + \\ try std.testing.expectEqual(RGB{ .r = 0, .g = 0, .b = 0 }, RGBName.black.toRGB()); + \\ try std.testing.expectEqual(RGB{ .r = 255, .g = 0, .b = 0 }, RGBName.red.toRGB()); + \\ try std.testing.expectEqual(RGB{ .r = 0, .g = 255, .b = 0 }, RGBName.green.toRGB()); + \\ try std.testing.expectEqual(RGB{ .r = 0, .g = 0, .b = 255 }, RGBName.blue.toRGB()); + \\ try std.testing.expectEqual(RGB{ .r = 255, .g = 255, .b = 255 }, RGBName.white.toRGB()); + \\ try std.testing.expectEqual(RGB{ .r = 124, .g = 252, .b = 0 }, RGBName.lawngreen.toRGB()); + \\ try std.testing.expectEqual(RGB{ .r = 0, .g = 250, .b = 154 }, RGBName.mediumspringgreen.toRGB()); + \\ try std.testing.expectEqual(RGB{ .r = 34, .g = 139, .b = 34 }, RGBName.forestgreen.toRGB()); + \\} + \\ + ); + + try bw.flush(); +} diff --git a/src/terminal/color.zig b/src/terminal/color.zig index 732191bff..fb8547315 100644 --- a/src/terminal/color.zig +++ b/src/terminal/color.zig @@ -1,5 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; +const RGBName = @import("rgb_names").RGBName; /// The default palette. pub const default: Palette = default: { @@ -216,6 +217,15 @@ pub const RGB = struct { }; } + if (RGBName.fromString(value)) |name| { + const rgb = name.toRGB(); + return RGB{ + .r = rgb.r, + .g = rgb.g, + .b = rgb.b, + }; + } + if (value.len < "rgb:a/a/a".len or !std.mem.eql(u8, value[0..3], "rgb")) { return error.InvalidFormat; } @@ -293,6 +303,16 @@ test "RGB.parse" { try testing.expectEqual(RGB{ .r = 255, .g = 255, .b = 255 }, try RGB.parse("#ffffff")); try testing.expectEqual(RGB{ .r = 255, .g = 0, .b = 16 }, try RGB.parse("#ff0010")); + try testing.expectEqual(RGB{ .r = 0, .g = 0, .b = 0 }, try RGB.parse("black")); + try testing.expectEqual(RGB{ .r = 255, .g = 0, .b = 0 }, try RGB.parse("red")); + try testing.expectEqual(RGB{ .r = 0, .g = 255, .b = 0 }, try RGB.parse("green")); + try testing.expectEqual(RGB{ .r = 0, .g = 0, .b = 255 }, try RGB.parse("blue")); + try testing.expectEqual(RGB{ .r = 255, .g = 255, .b = 255 }, try RGB.parse("white")); + + try testing.expectEqual(RGB{ .r = 124, .g = 252, .b = 0 }, try RGB.parse("LawnGreen")); + try testing.expectEqual(RGB{ .r = 0, .g = 250, .b = 154 }, try RGB.parse("medium spring green")); + try testing.expectEqual(RGB{ .r = 34, .g = 139, .b = 34 }, try RGB.parse(" Forest Green ")); + // Invalid format try testing.expectError(error.InvalidFormat, RGB.parse("rgb;")); try testing.expectError(error.InvalidFormat, RGB.parse("rgb:")); From cf8763561d69c58a1d1b49ab3e7c1a1d731443bb Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 10 Jan 2024 20:36:39 -0800 Subject: [PATCH 2/5] terminal: use comptime generated X11 lookup table from rgb.txt --- src/terminal/color.zig | 14 +- src/terminal/main.zig | 1 + src/terminal/res/rgb.txt | 782 +++++++++++++++++++++++++++++++++++++ src/terminal/x11_color.zig | 62 +++ 4 files changed, 850 insertions(+), 9 deletions(-) create mode 100644 src/terminal/res/rgb.txt create mode 100644 src/terminal/x11_color.zig diff --git a/src/terminal/color.zig b/src/terminal/color.zig index fb8547315..de5773aac 100644 --- a/src/terminal/color.zig +++ b/src/terminal/color.zig @@ -1,6 +1,6 @@ const std = @import("std"); const assert = std.debug.assert; -const RGBName = @import("rgb_names").RGBName; +const x11_color = @import("x11_color.zig"); /// The default palette. pub const default: Palette = default: { @@ -217,14 +217,10 @@ pub const RGB = struct { }; } - if (RGBName.fromString(value)) |name| { - const rgb = name.toRGB(); - return RGB{ - .r = rgb.r, - .g = rgb.g, - .b = rgb.b, - }; - } + // Check for X11 named colors. We allow whitespace around the edges + // of the color because Kitty allows whitespace. This is not part of + // any spec I could find. + if (x11_color.map.get(std.mem.trim(u8, value, " "))) |rgb| return rgb; if (value.len < "rgb:a/a/a".len or !std.mem.eql(u8, value[0..3], "rgb")) { return error.InvalidFormat; diff --git a/src/terminal/main.zig b/src/terminal/main.zig index 486e3526e..1ca385c27 100644 --- a/src/terminal/main.zig +++ b/src/terminal/main.zig @@ -15,6 +15,7 @@ pub const color = @import("color.zig"); pub const kitty = @import("kitty.zig"); pub const modes = @import("modes.zig"); pub const parse_table = @import("parse_table.zig"); +pub const x11_color = @import("x11_color.zig"); pub const Charset = charsets.Charset; pub const CharsetSlot = charsets.Slots; diff --git a/src/terminal/res/rgb.txt b/src/terminal/res/rgb.txt new file mode 100644 index 000000000..709664376 --- /dev/null +++ b/src/terminal/res/rgb.txt @@ -0,0 +1,782 @@ +255 250 250 snow +248 248 255 ghost white +248 248 255 GhostWhite +245 245 245 white smoke +245 245 245 WhiteSmoke +220 220 220 gainsboro +255 250 240 floral white +255 250 240 FloralWhite +253 245 230 old lace +253 245 230 OldLace +250 240 230 linen +250 235 215 antique white +250 235 215 AntiqueWhite +255 239 213 papaya whip +255 239 213 PapayaWhip +255 235 205 blanched almond +255 235 205 BlanchedAlmond +255 228 196 bisque +255 218 185 peach puff +255 218 185 PeachPuff +255 222 173 navajo white +255 222 173 NavajoWhite +255 228 181 moccasin +255 248 220 cornsilk +255 255 240 ivory +255 250 205 lemon chiffon +255 250 205 LemonChiffon +255 245 238 seashell +240 255 240 honeydew +245 255 250 mint cream +245 255 250 MintCream +240 255 255 azure +240 248 255 alice blue +240 248 255 AliceBlue +230 230 250 lavender +255 240 245 lavender blush +255 240 245 LavenderBlush +255 228 225 misty rose +255 228 225 MistyRose +255 255 255 white + 0 0 0 black + 47 79 79 dark slate gray + 47 79 79 DarkSlateGray + 47 79 79 dark slate grey + 47 79 79 DarkSlateGrey +105 105 105 dim gray +105 105 105 DimGray +105 105 105 dim grey +105 105 105 DimGrey +112 128 144 slate gray +112 128 144 SlateGray +112 128 144 slate grey +112 128 144 SlateGrey +119 136 153 light slate gray +119 136 153 LightSlateGray +119 136 153 light slate grey +119 136 153 LightSlateGrey +190 190 190 gray +190 190 190 grey +190 190 190 x11 gray +190 190 190 X11Gray +190 190 190 x11 grey +190 190 190 X11Grey +128 128 128 web gray +128 128 128 WebGray +128 128 128 web grey +128 128 128 WebGrey +211 211 211 light grey +211 211 211 LightGrey +211 211 211 light gray +211 211 211 LightGray + 25 25 112 midnight blue + 25 25 112 MidnightBlue + 0 0 128 navy + 0 0 128 navy blue + 0 0 128 NavyBlue +100 149 237 cornflower blue +100 149 237 CornflowerBlue + 72 61 139 dark slate blue + 72 61 139 DarkSlateBlue +106 90 205 slate blue +106 90 205 SlateBlue +123 104 238 medium slate blue +123 104 238 MediumSlateBlue +132 112 255 light slate blue +132 112 255 LightSlateBlue + 0 0 205 medium blue + 0 0 205 MediumBlue + 65 105 225 royal blue + 65 105 225 RoyalBlue + 0 0 255 blue + 30 144 255 dodger blue + 30 144 255 DodgerBlue + 0 191 255 deep sky blue + 0 191 255 DeepSkyBlue +135 206 235 sky blue +135 206 235 SkyBlue +135 206 250 light sky blue +135 206 250 LightSkyBlue + 70 130 180 steel blue + 70 130 180 SteelBlue +176 196 222 light steel blue +176 196 222 LightSteelBlue +173 216 230 light blue +173 216 230 LightBlue +176 224 230 powder blue +176 224 230 PowderBlue +175 238 238 pale turquoise +175 238 238 PaleTurquoise + 0 206 209 dark turquoise + 0 206 209 DarkTurquoise + 72 209 204 medium turquoise + 72 209 204 MediumTurquoise + 64 224 208 turquoise + 0 255 255 cyan + 0 255 255 aqua +224 255 255 light cyan +224 255 255 LightCyan + 95 158 160 cadet blue + 95 158 160 CadetBlue +102 205 170 medium aquamarine +102 205 170 MediumAquamarine +127 255 212 aquamarine + 0 100 0 dark green + 0 100 0 DarkGreen + 85 107 47 dark olive green + 85 107 47 DarkOliveGreen +143 188 143 dark sea green +143 188 143 DarkSeaGreen + 46 139 87 sea green + 46 139 87 SeaGreen + 60 179 113 medium sea green + 60 179 113 MediumSeaGreen + 32 178 170 light sea green + 32 178 170 LightSeaGreen +152 251 152 pale green +152 251 152 PaleGreen + 0 255 127 spring green + 0 255 127 SpringGreen +124 252 0 lawn green +124 252 0 LawnGreen + 0 255 0 green + 0 255 0 lime + 0 255 0 x11 green + 0 255 0 X11Green + 0 128 0 web green + 0 128 0 WebGreen +127 255 0 chartreuse + 0 250 154 medium spring green + 0 250 154 MediumSpringGreen +173 255 47 green yellow +173 255 47 GreenYellow + 50 205 50 lime green + 50 205 50 LimeGreen +154 205 50 yellow green +154 205 50 YellowGreen + 34 139 34 forest green + 34 139 34 ForestGreen +107 142 35 olive drab +107 142 35 OliveDrab +189 183 107 dark khaki +189 183 107 DarkKhaki +240 230 140 khaki +238 232 170 pale goldenrod +238 232 170 PaleGoldenrod +250 250 210 light goldenrod yellow +250 250 210 LightGoldenrodYellow +255 255 224 light yellow +255 255 224 LightYellow +255 255 0 yellow +255 215 0 gold +238 221 130 light goldenrod +238 221 130 LightGoldenrod +218 165 32 goldenrod +184 134 11 dark goldenrod +184 134 11 DarkGoldenrod +188 143 143 rosy brown +188 143 143 RosyBrown +205 92 92 indian red +205 92 92 IndianRed +139 69 19 saddle brown +139 69 19 SaddleBrown +160 82 45 sienna +205 133 63 peru +222 184 135 burlywood +245 245 220 beige +245 222 179 wheat +244 164 96 sandy brown +244 164 96 SandyBrown +210 180 140 tan +210 105 30 chocolate +178 34 34 firebrick +165 42 42 brown +233 150 122 dark salmon +233 150 122 DarkSalmon +250 128 114 salmon +255 160 122 light salmon +255 160 122 LightSalmon +255 165 0 orange +255 140 0 dark orange +255 140 0 DarkOrange +255 127 80 coral +240 128 128 light coral +240 128 128 LightCoral +255 99 71 tomato +255 69 0 orange red +255 69 0 OrangeRed +255 0 0 red +255 105 180 hot pink +255 105 180 HotPink +255 20 147 deep pink +255 20 147 DeepPink +255 192 203 pink +255 182 193 light pink +255 182 193 LightPink +219 112 147 pale violet red +219 112 147 PaleVioletRed +176 48 96 maroon +176 48 96 x11 maroon +176 48 96 X11Maroon +128 0 0 web maroon +128 0 0 WebMaroon +199 21 133 medium violet red +199 21 133 MediumVioletRed +208 32 144 violet red +208 32 144 VioletRed +255 0 255 magenta +255 0 255 fuchsia +238 130 238 violet +221 160 221 plum +218 112 214 orchid +186 85 211 medium orchid +186 85 211 MediumOrchid +153 50 204 dark orchid +153 50 204 DarkOrchid +148 0 211 dark violet +148 0 211 DarkViolet +138 43 226 blue violet +138 43 226 BlueViolet +160 32 240 purple +160 32 240 x11 purple +160 32 240 X11Purple +128 0 128 web purple +128 0 128 WebPurple +147 112 219 medium purple +147 112 219 MediumPurple +216 191 216 thistle +255 250 250 snow1 +238 233 233 snow2 +205 201 201 snow3 +139 137 137 snow4 +255 245 238 seashell1 +238 229 222 seashell2 +205 197 191 seashell3 +139 134 130 seashell4 +255 239 219 AntiqueWhite1 +238 223 204 AntiqueWhite2 +205 192 176 AntiqueWhite3 +139 131 120 AntiqueWhite4 +255 228 196 bisque1 +238 213 183 bisque2 +205 183 158 bisque3 +139 125 107 bisque4 +255 218 185 PeachPuff1 +238 203 173 PeachPuff2 +205 175 149 PeachPuff3 +139 119 101 PeachPuff4 +255 222 173 NavajoWhite1 +238 207 161 NavajoWhite2 +205 179 139 NavajoWhite3 +139 121 94 NavajoWhite4 +255 250 205 LemonChiffon1 +238 233 191 LemonChiffon2 +205 201 165 LemonChiffon3 +139 137 112 LemonChiffon4 +255 248 220 cornsilk1 +238 232 205 cornsilk2 +205 200 177 cornsilk3 +139 136 120 cornsilk4 +255 255 240 ivory1 +238 238 224 ivory2 +205 205 193 ivory3 +139 139 131 ivory4 +240 255 240 honeydew1 +224 238 224 honeydew2 +193 205 193 honeydew3 +131 139 131 honeydew4 +255 240 245 LavenderBlush1 +238 224 229 LavenderBlush2 +205 193 197 LavenderBlush3 +139 131 134 LavenderBlush4 +255 228 225 MistyRose1 +238 213 210 MistyRose2 +205 183 181 MistyRose3 +139 125 123 MistyRose4 +240 255 255 azure1 +224 238 238 azure2 +193 205 205 azure3 +131 139 139 azure4 +131 111 255 SlateBlue1 +122 103 238 SlateBlue2 +105 89 205 SlateBlue3 + 71 60 139 SlateBlue4 + 72 118 255 RoyalBlue1 + 67 110 238 RoyalBlue2 + 58 95 205 RoyalBlue3 + 39 64 139 RoyalBlue4 + 0 0 255 blue1 + 0 0 238 blue2 + 0 0 205 blue3 + 0 0 139 blue4 + 30 144 255 DodgerBlue1 + 28 134 238 DodgerBlue2 + 24 116 205 DodgerBlue3 + 16 78 139 DodgerBlue4 + 99 184 255 SteelBlue1 + 92 172 238 SteelBlue2 + 79 148 205 SteelBlue3 + 54 100 139 SteelBlue4 + 0 191 255 DeepSkyBlue1 + 0 178 238 DeepSkyBlue2 + 0 154 205 DeepSkyBlue3 + 0 104 139 DeepSkyBlue4 +135 206 255 SkyBlue1 +126 192 238 SkyBlue2 +108 166 205 SkyBlue3 + 74 112 139 SkyBlue4 +176 226 255 LightSkyBlue1 +164 211 238 LightSkyBlue2 +141 182 205 LightSkyBlue3 + 96 123 139 LightSkyBlue4 +198 226 255 SlateGray1 +185 211 238 SlateGray2 +159 182 205 SlateGray3 +108 123 139 SlateGray4 +202 225 255 LightSteelBlue1 +188 210 238 LightSteelBlue2 +162 181 205 LightSteelBlue3 +110 123 139 LightSteelBlue4 +191 239 255 LightBlue1 +178 223 238 LightBlue2 +154 192 205 LightBlue3 +104 131 139 LightBlue4 +224 255 255 LightCyan1 +209 238 238 LightCyan2 +180 205 205 LightCyan3 +122 139 139 LightCyan4 +187 255 255 PaleTurquoise1 +174 238 238 PaleTurquoise2 +150 205 205 PaleTurquoise3 +102 139 139 PaleTurquoise4 +152 245 255 CadetBlue1 +142 229 238 CadetBlue2 +122 197 205 CadetBlue3 + 83 134 139 CadetBlue4 + 0 245 255 turquoise1 + 0 229 238 turquoise2 + 0 197 205 turquoise3 + 0 134 139 turquoise4 + 0 255 255 cyan1 + 0 238 238 cyan2 + 0 205 205 cyan3 + 0 139 139 cyan4 +151 255 255 DarkSlateGray1 +141 238 238 DarkSlateGray2 +121 205 205 DarkSlateGray3 + 82 139 139 DarkSlateGray4 +127 255 212 aquamarine1 +118 238 198 aquamarine2 +102 205 170 aquamarine3 + 69 139 116 aquamarine4 +193 255 193 DarkSeaGreen1 +180 238 180 DarkSeaGreen2 +155 205 155 DarkSeaGreen3 +105 139 105 DarkSeaGreen4 + 84 255 159 SeaGreen1 + 78 238 148 SeaGreen2 + 67 205 128 SeaGreen3 + 46 139 87 SeaGreen4 +154 255 154 PaleGreen1 +144 238 144 PaleGreen2 +124 205 124 PaleGreen3 + 84 139 84 PaleGreen4 + 0 255 127 SpringGreen1 + 0 238 118 SpringGreen2 + 0 205 102 SpringGreen3 + 0 139 69 SpringGreen4 + 0 255 0 green1 + 0 238 0 green2 + 0 205 0 green3 + 0 139 0 green4 +127 255 0 chartreuse1 +118 238 0 chartreuse2 +102 205 0 chartreuse3 + 69 139 0 chartreuse4 +192 255 62 OliveDrab1 +179 238 58 OliveDrab2 +154 205 50 OliveDrab3 +105 139 34 OliveDrab4 +202 255 112 DarkOliveGreen1 +188 238 104 DarkOliveGreen2 +162 205 90 DarkOliveGreen3 +110 139 61 DarkOliveGreen4 +255 246 143 khaki1 +238 230 133 khaki2 +205 198 115 khaki3 +139 134 78 khaki4 +255 236 139 LightGoldenrod1 +238 220 130 LightGoldenrod2 +205 190 112 LightGoldenrod3 +139 129 76 LightGoldenrod4 +255 255 224 LightYellow1 +238 238 209 LightYellow2 +205 205 180 LightYellow3 +139 139 122 LightYellow4 +255 255 0 yellow1 +238 238 0 yellow2 +205 205 0 yellow3 +139 139 0 yellow4 +255 215 0 gold1 +238 201 0 gold2 +205 173 0 gold3 +139 117 0 gold4 +255 193 37 goldenrod1 +238 180 34 goldenrod2 +205 155 29 goldenrod3 +139 105 20 goldenrod4 +255 185 15 DarkGoldenrod1 +238 173 14 DarkGoldenrod2 +205 149 12 DarkGoldenrod3 +139 101 8 DarkGoldenrod4 +255 193 193 RosyBrown1 +238 180 180 RosyBrown2 +205 155 155 RosyBrown3 +139 105 105 RosyBrown4 +255 106 106 IndianRed1 +238 99 99 IndianRed2 +205 85 85 IndianRed3 +139 58 58 IndianRed4 +255 130 71 sienna1 +238 121 66 sienna2 +205 104 57 sienna3 +139 71 38 sienna4 +255 211 155 burlywood1 +238 197 145 burlywood2 +205 170 125 burlywood3 +139 115 85 burlywood4 +255 231 186 wheat1 +238 216 174 wheat2 +205 186 150 wheat3 +139 126 102 wheat4 +255 165 79 tan1 +238 154 73 tan2 +205 133 63 tan3 +139 90 43 tan4 +255 127 36 chocolate1 +238 118 33 chocolate2 +205 102 29 chocolate3 +139 69 19 chocolate4 +255 48 48 firebrick1 +238 44 44 firebrick2 +205 38 38 firebrick3 +139 26 26 firebrick4 +255 64 64 brown1 +238 59 59 brown2 +205 51 51 brown3 +139 35 35 brown4 +255 140 105 salmon1 +238 130 98 salmon2 +205 112 84 salmon3 +139 76 57 salmon4 +255 160 122 LightSalmon1 +238 149 114 LightSalmon2 +205 129 98 LightSalmon3 +139 87 66 LightSalmon4 +255 165 0 orange1 +238 154 0 orange2 +205 133 0 orange3 +139 90 0 orange4 +255 127 0 DarkOrange1 +238 118 0 DarkOrange2 +205 102 0 DarkOrange3 +139 69 0 DarkOrange4 +255 114 86 coral1 +238 106 80 coral2 +205 91 69 coral3 +139 62 47 coral4 +255 99 71 tomato1 +238 92 66 tomato2 +205 79 57 tomato3 +139 54 38 tomato4 +255 69 0 OrangeRed1 +238 64 0 OrangeRed2 +205 55 0 OrangeRed3 +139 37 0 OrangeRed4 +255 0 0 red1 +238 0 0 red2 +205 0 0 red3 +139 0 0 red4 +255 20 147 DeepPink1 +238 18 137 DeepPink2 +205 16 118 DeepPink3 +139 10 80 DeepPink4 +255 110 180 HotPink1 +238 106 167 HotPink2 +205 96 144 HotPink3 +139 58 98 HotPink4 +255 181 197 pink1 +238 169 184 pink2 +205 145 158 pink3 +139 99 108 pink4 +255 174 185 LightPink1 +238 162 173 LightPink2 +205 140 149 LightPink3 +139 95 101 LightPink4 +255 130 171 PaleVioletRed1 +238 121 159 PaleVioletRed2 +205 104 137 PaleVioletRed3 +139 71 93 PaleVioletRed4 +255 52 179 maroon1 +238 48 167 maroon2 +205 41 144 maroon3 +139 28 98 maroon4 +255 62 150 VioletRed1 +238 58 140 VioletRed2 +205 50 120 VioletRed3 +139 34 82 VioletRed4 +255 0 255 magenta1 +238 0 238 magenta2 +205 0 205 magenta3 +139 0 139 magenta4 +255 131 250 orchid1 +238 122 233 orchid2 +205 105 201 orchid3 +139 71 137 orchid4 +255 187 255 plum1 +238 174 238 plum2 +205 150 205 plum3 +139 102 139 plum4 +224 102 255 MediumOrchid1 +209 95 238 MediumOrchid2 +180 82 205 MediumOrchid3 +122 55 139 MediumOrchid4 +191 62 255 DarkOrchid1 +178 58 238 DarkOrchid2 +154 50 205 DarkOrchid3 +104 34 139 DarkOrchid4 +155 48 255 purple1 +145 44 238 purple2 +125 38 205 purple3 + 85 26 139 purple4 +171 130 255 MediumPurple1 +159 121 238 MediumPurple2 +137 104 205 MediumPurple3 + 93 71 139 MediumPurple4 +255 225 255 thistle1 +238 210 238 thistle2 +205 181 205 thistle3 +139 123 139 thistle4 + 0 0 0 gray0 + 0 0 0 grey0 + 3 3 3 gray1 + 3 3 3 grey1 + 5 5 5 gray2 + 5 5 5 grey2 + 8 8 8 gray3 + 8 8 8 grey3 + 10 10 10 gray4 + 10 10 10 grey4 + 13 13 13 gray5 + 13 13 13 grey5 + 15 15 15 gray6 + 15 15 15 grey6 + 18 18 18 gray7 + 18 18 18 grey7 + 20 20 20 gray8 + 20 20 20 grey8 + 23 23 23 gray9 + 23 23 23 grey9 + 26 26 26 gray10 + 26 26 26 grey10 + 28 28 28 gray11 + 28 28 28 grey11 + 31 31 31 gray12 + 31 31 31 grey12 + 33 33 33 gray13 + 33 33 33 grey13 + 36 36 36 gray14 + 36 36 36 grey14 + 38 38 38 gray15 + 38 38 38 grey15 + 41 41 41 gray16 + 41 41 41 grey16 + 43 43 43 gray17 + 43 43 43 grey17 + 46 46 46 gray18 + 46 46 46 grey18 + 48 48 48 gray19 + 48 48 48 grey19 + 51 51 51 gray20 + 51 51 51 grey20 + 54 54 54 gray21 + 54 54 54 grey21 + 56 56 56 gray22 + 56 56 56 grey22 + 59 59 59 gray23 + 59 59 59 grey23 + 61 61 61 gray24 + 61 61 61 grey24 + 64 64 64 gray25 + 64 64 64 grey25 + 66 66 66 gray26 + 66 66 66 grey26 + 69 69 69 gray27 + 69 69 69 grey27 + 71 71 71 gray28 + 71 71 71 grey28 + 74 74 74 gray29 + 74 74 74 grey29 + 77 77 77 gray30 + 77 77 77 grey30 + 79 79 79 gray31 + 79 79 79 grey31 + 82 82 82 gray32 + 82 82 82 grey32 + 84 84 84 gray33 + 84 84 84 grey33 + 87 87 87 gray34 + 87 87 87 grey34 + 89 89 89 gray35 + 89 89 89 grey35 + 92 92 92 gray36 + 92 92 92 grey36 + 94 94 94 gray37 + 94 94 94 grey37 + 97 97 97 gray38 + 97 97 97 grey38 + 99 99 99 gray39 + 99 99 99 grey39 +102 102 102 gray40 +102 102 102 grey40 +105 105 105 gray41 +105 105 105 grey41 +107 107 107 gray42 +107 107 107 grey42 +110 110 110 gray43 +110 110 110 grey43 +112 112 112 gray44 +112 112 112 grey44 +115 115 115 gray45 +115 115 115 grey45 +117 117 117 gray46 +117 117 117 grey46 +120 120 120 gray47 +120 120 120 grey47 +122 122 122 gray48 +122 122 122 grey48 +125 125 125 gray49 +125 125 125 grey49 +127 127 127 gray50 +127 127 127 grey50 +130 130 130 gray51 +130 130 130 grey51 +133 133 133 gray52 +133 133 133 grey52 +135 135 135 gray53 +135 135 135 grey53 +138 138 138 gray54 +138 138 138 grey54 +140 140 140 gray55 +140 140 140 grey55 +143 143 143 gray56 +143 143 143 grey56 +145 145 145 gray57 +145 145 145 grey57 +148 148 148 gray58 +148 148 148 grey58 +150 150 150 gray59 +150 150 150 grey59 +153 153 153 gray60 +153 153 153 grey60 +156 156 156 gray61 +156 156 156 grey61 +158 158 158 gray62 +158 158 158 grey62 +161 161 161 gray63 +161 161 161 grey63 +163 163 163 gray64 +163 163 163 grey64 +166 166 166 gray65 +166 166 166 grey65 +168 168 168 gray66 +168 168 168 grey66 +171 171 171 gray67 +171 171 171 grey67 +173 173 173 gray68 +173 173 173 grey68 +176 176 176 gray69 +176 176 176 grey69 +179 179 179 gray70 +179 179 179 grey70 +181 181 181 gray71 +181 181 181 grey71 +184 184 184 gray72 +184 184 184 grey72 +186 186 186 gray73 +186 186 186 grey73 +189 189 189 gray74 +189 189 189 grey74 +191 191 191 gray75 +191 191 191 grey75 +194 194 194 gray76 +194 194 194 grey76 +196 196 196 gray77 +196 196 196 grey77 +199 199 199 gray78 +199 199 199 grey78 +201 201 201 gray79 +201 201 201 grey79 +204 204 204 gray80 +204 204 204 grey80 +207 207 207 gray81 +207 207 207 grey81 +209 209 209 gray82 +209 209 209 grey82 +212 212 212 gray83 +212 212 212 grey83 +214 214 214 gray84 +214 214 214 grey84 +217 217 217 gray85 +217 217 217 grey85 +219 219 219 gray86 +219 219 219 grey86 +222 222 222 gray87 +222 222 222 grey87 +224 224 224 gray88 +224 224 224 grey88 +227 227 227 gray89 +227 227 227 grey89 +229 229 229 gray90 +229 229 229 grey90 +232 232 232 gray91 +232 232 232 grey91 +235 235 235 gray92 +235 235 235 grey92 +237 237 237 gray93 +237 237 237 grey93 +240 240 240 gray94 +240 240 240 grey94 +242 242 242 gray95 +242 242 242 grey95 +245 245 245 gray96 +245 245 245 grey96 +247 247 247 gray97 +247 247 247 grey97 +250 250 250 gray98 +250 250 250 grey98 +252 252 252 gray99 +252 252 252 grey99 +255 255 255 gray100 +255 255 255 grey100 +169 169 169 dark grey +169 169 169 DarkGrey +169 169 169 dark gray +169 169 169 DarkGray + 0 0 139 dark blue + 0 0 139 DarkBlue + 0 139 139 dark cyan + 0 139 139 DarkCyan +139 0 139 dark magenta +139 0 139 DarkMagenta +139 0 0 dark red +139 0 0 DarkRed +144 238 144 light green +144 238 144 LightGreen +220 20 60 crimson + 75 0 130 indigo +128 128 0 olive +102 51 153 rebecca purple +102 51 153 RebeccaPurple +192 192 192 silver + 0 128 128 teal diff --git a/src/terminal/x11_color.zig b/src/terminal/x11_color.zig new file mode 100644 index 000000000..9e4eda86b --- /dev/null +++ b/src/terminal/x11_color.zig @@ -0,0 +1,62 @@ +const std = @import("std"); +const assert = std.debug.assert; +const RGB = @import("color.zig").RGB; + +/// The map of all available X11 colors. +pub const map = colorMap() catch @compileError("failed to parse rgb.txt"); + +fn colorMap() !type { + @setEvalBranchQuota(100_000); + + const KV = struct { []const u8, RGB }; + + // The length of our data is the number of lines in the rgb file. + const len = std.mem.count(u8, data, "\n"); + var kvs: [len]KV = undefined; + + // Parse the line. This is not very robust parsing, because we expect + // a very exact format for rgb.txt. However, this is all done at comptime + // so if our data is bad, we should hopefully get an error here or one + // of our unit tests will catch it. + var iter = std.mem.splitScalar(u8, data, '\n'); + var i: usize = 0; + while (iter.next()) |line| { + if (line.len == 0) continue; + const r = try std.fmt.parseInt(u8, std.mem.trim(u8, line[0..3], " "), 10); + const g = try std.fmt.parseInt(u8, std.mem.trim(u8, line[4..7], " "), 10); + const b = try std.fmt.parseInt(u8, std.mem.trim(u8, line[8..11], " "), 10); + const name = std.mem.trim(u8, line[12..], " \t\n"); + kvs[i] = .{ name, .{ .r = r, .g = g, .b = b } }; + i += 1; + } + assert(i == len); + + return std.ComptimeStringMapWithEql( + RGB, + kvs, + std.comptime_string_map.eqlAsciiIgnoreCase, + ); +} + +/// This is the rgb.txt file from the X11 project. This was last sourced +/// from this location: https://gitlab.freedesktop.org/xorg/app/rgb +/// This data is licensed under the MIT/X11 license while this Zig file is +/// licensed under the same license as Ghostty. +const data = @embedFile("res/rgb.txt"); + +test { + const testing = std.testing; + try testing.expectEqual(null, map.get("nosuchcolor")); + try testing.expectEqual(RGB{ .r = 255, .g = 255, .b = 255 }, map.get("white").?); + try testing.expectEqual(RGB{ .r = 0, .g = 250, .b = 154 }, map.get("medium spring green")); + try testing.expectEqual(RGB{ .r = 34, .g = 139, .b = 34 }, map.get("ForestGreen")); + try testing.expectEqual(RGB{ .r = 34, .g = 139, .b = 34 }, map.get("FoReStGReen")); + try testing.expectEqual(RGB{ .r = 0, .g = 0, .b = 0 }, map.get("black")); + try testing.expectEqual(RGB{ .r = 255, .g = 0, .b = 0 }, map.get("red")); + try testing.expectEqual(RGB{ .r = 0, .g = 255, .b = 0 }, map.get("green")); + try testing.expectEqual(RGB{ .r = 0, .g = 0, .b = 255 }, map.get("blue")); + try testing.expectEqual(RGB{ .r = 255, .g = 255, .b = 255 }, map.get("white")); + try testing.expectEqual(RGB{ .r = 124, .g = 252, .b = 0 }, map.get("lawngreen")); + try testing.expectEqual(RGB{ .r = 0, .g = 250, .b = 154 }, map.get("mediumspringgreen")); + try testing.expectEqual(RGB{ .r = 34, .g = 139, .b = 34 }, map.get("forestgreen")); +} From 5216b4cfe92e37541710e72e3a3c72e826444af2 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 10 Jan 2024 20:40:21 -0800 Subject: [PATCH 3/5] build: remove generate_rgb_names --- build.zig | 51 ---------------- build.zig.zon | 4 -- src/config/Config.zig | 20 ++++--- src/generate_rgb_names.zig | 120 ------------------------------------- 4 files changed, 11 insertions(+), 184 deletions(-) delete mode 100644 src/generate_rgb_names.zig diff --git a/build.zig b/build.zig index 32fd07eb1..876eb2cec 100644 --- a/build.zig +++ b/build.zig @@ -213,8 +213,6 @@ pub fn build(b: *std.Build) !void { exe_options.addOption(renderer.Impl, "renderer", renderer_impl); exe_options.addOption(bool, "libadwaita", libadwaita); - createRGBNames(b); - // Exe if (exe_) |exe| { exe.root_module.addOptions("build_options", exe_options); @@ -222,8 +220,6 @@ pub fn build(b: *std.Build) !void { // Add the shared dependencies _ = try addDeps(b, exe, static); - addRGBNames(exe); - // If we're in NixOS but not in the shell environment then we issue // a warning because the rpath may not be setup properly. const is_nixos = is_nixos: { @@ -465,8 +461,6 @@ pub fn build(b: *std.Build) !void { lib.linkLibC(); lib.root_module.addOptions("build_options", exe_options); - addRGBNames(lib); - // Create a single static lib with all our dependencies merged var lib_list = try addDeps(b, lib, true); try lib_list.append(lib.getEmittedBin()); @@ -496,8 +490,6 @@ pub fn build(b: *std.Build) !void { lib.linkLibC(); lib.root_module.addOptions("build_options", exe_options); - addRGBNames(lib); - // Create a single static lib with all our dependencies merged var lib_list = try addDeps(b, lib, true); try lib_list.append(lib.getEmittedBin()); @@ -612,8 +604,6 @@ pub fn build(b: *std.Build) !void { .target = b.resolveTargetQuery(wasm_crosstarget), }); - addRGBNames(main_test); - main_test.root_module.addOptions("build_options", exe_options); _ = try addDeps(b, main_test, true); test_step.dependOn(&main_test.step); @@ -650,8 +640,6 @@ pub fn build(b: *std.Build) !void { .filter = test_filter, }); - addRGBNames(main_test); - { if (emit_test_exe) b.installArtifact(main_test); _ = try addDeps(b, main_test, true); @@ -930,45 +918,6 @@ fn addDeps( return static_libs; } -var generate_rgb_names: *std.Build.Step.Run = undefined; -var generate_rgb_names_output: std.Build.LazyPath = undefined; - -fn createRGBNames(b: *std.Build) void { - const gen = b.addExecutable( - .{ - .name = "generate-rgb-names", - .root_source_file = .{ - .path = "src/generate_rgb_names.zig", - }, - .target = b.host, - }, - ); - - const rgb = b.dependency("rgb", .{}); - - gen.root_module.addAnonymousImport( - "rgb", - .{ - .root_source_file = .{ - .path = rgb.builder.pathFromRoot("rgb.txt"), - }, - }, - ); - - generate_rgb_names = b.addRunArtifact(gen); - generate_rgb_names_output = generate_rgb_names.captureStdOut(); -} - -fn addRGBNames(exe: *std.Build.Step.Compile) void { - exe.step.dependOn(&generate_rgb_names.step); - exe.root_module.addAnonymousImport( - "rgb_names", - .{ - .root_source_file = generate_rgb_names_output, - }, - ); -} - fn benchSteps( b: *std.Build, target: std.Build.ResolvedTarget, diff --git a/build.zig.zon b/build.zig.zon index b55b1cba5..c1472894d 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -48,9 +48,5 @@ .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/53acae071801e0de6ed160315869abb9bdaf20fa.tar.gz", .hash = "12201575c5a2b21c2e110593773040cddcd357544038092d18bd98fc5a2141354bbd", }, - .rgb = .{ - .url = "https://gitlab.freedesktop.org/xorg/app/rgb/-/archive/master/rgb-master.tar.gz", - .hash = "12201ecce35845b829edf31f5b1b751b24efe6bdc20a8acf06f5c0f2bd83fdd69158", - }, }, } diff --git a/src/config/Config.zig b/src/config/Config.zig index e274550f5..a852fcef7 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -20,7 +20,6 @@ const Key = @import("key.zig").Key; const KeyValue = @import("key.zig").Value; const ErrorList = @import("ErrorList.zig"); const MetricModifier = fontpkg.face.Metrics.Modifier; -const RGBName = @import("rgb_names").RGBName; const log = std.log.scoped(.config); @@ -2139,13 +2138,16 @@ pub const Color = packed struct(u24) { return .{ .r = self.r, .g = self.g, .b = self.b }; } - pub fn parseCLI(input: ?[]const u8) !Color { - if (input == null) return error.ValueRequred; - if (RGBName.fromString(input.?)) |name| { - const rgb = name.toRGB(); - return Color{ .r = rgb.r, .g = rgb.g, .b = rgb.b }; - } - return fromHex(input.?); + pub fn parseCLI(input_: ?[]const u8) !Color { + const input = input_ orelse return error.ValueRequred; + + if (terminal.x11_color.map.get(input)) |rgb| return .{ + .r = rgb.r, + .g = rgb.g, + .b = rgb.b, + }; + + return fromHex(input); } /// Deep copy of the struct. Required by Config. @@ -2195,7 +2197,7 @@ pub const Color = packed struct(u24) { try testing.expectEqual(Color{ .r = 255, .g = 255, .b = 255 }, try Color.fromHex("FFFFFF")); } - test "fromName" { + test "parseCLI from name" { try std.testing.expectEqual(Color{ .r = 0, .g = 0, .b = 0 }, try Color.parseCLI("black")); } }; diff --git a/src/generate_rgb_names.zig b/src/generate_rgb_names.zig deleted file mode 100644 index c60aa34da..000000000 --- a/src/generate_rgb_names.zig +++ /dev/null @@ -1,120 +0,0 @@ -const std = @import("std"); -const rgb = @embedFile("rgb"); - -const RGB = struct { - r: u8, - g: u8, - b: u8, -}; - -pub fn main() !void { - var gpa = std.heap.GeneralPurposeAllocator(.{}){}; - var arena = std.heap.ArenaAllocator.init(gpa.allocator()); - const alloc = arena.allocator(); - - const stdout_file = std.io.getStdOut().writer(); - var bw = std.io.bufferedWriter(stdout_file); - const stdout = bw.writer(); - - var set = std.StringHashMap(RGB).init(alloc); - defer set.deinit(); - var list = std.ArrayList([]const u8).init(alloc); - defer list.deinit(); - - try stdout.writeAll( - \\// THIS FILE IS AUTO-GENERATED! DO NOT MAKE ANY CHANGES! - \\ - \\const std = @import("std"); - \\ - \\pub const RGB = struct { - \\ r: u8, - \\ g: u8, - \\ b: u8, - \\}; - \\ - \\/// RGB color names, taken from the X11 rgb.txt file. - \\pub const RGBName = enum { - \\ - \\ const Self = @This(); - \\ - \\ - ); - - var iter = std.mem.splitScalar(u8, rgb, '\n'); - while (iter.next()) |line| { - if (line.len < 12) continue; - const r = try std.fmt.parseInt(u8, std.mem.trim(u8, line[0..3], &std.ascii.whitespace), 10); - const g = try std.fmt.parseInt(u8, std.mem.trim(u8, line[4..7], &std.ascii.whitespace), 10); - const b = try std.fmt.parseInt(u8, std.mem.trim(u8, line[8..11], &std.ascii.whitespace), 10); - var n = try alloc.alloc(u8, line[12..].len); - defer alloc.free(n); - var i: usize = 0; - for (line[12..]) |c| { - if (std.ascii.isWhitespace(c)) continue; - n[i] = std.ascii.toLower(c); - i += 1; - } - const m = try alloc.dupe(u8, n[0..i]); - if (set.get(m) == null) { - try set.put(m, RGB{ .r = r, .g = g, .b = b }); - try list.append(m); - try stdout.print(" {s},\n", .{ - m, - }); - } - } - - try stdout.writeAll( - \\ - \\ pub fn fromString(str: []const u8) ?Self { - \\ const max = 64; - \\ var n: [max]u8 = undefined; - \\ var i: usize = 0; - \\ for (str, 0..) |c, j| { - \\ if (std.ascii.isWhitespace(c)) continue; - \\ n[i] = std.ascii.toLower(c); - \\ i += 1; - \\ if (i == max) { - \\ if (j >= str.len - 1) std.log.warn("color name '{s}' longer than {d} characters", .{str, max}); - \\ break; - \\ } - \\ } - \\ return std.meta.stringToEnum(Self, n[0..i]); - \\ } - \\ - \\ pub fn toRGB(self: Self) RGB { - \\ return switch(self) { - \\ - ); - - for (list.items) |name| { - if (set.get(name)) |value| { - try stdout.print(" .{s} => RGB{{ .r = {d}, .g = {d}, .b = {d} }},\n", .{ name, value.r, value.g, value.b }); - } - } - - try stdout.writeAll( - \\ }; - \\ } - \\}; - \\ - \\test "RGBName" { - \\ try std.testing.expectEqual(null, RGBName.fromString("nosuchcolor")); - \\ try std.testing.expectEqual(RGBName.white, RGBName.fromString("white")); - \\ try std.testing.expectEqual(RGBName.mediumspringgreen, RGBName.fromString("medium spring green")); - \\ try std.testing.expectEqual(RGBName.forestgreen, RGBName.fromString("ForestGreen")); - \\ - \\ try std.testing.expectEqual(RGB{ .r = 0, .g = 0, .b = 0 }, RGBName.black.toRGB()); - \\ try std.testing.expectEqual(RGB{ .r = 255, .g = 0, .b = 0 }, RGBName.red.toRGB()); - \\ try std.testing.expectEqual(RGB{ .r = 0, .g = 255, .b = 0 }, RGBName.green.toRGB()); - \\ try std.testing.expectEqual(RGB{ .r = 0, .g = 0, .b = 255 }, RGBName.blue.toRGB()); - \\ try std.testing.expectEqual(RGB{ .r = 255, .g = 255, .b = 255 }, RGBName.white.toRGB()); - \\ try std.testing.expectEqual(RGB{ .r = 124, .g = 252, .b = 0 }, RGBName.lawngreen.toRGB()); - \\ try std.testing.expectEqual(RGB{ .r = 0, .g = 250, .b = 154 }, RGBName.mediumspringgreen.toRGB()); - \\ try std.testing.expectEqual(RGB{ .r = 34, .g = 139, .b = 34 }, RGBName.forestgreen.toRGB()); - \\} - \\ - ); - - try bw.flush(); -} From 02c0ceab111509305157e8ad93fe077e8d816940 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 10 Jan 2024 20:43:22 -0800 Subject: [PATCH 4/5] cli: list-colors uses new generated rgb --- src/cli/list_colors.zig | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/cli/list_colors.zig b/src/cli/list_colors.zig index 4479c8f68..42c8396d3 100644 --- a/src/cli/list_colors.zig +++ b/src/cli/list_colors.zig @@ -1,7 +1,7 @@ const std = @import("std"); const inputpkg = @import("../input.zig"); const args = @import("args.zig"); -const RGBName = @import("rgb_names").RGBName; +const x11_color = @import("../terminal/main.zig").x11_color; pub const Options = struct { pub fn deinit(self: Options) void { @@ -23,9 +23,10 @@ pub fn run(alloc: std.mem.Allocator) !u8 { const stdout = std.io.getStdOut().writer(); - inline for (std.meta.fields(RGBName)) |f| { - const rgb = @field(RGBName, f.name).toRGB(); - try stdout.print("{s} = #{x:0>2}{x:0>2}{x:0>2}\n", .{ f.name, rgb.r, rgb.g, rgb.b }); + inline for (x11_color.map.kvs) |kv| { + const name = kv.key; + const rgb = kv.value; + try stdout.print("{s} = #{x:0>2}{x:0>2}{x:0>2}\n", .{ name, rgb.r, rgb.g, rgb.b }); } return 0; From c551e433741ede0147c426fddb3dc3a5bc35f222 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 10 Jan 2024 20:46:12 -0800 Subject: [PATCH 5/5] mark rgb.txt as vendored --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 16f4fb23c..18cd6ee96 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,4 @@ vendor/** linguist-vendored website/** linguist-documentation pkg/cimgui/vendor/** linguist-vendored +src/terminal/res/** linguist-vendored