From 842becbcaf3aaeff663f7c3f3db771e28868bf6a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 26 Nov 2025 16:05:12 -0800 Subject: [PATCH 1/9] terminal: PageList search should halt when pin becomes garbage This means that the pin we're using to track our position in the PageList was part of a node that got reused/recycled at some point. We can't make any meaningful guarantees about the state of the PageList. This only happens with scrollback pruning so we can treat it as a complete search. --- src/terminal/search/pagelist.zig | 50 ++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/terminal/search/pagelist.zig b/src/terminal/search/pagelist.zig index bd1ce9ef7..227bd03f9 100644 --- a/src/terminal/search/pagelist.zig +++ b/src/terminal/search/pagelist.zig @@ -112,6 +112,11 @@ pub const PageListSearch = struct { /// This returns false if there is no more data to feed. This essentially /// means we've searched the entire pagelist. pub fn feed(self: *PageListSearch) Allocator.Error!bool { + // If our pin becomes garbage it means wherever we were next + // was reused and we can't make sense of our progress anymore. + // It is effectively equivalent to reaching the end of the PageList. + if (self.pin.garbage) return false; + // Add at least enough data to find a single match. var rem = self.window.needle.len; @@ -392,3 +397,48 @@ test "feed with match spanning page boundary with newline" { try testing.expect(search.next() == null); try testing.expect(!try search.feed()); } + +test "feed with pruned page" { + const alloc = testing.allocator; + + // Zero here forces minimum max size to effectively two pages. + var p: PageList = try .init(alloc, 80, 24, 0); + defer p.deinit(); + + // Grow to capacity + const page1_node = p.pages.last.?; + const page1 = page1_node.data; + for (0..page1.capacity.rows - page1.size.rows) |_| { + try testing.expect(try p.grow() == null); + } + + // Grow and allocate one more page. Then fill that page up. + const page2_node = (try p.grow()).?; + const page2 = page2_node.data; + for (0..page2.capacity.rows - page2.size.rows) |_| { + try testing.expect(try p.grow() == null); + } + + // Setup search and feed until we can't + var search: PageListSearch = try .init( + alloc, + "Test", + &p, + p.pages.last.?, + ); + defer search.deinit(); + try testing.expect(try search.feed()); + try testing.expect(!try search.feed()); + + // Next should create a new page, but it should reuse our first + // page since we're at max size. + const new = (try p.grow()).?; + try testing.expect(p.pages.last.? == new); + + // Our first should now be page2 and our last should be page1 + try testing.expectEqual(page2_node, p.pages.first.?); + try testing.expectEqual(page1_node, p.pages.last.?); + + // Feed should still do nothing + try testing.expect(!try search.feed()); +} From 4ff0e0c9d251ddd0687ead578a90d58d63f9840b Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 27 Nov 2025 07:21:56 -0800 Subject: [PATCH 2/9] input: remove the unused end search entry in the palette --- src/input/command.zig | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/input/command.zig b/src/input/command.zig index 7cbff405a..3879efc36 100644 --- a/src/input/command.zig +++ b/src/input/command.zig @@ -185,12 +185,6 @@ fn actionCommands(action: Action.Key) []const Command { .description = "Navigate to the previous search result, if any.", } }, - .search => comptime &.{.{ - .action = .{ .search = "" }, - .title = "End Search", - .description = "End a search if one is active.", - }}, - .increase_font_size => comptime &.{.{ .action = .{ .increase_font_size = 1 }, .title = "Increase Font Size", @@ -633,6 +627,7 @@ fn actionCommands(action: Action.Key) []const Command { .esc, .cursor_key, .set_font_size, + .search, .scroll_to_row, .scroll_page_fractional, .scroll_page_lines, From 5c1679209dbf4817e515f6d3204bec9685bf3a07 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 27 Nov 2025 12:56:49 -0800 Subject: [PATCH 3/9] macos: add hover styles to search buttons, cursor changes --- macos/Sources/Ghostty/SurfaceView.swift | 37 ++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index 6f21c997b..ba678db59 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -405,7 +405,7 @@ extension Ghostty { var body: some View { GeometryReader { geo in - HStack(spacing: 8) { + HStack(spacing: 4) { TextField("Search", text: $searchState.needle) .textFieldStyle(.plain) .frame(width: 180) @@ -451,7 +451,7 @@ extension Ghostty { }) { Image(systemName: "chevron.up") } - .buttonStyle(.borderless) + .buttonStyle(SearchButtonStyle()) Button(action: { guard let surface = surfaceView.surface else { return } @@ -460,12 +460,12 @@ extension Ghostty { }) { Image(systemName: "chevron.down") } - .buttonStyle(.borderless) + .buttonStyle(SearchButtonStyle()) Button(action: onClose) { Image(systemName: "xmark") } - .buttonStyle(.borderless) + .buttonStyle(SearchButtonStyle()) } .padding(8) .background(.background) @@ -556,6 +556,35 @@ extension Ghostty { return point.y < midY ? .topRight : .bottomRight } } + + struct SearchButtonStyle: ButtonStyle { + @State private var isHovered = false + + func makeBody(configuration: Configuration) -> some View { + configuration.label + .foregroundStyle(isHovered || configuration.isPressed ? .primary : .secondary) + .padding(.horizontal, 2) + .frame(height: 26) + .background( + RoundedRectangle(cornerRadius: 6) + .fill(backgroundColor(isPressed: configuration.isPressed)) + ) + .onHover { hovering in + isHovered = hovering + } + .backport.pointerStyle(.link) + } + + private func backgroundColor(isPressed: Bool) -> Color { + if isPressed { + return Color.primary.opacity(0.2) + } else if isHovered { + return Color.primary.opacity(0.1) + } else { + return Color.clear + } + } + } } /// A surface is terminology in Ghostty for a terminal surface, or a place where a terminal is actually drawn From dbfc3eb67990543f9c243dbe0cecd0c87e13ea8c Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 27 Nov 2025 13:35:56 -0800 Subject: [PATCH 4/9] Remove unused imports --- src/App.zig | 5 ----- src/Surface.zig | 3 --- src/apprt.zig | 2 -- src/apprt/gtk.zig | 2 -- src/apprt/gtk/App.zig | 5 ----- src/apprt/gtk/cgroup.zig | 3 --- src/apprt/gtk/class/application.zig | 2 -- src/apprt/gtk/class/clipboard_confirmation_dialog.zig | 1 - src/apprt/gtk/class/close_confirmation_dialog.zig | 3 --- src/apprt/gtk/class/config.zig | 2 -- src/apprt/gtk/class/config_errors_dialog.zig | 2 -- src/apprt/gtk/class/debug_warning.zig | 2 -- src/apprt/gtk/class/dialog.zig | 2 -- src/apprt/gtk/class/global_shortcuts.zig | 3 --- src/apprt/gtk/class/inspector_widget.zig | 1 - src/apprt/gtk/class/inspector_window.zig | 3 --- src/apprt/gtk/class/resize_overlay.zig | 1 - src/apprt/gtk/class/split_tree.zig | 7 ------- src/apprt/gtk/class/surface.zig | 2 -- src/apprt/gtk/class/surface_child_exited.zig | 1 - src/apprt/gtk/class/surface_scrolled_window.zig | 1 - src/apprt/gtk/class/surface_title_dialog.zig | 1 - src/apprt/gtk/class/tab.zig | 6 ------ src/apprt/gtk/class/window.zig | 1 - src/apprt/gtk/ext.zig | 1 - src/apprt/gtk/key.zig | 1 - src/apprt/gtk/winproto/wayland.zig | 1 - src/apprt/gtk/winproto/x11.zig | 2 -- src/benchmark/IsSymbol.zig | 1 - src/build/GhosttyBench.zig | 1 - src/build/GhosttyFrameData.zig | 2 -- src/build/GhosttyLibVt.zig | 4 ---- src/build/GhosttyResources.zig | 2 -- src/build/GhosttyWebdata.zig | 1 - src/build/UnicodeTables.zig | 1 - src/build/webgen/main_actions.zig | 1 - src/build_config.zig | 1 - src/cli/boo.zig | 1 - src/cli/list_themes.zig | 2 -- src/cli/ssh_cache.zig | 1 - src/cli/validate_config.zig | 1 - src/config/CApi.zig | 2 -- src/config/Config.zig | 2 -- src/config/command.zig | 1 - src/config/conditional.zig | 1 - src/config/edit.zig | 1 - src/config/theme.zig | 1 - src/datastruct/blocking_queue.zig | 2 -- src/extra/sublime.zig | 1 - src/font/Collection.zig | 1 - src/font/DeferredFace.zig | 1 - src/font/discovery.zig | 1 - src/font/face/freetype.zig | 1 - src/font/face/web_canvas.zig | 1 - src/font/library.zig | 1 - src/font/opentype/head.zig | 1 - src/font/opentype/hhea.zig | 1 - src/font/opentype/os2.zig | 1 - src/font/opentype/post.zig | 1 - src/font/opentype/svg.zig | 1 - src/font/shape.zig | 1 - src/font/shaper/Cache.zig | 1 - src/font/shaper/coretext.zig | 2 -- src/font/shaper/feature.zig | 1 - src/font/shaper/harfbuzz.zig | 1 - src/font/shaper/noop.zig | 2 -- src/font/sprite/Face.zig | 1 - src/font/sprite/draw/block.zig | 4 ---- src/font/sprite/draw/box.zig | 3 --- src/font/sprite/draw/branch.zig | 1 - src/font/sprite/draw/common.zig | 4 ---- src/font/sprite/draw/geometric_shapes.zig | 2 -- src/font/sprite/draw/powerline.zig | 2 -- src/font/sprite/draw/special.zig | 2 -- src/font/sprite/draw/symbols_for_legacy_computing.zig | 2 -- .../draw/symbols_for_legacy_computing_supplement.zig | 2 -- src/input/KeymapDarwin.zig | 1 - src/input/command.zig | 1 - src/input/kitty.zig | 1 - src/input/paste.zig | 1 - src/inspector/cursor.zig | 1 - src/inspector/page.zig | 2 -- src/lib/union.zig | 1 - src/main_bench.zig | 2 -- src/main_gen.zig | 2 -- src/main_ghostty.zig | 6 ------ src/os/TempDir.zig | 1 - src/os/args.zig | 1 - src/os/flatpak.zig | 1 - src/os/homedir.zig | 1 - src/os/mouse.zig | 1 - src/os/wasm/log.zig | 1 - src/os/xdg.zig | 1 - src/renderer.zig | 2 -- src/renderer/OpenGL.zig | 1 - src/renderer/Options.zig | 1 - src/renderer/Thread.zig | 1 - src/renderer/link.zig | 1 - src/renderer/message.zig | 1 - src/renderer/metal/Frame.zig | 4 ---- src/renderer/metal/IOSurfaceLayer.zig | 2 -- src/renderer/metal/Pipeline.zig | 4 ---- src/renderer/metal/RenderPass.zig | 4 ---- src/renderer/metal/Sampler.zig | 2 -- src/renderer/metal/Target.zig | 2 -- src/renderer/metal/Texture.zig | 1 - src/renderer/metal/buffer.zig | 1 - src/renderer/metal/shaders.zig | 1 - src/renderer/opengl/Frame.zig | 4 ---- src/renderer/opengl/Pipeline.zig | 6 ------ src/renderer/opengl/RenderPass.zig | 4 ---- src/renderer/opengl/Sampler.zig | 2 -- src/renderer/opengl/Target.zig | 2 -- src/renderer/opengl/Texture.zig | 2 -- src/renderer/opengl/buffer.zig | 1 - src/renderer/row.zig | 1 - src/renderer/shadertoy.zig | 1 - src/simd/index_of.zig | 1 - src/surface_mouse.zig | 1 - src/terminal/PageList.zig | 1 - src/terminal/Parser.zig | 2 -- src/terminal/Terminal.zig | 1 - src/terminal/apc.zig | 1 - src/terminal/c/key_encode.zig | 1 - src/terminal/c/key_event.zig | 1 - src/terminal/c/osc.zig | 2 -- src/terminal/c/sgr.zig | 2 -- src/terminal/hash_map.zig | 1 - src/terminal/highlight.zig | 1 - src/terminal/hyperlink.zig | 1 - src/terminal/kitty/color.zig | 2 -- src/terminal/kitty/graphics_exec.zig | 2 -- src/terminal/kitty/graphics_image.zig | 1 - src/terminal/kitty/graphics_render.zig | 1 - src/terminal/main.zig | 3 --- src/terminal/page.zig | 1 - src/terminal/parse_table.zig | 1 - src/terminal/point.zig | 1 - src/terminal/ref_counted_set.zig | 2 -- src/terminal/search/Thread.zig | 2 -- src/terminal/search/active.zig | 1 - src/terminal/search/pagelist.zig | 3 --- src/terminal/search/screen.zig | 1 - src/terminal/search/viewport.zig | 1 - src/termio/Options.zig | 2 -- src/termio/Termio.zig | 7 ------- src/termio/Thread.zig | 1 - src/termio/backend.zig | 9 --------- src/termio/mailbox.zig | 2 -- src/termio/message.zig | 2 -- 150 files changed, 275 deletions(-) diff --git a/src/App.zig b/src/App.zig index 2fae4d7df..99d03399c 100644 --- a/src/App.zig +++ b/src/App.zig @@ -7,19 +7,14 @@ const std = @import("std"); const builtin = @import("builtin"); const assert = @import("quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; -const build_config = @import("build_config.zig"); const apprt = @import("apprt.zig"); const Surface = @import("Surface.zig"); -const tracy = @import("tracy"); const input = @import("input.zig"); const configpkg = @import("config.zig"); const Config = configpkg.Config; const BlockingQueue = @import("datastruct/main.zig").BlockingQueue; const renderer = @import("renderer.zig"); const font = @import("font/main.zig"); -const internal_os = @import("os/main.zig"); -const macos = @import("macos"); -const objc = @import("objc"); const log = std.log.scoped(.app); diff --git a/src/Surface.zig b/src/Surface.zig index d0866e901..591ee7220 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -26,9 +26,6 @@ const crash = @import("crash/main.zig"); const unicode = @import("unicode/main.zig"); const rendererpkg = @import("renderer.zig"); const termio = @import("termio.zig"); -const objc = @import("objc"); -const imgui = @import("imgui"); -const Pty = @import("pty.zig").Pty; const font = @import("font/main.zig"); const Command = @import("Command.zig"); const terminal = @import("terminal/main.zig"); diff --git a/src/apprt.zig b/src/apprt.zig index dbd62fbfb..c467f1801 100644 --- a/src/apprt.zig +++ b/src/apprt.zig @@ -8,8 +8,6 @@ //! The goal is to have different implementations share as much of the core //! logic as possible, and to only reach out to platform-specific implementation //! code when absolutely necessary. -const std = @import("std"); -const builtin = @import("builtin"); const build_config = @import("build_config.zig"); const structs = @import("apprt/structs.zig"); diff --git a/src/apprt/gtk.zig b/src/apprt/gtk.zig index aa2404566..415d3773d 100644 --- a/src/apprt/gtk.zig +++ b/src/apprt/gtk.zig @@ -1,5 +1,3 @@ -const internal_os = @import("../os/main.zig"); - // The required comptime API for any apprt. pub const App = @import("gtk/App.zig"); pub const Surface = @import("gtk/Surface.zig"); diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 4d2006fbb..6c7310339 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -5,18 +5,13 @@ const App = @This(); const std = @import("std"); const builtin = @import("builtin"); const Allocator = std.mem.Allocator; -const adw = @import("adw"); -const gio = @import("gio"); const apprt = @import("../../apprt.zig"); const configpkg = @import("../../config.zig"); -const internal_os = @import("../../os/main.zig"); const Config = configpkg.Config; const CoreApp = @import("../../App.zig"); const Application = @import("class/application.zig").Application; const Surface = @import("Surface.zig"); -const gtk_version = @import("gtk_version.zig"); -const adw_version = @import("adw_version.zig"); const ipcNewWindow = @import("ipc/new_window.zig").newWindow; const log = std.log.scoped(.gtk); diff --git a/src/apprt/gtk/cgroup.zig b/src/apprt/gtk/cgroup.zig index dbf11a287..654c1e1ac 100644 --- a/src/apprt/gtk/cgroup.zig +++ b/src/apprt/gtk/cgroup.zig @@ -1,14 +1,11 @@ /// Contains all the logic for putting the Ghostty process and /// each individual surface into its own cgroup. const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const gio = @import("gio"); const glib = @import("glib"); -const gobject = @import("gobject"); -const App = @import("App.zig"); const internal_os = @import("../../os/main.zig"); const log = std.log.scoped(.gtk_systemd_cgroup); diff --git a/src/apprt/gtk/class/application.zig b/src/apprt/gtk/class/application.zig index 9c22782c7..cc070240c 100644 --- a/src/apprt/gtk/class/application.zig +++ b/src/apprt/gtk/class/application.zig @@ -1,7 +1,6 @@ const std = @import("std"); const assert = @import("../../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; -const builtin = @import("builtin"); const adw = @import("adw"); const gdk = @import("gdk"); const gio = @import("gio"); @@ -9,7 +8,6 @@ const glib = @import("glib"); const gobject = @import("gobject"); const gtk = @import("gtk"); -const build_config = @import("../../../build_config.zig"); const i18n = @import("../../../os/main.zig").i18n; const apprt = @import("../../../apprt.zig"); const cgroup = @import("../cgroup.zig"); diff --git a/src/apprt/gtk/class/clipboard_confirmation_dialog.zig b/src/apprt/gtk/class/clipboard_confirmation_dialog.zig index 4bcc8696a..d44d38a35 100644 --- a/src/apprt/gtk/class/clipboard_confirmation_dialog.zig +++ b/src/apprt/gtk/class/clipboard_confirmation_dialog.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../../quirks.zig").inlineAssert; const adw = @import("adw"); const glib = @import("glib"); const gobject = @import("gobject"); diff --git a/src/apprt/gtk/class/close_confirmation_dialog.zig b/src/apprt/gtk/class/close_confirmation_dialog.zig index e806eb354..5919f9c94 100644 --- a/src/apprt/gtk/class/close_confirmation_dialog.zig +++ b/src/apprt/gtk/class/close_confirmation_dialog.zig @@ -1,13 +1,10 @@ const std = @import("std"); -const adw = @import("adw"); const gobject = @import("gobject"); const gtk = @import("gtk"); const gresource = @import("../build/gresource.zig"); const i18n = @import("../../../os/main.zig").i18n; -const adw_version = @import("../adw_version.zig"); const Common = @import("../class.zig").Common; -const Config = @import("config.zig").Config; const Dialog = @import("dialog.zig").Dialog; const log = std.log.scoped(.gtk_ghostty_close_confirmation_dialog); diff --git a/src/apprt/gtk/class/config.zig b/src/apprt/gtk/class/config.zig index eadd3b7b8..9a705d356 100644 --- a/src/apprt/gtk/class/config.zig +++ b/src/apprt/gtk/class/config.zig @@ -1,7 +1,5 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const adw = @import("adw"); -const glib = @import("glib"); const gobject = @import("gobject"); const gtk = @import("gtk"); diff --git a/src/apprt/gtk/class/config_errors_dialog.zig b/src/apprt/gtk/class/config_errors_dialog.zig index fc76bc268..46d5fe621 100644 --- a/src/apprt/gtk/class/config_errors_dialog.zig +++ b/src/apprt/gtk/class/config_errors_dialog.zig @@ -1,10 +1,8 @@ const std = @import("std"); -const adw = @import("adw"); const gobject = @import("gobject"); const gtk = @import("gtk"); const gresource = @import("../build/gresource.zig"); -const adw_version = @import("../adw_version.zig"); const Common = @import("../class.zig").Common; const Config = @import("config.zig").Config; const Dialog = @import("dialog.zig").Dialog; diff --git a/src/apprt/gtk/class/debug_warning.zig b/src/apprt/gtk/class/debug_warning.zig index edda6659b..0ad320337 100644 --- a/src/apprt/gtk/class/debug_warning.zig +++ b/src/apprt/gtk/class/debug_warning.zig @@ -1,9 +1,7 @@ -const std = @import("std"); const adw = @import("adw"); const gobject = @import("gobject"); const gtk = @import("gtk"); -const build_config = @import("../../../build_config.zig"); const adw_version = @import("../adw_version.zig"); const gresource = @import("../build/gresource.zig"); const Common = @import("../class.zig").Common; diff --git a/src/apprt/gtk/class/dialog.zig b/src/apprt/gtk/class/dialog.zig index 41a1988ba..5bc3cdfa5 100644 --- a/src/apprt/gtk/class/dialog.zig +++ b/src/apprt/gtk/class/dialog.zig @@ -3,10 +3,8 @@ const adw = @import("adw"); const gobject = @import("gobject"); const gtk = @import("gtk"); -const gresource = @import("../build/gresource.zig"); const adw_version = @import("../adw_version.zig"); const Common = @import("../class.zig").Common; -const Config = @import("config.zig").Config; const log = std.log.scoped(.gtk_ghostty_dialog); diff --git a/src/apprt/gtk/class/global_shortcuts.zig b/src/apprt/gtk/class/global_shortcuts.zig index e5d89003a..57652916a 100644 --- a/src/apprt/gtk/class/global_shortcuts.zig +++ b/src/apprt/gtk/class/global_shortcuts.zig @@ -1,14 +1,11 @@ const std = @import("std"); const assert = @import("../../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; -const adw = @import("adw"); const gio = @import("gio"); const glib = @import("glib"); const gobject = @import("gobject"); -const gtk = @import("gtk"); const Binding = @import("../../../input.zig").Binding; -const gresource = @import("../build/gresource.zig"); const key = @import("../key.zig"); const Common = @import("../class.zig").Common; const Application = @import("application.zig").Application; diff --git a/src/apprt/gtk/class/inspector_widget.zig b/src/apprt/gtk/class/inspector_widget.zig index 4321dcd57..046cd2174 100644 --- a/src/apprt/gtk/class/inspector_widget.zig +++ b/src/apprt/gtk/class/inspector_widget.zig @@ -1,6 +1,5 @@ const std = @import("std"); -const adw = @import("adw"); const gobject = @import("gobject"); const gtk = @import("gtk"); diff --git a/src/apprt/gtk/class/inspector_window.zig b/src/apprt/gtk/class/inspector_window.zig index 701718229..739e75691 100644 --- a/src/apprt/gtk/class/inspector_window.zig +++ b/src/apprt/gtk/class/inspector_window.zig @@ -2,15 +2,12 @@ const std = @import("std"); const build_config = @import("../../../build_config.zig"); const adw = @import("adw"); -const gdk = @import("gdk"); const gobject = @import("gobject"); const gtk = @import("gtk"); const gresource = @import("../build/gresource.zig"); -const key = @import("../key.zig"); const Common = @import("../class.zig").Common; -const Application = @import("application.zig").Application; const Surface = @import("surface.zig").Surface; const DebugWarning = @import("debug_warning.zig").DebugWarning; const InspectorWidget = @import("inspector_widget.zig").InspectorWidget; diff --git a/src/apprt/gtk/class/resize_overlay.zig b/src/apprt/gtk/class/resize_overlay.zig index e13dcbc5d..e14f15636 100644 --- a/src/apprt/gtk/class/resize_overlay.zig +++ b/src/apprt/gtk/class/resize_overlay.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../../quirks.zig").inlineAssert; const adw = @import("adw"); const glib = @import("glib"); const gobject = @import("gobject"); diff --git a/src/apprt/gtk/class/split_tree.zig b/src/apprt/gtk/class/split_tree.zig index 4fbf7a0c2..48656c951 100644 --- a/src/apprt/gtk/class/split_tree.zig +++ b/src/apprt/gtk/class/split_tree.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const build_config = @import("../../../build_config.zig"); const assert = @import("../../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const adw = @import("adw"); @@ -8,17 +7,11 @@ const glib = @import("glib"); const gobject = @import("gobject"); const gtk = @import("gtk"); -const i18n = @import("../../../os/main.zig").i18n; const apprt = @import("../../../apprt.zig"); -const input = @import("../../../input.zig"); -const CoreSurface = @import("../../../Surface.zig"); -const gtk_version = @import("../gtk_version.zig"); -const adw_version = @import("../adw_version.zig"); const ext = @import("../ext.zig"); const gresource = @import("../build/gresource.zig"); const Common = @import("../class.zig").Common; const WeakRef = @import("../weak_ref.zig").WeakRef; -const Config = @import("config.zig").Config; const Application = @import("application.zig").Application; const CloseConfirmationDialog = @import("close_confirmation_dialog.zig").CloseConfirmationDialog; const Surface = @import("surface.zig").Surface; diff --git a/src/apprt/gtk/class/surface.zig b/src/apprt/gtk/class/surface.zig index 6dae08a79..9ba7ce0ab 100644 --- a/src/apprt/gtk/class/surface.zig +++ b/src/apprt/gtk/class/surface.zig @@ -19,7 +19,6 @@ const terminal = @import("../../../terminal/main.zig"); const CoreSurface = @import("../../../Surface.zig"); const gresource = @import("../build/gresource.zig"); const ext = @import("../ext.zig"); -const adw_version = @import("../adw_version.zig"); const gtk_key = @import("../key.zig"); const ApprtSurface = @import("../Surface.zig"); const Common = @import("../class.zig").Common; @@ -30,7 +29,6 @@ const ChildExited = @import("surface_child_exited.zig").SurfaceChildExited; const ClipboardConfirmationDialog = @import("clipboard_confirmation_dialog.zig").ClipboardConfirmationDialog; const TitleDialog = @import("surface_title_dialog.zig").SurfaceTitleDialog; const Window = @import("window.zig").Window; -const WeakRef = @import("../weak_ref.zig").WeakRef; const InspectorWindow = @import("inspector_window.zig").InspectorWindow; const i18n = @import("../../../os/i18n.zig"); diff --git a/src/apprt/gtk/class/surface_child_exited.zig b/src/apprt/gtk/class/surface_child_exited.zig index 4e34f3340..d7dd41bcb 100644 --- a/src/apprt/gtk/class/surface_child_exited.zig +++ b/src/apprt/gtk/class/surface_child_exited.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../../quirks.zig").inlineAssert; const adw = @import("adw"); const glib = @import("glib"); const gobject = @import("gobject"); diff --git a/src/apprt/gtk/class/surface_scrolled_window.zig b/src/apprt/gtk/class/surface_scrolled_window.zig index 505b16dda..488fdb3f4 100644 --- a/src/apprt/gtk/class/surface_scrolled_window.zig +++ b/src/apprt/gtk/class/surface_scrolled_window.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../../quirks.zig").inlineAssert; const adw = @import("adw"); const gobject = @import("gobject"); const gtk = @import("gtk"); diff --git a/src/apprt/gtk/class/surface_title_dialog.zig b/src/apprt/gtk/class/surface_title_dialog.zig index 6d3bf33de..aa1d1a153 100644 --- a/src/apprt/gtk/class/surface_title_dialog.zig +++ b/src/apprt/gtk/class/surface_title_dialog.zig @@ -6,7 +6,6 @@ const gobject = @import("gobject"); const gtk = @import("gtk"); const gresource = @import("../build/gresource.zig"); -const adw_version = @import("../adw_version.zig"); const ext = @import("../ext.zig"); const Common = @import("../class.zig").Common; diff --git a/src/apprt/gtk/class/tab.zig b/src/apprt/gtk/class/tab.zig index d7a82b776..c8b5607a6 100644 --- a/src/apprt/gtk/class/tab.zig +++ b/src/apprt/gtk/class/tab.zig @@ -1,19 +1,13 @@ const std = @import("std"); -const build_config = @import("../../../build_config.zig"); -const assert = @import("../../../quirks.zig").inlineAssert; const adw = @import("adw"); const gio = @import("gio"); const glib = @import("glib"); const gobject = @import("gobject"); const gtk = @import("gtk"); -const i18n = @import("../../../os/main.zig").i18n; const apprt = @import("../../../apprt.zig"); -const input = @import("../../../input.zig"); const CoreSurface = @import("../../../Surface.zig"); const ext = @import("../ext.zig"); -const gtk_version = @import("../gtk_version.zig"); -const adw_version = @import("../adw_version.zig"); const gresource = @import("../build/gresource.zig"); const Common = @import("../class.zig").Common; const Config = @import("config.zig").Config; diff --git a/src/apprt/gtk/class/window.zig b/src/apprt/gtk/class/window.zig index dbcf0fcd1..c691b84a6 100644 --- a/src/apprt/gtk/class/window.zig +++ b/src/apprt/gtk/class/window.zig @@ -28,7 +28,6 @@ const Surface = @import("surface.zig").Surface; const Tab = @import("tab.zig").Tab; const DebugWarning = @import("debug_warning.zig").DebugWarning; const CommandPalette = @import("command_palette.zig").CommandPalette; -const InspectorWindow = @import("inspector_window.zig").InspectorWindow; const WeakRef = @import("../weak_ref.zig").WeakRef; const log = std.log.scoped(.gtk_ghostty_window); diff --git a/src/apprt/gtk/ext.zig b/src/apprt/gtk/ext.zig index f832d1f90..9b1eeecc6 100644 --- a/src/apprt/gtk/ext.zig +++ b/src/apprt/gtk/ext.zig @@ -7,7 +7,6 @@ const std = @import("std"); const assert = @import("../../quirks.zig").inlineAssert; const testing = std.testing; -const gio = @import("gio"); const glib = @import("glib"); const gobject = @import("gobject"); const gtk = @import("gtk"); diff --git a/src/apprt/gtk/key.zig b/src/apprt/gtk/key.zig index bf0f0e2f6..19bdc8315 100644 --- a/src/apprt/gtk/key.zig +++ b/src/apprt/gtk/key.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const build_options = @import("build_options"); const gdk = @import("gdk"); const glib = @import("glib"); diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index 5837e3e5e..ec02fbee5 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -1,7 +1,6 @@ //! Wayland protocol implementation for the Ghostty GTK apprt. const std = @import("std"); const Allocator = std.mem.Allocator; -const build_options = @import("build_options"); const gdk = @import("gdk"); const gdk_wayland = @import("gdk_wayland"); diff --git a/src/apprt/gtk/winproto/x11.zig b/src/apprt/gtk/winproto/x11.zig index 8956a29ed..9dc273563 100644 --- a/src/apprt/gtk/winproto/x11.zig +++ b/src/apprt/gtk/winproto/x11.zig @@ -1,10 +1,8 @@ //! X11 window protocol implementation for the Ghostty GTK apprt. const std = @import("std"); const builtin = @import("builtin"); -const build_options = @import("build_options"); const Allocator = std.mem.Allocator; -const adw = @import("adw"); const gdk = @import("gdk"); const gdk_x11 = @import("gdk_x11"); const glib = @import("glib"); diff --git a/src/benchmark/IsSymbol.zig b/src/benchmark/IsSymbol.zig index 5ba2da907..4fbffd1ec 100644 --- a/src/benchmark/IsSymbol.zig +++ b/src/benchmark/IsSymbol.zig @@ -4,7 +4,6 @@ const IsSymbol = @This(); const std = @import("std"); -const builtin = @import("builtin"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; const Benchmark = @import("Benchmark.zig"); diff --git a/src/build/GhosttyBench.zig b/src/build/GhosttyBench.zig index c9cd5dd33..27dda8809 100644 --- a/src/build/GhosttyBench.zig +++ b/src/build/GhosttyBench.zig @@ -2,7 +2,6 @@ const GhosttyBench = @This(); const std = @import("std"); -const Config = @import("Config.zig"); const SharedDeps = @import("SharedDeps.zig"); steps: []*std.Build.Step.Compile, diff --git a/src/build/GhosttyFrameData.zig b/src/build/GhosttyFrameData.zig index 7193162bd..8469759f9 100644 --- a/src/build/GhosttyFrameData.zig +++ b/src/build/GhosttyFrameData.zig @@ -3,8 +3,6 @@ const GhosttyFrameData = @This(); const std = @import("std"); -const Config = @import("Config.zig"); -const SharedDeps = @import("SharedDeps.zig"); const DistResource = @import("GhosttyDist.zig").Resource; /// The output path for the compressed framedata zig file diff --git a/src/build/GhosttyLibVt.zig b/src/build/GhosttyLibVt.zig index d1ab5d1ba..aae8ace19 100644 --- a/src/build/GhosttyLibVt.zig +++ b/src/build/GhosttyLibVt.zig @@ -3,11 +3,7 @@ const GhosttyLibVt = @This(); const std = @import("std"); const assert = std.debug.assert; const RunStep = std.Build.Step.Run; -const Config = @import("Config.zig"); const GhosttyZig = @import("GhosttyZig.zig"); -const SharedDeps = @import("SharedDeps.zig"); -const LibtoolStep = @import("LibtoolStep.zig"); -const LipoStep = @import("LipoStep.zig"); /// The step that generates the file. step: *std.Build.Step, diff --git a/src/build/GhosttyResources.zig b/src/build/GhosttyResources.zig index a1bbe2857..6f857655b 100644 --- a/src/build/GhosttyResources.zig +++ b/src/build/GhosttyResources.zig @@ -1,9 +1,7 @@ const GhosttyResources = @This(); const std = @import("std"); -const builtin = @import("builtin"); const assert = std.debug.assert; -const buildpkg = @import("main.zig"); const Config = @import("Config.zig"); const RunStep = std.Build.Step.Run; const SharedDeps = @import("SharedDeps.zig"); diff --git a/src/build/GhosttyWebdata.zig b/src/build/GhosttyWebdata.zig index 145bb91fa..e29b20c25 100644 --- a/src/build/GhosttyWebdata.zig +++ b/src/build/GhosttyWebdata.zig @@ -3,7 +3,6 @@ const GhosttyWebdata = @This(); const std = @import("std"); -const Config = @import("Config.zig"); const SharedDeps = @import("SharedDeps.zig"); steps: []*std.Build.Step, diff --git a/src/build/UnicodeTables.zig b/src/build/UnicodeTables.zig index aba3e8f24..17a839eaf 100644 --- a/src/build/UnicodeTables.zig +++ b/src/build/UnicodeTables.zig @@ -1,7 +1,6 @@ const UnicodeTables = @This(); const std = @import("std"); -const Config = @import("Config.zig"); /// The exe. props_exe: *std.Build.Step.Compile, diff --git a/src/build/webgen/main_actions.zig b/src/build/webgen/main_actions.zig index 85357b972..b0de6537d 100644 --- a/src/build/webgen/main_actions.zig +++ b/src/build/webgen/main_actions.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const help_strings = @import("help_strings"); const helpgen_actions = @import("../../input/helpgen_actions.zig"); pub fn main() !void { diff --git a/src/build_config.zig b/src/build_config.zig index 0d294c69e..c19f7372b 100644 --- a/src/build_config.zig +++ b/src/build_config.zig @@ -9,7 +9,6 @@ const assert = std.debug.assert; const apprt = @import("apprt.zig"); const font = @import("font/main.zig"); const rendererpkg = @import("renderer.zig"); -const WasmTarget = @import("os/wasm/target.zig").Target; const BuildConfig = @import("build/Config.zig"); pub const ReleaseChannel = BuildConfig.ReleaseChannel; diff --git a/src/cli/boo.zig b/src/cli/boo.zig index f96fd6282..2834eadbd 100644 --- a/src/cli/boo.zig +++ b/src/cli/boo.zig @@ -3,7 +3,6 @@ const builtin = @import("builtin"); const args = @import("args.zig"); const Action = @import("ghostty.zig").Action; const Allocator = std.mem.Allocator; -const help_strings = @import("help_strings"); const vaxis = @import("vaxis"); const framedata = @import("framedata").compressed; diff --git a/src/cli/list_themes.zig b/src/cli/list_themes.zig index 63184ddfb..1e301eb73 100644 --- a/src/cli/list_themes.zig +++ b/src/cli/list_themes.zig @@ -1,11 +1,9 @@ const std = @import("std"); -const inputpkg = @import("../input.zig"); const args = @import("args.zig"); const Action = @import("ghostty.zig").Action; const Config = @import("../config/Config.zig"); const themepkg = @import("../config/theme.zig"); const tui = @import("tui.zig"); -const internal_os = @import("../os/main.zig"); const global_state = &@import("../global.zig").state; const vaxis = @import("vaxis"); diff --git a/src/cli/ssh_cache.zig b/src/cli/ssh_cache.zig index 9434e9771..d3ee658af 100644 --- a/src/cli/ssh_cache.zig +++ b/src/cli/ssh_cache.zig @@ -1,7 +1,6 @@ const std = @import("std"); const fs = std.fs; const Allocator = std.mem.Allocator; -const xdg = @import("../os/xdg.zig"); const args = @import("args.zig"); const Action = @import("ghostty.zig").Action; pub const Entry = @import("ssh-cache/Entry.zig"); diff --git a/src/cli/validate_config.zig b/src/cli/validate_config.zig index 55d861402..5586cf29f 100644 --- a/src/cli/validate_config.zig +++ b/src/cli/validate_config.zig @@ -3,7 +3,6 @@ const Allocator = std.mem.Allocator; const args = @import("args.zig"); const Action = @import("ghostty.zig").Action; const Config = @import("../config.zig").Config; -const cli = @import("../cli.zig"); pub const Options = struct { /// The path of the config file to validate. If this isn't specified, diff --git a/src/config/CApi.zig b/src/config/CApi.zig index d3f714a45..a970a8d33 100644 --- a/src/config/CApi.zig +++ b/src/config/CApi.zig @@ -1,6 +1,4 @@ const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; -const cli = @import("../cli.zig"); const inputpkg = @import("../input.zig"); const state = &@import("../global.zig").state; const c = @import("../main_c.zig"); diff --git a/src/config/Config.zig b/src/config/Config.zig index 18412ff0e..bac7d3443 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -29,8 +29,6 @@ const formatterpkg = @import("formatter.zig"); const themepkg = @import("theme.zig"); const url = @import("url.zig"); const Key = @import("key.zig").Key; -const KeyValue = @import("key.zig").Value; -const ErrorList = @import("ErrorList.zig"); const MetricModifier = fontpkg.Metrics.Modifier; const help_strings = @import("help_strings"); pub const Command = @import("command.zig").Command; diff --git a/src/config/command.zig b/src/config/command.zig index e0cdc641b..7e16ad5c7 100644 --- a/src/config/command.zig +++ b/src/config/command.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const builtin = @import("builtin"); const Allocator = std.mem.Allocator; const ArenaAllocator = std.heap.ArenaAllocator; const formatterpkg = @import("formatter.zig"); diff --git a/src/config/conditional.zig b/src/config/conditional.zig index aabfeca1c..fdc285a22 100644 --- a/src/config/conditional.zig +++ b/src/config/conditional.zig @@ -1,6 +1,5 @@ const std = @import("std"); const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; /// Conditionals in Ghostty configuration are based on a static, typed diff --git a/src/config/edit.zig b/src/config/edit.zig index 6c18abadc..8cedc47a5 100644 --- a/src/config/edit.zig +++ b/src/config/edit.zig @@ -3,7 +3,6 @@ const builtin = @import("builtin"); const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const ArenaAllocator = std.heap.ArenaAllocator; -const internal_os = @import("../os/main.zig"); const file_load = @import("file_load.zig"); /// The path to the configuration that should be opened for editing. diff --git a/src/config/theme.zig b/src/config/theme.zig index 983ce647d..7ba6e5885 100644 --- a/src/config/theme.zig +++ b/src/config/theme.zig @@ -1,6 +1,5 @@ const std = @import("std"); const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const global_state = &@import("../global.zig").state; const internal_os = @import("../os/main.zig"); diff --git a/src/datastruct/blocking_queue.zig b/src/datastruct/blocking_queue.zig index 339007c3a..3185d98d1 100644 --- a/src/datastruct/blocking_queue.zig +++ b/src/datastruct/blocking_queue.zig @@ -2,8 +2,6 @@ //! between threads. const std = @import("std"); -const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; /// Returns a blocking queue implementation for type T. diff --git a/src/extra/sublime.zig b/src/extra/sublime.zig index 4af589b4f..e0deb2fa9 100644 --- a/src/extra/sublime.zig +++ b/src/extra/sublime.zig @@ -1,4 +1,3 @@ -const std = @import("std"); const Config = @import("../config/Config.zig"); const Template = struct { diff --git a/src/font/Collection.zig b/src/font/Collection.zig index 6726fb64a..412098f10 100644 --- a/src/font/Collection.zig +++ b/src/font/Collection.zig @@ -16,7 +16,6 @@ const Collection = @This(); const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const config = @import("../config.zig"); const comparison = @import("../datastruct/comparison.zig"); diff --git a/src/font/DeferredFace.zig b/src/font/DeferredFace.zig index 61d0adf8b..e818cca30 100644 --- a/src/font/DeferredFace.zig +++ b/src/font/DeferredFace.zig @@ -7,7 +7,6 @@ const DeferredFace = @This(); const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const fontconfig = @import("fontconfig"); const macos = @import("macos"); diff --git a/src/font/discovery.zig b/src/font/discovery.zig index 45fc89ea9..c419d36a6 100644 --- a/src/font/discovery.zig +++ b/src/font/discovery.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const builtin = @import("builtin"); const Allocator = std.mem.Allocator; const assert = @import("../quirks.zig").inlineAssert; const fontconfig = @import("fontconfig"); diff --git a/src/font/face/freetype.zig b/src/font/face/freetype.zig index fe3dcf707..a6ef52c39 100644 --- a/src/font/face/freetype.zig +++ b/src/font/face/freetype.zig @@ -16,7 +16,6 @@ const font = @import("../main.zig"); const Glyph = font.Glyph; const Library = font.Library; const opentype = @import("../opentype.zig"); -const fastmem = @import("../../fastmem.zig"); const quirks = @import("../../quirks.zig"); const config = @import("../../config.zig"); diff --git a/src/font/face/web_canvas.zig b/src/font/face/web_canvas.zig index d6a3ca449..b4f9f5d5d 100644 --- a/src/font/face/web_canvas.zig +++ b/src/font/face/web_canvas.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const builtin = @import("builtin"); const assert = @import("../../quirks.zig").inlineAssert; const testing = std.testing; const Allocator = std.mem.Allocator; diff --git a/src/font/library.zig b/src/font/library.zig index 43aa101b7..dce6dbd5a 100644 --- a/src/font/library.zig +++ b/src/font/library.zig @@ -2,7 +2,6 @@ //! library implementation(s) require per-process. const std = @import("std"); const Allocator = std.mem.Allocator; -const builtin = @import("builtin"); const options = @import("main.zig").options; const freetype = @import("freetype"); const font = @import("main.zig"); diff --git a/src/font/opentype/head.zig b/src/font/opentype/head.zig index 69b951821..38284d9cf 100644 --- a/src/font/opentype/head.zig +++ b/src/font/opentype/head.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const sfnt = @import("sfnt.zig"); /// Font Header Table diff --git a/src/font/opentype/hhea.zig b/src/font/opentype/hhea.zig index 2a86e5b82..b2b3f3e20 100644 --- a/src/font/opentype/hhea.zig +++ b/src/font/opentype/hhea.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const sfnt = @import("sfnt.zig"); /// Horizontal Header Table diff --git a/src/font/opentype/os2.zig b/src/font/opentype/os2.zig index 9bcec973d..1cd11f35e 100644 --- a/src/font/opentype/os2.zig +++ b/src/font/opentype/os2.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const sfnt = @import("sfnt.zig"); pub const FSSelection = packed struct(sfnt.uint16) { diff --git a/src/font/opentype/post.zig b/src/font/opentype/post.zig index b739bd224..8031a0a4d 100644 --- a/src/font/opentype/post.zig +++ b/src/font/opentype/post.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const sfnt = @import("sfnt.zig"); /// PostScript Table diff --git a/src/font/opentype/svg.zig b/src/font/opentype/svg.zig index 348a1dc5b..b4d9ccaa2 100644 --- a/src/font/opentype/svg.zig +++ b/src/font/opentype/svg.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const font = @import("../main.zig"); /// SVG glyphs description table. diff --git a/src/font/shape.zig b/src/font/shape.zig index 0d8a029bf..c96c8df7f 100644 --- a/src/font/shape.zig +++ b/src/font/shape.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const builtin = @import("builtin"); const options = @import("main.zig").options; const run = @import("shaper/run.zig"); const feature = @import("shaper/feature.zig"); diff --git a/src/font/shaper/Cache.zig b/src/font/shaper/Cache.zig index 70b49bb75..2696985a4 100644 --- a/src/font/shaper/Cache.zig +++ b/src/font/shaper/Cache.zig @@ -11,7 +11,6 @@ pub const Cache = @This(); const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const font = @import("../main.zig"); const CacheTable = @import("../../datastruct/main.zig").CacheTable; diff --git a/src/font/shaper/coretext.zig b/src/font/shaper/coretext.zig index c1deec11d..97cb5cd89 100644 --- a/src/font/shaper/coretext.zig +++ b/src/font/shaper/coretext.zig @@ -3,11 +3,9 @@ const builtin = @import("builtin"); const assert = @import("../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const macos = @import("macos"); -const trace = @import("tracy").trace; const font = @import("../main.zig"); const os = @import("../../os/main.zig"); const terminal = @import("../../terminal/main.zig"); -const config = @import("../../config.zig"); const Feature = font.shape.Feature; const FeatureList = font.shape.FeatureList; const default_features = font.shape.default_features; diff --git a/src/font/shaper/feature.zig b/src/font/shaper/feature.zig index b85d2867d..5bd73f97f 100644 --- a/src/font/shaper/feature.zig +++ b/src/font/shaper/feature.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const builtin = @import("builtin"); const assert = @import("../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; diff --git a/src/font/shaper/harfbuzz.zig b/src/font/shaper/harfbuzz.zig index 2911e1e77..e4a9301e8 100644 --- a/src/font/shaper/harfbuzz.zig +++ b/src/font/shaper/harfbuzz.zig @@ -4,7 +4,6 @@ const Allocator = std.mem.Allocator; const harfbuzz = @import("harfbuzz"); const font = @import("../main.zig"); const terminal = @import("../../terminal/main.zig"); -const config = @import("../../config.zig"); const Feature = font.shape.Feature; const FeatureList = font.shape.FeatureList; const default_features = font.shape.default_features; diff --git a/src/font/shaper/noop.zig b/src/font/shaper/noop.zig index 5d2b1f54f..e5a08653f 100644 --- a/src/font/shaper/noop.zig +++ b/src/font/shaper/noop.zig @@ -1,7 +1,5 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; -const trace = @import("tracy").trace; const font = @import("../main.zig"); const Face = font.Face; const Collection = font.Collection; diff --git a/src/font/sprite/Face.zig b/src/font/sprite/Face.zig index a1f87f889..94bfa2f0b 100644 --- a/src/font/sprite/Face.zig +++ b/src/font/sprite/Face.zig @@ -13,7 +13,6 @@ const Face = @This(); const std = @import("std"); -const builtin = @import("builtin"); const assert = @import("../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const wuffs = @import("wuffs"); diff --git a/src/font/sprite/draw/block.zig b/src/font/sprite/draw/block.zig index 96910ce57..1731d2f50 100644 --- a/src/font/sprite/draw/block.zig +++ b/src/font/sprite/draw/block.zig @@ -6,11 +6,8 @@ //! const std = @import("std"); -const assert = @import("../../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; -const z2d = @import("z2d"); - const common = @import("common.zig"); const Shade = common.Shade; const Quads = common.Quads; @@ -18,7 +15,6 @@ const Alignment = common.Alignment; const fill = common.fill; const font = @import("../../main.zig"); -const Sprite = @import("../../sprite.zig").Sprite; // Utility names for common fractions const one_eighth: f64 = 0.125; diff --git a/src/font/sprite/draw/box.zig b/src/font/sprite/draw/box.zig index ff6fa292e..cc6e694d4 100644 --- a/src/font/sprite/draw/box.zig +++ b/src/font/sprite/draw/box.zig @@ -15,8 +15,6 @@ const std = @import("std"); const assert = @import("../../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; -const z2d = @import("z2d"); - const common = @import("common.zig"); const Thickness = common.Thickness; const Shade = common.Shade; @@ -30,7 +28,6 @@ const hlineMiddle = common.hlineMiddle; const vlineMiddle = common.vlineMiddle; const font = @import("../../main.zig"); -const Sprite = @import("../../sprite.zig").Sprite; /// Specification of a traditional intersection-style line/box-drawing char, /// which can have a different style of line from each edge to the center. diff --git a/src/font/sprite/draw/branch.zig b/src/font/sprite/draw/branch.zig index 3cca6b7ff..034f1e398 100644 --- a/src/font/sprite/draw/branch.zig +++ b/src/font/sprite/draw/branch.zig @@ -16,7 +16,6 @@ //! const std = @import("std"); -const assert = @import("../../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const common = @import("common.zig"); diff --git a/src/font/sprite/draw/common.zig b/src/font/sprite/draw/common.zig index 18efe6c65..290c44965 100644 --- a/src/font/sprite/draw/common.zig +++ b/src/font/sprite/draw/common.zig @@ -4,13 +4,9 @@ //! rather than being single-use. const std = @import("std"); -const assert = @import("../../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; -const z2d = @import("z2d"); - const font = @import("../../main.zig"); -const Sprite = @import("../../sprite.zig").Sprite; const log = std.log.scoped(.sprite_font); diff --git a/src/font/sprite/draw/geometric_shapes.zig b/src/font/sprite/draw/geometric_shapes.zig index d95a4fd2f..f6402cf05 100644 --- a/src/font/sprite/draw/geometric_shapes.zig +++ b/src/font/sprite/draw/geometric_shapes.zig @@ -15,8 +15,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const z2d = @import("z2d"); - const common = @import("common.zig"); const Thickness = common.Thickness; const Corner = common.Corner; diff --git a/src/font/sprite/draw/powerline.zig b/src/font/sprite/draw/powerline.zig index 24fce454b..8658d8553 100644 --- a/src/font/sprite/draw/powerline.zig +++ b/src/font/sprite/draw/powerline.zig @@ -11,8 +11,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const z2d = @import("z2d"); - const common = @import("common.zig"); const Thickness = common.Thickness; const Shade = common.Shade; diff --git a/src/font/sprite/draw/special.zig b/src/font/sprite/draw/special.zig index 22d8edb5c..8cad9ceba 100644 --- a/src/font/sprite/draw/special.zig +++ b/src/font/sprite/draw/special.zig @@ -6,8 +6,6 @@ //! having names that exactly match the enum fields in Sprite. const std = @import("std"); -const builtin = @import("builtin"); -const assert = @import("../../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const font = @import("../../main.zig"); const Sprite = font.sprite.Sprite; diff --git a/src/font/sprite/draw/symbols_for_legacy_computing.zig b/src/font/sprite/draw/symbols_for_legacy_computing.zig index 7abc179fe..d99fc8702 100644 --- a/src/font/sprite/draw/symbols_for_legacy_computing.zig +++ b/src/font/sprite/draw/symbols_for_legacy_computing.zig @@ -23,8 +23,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const assert = @import("../../../quirks.zig").inlineAssert; -const z2d = @import("z2d"); - const common = @import("common.zig"); const Thickness = common.Thickness; const Alignment = common.Alignment; diff --git a/src/font/sprite/draw/symbols_for_legacy_computing_supplement.zig b/src/font/sprite/draw/symbols_for_legacy_computing_supplement.zig index 45148ee76..bd91d3925 100644 --- a/src/font/sprite/draw/symbols_for_legacy_computing_supplement.zig +++ b/src/font/sprite/draw/symbols_for_legacy_computing_supplement.zig @@ -51,8 +51,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; const assert = @import("../../../quirks.zig").inlineAssert; -const z2d = @import("z2d"); - const common = @import("common.zig"); const Thickness = common.Thickness; const Fraction = common.Fraction; diff --git a/src/input/KeymapDarwin.zig b/src/input/KeymapDarwin.zig index 53c305ab1..a8702730e 100644 --- a/src/input/KeymapDarwin.zig +++ b/src/input/KeymapDarwin.zig @@ -17,7 +17,6 @@ const builtin = @import("builtin"); const Allocator = std.mem.Allocator; const macos = @import("macos"); const codes = @import("keycodes.zig").entries; -const Key = @import("key.zig").Key; const Mods = @import("key.zig").Mods; /// The current input source that is selected for the keyboard. This can diff --git a/src/input/command.zig b/src/input/command.zig index 3879efc36..72fb7f4ee 100644 --- a/src/input/command.zig +++ b/src/input/command.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const builtin = @import("builtin"); const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const Action = @import("Binding.zig").Action; diff --git a/src/input/kitty.zig b/src/input/kitty.zig index 7ebbd7757..e5789cc40 100644 --- a/src/input/kitty.zig +++ b/src/input/kitty.zig @@ -1,4 +1,3 @@ -const std = @import("std"); const key = @import("key.zig"); /// A single entry in the kitty keymap data. There are only ~100 entries diff --git a/src/input/paste.zig b/src/input/paste.zig index 197386e89..111a783f3 100644 --- a/src/input/paste.zig +++ b/src/input/paste.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; const Terminal = @import("../terminal/Terminal.zig"); pub const Options = struct { diff --git a/src/inspector/cursor.zig b/src/inspector/cursor.zig index 37ec412e9..756898252 100644 --- a/src/inspector/cursor.zig +++ b/src/inspector/cursor.zig @@ -1,4 +1,3 @@ -const std = @import("std"); const cimgui = @import("cimgui"); const terminal = @import("../terminal/main.zig"); diff --git a/src/inspector/page.zig b/src/inspector/page.zig index 2cc62772e..7da469e21 100644 --- a/src/inspector/page.zig +++ b/src/inspector/page.zig @@ -1,9 +1,7 @@ const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const cimgui = @import("cimgui"); const terminal = @import("../terminal/main.zig"); -const inspector = @import("main.zig"); const units = @import("units.zig"); pub fn render(page: *const terminal.Page) void { diff --git a/src/lib/union.zig b/src/lib/union.zig index c1513fc79..924d0e864 100644 --- a/src/lib/union.zig +++ b/src/lib/union.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; const testing = std.testing; const Target = @import("target.zig").Target; diff --git a/src/main_bench.zig b/src/main_bench.zig index 2314dc2ed..9804f51ef 100644 --- a/src/main_bench.zig +++ b/src/main_bench.zig @@ -1,5 +1,3 @@ -const std = @import("std"); -const builtin = @import("builtin"); const benchmark = @import("benchmark/main.zig"); pub const main = benchmark.cli.main; diff --git a/src/main_gen.zig b/src/main_gen.zig index b988819f8..3342bc2e9 100644 --- a/src/main_gen.zig +++ b/src/main_gen.zig @@ -1,5 +1,3 @@ -const std = @import("std"); -const builtin = @import("builtin"); const synthetic = @import("synthetic/main.zig"); pub const main = synthetic.cli.main; diff --git a/src/main_ghostty.zig b/src/main_ghostty.zig index 77b7f3ef4..261e0ad7d 100644 --- a/src/main_ghostty.zig +++ b/src/main_ghostty.zig @@ -6,14 +6,8 @@ const builtin = @import("builtin"); const Allocator = std.mem.Allocator; const posix = std.posix; const build_config = @import("build_config.zig"); -const options = @import("build_options"); -const glslang = @import("glslang"); const macos = @import("macos"); -const oni = @import("oniguruma"); const cli = @import("cli.zig"); -const internal_os = @import("os/main.zig"); -const fontconfig = @import("fontconfig"); -const harfbuzz = @import("harfbuzz"); const renderer = @import("renderer.zig"); const apprt = @import("apprt.zig"); diff --git a/src/os/TempDir.zig b/src/os/TempDir.zig index f2e9992c4..2ddf18da3 100644 --- a/src/os/TempDir.zig +++ b/src/os/TempDir.zig @@ -3,7 +3,6 @@ const TempDir = @This(); const std = @import("std"); -const builtin = @import("builtin"); const testing = std.testing; const Dir = std.fs.Dir; const allocTmpDir = @import("file.zig").allocTmpDir; diff --git a/src/os/args.zig b/src/os/args.zig index 871663504..9ef5bba40 100644 --- a/src/os/args.zig +++ b/src/os/args.zig @@ -1,6 +1,5 @@ const std = @import("std"); const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const objc = @import("objc"); const macos = @import("macos"); diff --git a/src/os/flatpak.zig b/src/os/flatpak.zig index 1b517cd83..78692089e 100644 --- a/src/os/flatpak.zig +++ b/src/os/flatpak.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const builtin = @import("builtin"); const posix = std.posix; diff --git a/src/os/homedir.zig b/src/os/homedir.zig index 28b4a0f73..0868a4fa5 100644 --- a/src/os/homedir.zig +++ b/src/os/homedir.zig @@ -1,6 +1,5 @@ const std = @import("std"); const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const passwd = @import("passwd.zig"); const posix = std.posix; const objc = @import("objc"); diff --git a/src/os/mouse.zig b/src/os/mouse.zig index b592bd94a..d68bb226f 100644 --- a/src/os/mouse.zig +++ b/src/os/mouse.zig @@ -1,6 +1,5 @@ const std = @import("std"); const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const objc = @import("objc"); const log = std.log.scoped(.os); diff --git a/src/os/wasm/log.zig b/src/os/wasm/log.zig index 1aac8c4e7..faa885c6e 100644 --- a/src/os/wasm/log.zig +++ b/src/os/wasm/log.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const builtin = @import("builtin"); const wasm = @import("../wasm.zig"); // Use the correct implementation diff --git a/src/os/xdg.zig b/src/os/xdg.zig index 57ef075aa..a813b0a98 100644 --- a/src/os/xdg.zig +++ b/src/os/xdg.zig @@ -3,7 +3,6 @@ const std = @import("std"); const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const posix = std.posix; const homedir = @import("homedir.zig"); diff --git a/src/renderer.zig b/src/renderer.zig index f09f717c4..2d37ddd4c 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -7,8 +7,6 @@ //! APIs. The renderers in this package assume that the renderer is already //! setup (OpenGL has a context, Vulkan has a surface, etc.) -const std = @import("std"); -const builtin = @import("builtin"); const build_config = @import("build_config.zig"); const cursor = @import("renderer/cursor.zig"); diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index efd98601c..da577f957 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -2,7 +2,6 @@ pub const OpenGL = @This(); const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const builtin = @import("builtin"); const gl = @import("opengl"); diff --git a/src/renderer/Options.zig b/src/renderer/Options.zig index 85ff8e310..948b31d2d 100644 --- a/src/renderer/Options.zig +++ b/src/renderer/Options.zig @@ -3,7 +3,6 @@ const apprt = @import("../apprt.zig"); const font = @import("../font/main.zig"); const renderer = @import("../renderer.zig"); -const Config = @import("../config.zig").Config; /// The derived configuration for this renderer implementation. config: renderer.Renderer.DerivedConfig, diff --git a/src/renderer/Thread.zig b/src/renderer/Thread.zig index 7316ac51d..c1b377b3d 100644 --- a/src/renderer/Thread.zig +++ b/src/renderer/Thread.zig @@ -4,7 +4,6 @@ pub const Thread = @This(); const std = @import("std"); const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const xev = @import("../global.zig").xev; const crash = @import("../crash/main.zig"); const internal_os = @import("../os/main.zig"); diff --git a/src/renderer/link.zig b/src/renderer/link.zig index 8c09a3195..74df3e596 100644 --- a/src/renderer/link.zig +++ b/src/renderer/link.zig @@ -2,7 +2,6 @@ const std = @import("std"); const assert = std.debug.assert; const Allocator = std.mem.Allocator; const oni = @import("oniguruma"); -const configpkg = @import("../config.zig"); const inputpkg = @import("../input.zig"); const terminal = @import("../terminal/main.zig"); const point = terminal.point; diff --git a/src/renderer/message.zig b/src/renderer/message.zig index 8d4db32cd..a47b96080 100644 --- a/src/renderer/message.zig +++ b/src/renderer/message.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const ArenaAllocator = std.heap.ArenaAllocator; const configpkg = @import("../config.zig"); diff --git a/src/renderer/metal/Frame.zig b/src/renderer/metal/Frame.zig index e919a01ed..388b4f9ed 100644 --- a/src/renderer/metal/Frame.zig +++ b/src/renderer/metal/Frame.zig @@ -3,17 +3,13 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const objc = @import("objc"); const mtl = @import("api.zig"); const Renderer = @import("../generic.zig").Renderer(Metal); const Metal = @import("../Metal.zig"); const Target = @import("Target.zig"); -const Pipeline = @import("Pipeline.zig"); const RenderPass = @import("RenderPass.zig"); -const Buffer = @import("buffer.zig").Buffer; const Health = @import("../../renderer.zig").Health; diff --git a/src/renderer/metal/IOSurfaceLayer.zig b/src/renderer/metal/IOSurfaceLayer.zig index afee0953f..34fbfbed5 100644 --- a/src/renderer/metal/IOSurfaceLayer.zig +++ b/src/renderer/metal/IOSurfaceLayer.zig @@ -4,8 +4,6 @@ const IOSurfaceLayer = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const objc = @import("objc"); const macos = @import("macos"); diff --git a/src/renderer/metal/Pipeline.zig b/src/renderer/metal/Pipeline.zig index cf495edda..9ba25c350 100644 --- a/src/renderer/metal/Pipeline.zig +++ b/src/renderer/metal/Pipeline.zig @@ -3,14 +3,10 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const macos = @import("macos"); const objc = @import("objc"); const mtl = @import("api.zig"); -const Texture = @import("Texture.zig"); -const Metal = @import("../Metal.zig"); const log = std.log.scoped(.metal); diff --git a/src/renderer/metal/RenderPass.zig b/src/renderer/metal/RenderPass.zig index eb458e054..f204e1770 100644 --- a/src/renderer/metal/RenderPass.zig +++ b/src/renderer/metal/RenderPass.zig @@ -3,8 +3,6 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const objc = @import("objc"); const mtl = @import("api.zig"); @@ -12,8 +10,6 @@ const Pipeline = @import("Pipeline.zig"); const Sampler = @import("Sampler.zig"); const Texture = @import("Texture.zig"); const Target = @import("Target.zig"); -const Metal = @import("../Metal.zig"); -const Buffer = @import("buffer.zig").Buffer; const log = std.log.scoped(.metal); diff --git a/src/renderer/metal/Sampler.zig b/src/renderer/metal/Sampler.zig index d1069948e..593f9a864 100644 --- a/src/renderer/metal/Sampler.zig +++ b/src/renderer/metal/Sampler.zig @@ -3,8 +3,6 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const objc = @import("objc"); const mtl = @import("api.zig"); diff --git a/src/renderer/metal/Target.zig b/src/renderer/metal/Target.zig index fe572a63b..f20bb0b7c 100644 --- a/src/renderer/metal/Target.zig +++ b/src/renderer/metal/Target.zig @@ -5,8 +5,6 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const objc = @import("objc"); const macos = @import("macos"); const graphics = macos.graphics; diff --git a/src/renderer/metal/Texture.zig b/src/renderer/metal/Texture.zig index c339277e8..5042919ac 100644 --- a/src/renderer/metal/Texture.zig +++ b/src/renderer/metal/Texture.zig @@ -4,7 +4,6 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const objc = @import("objc"); const mtl = @import("api.zig"); diff --git a/src/renderer/metal/buffer.zig b/src/renderer/metal/buffer.zig index 8d2254640..f91f89e99 100644 --- a/src/renderer/metal/buffer.zig +++ b/src/renderer/metal/buffer.zig @@ -1,6 +1,5 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; const objc = @import("objc"); const macos = @import("macos"); diff --git a/src/renderer/metal/shaders.zig b/src/renderer/metal/shaders.zig index 653c0dea2..0be023572 100644 --- a/src/renderer/metal/shaders.zig +++ b/src/renderer/metal/shaders.zig @@ -1,6 +1,5 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; const macos = @import("macos"); const objc = @import("objc"); const math = @import("../../math.zig"); diff --git a/src/renderer/opengl/Frame.zig b/src/renderer/opengl/Frame.zig index 3d0efbdfb..289413b0a 100644 --- a/src/renderer/opengl/Frame.zig +++ b/src/renderer/opengl/Frame.zig @@ -3,16 +3,12 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const gl = @import("opengl"); const Renderer = @import("../generic.zig").Renderer(OpenGL); const OpenGL = @import("../OpenGL.zig"); const Target = @import("Target.zig"); -const Pipeline = @import("Pipeline.zig"); const RenderPass = @import("RenderPass.zig"); -const Buffer = @import("buffer.zig").Buffer; const Health = @import("../../renderer.zig").Health; diff --git a/src/renderer/opengl/Pipeline.zig b/src/renderer/opengl/Pipeline.zig index 04130752a..2469f45bc 100644 --- a/src/renderer/opengl/Pipeline.zig +++ b/src/renderer/opengl/Pipeline.zig @@ -3,14 +3,8 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const gl = @import("opengl"); -const OpenGL = @import("../OpenGL.zig"); -const Texture = @import("Texture.zig"); -const Buffer = @import("buffer.zig").Buffer; - const log = std.log.scoped(.opengl); /// Options for initializing a render pipeline. diff --git a/src/renderer/opengl/RenderPass.zig b/src/renderer/opengl/RenderPass.zig index 1ef151c45..180664942 100644 --- a/src/renderer/opengl/RenderPass.zig +++ b/src/renderer/opengl/RenderPass.zig @@ -3,16 +3,12 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const gl = @import("opengl"); -const OpenGL = @import("../OpenGL.zig"); const Sampler = @import("Sampler.zig"); const Target = @import("Target.zig"); const Texture = @import("Texture.zig"); const Pipeline = @import("Pipeline.zig"); -const RenderPass = @import("RenderPass.zig"); const Buffer = @import("buffer.zig").Buffer; /// Options for beginning a render pass. diff --git a/src/renderer/opengl/Sampler.zig b/src/renderer/opengl/Sampler.zig index 66f579221..f4013c686 100644 --- a/src/renderer/opengl/Sampler.zig +++ b/src/renderer/opengl/Sampler.zig @@ -3,8 +3,6 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const gl = @import("opengl"); const OpenGL = @import("../OpenGL.zig"); diff --git a/src/renderer/opengl/Target.zig b/src/renderer/opengl/Target.zig index e9de7216e..5c6d818f1 100644 --- a/src/renderer/opengl/Target.zig +++ b/src/renderer/opengl/Target.zig @@ -5,8 +5,6 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const gl = @import("opengl"); const log = std.log.scoped(.opengl); diff --git a/src/renderer/opengl/Texture.zig b/src/renderer/opengl/Texture.zig index 71018d941..c37ec6866 100644 --- a/src/renderer/opengl/Texture.zig +++ b/src/renderer/opengl/Texture.zig @@ -3,8 +3,6 @@ const Self = @This(); const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const gl = @import("opengl"); const OpenGL = @import("../OpenGL.zig"); diff --git a/src/renderer/opengl/buffer.zig b/src/renderer/opengl/buffer.zig index 17d34e500..f9cbbcebd 100644 --- a/src/renderer/opengl/buffer.zig +++ b/src/renderer/opengl/buffer.zig @@ -1,6 +1,5 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; const gl = @import("opengl"); const OpenGL = @import("../OpenGL.zig"); diff --git a/src/renderer/row.zig b/src/renderer/row.zig index 157d22b54..933bb338b 100644 --- a/src/renderer/row.zig +++ b/src/renderer/row.zig @@ -1,4 +1,3 @@ -const std = @import("std"); const terminal = @import("../terminal/main.zig"); // TODO: Test neverExtendBg function diff --git a/src/renderer/shadertoy.zig b/src/renderer/shadertoy.zig index 38860932b..0d096c0fc 100644 --- a/src/renderer/shadertoy.zig +++ b/src/renderer/shadertoy.zig @@ -1,6 +1,5 @@ const std = @import("std"); const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const ArenaAllocator = std.heap.ArenaAllocator; const glslang = @import("glslang"); diff --git a/src/simd/index_of.zig b/src/simd/index_of.zig index cea549b95..7bf053b0d 100644 --- a/src/simd/index_of.zig +++ b/src/simd/index_of.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const builtin = @import("builtin"); const options = @import("build_options"); extern "c" fn ghostty_simd_index_of( diff --git a/src/surface_mouse.zig b/src/surface_mouse.zig index a9702a8fe..691f1b23c 100644 --- a/src/surface_mouse.zig +++ b/src/surface_mouse.zig @@ -8,7 +8,6 @@ const SurfaceMouse = @This(); const std = @import("std"); const builtin = @import("builtin"); const input = @import("input.zig"); -const apprt = @import("apprt.zig"); const terminal = @import("terminal/main.zig"); const MouseShape = @import("terminal/mouse_shape.zig").MouseShape; diff --git a/src/terminal/PageList.zig b/src/terminal/PageList.zig index 3673cf1f4..e7cb56da7 100644 --- a/src/terminal/PageList.zig +++ b/src/terminal/PageList.zig @@ -15,7 +15,6 @@ const point = @import("point.zig"); const pagepkg = @import("page.zig"); const stylepkg = @import("style.zig"); const size = @import("size.zig"); -const Selection = @import("Selection.zig"); const OffsetBuf = size.OffsetBuf; const Capacity = pagepkg.Capacity; const Page = pagepkg.Page; diff --git a/src/terminal/Parser.zig b/src/terminal/Parser.zig index 69f7e859f..980906e49 100644 --- a/src/terminal/Parser.zig +++ b/src/terminal/Parser.zig @@ -5,8 +5,6 @@ const Parser = @This(); const std = @import("std"); -const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const testing = std.testing; const table = @import("parse_table.zig").table; const osc = @import("osc.zig"); diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index 68919107b..6c9db6a8d 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -5,7 +5,6 @@ const Terminal = @This(); const std = @import("std"); const build_options = @import("terminal_options"); -const builtin = @import("builtin"); const assert = @import("../quirks.zig").inlineAssert; const testing = std.testing; const Allocator = std.mem.Allocator; diff --git a/src/terminal/apc.zig b/src/terminal/apc.zig index 0585c78ba..3ebacbbff 100644 --- a/src/terminal/apc.zig +++ b/src/terminal/apc.zig @@ -1,6 +1,5 @@ const std = @import("std"); const build_options = @import("terminal_options"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const kitty_gfx = @import("kitty/graphics.zig"); diff --git a/src/terminal/c/key_encode.zig b/src/terminal/c/key_encode.zig index 1e0367829..063cd8df7 100644 --- a/src/terminal/c/key_encode.zig +++ b/src/terminal/c/key_encode.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const lib_alloc = @import("../../lib/allocator.zig"); const CAllocator = lib_alloc.Allocator; diff --git a/src/terminal/c/key_event.zig b/src/terminal/c/key_event.zig index 6608c84b1..748b8799c 100644 --- a/src/terminal/c/key_event.zig +++ b/src/terminal/c/key_event.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const lib_alloc = @import("../../lib/allocator.zig"); const CAllocator = lib_alloc.Allocator; diff --git a/src/terminal/c/osc.zig b/src/terminal/c/osc.zig index 9c6286e6a..c4cdaad3b 100644 --- a/src/terminal/c/osc.zig +++ b/src/terminal/c/osc.zig @@ -1,6 +1,4 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; -const builtin = @import("builtin"); const lib_alloc = @import("../../lib/allocator.zig"); const CAllocator = lib_alloc.Allocator; const osc = @import("../osc.zig"); diff --git a/src/terminal/c/sgr.zig b/src/terminal/c/sgr.zig index ec35ce608..53536417f 100644 --- a/src/terminal/c/sgr.zig +++ b/src/terminal/c/sgr.zig @@ -1,8 +1,6 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const testing = std.testing; const Allocator = std.mem.Allocator; -const builtin = @import("builtin"); const lib_alloc = @import("../../lib/allocator.zig"); const CAllocator = lib_alloc.Allocator; const sgr = @import("../sgr.zig"); diff --git a/src/terminal/hash_map.zig b/src/terminal/hash_map.zig index a9d081782..e06050605 100644 --- a/src/terminal/hash_map.zig +++ b/src/terminal/hash_map.zig @@ -31,7 +31,6 @@ //! bottleneck. const std = @import("std"); -const builtin = @import("builtin"); const assert = @import("../quirks.zig").inlineAssert; const autoHash = std.hash.autoHash; const math = std.math; diff --git a/src/terminal/highlight.zig b/src/terminal/highlight.zig index 4db5e31e7..582ef6f06 100644 --- a/src/terminal/highlight.zig +++ b/src/terminal/highlight.zig @@ -11,7 +11,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../quirks.zig").inlineAssert; const size = @import("size.zig"); const PageList = @import("PageList.zig"); const PageChunk = PageList.PageIterator.Chunk; diff --git a/src/terminal/hyperlink.zig b/src/terminal/hyperlink.zig index b60ed795b..975e6f30e 100644 --- a/src/terminal/hyperlink.zig +++ b/src/terminal/hyperlink.zig @@ -1,6 +1,5 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../quirks.zig").inlineAssert; const hash_map = @import("hash_map.zig"); const AutoOffsetHashMap = hash_map.AutoOffsetHashMap; const pagepkg = @import("page.zig"); diff --git a/src/terminal/kitty/color.zig b/src/terminal/kitty/color.zig index dface5723..deeabcfb7 100644 --- a/src/terminal/kitty/color.zig +++ b/src/terminal/kitty/color.zig @@ -1,6 +1,4 @@ const std = @import("std"); -const build_options = @import("terminal_options"); -const LibEnum = @import("../../lib/enum.zig").Enum; const terminal = @import("../main.zig"); const RGB = terminal.color.RGB; const Terminator = terminal.osc.Terminator; diff --git a/src/terminal/kitty/graphics_exec.zig b/src/terminal/kitty/graphics_exec.zig index b5f8ad61b..5b3ab915d 100644 --- a/src/terminal/kitty/graphics_exec.zig +++ b/src/terminal/kitty/graphics_exec.zig @@ -2,8 +2,6 @@ const std = @import("std"); const assert = @import("../../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; -const renderer = @import("../../renderer.zig"); -const point = @import("../point.zig"); const Terminal = @import("../Terminal.zig"); const command = @import("graphics_command.zig"); const image = @import("graphics_image.zig"); diff --git a/src/terminal/kitty/graphics_image.zig b/src/terminal/kitty/graphics_image.zig index d5e0735a6..d2877cfc2 100644 --- a/src/terminal/kitty/graphics_image.zig +++ b/src/terminal/kitty/graphics_image.zig @@ -7,7 +7,6 @@ const posix = std.posix; const fastmem = @import("../../fastmem.zig"); const command = @import("graphics_command.zig"); -const point = @import("../point.zig"); const PageList = @import("../PageList.zig"); const wuffs = @import("wuffs"); diff --git a/src/terminal/kitty/graphics_render.zig b/src/terminal/kitty/graphics_render.zig index 4db9d1ab1..946b537a8 100644 --- a/src/terminal/kitty/graphics_render.zig +++ b/src/terminal/kitty/graphics_render.zig @@ -1,5 +1,4 @@ const std = @import("std"); -const assert = @import("../../quirks.zig").inlineAssert; const testing = std.testing; const terminal = @import("../main.zig"); diff --git a/src/terminal/main.zig b/src/terminal/main.zig index fc7584c1a..06c930014 100644 --- a/src/terminal/main.zig +++ b/src/terminal/main.zig @@ -1,10 +1,7 @@ -const builtin = @import("builtin"); - const charsets = @import("charsets.zig"); const stream = @import("stream.zig"); const ansi = @import("ansi.zig"); const csi = @import("csi.zig"); -const hyperlink = @import("hyperlink.zig"); const render = @import("render.zig"); const stream_readonly = @import("stream_readonly.zig"); const style = @import("style.zig"); diff --git a/src/terminal/page.zig b/src/terminal/page.zig index bf40d2353..124ff2545 100644 --- a/src/terminal/page.zig +++ b/src/terminal/page.zig @@ -10,7 +10,6 @@ const fastmem = @import("../fastmem.zig"); const color = @import("color.zig"); const hyperlink = @import("hyperlink.zig"); const kitty = @import("kitty.zig"); -const sgr = @import("sgr.zig"); const stylepkg = @import("style.zig"); const Style = stylepkg.Style; const StyleId = stylepkg.Id; diff --git a/src/terminal/parse_table.zig b/src/terminal/parse_table.zig index 2c8ccf8fc..01bd569cb 100644 --- a/src/terminal/parse_table.zig +++ b/src/terminal/parse_table.zig @@ -10,7 +10,6 @@ //! const std = @import("std"); -const builtin = @import("builtin"); const parser = @import("Parser.zig"); const State = parser.State; const Action = parser.TransitionAction; diff --git a/src/terminal/point.zig b/src/terminal/point.zig index fb44aae88..5a3d4a6f8 100644 --- a/src/terminal/point.zig +++ b/src/terminal/point.zig @@ -1,6 +1,5 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../quirks.zig").inlineAssert; const size = @import("size.zig"); /// The possible reference locations for a point. When someone says "(42, 80)" diff --git a/src/terminal/ref_counted_set.zig b/src/terminal/ref_counted_set.zig index 3d0dd469a..e67682ff5 100644 --- a/src/terminal/ref_counted_set.zig +++ b/src/terminal/ref_counted_set.zig @@ -5,8 +5,6 @@ const size = @import("size.zig"); const Offset = size.Offset; const OffsetBuf = size.OffsetBuf; -const fastmem = @import("../fastmem.zig"); - /// A reference counted set. /// /// This set is created with some capacity in mind. You can determine diff --git a/src/terminal/search/Thread.zig b/src/terminal/search/Thread.zig index 8addd6ba9..8f2d73f16 100644 --- a/src/terminal/search/Thread.zig +++ b/src/terminal/search/Thread.zig @@ -21,8 +21,6 @@ const MessageData = @import("../../datastruct/main.zig").MessageData; const point = @import("../point.zig"); const FlattenedHighlight = @import("../highlight.zig").Flattened; const UntrackedHighlight = @import("../highlight.zig").Untracked; -const PageList = @import("../PageList.zig"); -const Screen = @import("../Screen.zig"); const ScreenSet = @import("../ScreenSet.zig"); const Selection = @import("../Selection.zig"); const Terminal = @import("../Terminal.zig"); diff --git a/src/terminal/search/active.zig b/src/terminal/search/active.zig index 2329c40b0..236f4c7a6 100644 --- a/src/terminal/search/active.zig +++ b/src/terminal/search/active.zig @@ -5,7 +5,6 @@ const point = @import("../point.zig"); const size = @import("../size.zig"); const FlattenedHighlight = @import("../highlight.zig").Flattened; const PageList = @import("../PageList.zig"); -const Selection = @import("../Selection.zig"); const SlidingWindow = @import("sliding_window.zig").SlidingWindow; const Terminal = @import("../Terminal.zig"); diff --git a/src/terminal/search/pagelist.zig b/src/terminal/search/pagelist.zig index 227bd03f9..4bfd241e7 100644 --- a/src/terminal/search/pagelist.zig +++ b/src/terminal/search/pagelist.zig @@ -1,8 +1,6 @@ const std = @import("std"); const Allocator = std.mem.Allocator; -const assert = @import("../../quirks.zig").inlineAssert; const testing = std.testing; -const CircBuf = @import("../../datastruct/main.zig").CircBuf; const terminal = @import("../main.zig"); const point = terminal.point; const FlattenedHighlight = @import("../highlight.zig").Flattened; @@ -11,7 +9,6 @@ const PageList = terminal.PageList; const Pin = PageList.Pin; const Selection = terminal.Selection; const Screen = terminal.Screen; -const PageFormatter = @import("../formatter.zig").PageFormatter; const Terminal = @import("../Terminal.zig"); const SlidingWindow = @import("sliding_window.zig").SlidingWindow; diff --git a/src/terminal/search/screen.zig b/src/terminal/search/screen.zig index 97784e97e..0ae7f8a1f 100644 --- a/src/terminal/search/screen.zig +++ b/src/terminal/search/screen.zig @@ -10,7 +10,6 @@ const TrackedHighlight = highlight.Tracked; const PageList = @import("../PageList.zig"); const Pin = PageList.Pin; const Screen = @import("../Screen.zig"); -const Selection = @import("../Selection.zig"); const Terminal = @import("../Terminal.zig"); const ActiveSearch = @import("active.zig").ActiveSearch; const PageListSearch = @import("pagelist.zig").PageListSearch; diff --git a/src/terminal/search/viewport.zig b/src/terminal/search/viewport.zig index 55eedb724..76deebcec 100644 --- a/src/terminal/search/viewport.zig +++ b/src/terminal/search/viewport.zig @@ -6,7 +6,6 @@ const point = @import("../point.zig"); const size = @import("../size.zig"); const FlattenedHighlight = @import("../highlight.zig").Flattened; const PageList = @import("../PageList.zig"); -const Selection = @import("../Selection.zig"); const SlidingWindow = @import("sliding_window.zig").SlidingWindow; const Terminal = @import("../Terminal.zig"); diff --git a/src/termio/Options.zig b/src/termio/Options.zig index 7484fd087..f41709f4a 100644 --- a/src/termio/Options.zig +++ b/src/termio/Options.zig @@ -1,10 +1,8 @@ //! The options that are used to configure a terminal IO implementation. -const builtin = @import("builtin"); const xev = @import("../global.zig").xev; const apprt = @import("../apprt.zig"); const renderer = @import("../renderer.zig"); -const Command = @import("../Command.zig"); const Config = @import("../config.zig").Config; const termio = @import("../termio.zig"); diff --git a/src/termio/Termio.zig b/src/termio/Termio.zig index e54c7ca61..53df00433 100644 --- a/src/termio/Termio.zig +++ b/src/termio/Termio.zig @@ -5,27 +5,20 @@ pub const Termio = @This(); const std = @import("std"); -const builtin = @import("builtin"); -const build_config = @import("../build_config.zig"); const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const ArenaAllocator = std.heap.ArenaAllocator; const EnvMap = std.process.EnvMap; const posix = std.posix; const termio = @import("../termio.zig"); -const Command = @import("../Command.zig"); -const Pty = @import("../pty.zig").Pty; const StreamHandler = @import("stream_handler.zig").StreamHandler; const terminalpkg = @import("../terminal/main.zig"); -const terminfo = @import("../terminfo/main.zig"); const xev = @import("../global.zig").xev; const renderer = @import("../renderer.zig"); const apprt = @import("../apprt.zig"); -const fastmem = @import("../fastmem.zig"); const internal_os = @import("../os/main.zig"); const windows = internal_os.windows; const configpkg = @import("../config.zig"); -const shell_integration = @import("shell_integration.zig"); const log = std.log.scoped(.io_exec); diff --git a/src/termio/Thread.zig b/src/termio/Thread.zig index bb616e623..b111d5a52 100644 --- a/src/termio/Thread.zig +++ b/src/termio/Thread.zig @@ -19,7 +19,6 @@ const crash = @import("../crash/main.zig"); const internal_os = @import("../os/main.zig"); const termio = @import("../termio.zig"); const renderer = @import("../renderer.zig"); -const BlockingQueue = @import("../datastruct/main.zig").BlockingQueue; const Allocator = std.mem.Allocator; const log = std.log.scoped(.io_thread); diff --git a/src/termio/backend.zig b/src/termio/backend.zig index ebd170079..ae0e2004f 100644 --- a/src/termio/backend.zig +++ b/src/termio/backend.zig @@ -1,18 +1,9 @@ const std = @import("std"); -const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const posix = std.posix; -const xev = @import("../global.zig").xev; -const build_config = @import("../build_config.zig"); -const configpkg = @import("../config.zig"); -const internal_os = @import("../os/main.zig"); const renderer = @import("../renderer.zig"); -const shell_integration = @import("shell_integration.zig"); const terminal = @import("../terminal/main.zig"); const termio = @import("../termio.zig"); -const Command = @import("../Command.zig"); -const Pty = @import("../pty.zig").Pty; // The preallocation size for the write request pool. This should be big // enough to satisfy most write requests. It must be a power of 2. diff --git a/src/termio/mailbox.zig b/src/termio/mailbox.zig index e91033180..2725d0241 100644 --- a/src/termio/mailbox.zig +++ b/src/termio/mailbox.zig @@ -1,6 +1,4 @@ const std = @import("std"); -const builtin = @import("builtin"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; const xev = @import("../global.zig").xev; const renderer = @import("../renderer.zig"); diff --git a/src/termio/message.zig b/src/termio/message.zig index 23b9f2545..f78da2058 100644 --- a/src/termio/message.zig +++ b/src/termio/message.zig @@ -1,7 +1,5 @@ const std = @import("std"); -const assert = @import("../quirks.zig").inlineAssert; const Allocator = std.mem.Allocator; -const apprt = @import("../apprt.zig"); const renderer = @import("../renderer.zig"); const terminal = @import("../terminal/main.zig"); const termio = @import("../termio.zig"); From 94f88c8b54fbbd6a4686261f42f266878e8aaeea Mon Sep 17 00:00:00 2001 From: Lukas <134181853+bo2themax@users.noreply.github.com> Date: Fri, 28 Nov 2025 10:14:07 +0100 Subject: [PATCH 5/9] macOS: fix toggle_visibility behaviour with tabbed windows This fixes regression of #5690, which kind of comes from #9576. 05b42919d5ce53b51be25cc4f900ee3f00988259 (before #9576) has weird behaviours too, restored windows are not properly focused. With this pr, we only order `selectedWindow` front so we won't mess up with its selection state and the order of the tab group. --- macos/Sources/App/macOS/AppDelegate.swift | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index da20c2124..192135c15 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -1184,10 +1184,19 @@ class AppDelegate: NSObject, // want to bring back these windows if we remove the toggle. // // We also ignore fullscreen windows because they don't hide anyways. - self.hiddenWindows = NSApp.windows.filter { + var visibleWindows = [Weak]() + NSApp.windows.filter { $0.isVisible && !$0.styleMask.contains(.fullScreen) - }.map { Weak($0) } + }.forEach { window in + // We only keep track of selectedWindow if it's in a tabGroup, + // so we can keep its selection state when restoring + let windowToHide = window.tabGroup?.selectedWindow ?? window + if !visibleWindows.contains(where: { $0.value === windowToHide }) { + visibleWindows.append(Weak(windowToHide)) + } + } + self.hiddenWindows = visibleWindows } func restore() { From c75bade8969401526e8a419a37821ba27fd779ca Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 28 Nov 2025 12:59:23 -0800 Subject: [PATCH 6/9] macos: `window-width/height` is accurate even with other widgets Fixes #2660 Rather than calculate our window frame size based on various chrome calculations, we now utilize SwiftUI layouts and view intrinsic content sizes with `setContentSize` to setup our content size ignoring all our other widgets. I'm sure there's some edge cases I'm missing here but this should be a whole lot more reliable on the whole. --- .../Terminal/TerminalController.swift | 156 ++++++++++-------- .../Features/Terminal/TerminalView.swift | 4 +- .../Extensions/NSWindow+Extension.swift | 16 ++ 3 files changed, 105 insertions(+), 71 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index e1a98e598..93a05b6b9 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -508,55 +508,6 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr window.syncAppearance(surfaceConfig) } - /// Returns the default size of the window. This is contextual based on the focused surface because - /// the focused surface may specify a different default size than others. - private var defaultSize: NSRect? { - guard let screen = window?.screen ?? NSScreen.main else { return nil } - - if derivedConfig.maximize { - return screen.visibleFrame - } else if let focusedSurface, - let initialSize = focusedSurface.initialSize { - // Get the current frame of the window - guard var frame = window?.frame else { return nil } - - // Calculate the chrome size (window size minus view size) - let chromeWidth = frame.size.width - focusedSurface.frame.size.width - let chromeHeight = frame.size.height - focusedSurface.frame.size.height - - // Calculate the new width and height, clamping to the screen's size - let newWidth = min(initialSize.width + chromeWidth, screen.visibleFrame.width) - let newHeight = min(initialSize.height + chromeHeight, screen.visibleFrame.height) - - // Update the frame size while keeping the window's position intact - frame.size.width = newWidth - frame.size.height = newHeight - - // Ensure the window doesn't go outside the screen boundaries - frame.origin.x = max(screen.frame.origin.x, min(frame.origin.x, screen.frame.maxX - newWidth)) - frame.origin.y = max(screen.frame.origin.y, min(frame.origin.y, screen.frame.maxY - newHeight)) - - return adjustForWindowPosition(frame: frame, on: screen) - } - - guard let initialFrame else { return nil } - guard var frame = window?.frame else { return nil } - - // Calculate the new width and height, clamping to the screen's size - let newWidth = min(initialFrame.size.width, screen.visibleFrame.width) - let newHeight = min(initialFrame.size.height, screen.visibleFrame.height) - - // Update the frame size while keeping the window's position intact - frame.size.width = newWidth - frame.size.height = newHeight - - // Ensure the window doesn't go outside the screen boundaries - frame.origin.x = max(screen.frame.origin.x, min(frame.origin.x, screen.frame.maxX - newWidth)) - frame.origin.y = max(screen.frame.origin.y, min(frame.origin.y, screen.frame.maxY - newHeight)) - - return adjustForWindowPosition(frame: frame, on: screen) - } - /// Adjusts the given frame for the configured window position. func adjustForWindowPosition(frame: NSRect, on screen: NSScreen) -> NSRect { guard let x = derivedConfig.windowPositionX else { return frame } @@ -922,9 +873,6 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr super.windowDidLoad() guard let window else { return } - // Store our initial frame so we can know our default later. - initialFrame = window.frame - // I copy this because we may change the source in the future but also because // I regularly audit our codebase for "ghostty.config" access because generally // you shouldn't use it. Its safe in this case because for a new window we should @@ -944,19 +892,38 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr // If this is our first surface then our focused surface will be nil // so we force the focused surface to the leaf. focusedSurface = view - - if let defaultSize { - window.setFrame(defaultSize, display: true) - } } // Initialize our content view to the SwiftUI root window.contentView = NSHostingView(rootView: TerminalView( ghostty: self.ghostty, viewModel: self, - delegate: self + delegate: self, )) - + + // If we have a default size, we want to apply it. + if let defaultSize { + switch (defaultSize) { + case .frame: + // Frames can be applied immediately + defaultSize.apply(to: window) + + case .contentIntrinsicSize: + // Content intrinsic size requires a short delay so that AppKit + // can layout our SwiftUI views. + DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(10_000)) { [weak window] in + guard let window else { return } + defaultSize.apply(to: window) + } + } + } + + // Store our initial frame so we can know our default later. This MUST + // be after the defaultSize call above so that we don't re-apply our frame. + // Note: we probably want to set this on the first frame change or something + // so it respects cascade. + initialFrame = window.frame + // In various situations, macOS automatically tabs new windows. Ghostty handles // its own tabbing so we DONT want this behavior. This detects this scenario and undoes // it. @@ -1144,8 +1111,8 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr } @IBAction func returnToDefaultSize(_ sender: Any?) { - guard let defaultSize else { return } - window?.setFrame(defaultSize, display: true) + guard let window, let defaultSize else { return } + defaultSize.apply(to: window) } @IBAction override func closeWindow(_ sender: Any?) { @@ -1421,19 +1388,68 @@ extension TerminalController { // If our window is already the default size or we don't have a // default size, then disable. - guard let defaultSize, - window.frame.size != .init( - width: defaultSize.size.width, - height: defaultSize.size.height - ) - else { - return false - } - - return true + return defaultSize?.isChanged(for: window) ?? false default: return super.validateMenuItem(item) } } } + +// MARK: Default Size + +extension TerminalController { + /// The possible default sizes for a terminal. The size can't purely be known as a + /// window frame because if we set `window-width/height` then it is based + /// on content size. + enum DefaultSize { + /// A frame, set with `window.setFrame` + case frame(NSRect) + + /// A content size, set with `window.setContentSize` + case contentIntrinsicSize + + func isChanged(for window: NSWindow) -> Bool { + switch self { + case .frame(let rect): + return window.frame != rect + case .contentIntrinsicSize: + guard let view = window.contentView else { + return false + } + + return view.frame.size != view.intrinsicContentSize + } + } + + func apply(to window: NSWindow) { + switch self { + case .frame(let rect): + window.setFrame(rect, display: true) + case .contentIntrinsicSize: + guard let size = window.contentView?.intrinsicContentSize else { + return + } + + window.setContentSize(size) + window.constrainToScreen() + } + } + } + + private var defaultSize: DefaultSize? { + if derivedConfig.maximize, let screen = window?.screen ?? NSScreen.main { + // Maximize takes priority, we take up the full screen we're on. + return .frame(screen.visibleFrame) + } else if focusedSurface?.initialSize != nil { + // Initial size as requested by the configuration (e.g. `window-width`) + // takes next priority. + return .contentIntrinsicSize + } else if let initialFrame { + // The initial frame we had when we started otherwise. + return .frame(initialFrame) + } else { + return nil + } + } +} diff --git a/macos/Sources/Features/Terminal/TerminalView.swift b/macos/Sources/Features/Terminal/TerminalView.swift index 8c5955c7f..fd53a617b 100644 --- a/macos/Sources/Features/Terminal/TerminalView.swift +++ b/macos/Sources/Features/Terminal/TerminalView.swift @@ -45,7 +45,7 @@ struct TerminalView: View { // An optional delegate to receive information about terminal changes. weak var delegate: (any TerminalViewDelegate)? = nil - + // The most recently focused surface, equal to focusedSurface when // it is non-nil. @State private var lastFocusedSurface: Weak = .init() @@ -100,6 +100,8 @@ struct TerminalView: View { guard let size = newValue else { return } self.delegate?.cellSizeDidChange(to: size) } + .frame(idealWidth: lastFocusedSurface.value?.initialSize?.width, + idealHeight: lastFocusedSurface.value?.initialSize?.height) } // Ignore safe area to extend up in to the titlebar region if we have the "hidden" titlebar style .ignoresSafeArea(.container, edges: ghostty.config.macosTitlebarStyle == "hidden" ? .top : []) diff --git a/macos/Sources/Helpers/Extensions/NSWindow+Extension.swift b/macos/Sources/Helpers/Extensions/NSWindow+Extension.swift index f9ed364aa..d834f5e63 100644 --- a/macos/Sources/Helpers/Extensions/NSWindow+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSWindow+Extension.swift @@ -15,4 +15,20 @@ extension NSWindow { guard let firstWindow = tabGroup?.windows.first else { return true } return firstWindow === self } + + /// Adjusts the window origin if necessary to ensure the window remains visible on screen. + func constrainToScreen() { + guard let screen = screen ?? NSScreen.main else { return } + let visibleFrame = screen.visibleFrame + var windowFrame = frame + + windowFrame.origin.x = max(visibleFrame.minX, + min(windowFrame.origin.x, visibleFrame.maxX - windowFrame.width)) + windowFrame.origin.y = max(visibleFrame.minY, + min(windowFrame.origin.y, visibleFrame.maxY - windowFrame.height)) + + if windowFrame.origin != frame.origin { + setFrameOrigin(windowFrame.origin) + } + } } From 351dd2ea51be4e9416261f3086c2f4967d88ba61 Mon Sep 17 00:00:00 2001 From: rhodes-b <59537185+rhodes-b@users.noreply.github.com> Date: Fri, 28 Nov 2025 19:26:11 -0600 Subject: [PATCH 7/9] allow list themes --plain to accept --color flag --- src/cli/list_themes.zig | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cli/list_themes.zig b/src/cli/list_themes.zig index 63184ddfb..eb7cb49a3 100644 --- a/src/cli/list_themes.zig +++ b/src/cli/list_themes.zig @@ -180,7 +180,13 @@ pub fn run(gpa_alloc: std.mem.Allocator) !u8 { return 0; } + var theme_config = try Config.default(gpa_alloc); + defer theme_config.deinit(); for (themes.items) |theme| { + try theme_config.loadFile(theme_config._arena.?.allocator(), theme.path); + if (!shouldIncludeTheme(opts.color, theme_config)) { + continue; + } if (opts.path) try stdout.print("{s} ({t}) {s}\n", .{ theme.theme, theme.location, theme.path }) else From 10f19ebdc3260dd5b2d0d27ebb3f7ed2501e3327 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 29 Nov 2025 07:15:31 -0800 Subject: [PATCH 8/9] search: handle soft-wrapped lines in sliding window properly Fixes #9752 --- src/terminal/formatter.zig | 72 ++++++++++++++++++ src/terminal/render.zig | 12 ++- src/terminal/search/sliding_window.zig | 100 ++++++++++++++++++++++--- 3 files changed, 173 insertions(+), 11 deletions(-) diff --git a/src/terminal/formatter.zig b/src/terminal/formatter.zig index 1f4f2468b..74bbfe482 100644 --- a/src/terminal/formatter.zig +++ b/src/terminal/formatter.zig @@ -825,6 +825,8 @@ pub const PageFormatter = struct { /// byte written to the writer offset by the byte index. It is the /// caller's responsibility to free the map. /// + /// The x/y coordinate will be the coordinates within the page. + /// /// Warning: there is a significant performance hit to track this point_map: ?struct { alloc: Allocator, @@ -1450,6 +1452,76 @@ test "Page plain single line" { ); } +test "Page plain single line soft-wrapped unwrapped" { + const testing = std.testing; + const alloc = testing.allocator; + + var builder: std.Io.Writer.Allocating = .init(alloc); + defer builder.deinit(); + + var t = try Terminal.init(alloc, .{ + .cols = 3, + .rows = 5, + }); + defer t.deinit(alloc); + + var s = t.vtStream(); + defer s.deinit(); + + try s.nextSlice("hello!"); + + // Verify we have only a single page + const pages = &t.screens.active.pages; + try testing.expect(pages.pages.first != null); + try testing.expect(pages.pages.first == pages.pages.last); + + // Create the formatter + const page = &pages.pages.last.?.data; + var formatter: PageFormatter = .init(page, .{ + .emit = .plain, + .unwrap = true, + }); + + // Test our point map. + var point_map: std.ArrayList(Coordinate) = .empty; + defer point_map.deinit(alloc); + formatter.point_map = .{ .alloc = alloc, .map = &point_map }; + + // Verify output + // Note: we don't test the trailing state, which may have bugs + // with unwrap... + _ = try formatter.formatWithState(&builder.writer); + const output = builder.writer.buffered(); + try testing.expectEqualStrings("hello!", output); + + // Verify our point map + try testing.expectEqual(output.len, point_map.items.len); + try testing.expectEqual( + Coordinate{ .x = 0, .y = 0 }, + point_map.items[0], + ); + try testing.expectEqual( + Coordinate{ .x = 1, .y = 0 }, + point_map.items[1], + ); + try testing.expectEqual( + Coordinate{ .x = 2, .y = 0 }, + point_map.items[2], + ); + try testing.expectEqual( + Coordinate{ .x = 0, .y = 1 }, + point_map.items[3], + ); + try testing.expectEqual( + Coordinate{ .x = 1, .y = 1 }, + point_map.items[4], + ); + try testing.expectEqual( + Coordinate{ .x = 2, .y = 1 }, + point_map.items[5], + ); +} + test "Page plain single wide char" { const testing = std.testing; const alloc = testing.allocator; diff --git a/src/terminal/render.zig b/src/terminal/render.zig index 296360381..83b4a7145 100644 --- a/src/terminal/render.zig +++ b/src/terminal/render.zig @@ -703,8 +703,16 @@ pub const RenderState = struct { .{ .tag = tag, .range = .{ - if (i == 0) hl.top_x else 0, - if (i == nodes.len - 1) hl.bot_x else self.cols - 1, + if (i == 0 and + row_pin.y == starts[0]) + hl.top_x + else + 0, + if (i == nodes.len - 1 and + row_pin.y == ends[nodes.len - 1] - 1) + hl.bot_x + else + self.cols - 1, }, }, ); diff --git a/src/terminal/search/sliding_window.zig b/src/terminal/search/sliding_window.zig index 0d853b3a0..3d64042ce 100644 --- a/src/terminal/search/sliding_window.zig +++ b/src/terminal/search/sliding_window.zig @@ -9,6 +9,7 @@ const PageList = terminal.PageList; const Pin = PageList.Pin; const Selection = terminal.Selection; const Screen = terminal.Screen; +const Terminal = terminal.Terminal; const PageFormatter = @import("../formatter.zig").PageFormatter; const FlattenedHighlight = terminal.highlight.Flattened; @@ -462,12 +463,13 @@ pub const SlidingWindow = struct { switch (self.direction) { .forward => {}, .reverse => { + const slice = self.chunk_buf.slice(); + const nodes = slice.items(.node); + const starts = slice.items(.start); + const ends = slice.items(.end); + if (self.chunk_buf.len > 1) { // Reverse all our chunks. This should be pretty obvious why. - const slice = self.chunk_buf.slice(); - const nodes = slice.items(.node); - const starts = slice.items(.start); - const ends = slice.items(.end); std.mem.reverse(*PageList.List.Node, nodes); std.mem.reverse(size.CellCountInt, starts); std.mem.reverse(size.CellCountInt, ends); @@ -484,10 +486,6 @@ pub const SlidingWindow = struct { // We DON'T need to do this for any middle pages because // they always use the full page. // - // We DON'T need to do this for chunks.len == 1 because - // the pages themselves aren't reversed and we don't have - // any prefix/suffix problems. - // // This is a fixup that makes our start/end match the // same logic as the loops above if they were in forward // order. @@ -496,6 +494,13 @@ pub const SlidingWindow = struct { ends[0] = nodes[0].data.size.rows; ends[nodes.len - 1] = starts[nodes.len - 1] + 1; starts[nodes.len - 1] = 0; + } else { + // For a single chunk, the y values are in reverse order + // (start is the screen-end, end is the screen-start). + // Swap them to get proper top-to-bottom order. + const start_y = starts[0]; + starts[0] = ends[0] - 1; + ends[0] = start_y + 1; } // X values also need to be reversed since the top/bottom @@ -539,7 +544,10 @@ pub const SlidingWindow = struct { // Encode the page into the buffer. const formatter: PageFormatter = formatter: { - var formatter: PageFormatter = .init(&meta.node.data, .plain); + var formatter: PageFormatter = .init(&meta.node.data, .{ + .emit = .plain, + .unwrap = true, + }); formatter.point_map = .{ .alloc = self.alloc, .map = &meta.cell_map, @@ -1555,3 +1563,77 @@ test "SlidingWindow single append match on boundary reversed" { } try testing.expect(w.next() == null); } + +test "SlidingWindow single append soft wrapped" { + const testing = std.testing; + const alloc = testing.allocator; + + var w: SlidingWindow = try .init(alloc, .forward, "boo!"); + defer w.deinit(); + + var t: Terminal = try .init(alloc, .{ .cols = 4, .rows = 5 }); + defer t.deinit(alloc); + + var s = t.vtStream(); + defer s.deinit(); + try s.nextSlice("A\r\nxxboo!\r\nC"); + + // We want to test single-page cases. + const screen = t.screens.active; + try testing.expect(screen.pages.pages.first == screen.pages.pages.last); + const node: *PageList.List.Node = screen.pages.pages.first.?; + _ = try w.append(node); + + // We should be able to find two matches. + { + const h = w.next().?; + const sel = h.untracked(); + try testing.expectEqual(point.Point{ .active = .{ + .x = 2, + .y = 1, + } }, screen.pages.pointFromPin(.active, sel.start)); + try testing.expectEqual(point.Point{ .active = .{ + .x = 1, + .y = 2, + } }, screen.pages.pointFromPin(.active, sel.end)); + } + try testing.expect(w.next() == null); + try testing.expect(w.next() == null); +} + +test "SlidingWindow single append reversed soft wrapped" { + const testing = std.testing; + const alloc = testing.allocator; + + var w: SlidingWindow = try .init(alloc, .reverse, "boo!"); + defer w.deinit(); + + var t: Terminal = try .init(alloc, .{ .cols = 4, .rows = 5 }); + defer t.deinit(alloc); + + var s = t.vtStream(); + defer s.deinit(); + try s.nextSlice("A\r\nxxboo!\r\nC"); + + // We want to test single-page cases. + const screen = t.screens.active; + try testing.expect(screen.pages.pages.first == screen.pages.pages.last); + const node: *PageList.List.Node = screen.pages.pages.first.?; + _ = try w.append(node); + + // We should be able to find two matches. + { + const h = w.next().?; + const sel = h.untracked(); + try testing.expectEqual(point.Point{ .active = .{ + .x = 2, + .y = 1, + } }, screen.pages.pointFromPin(.active, sel.start)); + try testing.expectEqual(point.Point{ .active = .{ + .x = 1, + .y = 2, + } }, screen.pages.pointFromPin(.active, sel.end)); + } + try testing.expect(w.next() == null); + try testing.expect(w.next() == null); +} From 643c5e00a076ce298faf7c9b69b39691576bf3b7 Mon Sep 17 00:00:00 2001 From: mitchellh <1299+mitchellh@users.noreply.github.com> Date: Sun, 30 Nov 2025 00:16:02 +0000 Subject: [PATCH 9/9] deps: Update iTerm2 color schemes --- build.zig.zon | 2 +- build.zig.zon.json | 4 ++-- build.zig.zon.nix | 4 ++-- build.zig.zon.txt | 2 +- flatpak/zig-packages.json | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index fc7d855f4..993904aec 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -116,7 +116,7 @@ // Other .apple_sdk = .{ .path = "./pkg/apple-sdk" }, .iterm2_themes = .{ - .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251110-150531-d5f3d53/ghostty-themes.tgz", + .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251124-150533-2b326a8/ghostty-themes.tgz", .hash = "N-V-__8AAPZCAwDJ0OsIn2nbr3FMvBw68oiv-hC2pFuY1eLN", .lazy = true, }, diff --git a/build.zig.zon.json b/build.zig.zon.json index 6de71dd82..9ca70c410 100644 --- a/build.zig.zon.json +++ b/build.zig.zon.json @@ -51,8 +51,8 @@ }, "N-V-__8AAPZCAwDJ0OsIn2nbr3FMvBw68oiv-hC2pFuY1eLN": { "name": "iterm2_themes", - "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251110-150531-d5f3d53/ghostty-themes.tgz", - "hash": "sha256-VZq3L/cAAu7kLA5oqJYNjAZApoblfBtAzfdKVOuJPQI=" + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251124-150533-2b326a8/ghostty-themes.tgz", + "hash": "sha256-5mmXW7d9SkesHyIwUBlWmyGtOWf6wu0S6zkHe93FVLM=" }, "N-V-__8AAIC5lwAVPJJzxnCAahSvZTIlG-HhtOvnM1uh-66x": { "name": "jetbrains_mono", diff --git a/build.zig.zon.nix b/build.zig.zon.nix index ae227129b..2563f5411 100644 --- a/build.zig.zon.nix +++ b/build.zig.zon.nix @@ -166,8 +166,8 @@ in name = "N-V-__8AAPZCAwDJ0OsIn2nbr3FMvBw68oiv-hC2pFuY1eLN"; path = fetchZigArtifact { name = "iterm2_themes"; - url = "https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251110-150531-d5f3d53/ghostty-themes.tgz"; - hash = "sha256-VZq3L/cAAu7kLA5oqJYNjAZApoblfBtAzfdKVOuJPQI="; + url = "https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251124-150533-2b326a8/ghostty-themes.tgz"; + hash = "sha256-5mmXW7d9SkesHyIwUBlWmyGtOWf6wu0S6zkHe93FVLM="; }; } { diff --git a/build.zig.zon.txt b/build.zig.zon.txt index c7a5bae21..4362c5d36 100644 --- a/build.zig.zon.txt +++ b/build.zig.zon.txt @@ -29,7 +29,7 @@ https://deps.files.ghostty.org/zig_wayland-1b5c038ec10da20ed3a15b0b2a6db1c21383e https://deps.files.ghostty.org/zlib-1220fed0c74e1019b3ee29edae2051788b080cd96e90d56836eea857b0b966742efb.tar.gz https://github.com/ivanstepanovftw/zigimg/archive/d7b7ab0ba0899643831ef042bd73289510b39906.tar.gz https://github.com/jacobsandlund/uucode/archive/31655fba3c638229989cc524363ef5e3c7b580c1.tar.gz -https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251110-150531-d5f3d53/ghostty-themes.tgz +https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251124-150533-2b326a8/ghostty-themes.tgz https://github.com/natecraddock/zf/archive/3c52637b7e937c5ae61fd679717da3e276765b23.tar.gz https://github.com/rockorager/libvaxis/archive/7dbb9fd3122e4ffad262dd7c151d80d863b68558.tar.gz https://github.com/vancluever/z2d/archive/refs/tags/v0.9.0.tar.gz diff --git a/flatpak/zig-packages.json b/flatpak/zig-packages.json index 5a64f81a8..672fd7a5f 100644 --- a/flatpak/zig-packages.json +++ b/flatpak/zig-packages.json @@ -61,9 +61,9 @@ }, { "type": "archive", - "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251110-150531-d5f3d53/ghostty-themes.tgz", + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/releases/download/release-20251124-150533-2b326a8/ghostty-themes.tgz", "dest": "vendor/p/N-V-__8AAPZCAwDJ0OsIn2nbr3FMvBw68oiv-hC2pFuY1eLN", - "sha256": "559ab72ff70002eee42c0e68a8960d8c0640a686e57c1b40cdf74a54eb893d02" + "sha256": "e669975bb77d4a47ac1f22305019569b21ad3967fac2ed12eb39077bddc554b3" }, { "type": "archive",