Merge pull request #528 from mitchellh/font-style

Font style
This commit is contained in:
Mitchell Hashimoto
2023-09-24 09:15:50 -07:00
committed by GitHub
5 changed files with 39 additions and 0 deletions

View File

@ -238,6 +238,7 @@ pub fn init(
if (config.@"font-family") |family| { if (config.@"font-family") |family| {
var disco_it = try disco.discover(.{ var disco_it = try disco.discover(.{
.family = family, .family = family,
.style = config.@"font-style",
.size = font_size.points, .size = font_size.points,
.variations = config.@"font-variation".list.items, .variations = config.@"font-variation".list.items,
}); });
@ -250,6 +251,7 @@ pub fn init(
if (config.@"font-family-bold") |family| { if (config.@"font-family-bold") |family| {
var disco_it = try disco.discover(.{ var disco_it = try disco.discover(.{
.family = family, .family = family,
.style = config.@"font-style-bold",
.size = font_size.points, .size = font_size.points,
.bold = true, .bold = true,
.variations = config.@"font-variation-bold".list.items, .variations = config.@"font-variation-bold".list.items,
@ -263,6 +265,7 @@ pub fn init(
if (config.@"font-family-italic") |family| { if (config.@"font-family-italic") |family| {
var disco_it = try disco.discover(.{ var disco_it = try disco.discover(.{
.family = family, .family = family,
.style = config.@"font-style-italic",
.size = font_size.points, .size = font_size.points,
.italic = true, .italic = true,
.variations = config.@"font-variation-italic".list.items, .variations = config.@"font-variation-italic".list.items,
@ -276,6 +279,7 @@ pub fn init(
if (config.@"font-family-bold-italic") |family| { if (config.@"font-family-bold-italic") |family| {
var disco_it = try disco.discover(.{ var disco_it = try disco.discover(.{
.family = family, .family = family,
.style = config.@"font-style-bold-italic",
.size = font_size.points, .size = font_size.points,
.bold = true, .bold = true,
.italic = true, .italic = true,

View File

@ -14,6 +14,9 @@ pub const Config = struct {
/// matching this family will be listed. /// matching this family will be listed.
family: ?[:0]const u8 = null, family: ?[:0]const u8 = null,
/// The style name to search for.
style: ?[:0]const u8 = null,
/// Font styles to search for. If this is set, then only fonts that /// Font styles to search for. If this is set, then only fonts that
/// match the given styles will be listed. /// match the given styles will be listed.
bold: bool = false, bold: bool = false,
@ -84,6 +87,7 @@ fn runArgs(alloc_gpa: Allocator, argsIter: anytype) !u8 {
defer disco.deinit(); defer disco.deinit();
var disco_it = try disco.discover(.{ var disco_it = try disco.discover(.{
.family = config.family, .family = config.family,
.style = config.style,
.bold = config.bold, .bold = config.bold,
.italic = config.italic, .italic = config.italic,
}); });

View File

@ -29,6 +29,17 @@ const c = @cImport({
@"font-family-italic": ?[:0]const u8 = null, @"font-family-italic": ?[:0]const u8 = null,
@"font-family-bold-italic": ?[:0]const u8 = null, @"font-family-bold-italic": ?[:0]const u8 = null,
/// The named font style to use for each of the requested terminal font
/// styles. This looks up the style based on the font style string advertised
/// by the font itself. For example, "Iosevka Heavy" has a style of "Heavy".
///
/// These are only valid if there is an exact font-family also specified.
/// If no font-family is specified, then the font-style is ignored.
@"font-style": ?[:0]const u8 = null,
@"font-style-bold": ?[:0]const u8 = null,
@"font-style-italic": ?[:0]const u8 = null,
@"font-style-bold-italic": ?[:0]const u8 = null,
/// Apply a font feature. This can be repeated multiple times to enable /// Apply a font feature. This can be repeated multiple times to enable
/// multiple font features. You can NOT set multiple font features with /// multiple font features. You can NOT set multiple font features with
/// a single value (yet). /// a single value (yet).

View File

@ -257,6 +257,7 @@ pub fn indexForCodepoint(
.size = self.size.points, .size = self.size.points,
.bold = style == .bold or style == .bold_italic, .bold = style == .bold or style == .bold_italic,
.italic = style == .italic or style == .bold_italic, .italic = style == .italic or style == .bold_italic,
.monospace = false,
}) catch break :discover; }) catch break :discover;
defer disco_it.deinit(); defer disco_it.deinit();

View File

@ -31,6 +31,12 @@ pub const Descriptor = struct {
/// fontconfig pattern, such as "Fira Code-14:bold". /// fontconfig pattern, such as "Fira Code-14:bold".
family: ?[:0]const u8 = null, family: ?[:0]const u8 = null,
/// Specific font style to search for. This will filter the style
/// string the font advertises. The "bold/italic" booleans later in this
/// struct filter by the style trait the font has, not the string, so
/// these can be used in conjunction or not.
style: ?[:0]const u8 = null,
/// A codepoint that this font must be able to render. /// A codepoint that this font must be able to render.
codepoint: u32 = 0, codepoint: u32 = 0,
@ -58,6 +64,9 @@ pub const Descriptor = struct {
if (self.family) |family| { if (self.family) |family| {
assert(pat.add(.family, .{ .string = family }, false)); assert(pat.add(.family, .{ .string = family }, false));
} }
if (self.style) |style| {
assert(pat.add(.style, .{ .string = style }, false));
}
if (self.codepoint > 0) { if (self.codepoint > 0) {
const cs = fontconfig.CharSet.create(); const cs = fontconfig.CharSet.create();
defer cs.destroy(); defer cs.destroy();
@ -99,6 +108,16 @@ pub const Descriptor = struct {
); );
} }
// Style
if (self.style) |style_bytes| {
const style = try macos.foundation.String.createWithBytes(style_bytes, .utf8, false);
defer style.release();
attrs.setValue(
macos.text.FontAttribute.style_name.key(),
style,
);
}
// Codepoint support // Codepoint support
if (self.codepoint > 0) { if (self.codepoint > 0) {
const cs = try macos.foundation.CharacterSet.createWithCharactersInRange(.{ const cs = try macos.foundation.CharacterSet.createWithCharactersInRange(.{