From fa8314058552bda5c7c09f769f7fef7c97aa39f4 Mon Sep 17 00:00:00 2001 From: Zein Hajj-Ali Date: Sat, 28 Dec 2024 21:07:43 -0500 Subject: [PATCH 01/23] Set alpha component for fullscreen background colour --- macos/Sources/Features/Terminal/TerminalController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 7fd1802dc..e6f5befff 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -247,7 +247,7 @@ class TerminalController: BaseTerminalController { let backgroundColor: OSColor if let surfaceTree { if let focusedSurface, surfaceTree.doesBorderTop(view: focusedSurface) { - backgroundColor = OSColor(focusedSurface.backgroundColor ?? surfaceConfig.backgroundColor) + backgroundColor = OSColor(focusedSurface.backgroundColor ?? surfaceConfig.backgroundColor).withAlphaComponent(0.0) } else { // We don't have a focused surface or our surface doesn't border the // top. We choose to match the color of the top-left most surface. From bfde326bcb2defdf90e98fb60caf083db80b2a97 Mon Sep 17 00:00:00 2001 From: sin-ack Date: Sun, 29 Dec 2024 02:05:37 +0000 Subject: [PATCH 02/23] font/freetype: Rewrite monoToGrayscale algorithm The original version had issues converting properly and caused broken glyphs. This version tries to be as simple as possible in order to make it easy to understand. I haven't measured the performance but in practice this will only happen during the first render of the glyph after a face change (i.e. during launch or when changing font size). --- src/font/face/freetype_convert.zig | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/src/font/face/freetype_convert.zig b/src/font/face/freetype_convert.zig index 298aad8a0..6df350bfa 100644 --- a/src/font/face/freetype_convert.zig +++ b/src/font/face/freetype_convert.zig @@ -43,26 +43,14 @@ pub fn monoToGrayscale(alloc: Allocator, bm: Bitmap) Allocator.Error!Bitmap { var buf = try alloc.alloc(u8, bm.width * bm.rows); errdefer alloc.free(buf); - // width divided by 8 because each byte has 8 pixels. This is therefore - // the number of bytes in each row. - const bytes_per_row = bm.width >> 3; - - var source_i: usize = 0; - var target_i: usize = 0; - var i: usize = bm.rows; - while (i > 0) : (i -= 1) { - var j: usize = bytes_per_row; - while (j > 0) : (j -= 1) { - var bit: u4 = 8; - while (bit > 0) : (bit -= 1) { - const mask = @as(u8, 1) << @as(u3, @intCast(bit - 1)); - const bitval: u8 = if (bm.buffer[source_i + (j - 1)] & mask > 0) 0xFF else 0; - buf[target_i] = bitval; - target_i += 1; - } + for (0..bm.rows) |y| { + const row_offset = y * @as(usize, @intCast(bm.pitch)); + for (0..bm.width) |x| { + const byte_offset = row_offset + @divTrunc(x, 8); + const mask = @as(u8, 1) << @intCast(7 - (x % 8)); + const bit: u8 = @intFromBool((bm.buffer[byte_offset] & mask) != 0); + buf[y * bm.width + x] = bit * 255; } - - source_i += @intCast(bm.pitch); } var copy = bm; From ea8fe9a4b0c438c3421ad030e70435a4efb65929 Mon Sep 17 00:00:00 2001 From: sin-ack Date: Sun, 29 Dec 2024 02:08:25 +0000 Subject: [PATCH 03/23] font/freetype: Enable bitmap glyphs for non-color faces This allows for crisp bitmap font rendering once again. --- src/font/face/freetype.zig | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/font/face/freetype.zig b/src/font/face/freetype.zig index bc503a3af..3f180ad68 100644 --- a/src/font/face/freetype.zig +++ b/src/font/face/freetype.zig @@ -288,7 +288,6 @@ pub const Face = struct { self.face.loadGlyph(glyph_id, .{ .render = true, .color = self.face.hasColor(), - .no_bitmap = !self.face.hasColor(), }) catch return false; // If the glyph is SVG we assume colorized @@ -323,14 +322,6 @@ pub const Face = struct { // glyph properties before render so we don't render here. .render = !self.synthetic.bold, - // Disable bitmap strikes for now since it causes issues with - // our cell metrics and rasterization. In the future, this is - // all fixable so we can enable it. - // - // This must be enabled for color faces though because those are - // often colored bitmaps, which we support. - .no_bitmap = !self.face.hasColor(), - // use options from config .no_hinting = !self.load_flags.hinting, .force_autohint = !self.load_flags.@"force-autohint", From 1a6d9590a21ff600b5de49521cb08daccb35d53f Mon Sep 17 00:00:00 2001 From: sin-ack Date: Sun, 29 Dec 2024 04:55:29 +0000 Subject: [PATCH 04/23] font/freetype: Add test for crisp bitmap font rendering Now we can be certain that bitmap fonts stay crisp. :^) --- src/font/embedded.zig | 3 ++ src/font/face/freetype.zig | 52 +++++++++++++++++++++++++++ src/font/res/README.md | 3 ++ src/font/res/TerminusTTF-Regular.ttf | Bin 0 -> 500668 bytes 4 files changed, 58 insertions(+) create mode 100644 src/font/res/TerminusTTF-Regular.ttf diff --git a/src/font/embedded.zig b/src/font/embedded.zig index 098aa3eb4..31b07ff31 100644 --- a/src/font/embedded.zig +++ b/src/font/embedded.zig @@ -34,3 +34,6 @@ pub const cozette = @embedFile("res/CozetteVector.ttf"); /// Monaspace has weird ligature behaviors we want to test in our shapers /// so we embed it here. pub const monaspace_neon = @embedFile("res/MonaspaceNeon-Regular.otf"); + +/// Terminus TTF is a scalable font with bitmap glyphs at various sizes. +pub const terminus_ttf = @embedFile("res/TerminusTTF-Regular.ttf"); diff --git a/src/font/face/freetype.zig b/src/font/face/freetype.zig index 3f180ad68..0a822cbc7 100644 --- a/src/font/face/freetype.zig +++ b/src/font/face/freetype.zig @@ -996,3 +996,55 @@ test "svg font table" { try testing.expectEqual(430, table.len); } + +const terminus_i = + \\........ + \\........ + \\...#.... + \\...#.... + \\........ + \\..##.... + \\...#.... + \\...#.... + \\...#.... + \\...#.... + \\...#.... + \\..###... + \\........ + \\........ + \\........ + \\........ +; +// Including the newline +const terminus_i_pitch = 9; + +test "bitmap glyph" { + const alloc = testing.allocator; + const testFont = font.embedded.terminus_ttf; + + var lib = try Library.init(); + defer lib.deinit(); + + var atlas = try font.Atlas.init(alloc, 512, .grayscale); + defer atlas.deinit(alloc); + + // Any glyph at 12pt @ 96 DPI is a bitmap + var ft_font = try Face.init(lib, testFont, .{ .size = .{ .points = 12 } }); + defer ft_font.deinit(); + + // glyph 77 = 'i' + const glyph = try ft_font.renderGlyph(alloc, &atlas, 77, .{}); + + // should render crisp + try testing.expectEqual(8, glyph.width); + try testing.expectEqual(16, glyph.height); + for (0..glyph.height) |y| { + for (0..glyph.width) |x| { + const pixel = terminus_i[y * terminus_i_pitch + x]; + try testing.expectEqual( + @as(u8, if (pixel == '#') 255 else 0), + atlas.data[(glyph.atlas_y + y) * atlas.size + (glyph.atlas_x + x)], + ); + } + } +} diff --git a/src/font/res/README.md b/src/font/res/README.md index 3195a8916..5ad4b274f 100644 --- a/src/font/res/README.md +++ b/src/font/res/README.md @@ -25,6 +25,9 @@ This project uses several fonts which fall under the SIL Open Font License (OFL- - [Copyright 2013 Google LLC](https://github.com/googlefonts/noto-emoji/blob/main/LICENSE) - Cozette (MIT) - [Copyright (c) 2020, Slavfox](https://github.com/slavfox/Cozette/blob/main/LICENSE) +- Terminus TTF (OFL-1.1) + - [Copyright (c) 2010-2020 Dimitar Toshkov Zhekov with Reserved Font Name "Terminus Font"](https://sourceforge.net/projects/terminus-font/) + - [Copyright (c) 2011-2023 Tilman Blumenbach with Reserved Font Name "Terminus (TTF)"](https://files.ax86.net/terminus-ttf/) A full copy of the OFL license can be found at [OFL.txt](./OFL.txt). An accompanying FAQ is also available at . diff --git a/src/font/res/TerminusTTF-Regular.ttf b/src/font/res/TerminusTTF-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d125e6347fcd4fb5a0804598393d150aef5059c1 GIT binary patch literal 500668 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 qKl?9)5TCntMSS|oT3nMW?g=5j` Date: Sun, 29 Dec 2024 04:56:17 +0000 Subject: [PATCH 05/23] font/freetype: Downgrade pixfmt conversion log to debug This is an expected occurrence with bitmap glyphs and causes unnecessary spam when using the terminal with one. --- src/font/face/freetype.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/font/face/freetype.zig b/src/font/face/freetype.zig index 0a822cbc7..d63cf99f1 100644 --- a/src/font/face/freetype.zig +++ b/src/font/face/freetype.zig @@ -376,7 +376,7 @@ pub const Face = struct { return error.UnsupportedPixelMode; }; - log.warn("converting from pixel_mode={} to atlas_format={}", .{ + log.debug("converting from pixel_mode={} to atlas_format={}", .{ bitmap_ft.pixel_mode, atlas.format, }); From 4d983a208384cfa420f2628844c59f251cee7d8f Mon Sep 17 00:00:00 2001 From: moni-dz Date: Mon, 30 Dec 2024 12:32:37 +0800 Subject: [PATCH 06/23] surface: don't issue mode 2031 DSR reports when colors are changed by a VT sequence --- src/Surface.zig | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Surface.zig b/src/Surface.zig index 053dec3fd..4472ce1c4 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -853,11 +853,8 @@ pub fn handleMessage(self: *Surface, msg: Message) !void { }, .color_change => |change| { - // On any color change, we have to report for mode 2031 - // if it is enabled. - self.reportColorScheme(false); - - // Notify our apprt + // Notify our apprt, but don't send a mode 2031 DSR report + // because VT sequences were used to change the color. try self.rt_app.performAction( .{ .surface = self }, .color_change, From e9bc033b882b2681d9dab08868e481ace799f20d Mon Sep 17 00:00:00 2001 From: Leigh Oliver Date: Sat, 28 Dec 2024 11:36:02 +0000 Subject: [PATCH 07/23] fix(gtk): fix issue detecting preferred color scheme --- src/apprt/gtk/App.zig | 53 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index c6e2b4d08..b8fe9d0b7 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -1403,7 +1403,15 @@ pub fn getColorScheme(self: *App) apprt.ColorScheme { null, &err, ) orelse { - if (err) |e| log.err("unable to get current color scheme: {s}", .{e.message}); + if (err) |e| { + // If ReadOne is not yet implemented, fall back to deprecated "Read" method + // Error code: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such method “ReadOne” + if (e.code == 19) { + return self.getColorSchemeDeprecated(); + } + // Otherwise, log the error and return .light + log.err("unable to get current color scheme: {s}", .{e.message}); + } return .light; }; defer c.g_variant_unref(value); @@ -1420,6 +1428,49 @@ pub fn getColorScheme(self: *App) apprt.ColorScheme { return .light; } +/// Call the deprecated D-Bus "Read" method to determine the current color scheme. If +/// there is any error at any point we'll log the error and return "light" +fn getColorSchemeDeprecated(self: *App) apprt.ColorScheme { + const dbus_connection = c.g_application_get_dbus_connection(@ptrCast(self.app)); + var err: ?*c.GError = null; + defer if (err) |e| c.g_error_free(e); + + const value = c.g_dbus_connection_call_sync( + dbus_connection, + "org.freedesktop.portal.Desktop", + "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.Settings", + "Read", + c.g_variant_new("(ss)", "org.freedesktop.appearance", "color-scheme"), + c.G_VARIANT_TYPE("(v)"), + c.G_DBUS_CALL_FLAGS_NONE, + -1, + null, + &err, + ) orelse { + if (err) |e| log.err("Read method failed: {s}", .{e.message}); + return .light; + }; + defer c.g_variant_unref(value); + + if (c.g_variant_is_of_type(value, c.G_VARIANT_TYPE("(v)")) == 1) { + var inner: ?*c.GVariant = null; + c.g_variant_get(value, "(v)", &inner); + defer if (inner) |i| c.g_variant_unref(i); + + if (inner) |i| { + const child = c.g_variant_get_child_value(i, 0) orelse { + return .light; + }; + defer c.g_variant_unref(child); + + const val = c.g_variant_get_uint32(child); + return if (val == 1) .dark else .light; + } + } + return .light; +} + /// This will be called by D-Bus when the style changes between light & dark. fn gtkNotifyColorScheme( _: ?*c.GDBusConnection, From c62f64866c8183ca15a16e879c71a828c73a46f1 Mon Sep 17 00:00:00 2001 From: Bryan Lee <38807139+liby@users.noreply.github.com> Date: Mon, 30 Dec 2024 22:55:01 +0800 Subject: [PATCH 08/23] Ensure correct coordinate ordering in selection file write When writing selected text to file, use `topLeft` and `bottomRight` instead of `start` and `end` to ensure correct coordinate ordering. This fixes an issue where selection files could be empty when selecting text in reverse order. - Use `terminal.Selection.topLeft()` for start coordinate - Use `terminal.Selection.bottomRight()` for end coordinate --- src/Surface.zig | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Surface.zig b/src/Surface.zig index 9a6d2f6db..5b39c6046 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -4293,11 +4293,16 @@ fn writeScreenFile( tmp_dir.deinit(); return; }; + + // Use topLeft and bottomRight to ensure correct coordinate ordering + const tl = sel.topLeft(&self.io.terminal.screen); + const br = sel.bottomRight(&self.io.terminal.screen); + try self.io.terminal.screen.dumpString( buf_writer.writer(), .{ - .tl = sel.start(), - .br = sel.end(), + .tl = tl, + .br = br, .unwrap = true, }, ); From a1f7a957636383fb1abf71088802028983a061bf Mon Sep 17 00:00:00 2001 From: Bryan Lee <38807139+liby@users.noreply.github.com> Date: Tue, 31 Dec 2024 01:14:46 +0800 Subject: [PATCH 09/23] Add pin order assertion in Pin.pageIterator --- src/terminal/PageList.zig | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/terminal/PageList.zig b/src/terminal/PageList.zig index ca928fda6..5fb49ea66 100644 --- a/src/terminal/PageList.zig +++ b/src/terminal/PageList.zig @@ -3413,6 +3413,16 @@ pub const Pin = struct { direction: Direction, limit: ?Pin, ) PageIterator { + if (build_config.slow_runtime_safety) { + if (limit) |l| { + // Check the order according to the iteration direction. + switch (direction) { + .right_down => assert(self.eql(l) or self.before(l)), + .left_up => assert(self.eql(l) or l.before(self)), + } + } + } + return .{ .row = self, .limit = if (limit) |p| .{ .row = p } else .{ .none = {} }, From ade07c4c3ce76f0a1b46071d744478a1478a1bab Mon Sep 17 00:00:00 2001 From: Damien Mehala Date: Sun, 29 Dec 2024 18:12:08 +0100 Subject: [PATCH 10/23] fix: quick terminal `focus-follows-mouse` behaviour Quick Terminal now focuses on the surface under the mouse pointer when `focus-follows-mouse` is enabled. Fixes #3337 --- .../Features/Terminal/BaseTerminalController.swift | 9 ++++++++- .../Features/Terminal/TerminalController.swift | 5 ----- macos/Sources/Features/Terminal/TerminalWindow.swift | 2 -- macos/Sources/Ghostty/SurfaceView_AppKit.swift | 11 ++++++----- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 68c243004..5342663d6 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -45,6 +45,11 @@ class BaseTerminalController: NSWindowController, didSet { surfaceTreeDidChange(from: oldValue, to: surfaceTree) } } + /// Whether the terminal surface should focus when the mouse is over it. + var focusFollowsMouse: Bool { + self.derivedConfig.focusFollowsMouse + } + /// Non-nil when an alert is active so we don't overlap multiple. private var alert: NSAlert? = nil @@ -262,7 +267,6 @@ class BaseTerminalController: NSWindowController, // Set the main window title window.title = to - } func pwdDidChange(to: URL?) { @@ -604,15 +608,18 @@ class BaseTerminalController: NSWindowController, private struct DerivedConfig { let macosTitlebarProxyIcon: Ghostty.MacOSTitlebarProxyIcon let windowStepResize: Bool + let focusFollowsMouse: Bool init() { self.macosTitlebarProxyIcon = .visible self.windowStepResize = false + self.focusFollowsMouse = false } init(_ config: Ghostty.Config) { self.macosTitlebarProxyIcon = config.macosTitlebarProxyIcon self.windowStepResize = config.windowStepResize + self.focusFollowsMouse = config.focusFollowsMouse } } } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 7fd1802dc..13a1a3b53 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -117,9 +117,6 @@ class TerminalController: BaseTerminalController { // Update our derived config self.derivedConfig = DerivedConfig(config) - guard let window = window as? TerminalWindow else { return } - window.focusFollowsMouse = config.focusFollowsMouse - // If we have no surfaces in our window (is that possible?) then we update // our window appearance based on the root config. If we have surfaces, we // don't call this because the TODO @@ -422,8 +419,6 @@ class TerminalController: BaseTerminalController { } } - window.focusFollowsMouse = config.focusFollowsMouse - // Apply any additional appearance-related properties to the new window. We // apply this based on the root config but change it later based on surface // config (see focused surface change callback). diff --git a/macos/Sources/Features/Terminal/TerminalWindow.swift b/macos/Sources/Features/Terminal/TerminalWindow.swift index 503e76791..35f629bfd 100644 --- a/macos/Sources/Features/Terminal/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/TerminalWindow.swift @@ -414,8 +414,6 @@ class TerminalWindow: NSWindow { } } - var focusFollowsMouse: Bool = false - // Find the NSTextField responsible for displaying the titlebar's title. private var titlebarTextField: NSTextField? { guard let titlebarView = titlebarContainer?.subviews diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 60de024d3..2cac4a0dd 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -617,11 +617,12 @@ extension Ghostty { let mods = Ghostty.ghosttyMods(event.modifierFlags) ghostty_surface_mouse_pos(surface, pos.x, frame.height - pos.y, mods) - // If focus follows mouse is enabled then move focus to this surface. - if let window = self.window as? TerminalWindow, - window.isKeyWindow && - window.focusFollowsMouse && - !self.focused + // Handle focus-follows-mouse + if let window, + let controller = window.windowController as? BaseTerminalController, + (window.isKeyWindow && + !self.focused && + controller.focusFollowsMouse) { Ghostty.moveFocus(to: self) } From 31f101c97051be3b7482fa9828d2b329ae8288a7 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Mon, 30 Dec 2024 14:39:07 -0500 Subject: [PATCH 11/23] Revert "coretext: exclude bitmap fonts from discovery" This reverts commit 322f166ca50eb495aba3e49d24fda280e2b0a759. --- src/font/discovery.zig | 49 ++++-------------------------------------- 1 file changed, 4 insertions(+), 45 deletions(-) diff --git a/src/font/discovery.zig b/src/font/discovery.zig index a42055d5a..e73ea626f 100644 --- a/src/font/discovery.zig +++ b/src/font/discovery.zig @@ -362,16 +362,9 @@ pub const CoreText = struct { const list = set.createMatchingFontDescriptors(); defer list.release(); - // Bring the list of descriptors in to zig land - var zig_list = try copyMatchingDescriptors(alloc, list); - errdefer alloc.free(zig_list); - - // Filter them. We don't use `CTFontCollectionSetExclusionDescriptors` - // to do this because that requires a mutable collection. This way is - // much more straight forward. - zig_list = try alloc.realloc(zig_list, filterDescriptors(zig_list)); - // Sort our descriptors + const zig_list = try copyMatchingDescriptors(alloc, list); + errdefer alloc.free(zig_list); sortMatchingDescriptors(&desc, zig_list); return DiscoverIterator{ @@ -558,47 +551,13 @@ pub const CoreText = struct { for (0..result.len) |i| { result[i] = list.getValueAtIndex(macos.text.FontDescriptor, i); - // We need to retain because once the list - // is freed it will release all its members. + // We need to retain becauseonce the list is freed it will + // release all its members. result[i].retain(); } return result; } - /// Filter any descriptors out of the list that aren't acceptable for - /// some reason or another (e.g. the font isn't in a format we can handle). - /// - /// Invalid descriptors are filled in from the end of - /// the list and the new length for the list is returned. - fn filterDescriptors(list: []*macos.text.FontDescriptor) usize { - var end = list.len; - var i: usize = 0; - while (i < end) { - if (validDescriptor(list[i])) { - i += 1; - } else { - list[i].release(); - end -= 1; - list[i] = list[end]; - } - } - return end; - } - - /// Used by `filterDescriptors` to decide whether a descriptor is valid. - fn validDescriptor(desc: *macos.text.FontDescriptor) bool { - if (desc.copyAttribute(macos.text.FontAttribute.format)) |format| { - defer format.release(); - var value: c_int = undefined; - assert(format.getValue(.int, &value)); - - // Bitmap fonts are not currently supported. - if (value == macos.text.c.kCTFontFormatBitmap) return false; - } - - return true; - } - fn sortMatchingDescriptors( desc: *const Descriptor, list: []*macos.text.FontDescriptor, From 7a4215abd7fff703a122e2f2f5afd270ed7b988a Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Mon, 30 Dec 2024 14:44:30 -0500 Subject: [PATCH 12/23] font/coretext: properly resolve metrics for bitmap-only fonts macOS bitmap-only fonts are a poorly documented format, which are often distributed as `.dfont` or `.dfon` files. They use a 'bhed' table in place of the usual 'head', but the table format is byte-identical, so enabling the use of bitmap-only fonts only requires us to properly fetch this table while calculating metrics. ref: https://fontforge.org/docs/techref/bitmaponlysfnt.html --- src/font/face/coretext.zig | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/font/face/coretext.zig b/src/font/face/coretext.zig index 92ab4d396..dd4f6432e 100644 --- a/src/font/face/coretext.zig +++ b/src/font/face/coretext.zig @@ -515,8 +515,17 @@ pub const Face = struct { fn calcMetrics(ct_font: *macos.text.Font) CalcMetricsError!font.face.Metrics { // Read the 'head' table out of the font data. const head: opentype.Head = head: { - const tag = macos.text.FontTableTag.init("head"); - const data = ct_font.copyTable(tag) orelse return error.CopyTableError; + // macOS bitmap-only fonts use a 'bhed' tag rather than 'head', but + // the table format is byte-identical to the 'head' table, so if we + // can't find 'head' we try 'bhed' instead before failing. + // + // ref: https://fontforge.org/docs/techref/bitmaponlysfnt.html + const head_tag = macos.text.FontTableTag.init("head"); + const bhed_tag = macos.text.FontTableTag.init("bhed"); + const data = + ct_font.copyTable(head_tag) orelse + ct_font.copyTable(bhed_tag) orelse + return error.CopyTableError; defer data.release(); const ptr = data.getPointer(); const len = data.getLength(); From a6eec4cbe27b5d45f034f3bfb68d81308042640a Mon Sep 17 00:00:00 2001 From: acsetter Date: Mon, 30 Dec 2024 12:33:17 -0500 Subject: [PATCH 13/23] feat: support for short hex colors in config --- src/config/Config.zig | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/config/Config.zig b/src/config/Config.zig index a2f71c0c0..4a06e22ac 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -3797,17 +3797,22 @@ pub const Color = struct { pub fn fromHex(input: []const u8) !Color { // Trim the beginning '#' if it exists const trimmed = if (input.len != 0 and input[0] == '#') input[1..] else input; + if (trimmed.len != 6 and trimmed.len != 3) return error.InvalidValue; - // We expect exactly 6 for RRGGBB - if (trimmed.len != 6) return error.InvalidValue; + // Expand short hex values to full hex values + const rgb: []const u8 = if (trimmed.len == 3) &.{ + trimmed[0], trimmed[0], + trimmed[1], trimmed[1], + trimmed[2], trimmed[2], + } else trimmed; // Parse the colors two at a time. var result: Color = undefined; comptime var i: usize = 0; inline while (i < 6) : (i += 2) { const v: u8 = - ((try std.fmt.charToDigit(trimmed[i], 16)) * 16) + - try std.fmt.charToDigit(trimmed[i + 1], 16); + ((try std.fmt.charToDigit(rgb[i], 16)) * 16) + + try std.fmt.charToDigit(rgb[i + 1], 16); @field(result, switch (i) { 0 => "r", @@ -3827,6 +3832,8 @@ pub const Color = struct { try testing.expectEqual(Color{ .r = 10, .g = 11, .b = 12 }, try Color.fromHex("#0A0B0C")); 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")); + try testing.expectEqual(Color{ .r = 255, .g = 255, .b = 255 }, try Color.fromHex("FFF")); + try testing.expectEqual(Color{ .r = 51, .g = 68, .b = 85 }, try Color.fromHex("#345")); } test "parseCLI from name" { From 41df2d980590de51c874783b2e9795dbb839c025 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 30 Dec 2024 12:01:31 -0800 Subject: [PATCH 14/23] font/freetype: hardcode DPI in test to avoid variation between OS --- src/font/face/freetype.zig | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/font/face/freetype.zig b/src/font/face/freetype.zig index d63cf99f1..630eaee25 100644 --- a/src/font/face/freetype.zig +++ b/src/font/face/freetype.zig @@ -1029,7 +1029,11 @@ test "bitmap glyph" { defer atlas.deinit(alloc); // Any glyph at 12pt @ 96 DPI is a bitmap - var ft_font = try Face.init(lib, testFont, .{ .size = .{ .points = 12 } }); + var ft_font = try Face.init(lib, testFont, .{ .size = .{ + .points = 12, + .xdpi = 96, + .ydpi = 96, + } }); defer ft_font.deinit(); // glyph 77 = 'i' From e9edd21bed27144c2bae6f9cc098b702bf8cb3c0 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 30 Dec 2024 12:20:57 -0800 Subject: [PATCH 15/23] os: don't return stack memory A regression from adcaff7137ef --- src/os/open.zig | 54 +++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/src/os/open.zig b/src/os/open.zig index ff7d6049a..f6dc7ca2a 100644 --- a/src/os/open.zig +++ b/src/os/open.zig @@ -18,7 +18,31 @@ pub fn open( typ: Type, url: []const u8, ) !void { - const cmd = try openCommand(alloc, typ, url); + const cmd: OpenCommand = switch (builtin.os.tag) { + .linux => .{ .child = std.process.Child.init( + &.{ "xdg-open", url }, + alloc, + ) }, + + .windows => .{ .child = std.process.Child.init( + &.{ "rundll32", "url.dll,FileProtocolHandler", url }, + alloc, + ) }, + + .macos => .{ + .child = std.process.Child.init( + switch (typ) { + .text => &.{ "open", "-t", url }, + .unknown => &.{ "open", url }, + }, + alloc, + ), + .wait = true, + }, + + .ios => return error.Unimplemented, + else => @compileError("unsupported OS"), + }; var exe = cmd.child; if (cmd.wait) { @@ -53,31 +77,3 @@ const OpenCommand = struct { child: std.process.Child, wait: bool = false, }; - -fn openCommand(alloc: Allocator, typ: Type, url: []const u8) !OpenCommand { - return switch (builtin.os.tag) { - .linux => .{ .child = std.process.Child.init( - &.{ "xdg-open", url }, - alloc, - ) }, - - .windows => .{ .child = std.process.Child.init( - &.{ "rundll32", "url.dll,FileProtocolHandler", url }, - alloc, - ) }, - - .macos => .{ - .child = std.process.Child.init( - switch (typ) { - .text => &.{ "open", "-t", url }, - .unknown => &.{ "open", url }, - }, - alloc, - ), - .wait = true, - }, - - .ios => return error.Unimplemented, - else => @compileError("unsupported OS"), - }; -} From bdeb93fe8701d38c50aedbf05148e16e31629349 Mon Sep 17 00:00:00 2001 From: kaizo Date: Mon, 30 Dec 2024 15:23:16 -0500 Subject: [PATCH 16/23] Fix clipboard confirmation window typo --- src/apprt/gtk/ClipboardConfirmationWindow.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apprt/gtk/ClipboardConfirmationWindow.zig b/src/apprt/gtk/ClipboardConfirmationWindow.zig index 30b38f1d4..11c68da7e 100644 --- a/src/apprt/gtk/ClipboardConfirmationWindow.zig +++ b/src/apprt/gtk/ClipboardConfirmationWindow.zig @@ -238,7 +238,7 @@ fn promptText(req: apprt.ClipboardRequest) [:0]const u8 { \\Pasting this text into the terminal may be dangerous as it looks like some commands may be executed. , .osc_52_read => - \\An appliclication is attempting to read from the clipboard. + \\An application is attempting to read from the clipboard. \\The current clipboard contents are shown below. , .osc_52_write => From ffe1b7a8722c8e12dfe45178a2ad933048aed655 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 30 Dec 2024 14:44:56 -0600 Subject: [PATCH 17/23] gtk: don't use gtk_window_set_titlebar if adwaita is enabled but it's older than 1.4.0 --- src/apprt/gtk/Window.zig | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index ea863051c..f3d53e4eb 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -216,6 +216,14 @@ pub fn init(self: *Window, app: *App) !void { } } + // If Adwaita is enabled and is older than 1.4.0 we don't have the tab overview and so we + // need to stick the headerbar into the content box. + if (!adwaita.versionAtLeast(1, 4, 0) and adwaita.enabled(&self.app.config)) { + if (self.header) |h| { + c.gtk_box_append(@ptrCast(box), h.asWidget()); + } + } + // In debug we show a warning and apply the 'devel' class to the window. // This is a really common issue where people build from source in debug and performance is really bad. if (comptime std.debug.runtime_safety) { @@ -363,8 +371,17 @@ pub fn init(self: *Window, app: *App) !void { } // The box is our main child - c.gtk_window_set_child(gtk_window, box); - if (self.header) |h| c.gtk_window_set_titlebar(gtk_window, h.asWidget()); + if (!adwaita.versionAtLeast(1, 4, 0) and adwaita.enabled(&self.app.config)) { + c.adw_application_window_set_content( + @ptrCast(gtk_window), + box, + ); + } else { + c.gtk_window_set_child(gtk_window, box); + if (self.header) |h| { + c.gtk_window_set_titlebar(gtk_window, h.asWidget()); + } + } } // Show the window From dd41a9447d7a2b5a61e3c858bebaf18d4a6a7269 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 30 Dec 2024 13:43:48 -0800 Subject: [PATCH 18/23] macOS: weak self for event monitor to avoid retain cycle for controllers Fixes #3219 We were holding a reference cycle to the base terminal controller. This was preventing the window from ever being fully deallocated. --- .../Sources/Features/Terminal/BaseTerminalController.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 54d505db9..01b211730 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -111,8 +111,8 @@ class BaseTerminalController: NSWindowController, // Listen for local events that we need to know of outside of // single surface handlers. self.eventMonitor = NSEvent.addLocalMonitorForEvents( - matching: [.flagsChanged], - handler: localEventHandler) + matching: [.flagsChanged] + ) { [weak self] event in self?.localEventHandler(event) } } deinit { @@ -160,7 +160,7 @@ class BaseTerminalController: NSWindowController, } // MARK: Notifications - + @objc private func didChangeScreenParametersNotification(_ notification: Notification) { // If we have a window that is visible and it is outside the bounds of the // screen then we clamp it back to within the screen. From 220d40e99ae189a9ef064bd252dc691dd0bf5f62 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 30 Dec 2024 16:09:07 -0600 Subject: [PATCH 19/23] gtk: make sure that window-decoration is honored on all paths --- src/apprt/gtk/Window.zig | 8 +++----- src/apprt/gtk/headerbar.zig | 4 ++++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index f3d53e4eb..98bea6da2 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -156,6 +156,9 @@ pub fn init(self: *Window, app: *App) !void { if (app.config.@"gtk-titlebar") { const header = HeaderBar.init(self); + // If we are not decorated then we hide the titlebar. + header.setVisible(app.config.@"window-decoration"); + { const btn = c.gtk_menu_button_new(); c.gtk_widget_set_tooltip_text(btn, "Main Menu"); @@ -298,11 +301,6 @@ pub fn init(self: *Window, app: *App) !void { if (self.header) |header| { const header_widget = header.asWidget(); c.adw_toolbar_view_add_top_bar(toolbar_view, header_widget); - - // If we are not decorated then we hide the titlebar. - if (!app.config.@"window-decoration") { - c.gtk_widget_set_visible(header_widget, 0); - } } if (self.app.config.@"gtk-tabs-location" != .hidden) { diff --git a/src/apprt/gtk/headerbar.zig b/src/apprt/gtk/headerbar.zig index b1567ce27..87dfa8d1a 100644 --- a/src/apprt/gtk/headerbar.zig +++ b/src/apprt/gtk/headerbar.zig @@ -30,6 +30,10 @@ pub const HeaderBar = union(enum) { return .{ .gtk = @ptrCast(headerbar) }; } + pub fn setVisible(self: HeaderBar, visible: bool) void { + c.gtk_widget_set_visible(self.asWidget(), if (visible) 1 else 0); + } + pub fn asWidget(self: HeaderBar) *c.GtkWidget { return switch (self) { .adw => |headerbar| @ptrCast(@alignCast(headerbar)), From 98d77788f4b233d422606482294cef8142c235b5 Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Sat, 28 Dec 2024 00:14:21 +0800 Subject: [PATCH 20/23] feat(config): generate default template when config file is not found Closes #3203 --- src/config/Config.zig | 64 ++++++++++++++++++++++++++++++-------- src/config/config-template | 43 +++++++++++++++++++++++++ src/config/edit.zig | 8 +---- 3 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 src/config/config-template diff --git a/src/config/Config.zig b/src/config/Config.zig index 4a06e22ac..eb3d28d95 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2668,18 +2668,40 @@ pub fn loadFile(self: *Config, alloc: Allocator, path: []const u8) !void { try self.expandPaths(std.fs.path.dirname(path).?); } +pub const OptionalFileAction = enum { loaded, not_found, @"error" }; + /// Load optional configuration file from `path`. All errors are ignored. -pub fn loadOptionalFile(self: *Config, alloc: Allocator, path: []const u8) void { - self.loadFile(alloc, path) catch |err| switch (err) { - error.FileNotFound => std.log.info( - "optional config file not found, not loading path={s}", - .{path}, - ), - else => std.log.warn( - "error reading optional config file, not loading err={} path={s}", - .{ err, path }, - ), - }; +/// +/// Returns the action that was taken. +pub fn loadOptionalFile( + self: *Config, + alloc: Allocator, + path: []const u8, +) OptionalFileAction { + if (self.loadFile(alloc, path)) { + return .loaded; + } else |err| switch (err) { + error.FileNotFound => return .not_found, + else => { + std.log.warn( + "error reading optional config file, not loading err={} path={s}", + .{ err, path }, + ); + + return .@"error"; + }, + } +} + +fn writeConfigTemplate(path: []const u8) !void { + log.info("creating template config file: path={s}", .{path}); + const file = try std.fs.createFileAbsolute(path, .{}); + defer file.close(); + try std.fmt.format( + file.writer(), + @embedFile("./config-template"), + .{ .path = path }, + ); } /// Load configurations from the default configuration files. The default @@ -2688,14 +2710,30 @@ pub fn loadOptionalFile(self: *Config, alloc: Allocator, path: []const u8) void /// On macOS, `$HOME/Library/Application Support/$CFBundleIdentifier/config` /// is also loaded. pub fn loadDefaultFiles(self: *Config, alloc: Allocator) !void { + // Load XDG first const xdg_path = try internal_os.xdg.config(alloc, .{ .subdir = "ghostty/config" }); defer alloc.free(xdg_path); - self.loadOptionalFile(alloc, xdg_path); + const xdg_action = self.loadOptionalFile(alloc, xdg_path); + // On macOS load the app support directory as well if (comptime builtin.os.tag == .macos) { const app_support_path = try internal_os.macos.appSupportDir(alloc, "config"); defer alloc.free(app_support_path); - self.loadOptionalFile(alloc, app_support_path); + const app_support_action = self.loadOptionalFile(alloc, app_support_path); + + // If both files are not found, then we create a template file. + // For macOS, we only create the template file in the app support + if (app_support_action == .not_found and xdg_action == .not_found) { + writeConfigTemplate(app_support_path) catch |err| { + log.warn("error creating template config file err={}", .{err}); + }; + } + } else { + if (xdg_action == .not_found) { + writeConfigTemplate(xdg_path) catch |err| { + log.warn("error creating template config file err={}", .{err}); + }; + } } } diff --git a/src/config/config-template b/src/config/config-template new file mode 100644 index 000000000..4645e60aa --- /dev/null +++ b/src/config/config-template @@ -0,0 +1,43 @@ +# This is the configuration file for Ghostty. +# +# This template file has been automatically created at the following +# path since Ghostty couldn't find any existing config files on your system: +# +# {[path]s} +# +# The template does not set any default options, since Ghostty ships +# with sensible defaults for all options. Users should only need to set +# options that they want to change from the default. +# +# Run `ghostty +show-config --default --docs` to view a list of +# all available config options and their default values. +# +# Additionally, each config option is also explained in detail +# on Ghostty's website, at https://ghostty.org/docs/config. + +# Config syntax crash course +# ========================== +# # The config file consists of simple key-value pairs, +# # separated by equals signs. +# font-family = Iosevka +# window-padding-x = 2 +# +# # Spacing around the equals sign does not matter. +# # All of these are identical: +# key=value +# key= value +# key =value +# key = value +# +# # Any line beginning with a # is a comment. It's not possible to put +# # a comment after a config option, since it would be interpreted as a +# # part of the value. For example, this will have a value of "#123abc": +# background = #123abc +# +# # Empty values are used to reset config keys to default. +# key = +# +# # Some config options have unique syntaxes for their value, +# # which is explained in the docs for that config option. +# # Just for example: +# resize-overlay-duration = 4s 200ms diff --git a/src/config/edit.zig b/src/config/edit.zig index 68d9da88c..871a1a755 100644 --- a/src/config/edit.zig +++ b/src/config/edit.zig @@ -48,13 +48,7 @@ pub fn open(alloc_gpa: Allocator) !void { /// /// The allocator must be an arena allocator. No memory is freed by this /// function and the resulting path is not all the memory that is allocated. -/// -/// NOTE: WHY IS THIS INLINE? This is inline because when this is not -/// inline then Zig 0.13 crashes [most of the time] when trying to compile -/// this file. This is a workaround for that issue. This function is only -/// called from one place that is not performance critical so it is fine -/// to be inline. -inline fn configPath(alloc_arena: Allocator) ![]const u8 { +fn configPath(alloc_arena: Allocator) ![]const u8 { const paths: []const []const u8 = try configPathCandidates(alloc_arena); assert(paths.len > 0); From f97f7e8a707024f5d88a1ffbfcea1554947b8bc4 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 30 Dec 2024 19:40:13 -0600 Subject: [PATCH 21/23] gtk: also add css window-decorated class when toggling window decorations --- src/apprt/gtk/Window.zig | 12 +++++++++--- src/apprt/gtk/headerbar.zig | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index 98bea6da2..c9e274ea0 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -514,13 +514,19 @@ pub fn toggleWindowDecorations(self: *Window) void { const new_decorated = !old_decorated; c.gtk_window_set_decorated(self.window, @intFromBool(new_decorated)); + // Fix any artifacting that may occur in window corners. + if (new_decorated) { + c.gtk_widget_add_css_class(@ptrCast(self.window), "without-window-decoration-and-with-titlebar"); + } else { + c.gtk_widget_remove_css_class(@ptrCast(self.window), "without-window-decoration-and-with-titlebar"); + } + // If we have a titlebar, then we also show/hide it depending on the // decorated state. GTK tends to consider the titlebar part of the frame // and hides it with decorations, but libadwaita doesn't. This makes it // explicit. - if (self.header) |v| { - const widget = v.asWidget(); - c.gtk_widget_set_visible(widget, @intFromBool(new_decorated)); + if (self.header) |headerbar| { + headerbar.setVisible(new_decorated); } } diff --git a/src/apprt/gtk/headerbar.zig b/src/apprt/gtk/headerbar.zig index 87dfa8d1a..5bb92aca2 100644 --- a/src/apprt/gtk/headerbar.zig +++ b/src/apprt/gtk/headerbar.zig @@ -31,7 +31,7 @@ pub const HeaderBar = union(enum) { } pub fn setVisible(self: HeaderBar, visible: bool) void { - c.gtk_widget_set_visible(self.asWidget(), if (visible) 1 else 0); + c.gtk_widget_set_visible(self.asWidget(), @intFromBool(visible)); } pub fn asWidget(self: HeaderBar) *c.GtkWidget { From aa81c16ba153764ec9b003950aec2d7ea18c5f1f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 30 Dec 2024 20:56:13 -0800 Subject: [PATCH 22/23] input: parse triggers with codepoints that map to keys as translated Fixes #4146 This makes it so that keys such as `cmd+1` and `cmd+one` are identical. --- src/config/Config.zig | 6 ++++-- src/input/Binding.zig | 21 +++++++++++++++++++++ src/input/key.zig | 4 +++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/config/Config.zig b/src/config/Config.zig index eb3d28d95..7d9c7d8cc 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -4746,9 +4746,11 @@ pub const Keybinds = struct { try list.parseCLI(alloc, "ctrl+z>2=goto_tab:2"); try list.formatEntry(formatterpkg.entryFormatter("keybind", buf.writer())); + // Note they turn into translated keys because they match + // their ASCII mapping. const want = - \\keybind = ctrl+z>1=goto_tab:1 - \\keybind = ctrl+z>2=goto_tab:2 + \\keybind = ctrl+z>two=goto_tab:2 + \\keybind = ctrl+z>one=goto_tab:1 \\ ; try std.testing.expectEqualStrings(want, buf.items); diff --git a/src/input/Binding.zig b/src/input/Binding.zig index 85721339d..b2c03b674 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -1019,6 +1019,14 @@ pub const Trigger = struct { const cp = it.nextCodepoint() orelse break :unicode; if (it.nextCodepoint() != null) break :unicode; + // If this is ASCII and we have a translated key, set that. + if (std.math.cast(u8, cp)) |ascii| { + if (key.Key.fromASCII(ascii)) |k| { + result.key = .{ .translated = k }; + continue :loop; + } + } + result.key = .{ .unicode = cp }; continue :loop; } @@ -1554,6 +1562,19 @@ test "parse: triggers" { try parseSingle("a=ignore"), ); + // unicode keys that map to translated + try testing.expectEqual(Binding{ + .trigger = .{ .key = .{ .translated = .one } }, + .action = .{ .ignore = {} }, + }, try parseSingle("1=ignore")); + try testing.expectEqual(Binding{ + .trigger = .{ + .mods = .{ .super = true }, + .key = .{ .translated = .period }, + }, + .action = .{ .ignore = {} }, + }, try parseSingle("cmd+.=ignore")); + // single modifier try testing.expectEqual(Binding{ .trigger = .{ diff --git a/src/input/key.zig b/src/input/key.zig index eb2526593..a875611d0 100644 --- a/src/input/key.zig +++ b/src/input/key.zig @@ -729,7 +729,9 @@ pub const Key = enum(c_int) { .{ '\t', .tab }, // Keypad entries. We just assume keypad with the kp_ prefix - // so that has some special meaning. These must also always be last. + // so that has some special meaning. These must also always be last, + // so that our `fromASCII` function doesn't accidentally map them + // over normal numerics and other keys. .{ '0', .kp_0 }, .{ '1', .kp_1 }, .{ '2', .kp_2 }, From 789e2024a5ac3e1dc6431d1f84a993d2fff7e813 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 30 Dec 2024 21:30:30 -0800 Subject: [PATCH 23/23] config: fix segfault if font-family is reset via the CLI Fixes #4149 --- src/config/Config.zig | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/config/Config.zig b/src/config/Config.zig index 7d9c7d8cc..91c07cc78 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2843,17 +2843,21 @@ pub fn loadCliArgs(self: *Config, alloc_gpa: Allocator) !void { // replace the entire list with the new list. inline for (fields, 0..) |field, i| { const v = &@field(self, field); - const len = v.list.items.len - counter[i]; - if (len > 0) { - // Note: we don't have to worry about freeing the memory - // that we overwrite or cut off here because its all in - // an arena. - v.list.replaceRangeAssumeCapacity( - 0, - len, - v.list.items[counter[i]..], - ); - v.list.items.len = len; + + // The list can be empty if it was reset, i.e. --font-family="" + if (v.list.items.len > 0) { + const len = v.list.items.len - counter[i]; + if (len > 0) { + // Note: we don't have to worry about freeing the memory + // that we overwrite or cut off here because its all in + // an arena. + v.list.replaceRangeAssumeCapacity( + 0, + len, + v.list.items[counter[i]..], + ); + v.list.items.len = len; + } } } }