mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-17 01:06:08 +03:00
font: SharedGridSet must hash diff for font size change
Fixes #1670 This fixes two issues: - If no font families are set, font points would not change the hash. - DPI changes would not change the hash. When the hash doesn't change when it should, we reuse a font stack due to changes in #1662. This would cause some font issues. :)
This commit is contained in:
@ -428,6 +428,11 @@ pub const Key = struct {
|
|||||||
/// The metric modifier set configuration.
|
/// The metric modifier set configuration.
|
||||||
metric_modifiers: Metrics.ModifierSet = .{},
|
metric_modifiers: Metrics.ModifierSet = .{},
|
||||||
|
|
||||||
|
/// The configured font size for this key. We don't use this
|
||||||
|
/// directly but it is used as part of the hash for the
|
||||||
|
/// font grid.
|
||||||
|
font_size: DesiredSize = .{ .points = 12 },
|
||||||
|
|
||||||
const style_offsets_len = std.enums.directEnumArrayLen(Style, 0);
|
const style_offsets_len = std.enums.directEnumArrayLen(Style, 0);
|
||||||
const StyleOffsets = [style_offsets_len]usize;
|
const StyleOffsets = [style_offsets_len]usize;
|
||||||
|
|
||||||
@ -537,6 +542,7 @@ pub const Key = struct {
|
|||||||
},
|
},
|
||||||
.codepoint_map = codepoint_map,
|
.codepoint_map = codepoint_map,
|
||||||
.metric_modifiers = metric_modifiers,
|
.metric_modifiers = metric_modifiers,
|
||||||
|
.font_size = font_size,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -559,6 +565,7 @@ pub const Key = struct {
|
|||||||
/// Hash the key with the given hasher.
|
/// Hash the key with the given hasher.
|
||||||
pub fn hash(self: Key, hasher: anytype) void {
|
pub fn hash(self: Key, hasher: anytype) void {
|
||||||
const autoHash = std.hash.autoHash;
|
const autoHash = std.hash.autoHash;
|
||||||
|
autoHash(hasher, self.font_size);
|
||||||
autoHash(hasher, self.descriptors.len);
|
autoHash(hasher, self.descriptors.len);
|
||||||
for (self.descriptors) |d| d.hash(hasher);
|
for (self.descriptors) |d| d.hash(hasher);
|
||||||
self.codepoint_map.hash(hasher);
|
self.codepoint_map.hash(hasher);
|
||||||
@ -600,7 +607,47 @@ test "Key" {
|
|||||||
var k = try Key.init(alloc, &keycfg, .{ .points = 12 });
|
var k = try Key.init(alloc, &keycfg, .{ .points = 12 });
|
||||||
defer k.deinit();
|
defer k.deinit();
|
||||||
|
|
||||||
|
var k2 = try Key.init(alloc, &keycfg, .{ .points = 12 });
|
||||||
|
defer k2.deinit();
|
||||||
|
|
||||||
try testing.expect(k.hashcode() > 0);
|
try testing.expect(k.hashcode() > 0);
|
||||||
|
try testing.expectEqual(k.hashcode(), k2.hashcode());
|
||||||
|
}
|
||||||
|
|
||||||
|
test "Key different font points" {
|
||||||
|
const testing = std.testing;
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
var cfg = try Config.default(alloc);
|
||||||
|
defer cfg.deinit();
|
||||||
|
|
||||||
|
var keycfg = try DerivedConfig.init(alloc, &cfg);
|
||||||
|
defer keycfg.deinit();
|
||||||
|
|
||||||
|
var k = try Key.init(alloc, &keycfg, .{ .points = 12 });
|
||||||
|
defer k.deinit();
|
||||||
|
|
||||||
|
var k2 = try Key.init(alloc, &keycfg, .{ .points = 16 });
|
||||||
|
defer k2.deinit();
|
||||||
|
|
||||||
|
try testing.expect(k.hashcode() != k2.hashcode());
|
||||||
|
}
|
||||||
|
|
||||||
|
test "Key different font DPI" {
|
||||||
|
const testing = std.testing;
|
||||||
|
const alloc = testing.allocator;
|
||||||
|
var cfg = try Config.default(alloc);
|
||||||
|
defer cfg.deinit();
|
||||||
|
|
||||||
|
var keycfg = try DerivedConfig.init(alloc, &cfg);
|
||||||
|
defer keycfg.deinit();
|
||||||
|
|
||||||
|
var k = try Key.init(alloc, &keycfg, .{ .points = 12, .xdpi = 1 });
|
||||||
|
defer k.deinit();
|
||||||
|
|
||||||
|
var k2 = try Key.init(alloc, &keycfg, .{ .points = 12, .xdpi = 2 });
|
||||||
|
defer k2.deinit();
|
||||||
|
|
||||||
|
try testing.expect(k.hashcode() != k2.hashcode());
|
||||||
}
|
}
|
||||||
|
|
||||||
test SharedGridSet {
|
test SharedGridSet {
|
||||||
|
Reference in New Issue
Block a user