diff --git a/src/cli/list_fonts.zig b/src/cli/list_fonts.zig index 26f684431..6e08aa838 100644 --- a/src/cli/list_fonts.zig +++ b/src/cli/list_fonts.zig @@ -4,7 +4,6 @@ const ArenaAllocator = std.heap.ArenaAllocator; const Action = @import("ghostty.zig").Action; const args = @import("args.zig"); const font = @import("../font/main.zig"); -const discovery = @import("../font/discovery.zig"); const log = std.log.scoped(.list_fonts); @@ -101,18 +100,12 @@ fn runArgs(alloc_gpa: Allocator, argsIter: anytype) !u8 { var families: std.ArrayList([]const u8) = .empty; var map: std.StringHashMap(std.ArrayListUnmanaged([]const u8)) = .init(alloc); - // Look up all available fonts. The Windows backend needs a FreeType - // library handle so it can open candidate font files while scanning - // the system/user font directories. - var font_lib = if (comptime font.Discover == discovery.Windows) - try font.Library.init(alloc) - else {}; - defer if (comptime font.Discover == discovery.Windows) font_lib.deinit(); - - var disco = if (comptime font.Discover == discovery.Windows) - font.Discover.init(font_lib) - else - font.Discover.init(); + // Look up all available fonts. The library is only used by backends + // that need it (the Windows backend opens candidate font files with + // FreeType); other backends ignore it. + var font_lib = try font.Library.init(alloc); + defer font_lib.deinit(); + var disco = font.Discover.init(font_lib); defer disco.deinit(); var disco_it = try disco.discover(alloc, .{ .family = config.family, diff --git a/src/font/SharedGridSet.zig b/src/font/SharedGridSet.zig index c20055089..9d8148bdc 100644 --- a/src/font/SharedGridSet.zig +++ b/src/font/SharedGridSet.zig @@ -442,10 +442,7 @@ fn discover(self: *SharedGridSet) !?*Discover { // If we initialized, use it if (self.font_discover) |*v| return v; - self.font_discover = if (comptime Discover == discovery.Windows) - .init(self.font_lib) - else - .init(); + self.font_discover = .init(self.font_lib); return &self.font_discover.?; } diff --git a/src/font/discovery.zig b/src/font/discovery.zig index 58bd0b17e..b945aa01b 100644 --- a/src/font/discovery.zig +++ b/src/font/discovery.zig @@ -247,7 +247,8 @@ pub const Descriptor = struct { pub const Fontconfig = struct { fc_config: *fontconfig.Config, - pub fn init() Fontconfig { + pub fn init(lib: Library) Fontconfig { + _ = lib; // safe to call multiple times and concurrently _ = fontconfig.init(); return .{ .fc_config = fontconfig.initLoadConfigAndFonts() }; @@ -338,7 +339,8 @@ pub const Fontconfig = struct { }; pub const CoreText = struct { - pub fn init() CoreText { + pub fn init(lib: Library) CoreText { + _ = lib; // Required for the "interface" but does nothing for CoreText. return .{}; } @@ -1162,7 +1164,10 @@ test "fontconfig" { const testing = std.testing; const alloc = testing.allocator; - var fc = Fontconfig.init(); + var lib = try Library.init(alloc); + defer lib.deinit(); + + var fc = Fontconfig.init(lib); defer fc.deinit(); var it = try fc.discover(alloc, .{ .family = "monospace", .size = 12 }); defer it.deinit(); @@ -1174,7 +1179,10 @@ test "fontconfig codepoint" { const testing = std.testing; const alloc = testing.allocator; - var fc = Fontconfig.init(); + var lib = try Library.init(alloc); + defer lib.deinit(); + + var fc = Fontconfig.init(lib); defer fc.deinit(); var it = try fc.discover(alloc, .{ .codepoint = 'A', .size = 12 }); defer it.deinit(); @@ -1196,7 +1204,10 @@ test "coretext" { const testing = std.testing; const alloc = testing.allocator; - var ct = CoreText.init(); + var lib = try Library.init(alloc); + defer lib.deinit(); + + var ct = CoreText.init(lib); defer ct.deinit(); var it = try ct.discover(alloc, .{ .family = "Monaco", .size = 12 }); defer it.deinit(); @@ -1214,7 +1225,10 @@ test "coretext codepoint" { const testing = std.testing; const alloc = testing.allocator; - var ct = CoreText.init(); + var lib = try Library.init(alloc); + defer lib.deinit(); + + var ct = CoreText.init(lib); defer ct.deinit(); var it = try ct.discover(alloc, .{ .codepoint = 'A', .size = 12 }); defer it.deinit(); @@ -1243,7 +1257,10 @@ test "coretext sorting" { const testing = std.testing; const alloc = testing.allocator; - var ct = CoreText.init(); + var lib = try Library.init(alloc); + defer lib.deinit(); + + var ct = CoreText.init(lib); defer ct.deinit(); // We try to get a Regular, Italic, Bold, & Bold Italic version of SF Pro, @@ -1309,3 +1326,24 @@ test "coretext sorting" { try testing.expectEqualStrings("SF Pro Bold Italic", name); } } + +test "windows" { + if (options.backend != .freetype_windows) return error.SkipZigTest; + + const testing = std.testing; + const alloc = testing.allocator; + + var lib = try Library.init(alloc); + defer lib.deinit(); + + var win = Windows.init(lib); + defer win.deinit(); + + // Arial ships on every stock Windows install. + var it = try win.discover(alloc, .{ .family = "Arial", .size = 12 }); + defer it.deinit(); + + var face = (try it.next()) orelse return error.TestFontNotFound; + defer face.deinit(); + try testing.expect(face.hasCodepoint('A', null)); +}