From d6dea79bde1f2060fce56d178102db2c80773332 Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Wed, 5 Feb 2025 13:58:01 +0100 Subject: [PATCH 001/371] gtk: add option to always display the tab bar Also fixes crashes in both vanilla GTK and Adwaita implementations of `closeTab`, which erroneously close windows twice when there are no more tabs left (we probably already handle it somewhere else). --- src/apprt/gtk/Window.zig | 56 ++++++++++++++++++++++------------------ src/config/Config.zig | 29 ++++++++++++++++++++- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index d82087ff0..6bed56ec0 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -54,6 +54,9 @@ window: *adw.ApplicationWindow, /// The header bar for the window. headerbar: HeaderBar, +/// The tab bar for the window. +tab_bar: *adw.TabBar, + /// The tab overview for the window. This is possibly null since there is no /// taboverview without a AdwApplicationWindow (libadwaita >= 1.4.0). tab_overview: ?*adw.TabOverview, @@ -82,6 +85,7 @@ pub const DerivedConfig = struct { gtk_tabs_location: configpkg.Config.GtkTabsLocation, gtk_wide_tabs: bool, gtk_toolbar_style: configpkg.Config.GtkToolbarStyle, + window_show_tab_bar: configpkg.Config.WindowShowTabBar, quick_terminal_position: configpkg.Config.QuickTerminalPosition, quick_terminal_size: configpkg.Config.QuickTerminalSize, @@ -101,6 +105,7 @@ pub const DerivedConfig = struct { .gtk_tabs_location = config.@"gtk-tabs-location", .gtk_wide_tabs = config.@"gtk-wide-tabs", .gtk_toolbar_style = config.@"gtk-toolbar-style", + .window_show_tab_bar = config.@"window-show-tab-bar", .quick_terminal_position = config.@"quick-terminal-position", .quick_terminal_size = config.@"quick-terminal-size", @@ -135,6 +140,7 @@ pub fn init(self: *Window, app: *App) !void { .config = DerivedConfig.init(&app.config), .window = undefined, .headerbar = undefined, + .tab_bar = undefined, .tab_overview = null, .notebook = undefined, .titlebar_menu = undefined, @@ -216,8 +222,9 @@ pub fn init(self: *Window, app: *App) !void { // If we're using an AdwWindow then we can support the tab overview. if (self.tab_overview) |tab_overview| { if (!adw_version.supportsTabOverview()) unreachable; - const btn = switch (self.config.gtk_tabs_location) { - .top, .bottom => btn: { + + const btn = switch (self.config.window_show_tab_bar) { + .always, .auto => btn: { const btn = gtk.ToggleButton.new(); btn.as(gtk.Widget).setTooltipText(i18n._("View Open Tabs")); btn.as(gtk.Button).setIconName("view-grid-symbolic"); @@ -229,8 +236,7 @@ pub fn init(self: *Window, app: *App) !void { ); break :btn btn.as(gtk.Widget); }, - - .hidden => btn: { + .never => btn: { const btn = adw.TabButton.new(); btn.setView(self.notebook.tab_view); btn.as(gtk.Actionable).setActionName("overview.open"); @@ -376,21 +382,16 @@ pub fn init(self: *Window, app: *App) !void { // Our actions for the menu initActions(self); + self.tab_bar = adw.TabBar.new(); + self.tab_bar.setView(self.notebook.tab_view); + if (adw_version.supportsToolbarView()) { const toolbar_view = adw.ToolbarView.new(); toolbar_view.addTopBar(self.headerbar.asWidget()); - if (self.config.gtk_tabs_location != .hidden) { - const tab_bar = adw.TabBar.new(); - tab_bar.setView(self.notebook.tab_view); - - if (!self.config.gtk_wide_tabs) tab_bar.setExpandTabs(0); - - switch (self.config.gtk_tabs_location) { - .top => toolbar_view.addTopBar(tab_bar.as(gtk.Widget)), - .bottom => toolbar_view.addBottomBar(tab_bar.as(gtk.Widget)), - .hidden => unreachable, - } + switch (self.config.gtk_tabs_location) { + .top => toolbar_view.addTopBar(self.tab_bar.as(gtk.Widget)), + .bottom => toolbar_view.addBottomBar(self.tab_bar.as(gtk.Widget)), } toolbar_view.setContent(box.as(gtk.Widget)); @@ -405,23 +406,18 @@ pub fn init(self: *Window, app: *App) !void { // Set our application window content. self.tab_overview.?.setChild(toolbar_view.as(gtk.Widget)); self.window.setContent(self.tab_overview.?.as(gtk.Widget)); - } else tab_bar: { - if (self.config.gtk_tabs_location == .hidden) break :tab_bar; + } else { // In earlier adwaita versions, we need to add the tabbar manually since we do not use // an AdwToolbarView. - const tab_bar = adw.TabBar.new(); - tab_bar.as(gtk.Widget).addCssClass("inline"); + self.tab_bar.as(gtk.Widget).addCssClass("inline"); + switch (self.config.gtk_tabs_location) { .top => box.insertChildAfter( - tab_bar.as(gtk.Widget), + self.tab_bar.as(gtk.Widget), self.headerbar.asWidget(), ), - .bottom => box.append(tab_bar.as(gtk.Widget)), - .hidden => unreachable, + .bottom => box.append(self.tab_bar.as(gtk.Widget)), } - tab_bar.setView(self.notebook.tab_view); - - if (!self.config.gtk_wide_tabs) tab_bar.setExpandTabs(0); } // If we want the window to be maximized, we do that here. @@ -543,6 +539,16 @@ pub fn syncAppearance(self: *Window) !void { } } + self.tab_bar.setExpandTabs(@intFromBool(self.config.gtk_wide_tabs)); + self.tab_bar.setAutohide(switch (self.config.window_show_tab_bar) { + .auto, .never => @intFromBool(true), + .always => @intFromBool(false), + }); + self.tab_bar.as(gtk.Widget).setVisible(switch (self.config.window_show_tab_bar) { + .always, .auto => @intFromBool(true), + .never => @intFromBool(false), + }); + self.winproto.syncAppearance() catch |err| { log.warn("failed to sync winproto appearance error={}", .{err}); }; diff --git a/src/config/Config.zig b/src/config/Config.zig index ca330f8f6..fd6ae798e 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -1410,6 +1410,27 @@ keybind: Keybinds = .{}, /// * `end` - Insert the new tab at the end of the tab list. @"window-new-tab-position": WindowNewTabPosition = .current, +/// Whether to show the tab bar. +/// +/// Valid values: +/// +/// - `always` +/// +/// Always display the tab bar, even when there's only one tab. +/// +/// - `auto` *(default)* +/// +/// Automatically show and hide the tab bar. The tab bar is only +/// shown when there are two or more tabs present. +/// +/// - `never` +/// +/// Never show the tab bar. Tabs are only accessible via the tab +/// overview or by keybind actions. +/// +/// Currently only supported on Linux (GTK). +@"window-show-tab-bar": WindowShowTabBar = .auto, + /// Background color for the window titlebar. This only takes effect if /// window-theme is set to ghostty. Currently only supported in the GTK app /// runtime. @@ -5747,7 +5768,6 @@ pub const GtkSingleInstance = enum { pub const GtkTabsLocation = enum { top, bottom, - hidden, }; /// See gtk-toolbar-style @@ -5795,6 +5815,13 @@ pub const WindowNewTabPosition = enum { end, }; +/// See window-show-tab-bar +pub const WindowShowTabBar = enum { + always, + auto, + never, +}; + /// See resize-overlay pub const ResizeOverlay = enum { always, From ab25600b2dd63d877b3ed56e58f8350dd30dd700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoffer=20T=C3=B8nnessen?= Date: Fri, 23 May 2025 10:46:24 +0200 Subject: [PATCH 002/371] Add new and update Norwegian split translations This change changes the wording on the split pane functionality. The new wording is taken from the macOS terminal app when the whole system is translated to Norwegian. macOS uses "Del opp vindu" and "Lukk delt vindu" for "Split Pane" and "Close Split Pane". So instead of using "split" the verb in question is always "del". Personally I find this translation to be better rooted in Norwegian. When looking at the German translation, which is often a good indicator for Norwegian as well, one can see the same wording being used. --- po/nb_NO.UTF-8.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/po/nb_NO.UTF-8.po b/po/nb_NO.UTF-8.po index ad76eea3d..2685d67bb 100644 --- a/po/nb_NO.UTF-8.po +++ b/po/nb_NO.UTF-8.po @@ -63,25 +63,25 @@ msgstr "Last konfigurasjon på nytt" #: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:38 #: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:50 msgid "Split Up" -msgstr "Splitt opp" +msgstr "Del oppover" #: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:11 #: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:43 #: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:55 msgid "Split Down" -msgstr "Splitt ned" +msgstr "Del nedover" #: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:16 #: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:48 #: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:60 msgid "Split Left" -msgstr "Splitt venstre" +msgstr "Del til venstre" #: src/apprt/gtk/ui/1.0/menu-headerbar-split_menu.blp:21 #: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:53 #: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:65 msgid "Split Right" -msgstr "Splitt høyre" +msgstr "Del til høyre" #: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:6 #: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:6 @@ -107,7 +107,7 @@ msgstr "Nullstill" #: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:30 #: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:42 msgid "Split" -msgstr "Splitt" +msgstr "Del vindu" #: src/apprt/gtk/ui/1.0/menu-surface-context_menu.blp:33 #: src/apprt/gtk/ui/1.0/menu-window-titlebar_menu.blp:45 @@ -218,7 +218,7 @@ msgstr "Se åpne faner" #: src/apprt/gtk/Window.zig:249 msgid "New Split" -msgstr "" +msgstr "Del opp vindu" #: src/apprt/gtk/Window.zig:312 msgid "" @@ -251,7 +251,7 @@ msgstr "Lukk fane?" #: src/apprt/gtk/CloseDialog.zig:90 msgid "Close Split?" -msgstr "Lukk splitt?" +msgstr "Lukk delt vindu?" #: src/apprt/gtk/CloseDialog.zig:96 msgid "All terminal sessions will be terminated." From a8651882a752ecba3d3ad2177d7b288969d4a31d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Sat, 24 May 2025 00:29:53 +0200 Subject: [PATCH 003/371] add cut/copy/paste keys The origin of these keys are old sun keyboards. They are getting picked up by the custom (progammable) keyboard scene (see https://github.com/manna-harbour/miryoku for a popular layout). Support in ghosty is quite handy because it allows to bind copy/paste in a way that doesn't overlap with ctrl-c/ctrl-v, which can have special bindings in some terminal applications. --- include/ghostty.h | 5 +++++ src/apprt/gtk/key.zig | 4 ++++ src/input/key.zig | 8 ++++++++ src/input/keycodes.zig | 3 +++ 4 files changed, 20 insertions(+) diff --git a/include/ghostty.h b/include/ghostty.h index 941223943..950f5ef80 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -292,6 +292,11 @@ typedef enum { GHOSTTY_KEY_AUDIO_VOLUME_MUTE, GHOSTTY_KEY_AUDIO_VOLUME_UP, GHOSTTY_KEY_WAKE_UP, + + // "Legacy, Non-standard, and Special Keys" § 3.7 + GHOSTTY_KEY_COPY, + GHOSTTY_KEY_CUT, + GHOSTTY_KEY_PASTE, } ghostty_input_key_e; typedef struct { diff --git a/src/apprt/gtk/key.zig b/src/apprt/gtk/key.zig index 3dcfaed98..fc3296366 100644 --- a/src/apprt/gtk/key.zig +++ b/src/apprt/gtk/key.zig @@ -388,6 +388,10 @@ const keymap: []const RawEntry = &.{ .{ gdk.KEY_KP_Delete, .numpad_delete }, .{ gdk.KEY_KP_Begin, .numpad_begin }, + .{ gdk.KEY_Copy, .copy }, + .{ gdk.KEY_Cut, .cut }, + .{ gdk.KEY_Paste, .paste }, + .{ gdk.KEY_Shift_L, .shift_left }, .{ gdk.KEY_Control_L, .control_left }, .{ gdk.KEY_Alt_L, .alt_left }, diff --git a/src/input/key.zig b/src/input/key.zig index 9dad37d78..28aa3ccf4 100644 --- a/src/input/key.zig +++ b/src/input/key.zig @@ -454,6 +454,11 @@ pub const Key = enum(c_int) { audio_volume_up, wake_up, + // "Legacy, Non-standard, and Special Keys" § 3.7 + copy, + cut, + paste, + /// Converts an ASCII character to a key, if possible. This returns /// null if the character is unknown. /// @@ -797,6 +802,9 @@ pub const Key = enum(c_int) { .audio_volume_up, .wake_up, .help, + .copy, + .cut, + .paste, => null, .unidentified, diff --git a/src/input/keycodes.zig b/src/input/keycodes.zig index b4004088e..a85f36d31 100644 --- a/src/input/keycodes.zig +++ b/src/input/keycodes.zig @@ -130,6 +130,9 @@ const code_to_key = code_to_key: { .{ "PageUp", .page_up }, .{ "Delete", .delete }, .{ "End", .end }, + .{ "Copy", .copy }, + .{ "Cut", .cut }, + .{ "Paste", .paste }, .{ "PageDown", .page_down }, .{ "ArrowRight", .arrow_right }, .{ "ArrowLeft", .arrow_left }, From b94d2da56745eca0544012aa443ea71a54a195b6 Mon Sep 17 00:00:00 2001 From: mitchellh <1299+mitchellh@users.noreply.github.com> Date: Sun, 25 May 2025 00:15:05 +0000 Subject: [PATCH 004/371] deps: Update iTerm2 color schemes --- build.zig.zon | 4 ++-- build.zig.zon.json | 6 +++--- build.zig.zon.nix | 6 +++--- build.zig.zon.txt | 2 +- flatpak/zig-packages.json | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index 796ce1475..3c6ed95ed 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -103,8 +103,8 @@ // Other .apple_sdk = .{ .path = "./pkg/apple-sdk" }, .iterm2_themes = .{ - .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/f979d8b1959d004390acede9f298be389cb9a1e0.tar.gz", - .hash = "N-V-__8AANf-XQSCQIcmjPV_GQZLPBxaAgzzw_3UWOmkDUXn", + .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz", + .hash = "N-V-__8AAIgLXgT76kRaZJzBE-1ZTXqaSx2jjIvPpIsnL2Gj", .lazy = true, }, }, diff --git a/build.zig.zon.json b/build.zig.zon.json index 68ec4522a..b1d919f3a 100644 --- a/build.zig.zon.json +++ b/build.zig.zon.json @@ -54,10 +54,10 @@ "url": "https://deps.files.ghostty.org/imgui-1220bc6b9daceaf7c8c60f3c3998058045ba0c5c5f48ae255ff97776d9cd8bfc6402.tar.gz", "hash": "sha256-oF/QHgTPEat4Hig4fGIdLkIPHmBEyOJ6JeYD6pnveGA=" }, - "N-V-__8AANf-XQSCQIcmjPV_GQZLPBxaAgzzw_3UWOmkDUXn": { + "N-V-__8AAIgLXgT76kRaZJzBE-1ZTXqaSx2jjIvPpIsnL2Gj": { "name": "iterm2_themes", - "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/f979d8b1959d004390acede9f298be389cb9a1e0.tar.gz", - "hash": "sha256-DKWVUxZEZA8x+3njPaTucr/u/Mmhef0YwhwOnOWn/N4=" + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz", + "hash": "sha256-2AsOCV9RymfDbhFFRdNVE+GYCAmE713tM27TBPKxAW0=" }, "N-V-__8AAJrvXQCqAT8Mg9o_tk6m0yf5Fz-gCNEOKLyTSerD": { "name": "libpng", diff --git a/build.zig.zon.nix b/build.zig.zon.nix index 7c3e08d2d..ce4a656c7 100644 --- a/build.zig.zon.nix +++ b/build.zig.zon.nix @@ -170,11 +170,11 @@ in }; } { - name = "N-V-__8AANf-XQSCQIcmjPV_GQZLPBxaAgzzw_3UWOmkDUXn"; + name = "N-V-__8AAIgLXgT76kRaZJzBE-1ZTXqaSx2jjIvPpIsnL2Gj"; path = fetchZigArtifact { name = "iterm2_themes"; - url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/f979d8b1959d004390acede9f298be389cb9a1e0.tar.gz"; - hash = "sha256-DKWVUxZEZA8x+3njPaTucr/u/Mmhef0YwhwOnOWn/N4="; + url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz"; + hash = "sha256-2AsOCV9RymfDbhFFRdNVE+GYCAmE713tM27TBPKxAW0="; }; } { diff --git a/build.zig.zon.txt b/build.zig.zon.txt index 0c71c80e4..cb8195752 100644 --- a/build.zig.zon.txt +++ b/build.zig.zon.txt @@ -27,7 +27,7 @@ https://deps.files.ghostty.org/ziglyph-b89d43d1e3fb01b6074bc1f7fc980324b04d26a5. https://deps.files.ghostty.org/zlib-1220fed0c74e1019b3ee29edae2051788b080cd96e90d56836eea857b0b966742efb.tar.gz https://github.com/glfw/glfw/archive/e7ea71be039836da3a98cea55ae5569cb5eb885c.tar.gz https://github.com/jcollie/ghostty-gobject/releases/download/0.14.0-2025-03-18-21-1/ghostty-gobject-0.14.0-2025-03-18-21-1.tar.zst -https://github.com/mbadolato/iTerm2-Color-Schemes/archive/f979d8b1959d004390acede9f298be389cb9a1e0.tar.gz +https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz https://github.com/mitchellh/libxev/archive/3df9337a9e84450a58a2c4af434ec1a036f7b494.tar.gz https://github.com/mitchellh/zig-objc/archive/3ab0d37c7d6b933d6ded1b3a35b6b60f05590a98.tar.gz https://github.com/natecraddock/zf/archive/7aacbe6d155d64d15937ca95ca6c014905eb531f.tar.gz diff --git a/flatpak/zig-packages.json b/flatpak/zig-packages.json index 2ee48f269..d56e6d121 100644 --- a/flatpak/zig-packages.json +++ b/flatpak/zig-packages.json @@ -67,9 +67,9 @@ }, { "type": "archive", - "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/f979d8b1959d004390acede9f298be389cb9a1e0.tar.gz", - "dest": "vendor/p/N-V-__8AANf-XQSCQIcmjPV_GQZLPBxaAgzzw_3UWOmkDUXn", - "sha256": "0ca595531644640f31fb79e33da4ee72bfeefcc9a179fd18c21c0e9ce5a7fcde" + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz", + "dest": "vendor/p/N-V-__8AAIgLXgT76kRaZJzBE-1ZTXqaSx2jjIvPpIsnL2Gj", + "sha256": "d80b0e095f51ca67c36e114545d35513e198080984ef5ded336ed304f2b1016d" }, { "type": "archive", From 0415a65083fa64b89b9b2048e1b8d02e1411c2f3 Mon Sep 17 00:00:00 2001 From: alex-huff Date: Sun, 25 May 2025 11:43:40 -0500 Subject: [PATCH 005/371] gtk: improve app id validation 'g_application_id_is_valid' doesn't allow empty elements or elements that start with digits. This commit updates 'isValidAppId' to be more consistant with 'g_application_id_is_valid' avoiding the app id defaulting to 'GTK Application' for app ids like '0foo.bar' or 'foo..bar'. --- src/apprt/gtk/App.zig | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index da828b973..9e5037d5c 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -1690,30 +1690,33 @@ fn initActions(self: *App) void { } fn isValidAppId(app_id: [:0]const u8) bool { - if (app_id.len > 255 or app_id.len == 0) return false; - if (app_id[0] == '.') return false; - if (app_id[app_id.len - 1] == '.') return false; + if (app_id.len > 255) return false; - var hasDot = false; + var hasSep = false; + var lastWasSep = true; for (app_id) |char| { switch (char) { - 'a'...'z', 'A'...'Z', '0'...'9', '_', '-' => {}, - '.' => hasDot = true, + 'a'...'z', 'A'...'Z', '_', '-' => {}, + '0'...'9', '.' => if (lastWasSep) return false, else => return false, } + lastWasSep = char == '.'; + hasSep = hasSep or lastWasSep; } - if (!hasDot) return false; - - return true; + return hasSep and !lastWasSep; } test "isValidAppId" { try testing.expect(isValidAppId("foo.bar")); try testing.expect(isValidAppId("foo.bar.baz")); + try testing.expect(isValidAppId("f00.bar")); + try testing.expect(isValidAppId("foo-bar._baz")); try testing.expect(!isValidAppId("foo")); try testing.expect(!isValidAppId("foo.bar?")); try testing.expect(!isValidAppId("foo.")); try testing.expect(!isValidAppId(".foo")); try testing.expect(!isValidAppId("")); try testing.expect(!isValidAppId("foo" ** 86)); + try testing.expect(!isValidAppId("foo..bar")); + try testing.expect(!isValidAppId("0foo.bar")); } From 113c196078bc21c0dfd6d15d04203a255839a091 Mon Sep 17 00:00:00 2001 From: alex-huff Date: Sun, 25 May 2025 13:20:29 -0500 Subject: [PATCH 006/371] gtk: use 'gio.Application.idIsValid' instead of 'isValidAppId' --- src/apprt/gtk/App.zig | 34 +--------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 9e5037d5c..55c0be5e0 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -288,7 +288,7 @@ pub fn init(core_app: *CoreApp, opts: Options) !App { // can develop Ghostty in Ghostty. const app_id: [:0]const u8 = app_id: { if (config.class) |class| { - if (isValidAppId(class)) { + if (gio.Application.idIsValid(class) != 0) { break :app_id class; } else { log.warn("invalid 'class' in config, ignoring", .{}); @@ -1688,35 +1688,3 @@ fn initActions(self: *App) void { action_map.addAction(action.as(gio.Action)); } } - -fn isValidAppId(app_id: [:0]const u8) bool { - if (app_id.len > 255) return false; - - var hasSep = false; - var lastWasSep = true; - for (app_id) |char| { - switch (char) { - 'a'...'z', 'A'...'Z', '_', '-' => {}, - '0'...'9', '.' => if (lastWasSep) return false, - else => return false, - } - lastWasSep = char == '.'; - hasSep = hasSep or lastWasSep; - } - return hasSep and !lastWasSep; -} - -test "isValidAppId" { - try testing.expect(isValidAppId("foo.bar")); - try testing.expect(isValidAppId("foo.bar.baz")); - try testing.expect(isValidAppId("f00.bar")); - try testing.expect(isValidAppId("foo-bar._baz")); - try testing.expect(!isValidAppId("foo")); - try testing.expect(!isValidAppId("foo.bar?")); - try testing.expect(!isValidAppId("foo.")); - try testing.expect(!isValidAppId(".foo")); - try testing.expect(!isValidAppId("")); - try testing.expect(!isValidAppId("foo" ** 86)); - try testing.expect(!isValidAppId("foo..bar")); - try testing.expect(!isValidAppId("0foo.bar")); -} From 19db2e2755c9abb4946fbb2dbadea85516703138 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Sun, 25 May 2025 22:25:23 -0600 Subject: [PATCH 007/371] CircBuf: non-allocating rotateToZero We can call `std.mem.rotate` for this. --- src/datastruct/circ_buf.zig | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/src/datastruct/circ_buf.zig b/src/datastruct/circ_buf.zig index 065bf6a1d..646a00940 100644 --- a/src/datastruct/circ_buf.zig +++ b/src/datastruct/circ_buf.zig @@ -152,7 +152,7 @@ pub fn CircBuf(comptime T: type, comptime default: T) type { /// If larger, new values will be set to the default value. pub fn resize(self: *Self, alloc: Allocator, size: usize) Allocator.Error!void { // Rotate to zero so it is aligned. - try self.rotateToZero(alloc); + try self.rotateToZero(); // Reallocate, this adds to the end so we're ready to go. const prev_len = self.len(); @@ -173,29 +173,16 @@ pub fn CircBuf(comptime T: type, comptime default: T) type { } /// Rotate the data so that it is zero-aligned. - fn rotateToZero(self: *Self, alloc: Allocator) Allocator.Error!void { - // TODO: this does this in the worst possible way by allocating. - // rewrite to not allocate, its possible, I'm just lazy right now. - + fn rotateToZero(self: *Self) Allocator.Error!void { // If we're already at zero then do nothing. if (self.tail == 0) return; - var buf = try alloc.alloc(T, self.storage.len); - defer { - self.head = if (self.full) 0 else self.len(); - self.tail = 0; - alloc.free(self.storage); - self.storage = buf; - } + // We use std.mem.rotate to rotate our storage in-place. + std.mem.rotate(T, self.storage, self.tail); - if (!self.full and self.head >= self.tail) { - fastmem.copy(T, buf, self.storage[self.tail..self.head]); - return; - } - - const middle = self.storage.len - self.tail; - fastmem.copy(T, buf, self.storage[self.tail..]); - fastmem.copy(T, buf[middle..], self.storage[0..self.head]); + // Then fix up our head and tail. + self.head = self.len() % self.storage.len; + self.tail = 0; } /// Returns if the buffer is currently empty. To check if its @@ -589,7 +576,7 @@ test "CircBuf rotateToZero" { defer buf.deinit(alloc); _ = buf.getPtrSlice(0, 11); - try buf.rotateToZero(alloc); + try buf.rotateToZero(); } test "CircBuf rotateToZero offset" { @@ -611,7 +598,7 @@ test "CircBuf rotateToZero offset" { try testing.expect(buf.tail > 0 and buf.head >= buf.tail); // Rotate to zero - try buf.rotateToZero(alloc); + try buf.rotateToZero(); try testing.expectEqual(@as(usize, 0), buf.tail); try testing.expectEqual(@as(usize, 1), buf.head); } @@ -645,7 +632,7 @@ test "CircBuf rotateToZero wraps" { } // Rotate to zero - try buf.rotateToZero(alloc); + try buf.rotateToZero(); try testing.expectEqual(@as(usize, 0), buf.tail); try testing.expectEqual(@as(usize, 3), buf.head); { @@ -681,7 +668,7 @@ test "CircBuf rotateToZero full no wrap" { } // Rotate to zero - try buf.rotateToZero(alloc); + try buf.rotateToZero(); try testing.expect(buf.full); try testing.expectEqual(@as(usize, 0), buf.tail); try testing.expectEqual(@as(usize, 0), buf.head); From 25a708ed9831083db9555da16137df7d98c38de3 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Sun, 25 May 2025 22:51:14 -0600 Subject: [PATCH 008/371] terminal/style: compare packed styles directly, no cast needed Woohoo, Zig 0.14! --- src/terminal/style.zig | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/terminal/style.zig b/src/terminal/style.zig index 7f176561b..34b07772a 100644 --- a/src/terminal/style.zig +++ b/src/terminal/style.zig @@ -87,10 +87,9 @@ pub const Style = struct { /// True if the style is equal to another style. pub fn eql(self: Style, other: Style) bool { - const packed_self = PackedStyle.fromStyle(self); - const packed_other = PackedStyle.fromStyle(other); - // TODO: in Zig 0.14, equating packed structs is allowed. Remove this work around. - return @as(u128, @bitCast(packed_self)) == @as(u128, @bitCast(packed_other)); + // We convert the styles to packed structs and compare as integers + // because this is much faster than comparing each field separately. + return PackedStyle.fromStyle(self) == PackedStyle.fromStyle(other); } /// Returns the bg color for a cell with this style given the cell From 98309e3226dd7589b70bc974cd6ba6efd60954c8 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 26 May 2025 10:47:43 -0500 Subject: [PATCH 009/371] nix: update to Nix 25.05 and Zig 0.14.1 Update to Nix 25.05 which gets us GTK 4.18, libadwaita 1.7, and Zig 0.14.1. Since Nix updated to Zig 0.14.1, the devshell has been switched to Zig 0.14.1 from zig-overlay as well. Fixes #7305 --- flake.lock | 54 +++++++++++++++++------------------------------------- flake.nix | 42 +++++++++++++++++------------------------- 2 files changed, 34 insertions(+), 62 deletions(-) diff --git a/flake.lock b/flake.lock index df09a9666..4b8ce405c 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1733328505, - "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", "owner": "edolstra", "repo": "flake-compat", - "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", "type": "github" }, "original": { @@ -34,44 +34,24 @@ "type": "github" } }, - "nixpkgs-stable": { + "nixpkgs": { "locked": { - "lastModified": 1741992157, - "narHash": "sha256-nlIfTsTrMSksEJc1f7YexXiPVuzD1gOfeN1ggwZyUoc=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "da4b122f63095ca1199bd4d526f9e26426697689", - "type": "github" + "lastModified": 1748189127, + "narHash": "sha256-zRDR+EbbeObu4V2X5QCd2Bk5eltfDlCr5yvhBwUT6pY=", + "rev": "7c43f080a7f28b2774f3b3f43234ca11661bf334", + "type": "tarball", + "url": "https://releases.nixos.org/nixos/25.05/nixos-25.05.802491.7c43f080a7f2/nixexprs.tar.xz" }, "original": { - "owner": "nixos", - "ref": "release-24.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-unstable": { - "locked": { - "lastModified": 1741865919, - "narHash": "sha256-4thdbnP6dlbdq+qZWTsm4ffAwoS8Tiq1YResB+RP6WE=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "573c650e8a14b2faa0041645ab18aed7e60f0c9a", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" + "type": "tarball", + "url": "https://channels.nixos.org/nixos-25.05/nixexprs.tar.xz" } }, "root": { "inputs": { "flake-compat": "flake-compat", "flake-utils": "flake-utils", - "nixpkgs-stable": "nixpkgs-stable", - "nixpkgs-unstable": "nixpkgs-unstable", + "nixpkgs": "nixpkgs", "zig": "zig", "zon2nix": "zon2nix" } @@ -98,15 +78,15 @@ "flake-utils" ], "nixpkgs": [ - "nixpkgs-stable" + "nixpkgs" ] }, "locked": { - "lastModified": 1741825901, - "narHash": "sha256-aeopo+aXg5I2IksOPFN79usw7AeimH1+tjfuMzJHFdk=", + "lastModified": 1748261582, + "narHash": "sha256-3i0IL3s18hdDlbsf0/E+5kyPRkZwGPbSFngq5eToiAA=", "owner": "mitchellh", "repo": "zig-overlay", - "rev": "0b14285e283f5a747f372fb2931835dd937c4383", + "rev": "aafb1b093fb838f7a02613b719e85ec912914221", "type": "github" }, "original": { @@ -121,7 +101,7 @@ "flake-utils" ], "nixpkgs": [ - "nixpkgs-unstable" + "nixpkgs" ] }, "locked": { diff --git a/flake.nix b/flake.nix index d4c6aa6ca..6794afb11 100644 --- a/flake.nix +++ b/flake.nix @@ -2,12 +2,10 @@ description = "👻"; inputs = { - nixpkgs-unstable.url = "github:nixos/nixpkgs/nixpkgs-unstable"; - # We want to stay as up to date as possible but need to be careful that the # glibc versions used by our dependencies from Nix are compatible with the # system glibc that the user is building for. - nixpkgs-stable.url = "github:nixos/nixpkgs/release-24.11"; + nixpkgs.url = "https://channels.nixos.org/nixos-25.05/nixexprs.tar.xz"; flake-utils.url = "github:numtide/flake-utils"; # Used for shell.nix @@ -19,7 +17,7 @@ zig = { url = "github:mitchellh/zig-overlay"; inputs = { - nixpkgs.follows = "nixpkgs-stable"; + nixpkgs.follows = "nixpkgs"; flake-utils.follows = "flake-utils"; flake-compat.follows = ""; }; @@ -28,7 +26,7 @@ zon2nix = { url = "github:jcollie/zon2nix?ref=56c159be489cc6c0e73c3930bd908ddc6fe89613"; inputs = { - nixpkgs.follows = "nixpkgs-unstable"; + nixpkgs.follows = "nixpkgs"; flake-utils.follows = "flake-utils"; }; }; @@ -36,24 +34,19 @@ outputs = { self, - nixpkgs-unstable, - nixpkgs-stable, + nixpkgs, zig, zon2nix, ... }: - builtins.foldl' nixpkgs-stable.lib.recursiveUpdate {} ( + builtins.foldl' nixpkgs.lib.recursiveUpdate {} ( builtins.map ( system: let - pkgs-stable = nixpkgs-stable.legacyPackages.${system}; - pkgs-unstable = nixpkgs-unstable.legacyPackages.${system}; + pkgs = nixpkgs.legacyPackages.${system}; in { - devShell.${system} = pkgs-stable.callPackage ./nix/devShell.nix { - zig = zig.packages.${system}."0.14.0"; - wraptest = pkgs-stable.callPackage ./nix/wraptest.nix {}; - uv = pkgs-unstable.uv; - # remove once blueprint-compiler 0.16.0 is in the stable nixpkgs - blueprint-compiler = pkgs-unstable.blueprint-compiler; + devShell.${system} = pkgs.callPackage ./nix/devShell.nix { + zig = zig.packages.${system}."0.14.1"; + wraptest = pkgs.callPackage ./nix/wraptest.nix {}; zon2nix = zon2nix; }; @@ -64,30 +57,29 @@ revision = self.shortRev or self.dirtyShortRev or "dirty"; }; in rec { - deps = pkgs-unstable.callPackage ./build.zig.zon.nix {}; - ghostty-debug = pkgs-unstable.callPackage ./nix/package.nix (mkArgs "Debug"); - ghostty-releasesafe = pkgs-unstable.callPackage ./nix/package.nix (mkArgs "ReleaseSafe"); - ghostty-releasefast = pkgs-unstable.callPackage ./nix/package.nix (mkArgs "ReleaseFast"); + deps = pkgs.callPackage ./build.zig.zon.nix {}; + ghostty-debug = pkgs.callPackage ./nix/package.nix (mkArgs "Debug"); + ghostty-releasesafe = pkgs.callPackage ./nix/package.nix (mkArgs "ReleaseSafe"); + ghostty-releasefast = pkgs.callPackage ./nix/package.nix (mkArgs "ReleaseFast"); ghostty = ghostty-releasefast; default = ghostty; }; - formatter.${system} = pkgs-stable.alejandra; + formatter.${system} = pkgs.alejandra; apps.${system} = let runVM = ( module: let vm = import ./nix/vm/create.nix { - inherit system module; - nixpkgs = nixpkgs-unstable; + inherit system module nixpkgs; overlay = self.overlays.debug; }; - program = pkgs-unstable.writeShellScript "run-ghostty-vm" '' + program = pkgs.writeShellScript "run-ghostty-vm" '' SHARED_DIR=$(pwd) export SHARED_DIR - ${pkgs-unstable.lib.getExe vm.config.system.build.vm} "$@" + ${pkgs.lib.getExe vm.config.system.build.vm} "$@" ''; in { type = "app"; From 48b6807ac979324292c8d36aa837b7352da627ba Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 26 May 2025 11:12:30 -0500 Subject: [PATCH 010/371] nix: fix typos --- macos/Sources/Ghostty/Ghostty.App.swift | 4 ++-- typos.toml | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/macos/Sources/Ghostty/Ghostty.App.swift b/macos/Sources/Ghostty/Ghostty.App.swift index 6736449a4..d8fdaa3ec 100644 --- a/macos/Sources/Ghostty/Ghostty.App.swift +++ b/macos/Sources/Ghostty/Ghostty.App.swift @@ -745,7 +745,7 @@ extension Ghostty { guard let surface = target.target.surface else { return } guard let surfaceView = self.surfaceView(from: surface) else { return } guard let mode = FullscreenMode.from(ghostty: raw) else { - Ghostty.logger.warning("unknow fullscreen mode raw=\(raw.rawValue)") + Ghostty.logger.warning("unknown fullscreen mode raw=\(raw.rawValue)") return } NotificationCenter.default.post( @@ -1082,7 +1082,7 @@ extension Ghostty { guard let surface = target.target.surface else { return } guard let surfaceView = self.surfaceView(from: surface) else { return } guard let window = surfaceView.window as? TerminalWindow else { return } - + switch (mode) { case .on: window.level = .floating diff --git a/typos.toml b/typos.toml index 4f4bf7ee7..fafc38858 100644 --- a/typos.toml +++ b/typos.toml @@ -49,6 +49,8 @@ grey = "gray" greyscale = "grayscale" DECID = "DECID" flate = "flate" +typ = "typ" +kend = "kend" [type.po] extend-glob = ["*.po"] From 695e0b3e5780919a6549c827bb282c1a8d516253 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 26 May 2025 11:43:52 -0500 Subject: [PATCH 011/371] nix: temporarily remove snapcraft from the devshell --- nix/devShell.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nix/devShell.nix b/nix/devShell.nix index b87c23dd1..f4ea62235 100644 --- a/nix/devShell.nix +++ b/nix/devShell.nix @@ -16,7 +16,7 @@ python3, qemu, scdoc, - snapcraft, + # snapcraft, valgrind, #, vulkan-loader # unused vttest, @@ -134,7 +134,7 @@ in appstream flatpak-builder gdb - snapcraft + # snapcraft valgrind wraptest From 2905b4727980b8d1109f333e0d78db7674eb0e48 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Mon, 26 May 2025 19:39:39 -0600 Subject: [PATCH 012/371] font: use labeled switch continue pattern for feature string parser In this case it does result in a little repeated code for reading bytes, but I find the control flow easier to follow, so it's worth it IMO. --- src/font/shaper/feature.zig | 300 ++++++++++++++++-------------------- 1 file changed, 133 insertions(+), 167 deletions(-) diff --git a/src/font/shaper/feature.zig b/src/font/shaper/feature.zig index 8e70d51da..c2d49234d 100644 --- a/src/font/shaper/feature.zig +++ b/src/font/shaper/feature.zig @@ -35,190 +35,156 @@ pub const Feature = struct { /// /// Ref: https://harfbuzz.github.io/harfbuzz-hb-common.html#hb-feature-from-string pub fn fromReader(reader: anytype) ?Feature { - var tag: [4]u8 = undefined; + var tag_buf: [4]u8 = undefined; + var tag: []u8 = tag_buf[0..0]; var value: ?u32 = null; - // TODO: when we move to Zig 0.14 this can be replaced with a - // labeled switch continue pattern rather than this loop. - var state: union(enum) { + state: switch ((enum { /// Initial state. - start: void, - /// Parsing the tag, data is index. - tag: u2, + start, + /// Parsing the tag. + tag, /// In the space between the tag and the value. - space: void, + space, /// Parsing an integer parameter directly in to `value`. - int: void, + int, /// Parsing a boolean keyword parameter ("on"/"off"). - bool: void, + bool, /// Encountered an unrecoverable syntax error, advancing to boundary. - err: void, - /// Done parsing feature. - done: void, - } = .start; - while (true) { - // If we hit the end of the stream we just pretend it's a comma. - const byte = reader.readByte() catch ','; - switch (state) { - // If we're done then we skip whitespace until we see a ','. - .done => switch (byte) { - ' ', '\t' => continue, - ',' => break, - // If we see something other than whitespace or a ',' - // then this is an error since the intent is unclear. - else => { - state = .err; - continue; - }, + err, + /// Done parsing feature, skip whitespace until end. + done, + }).start) { + // If we're done then we skip whitespace until we see a ','. + .done => while (true) switch (reader.readByte() catch ',') { + ' ', '\t' => continue, + ',' => break, + // If we see something other than whitespace or a ',' + // then this is an error since the intent is unclear. + else => continue :state .err, + }, + + // If we're fast-forwarding from an error we just wanna + // stop at the first boundary and ignore all other bytes. + .err => { + reader.skipUntilDelimiterOrEof(',') catch {}; + return null; + }, + + .start => while (true) switch (reader.readByte() catch ',') { + // Ignore leading whitespace. + ' ', '\t' => continue, + // Empty feature string. + ',' => return null, + // '+' prefix to explicitly enable feature. + '+' => { + value = 1; + continue :state .tag; }, + // '-' prefix to explicitly disable feature. + '-' => { + value = 0; + continue :state .tag; + }, + // Quote mark introducing a tag. + '"', '\'' => { + continue :state .tag; + }, + // First letter of tag. + else => |byte| { + tag.len = 1; + tag[0] = byte; + continue :state .tag; + }, + }, - // If we're fast-forwarding from an error we just wanna - // stop at the first boundary and ignore all other bytes. - .err => if (byte == ',') return null, + .tag => while (true) switch (reader.readByte() catch ',') { + // If the tag is interrupted by a comma it's invalid. + ',' => return null, + // Ignore quote marks. This does technically ignore cases like + // "'k'e'r'n' = 0", but it's unambiguous so if someone really + // wants to do that in their config then... sure why not. + '"', '\'' => continue, + // In all other cases we add the byte to our tag. + else => |byte| { + tag.len += 1; + tag[tag.len - 1] = byte; + if (tag.len == 4) continue :state .space; + }, + }, - .start => switch (byte) { - // Ignore leading whitespace. - ' ', '\t' => continue, - // Empty feature string. - ',' => return null, - // '+' prefix to explicitly enable feature. - '+' => { - value = 1; - state = .{ .tag = 0 }; - continue; - }, - // '-' prefix to explicitly disable feature. - '-' => { + .space => while (true) switch (reader.readByte() catch ',') { + ' ', '\t' => continue, + // Ignore quote marks since we might have a + // closing quote from the tag still ahead. + '"', '\'' => continue, + // Allow an '=' (which we can safely ignore) + // only if we don't already have a value due + // to a '+' or '-' prefix. + '=' => if (value != null) continue :state .err, + ',' => { + // Specifying only a tag turns a feature on. + if (value == null) value = 1; + break; + }, + '0'...'9' => |byte| { + // If we already have value because of a + // '+' or '-' prefix then this is an error. + if (value != null) continue :state .err; + value = byte - '0'; + continue :state .int; + }, + 'o', 'O' => { + // If we already have value because of a + // '+' or '-' prefix then this is an error. + if (value != null) continue :state .err; + continue :state .bool; + }, + else => continue :state .err, + }, + + .int => while (true) switch (reader.readByte() catch ',') { + ',' => break, + '0'...'9' => |byte| { + // If our value gets too big while + // parsing we consider it an error. + value = std.math.mul(u32, value.?, 10) catch { + continue :state .err; + }; + value.? += byte - '0'; + }, + else => continue :state .err, + }, + + .bool => while (true) switch (reader.readByte() catch ',') { + ',' => return null, + 'n', 'N' => { + // "ofn" + if (value != null) { + assert(value == 0); + continue :state .err; + } + value = 1; + continue :state .done; + }, + 'f', 'F' => { + // To make sure we consume two 'f's. + if (value == null) { value = 0; - state = .{ .tag = 0 }; - continue; - }, - // Quote mark introducing a tag. - '"', '\'' => { - state = .{ .tag = 0 }; - continue; - }, - // First letter of tag. - else => { - tag[0] = byte; - state = .{ .tag = 1 }; - continue; - }, + } else { + assert(value == 0); + continue :state .done; + } }, - - .tag => |*i| switch (byte) { - // If the tag is interrupted by a comma it's invalid. - ',' => return null, - // Ignore quote marks. - '"', '\'' => continue, - // A prefix of '+' or '-' - // In all other cases we add the byte to our tag. - else => { - tag[i.*] = byte; - if (i.* == 3) { - state = .space; - continue; - } - i.* += 1; - }, - }, - - .space => switch (byte) { - ' ', '\t' => continue, - // Ignore quote marks since we might have a - // closing quote from the tag still ahead. - '"', '\'' => continue, - // Allow an '=' (which we can safely ignore) - // only if we don't already have a value due - // to a '+' or '-' prefix. - '=' => if (value != null) { - state = .err; - continue; - }, - ',' => { - // Specifying only a tag turns a feature on. - if (value == null) value = 1; - break; - }, - '0'...'9' => { - // If we already have value because of a - // '+' or '-' prefix then this is an error. - if (value != null) { - state = .err; - continue; - } - value = byte - '0'; - state = .int; - continue; - }, - 'o', 'O' => { - // If we already have value because of a - // '+' or '-' prefix then this is an error. - if (value != null) { - state = .err; - continue; - } - state = .bool; - continue; - }, - else => { - state = .err; - continue; - }, - }, - - .int => switch (byte) { - ',' => break, - '0'...'9' => { - // If our value gets too big while - // parsing we consider it an error. - value = std.math.mul(u32, value.?, 10) catch { - state = .err; - continue; - }; - value.? += byte - '0'; - }, - else => { - state = .err; - continue; - }, - }, - - .bool => switch (byte) { - ',' => return null, - 'n', 'N' => { - // "ofn" - if (value != null) { - assert(value == 0); - state = .err; - continue; - } - value = 1; - state = .done; - continue; - }, - 'f', 'F' => { - // To make sure we consume two 'f's. - if (value == null) { - value = 0; - } else { - assert(value == 0); - state = .done; - continue; - } - }, - else => { - state = .err; - continue; - }, - }, - } + else => continue :state .err, + }, } assert(value != null); + assert(tag.len == 4); return .{ - .tag = tag, + .tag = tag_buf, .value = value.?, }; } From 2fe2ccdbde58557f17ba1787551dfb0666b6a147 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Mon, 26 May 2025 19:56:35 -0600 Subject: [PATCH 013/371] font/sprite: use decl literals in box drawing code Cleaner and less visual noise, easy change to make, there are many other areas in the code which would benefit from decl literals as well, but this is an area that benefits a lot from them and is self-contained. --- src/font/sprite/Box.zig | 310 ++++++++++++++++++++-------------------- 1 file changed, 155 insertions(+), 155 deletions(-) diff --git a/src/font/sprite/Box.zig b/src/font/sprite/Box.zig index 68acdabe5..b1ebfe3a9 100644 --- a/src/font/sprite/Box.zig +++ b/src/font/sprite/Box.zig @@ -516,40 +516,40 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void 0x257f => self.draw_lines(canvas, .{ .up = .heavy, .down = .light }), // '▀' UPPER HALF BLOCK - 0x2580 => self.draw_block(canvas, Alignment.upper, 1, half), + 0x2580 => self.draw_block(canvas, .upper, 1, half), // '▁' LOWER ONE EIGHTH BLOCK - 0x2581 => self.draw_block(canvas, Alignment.lower, 1, one_eighth), + 0x2581 => self.draw_block(canvas, .lower, 1, one_eighth), // '▂' LOWER ONE QUARTER BLOCK - 0x2582 => self.draw_block(canvas, Alignment.lower, 1, one_quarter), + 0x2582 => self.draw_block(canvas, .lower, 1, one_quarter), // '▃' LOWER THREE EIGHTHS BLOCK - 0x2583 => self.draw_block(canvas, Alignment.lower, 1, three_eighths), + 0x2583 => self.draw_block(canvas, .lower, 1, three_eighths), // '▄' LOWER HALF BLOCK - 0x2584 => self.draw_block(canvas, Alignment.lower, 1, half), + 0x2584 => self.draw_block(canvas, .lower, 1, half), // '▅' LOWER FIVE EIGHTHS BLOCK - 0x2585 => self.draw_block(canvas, Alignment.lower, 1, five_eighths), + 0x2585 => self.draw_block(canvas, .lower, 1, five_eighths), // '▆' LOWER THREE QUARTERS BLOCK - 0x2586 => self.draw_block(canvas, Alignment.lower, 1, three_quarters), + 0x2586 => self.draw_block(canvas, .lower, 1, three_quarters), // '▇' LOWER SEVEN EIGHTHS BLOCK - 0x2587 => self.draw_block(canvas, Alignment.lower, 1, seven_eighths), + 0x2587 => self.draw_block(canvas, .lower, 1, seven_eighths), // '█' FULL BLOCK 0x2588 => self.draw_full_block(canvas), // '▉' LEFT SEVEN EIGHTHS BLOCK - 0x2589 => self.draw_block(canvas, Alignment.left, seven_eighths, 1), + 0x2589 => self.draw_block(canvas, .left, seven_eighths, 1), // '▊' LEFT THREE QUARTERS BLOCK - 0x258a => self.draw_block(canvas, Alignment.left, three_quarters, 1), + 0x258a => self.draw_block(canvas, .left, three_quarters, 1), // '▋' LEFT FIVE EIGHTHS BLOCK - 0x258b => self.draw_block(canvas, Alignment.left, five_eighths, 1), + 0x258b => self.draw_block(canvas, .left, five_eighths, 1), // '▌' LEFT HALF BLOCK - 0x258c => self.draw_block(canvas, Alignment.left, half, 1), + 0x258c => self.draw_block(canvas, .left, half, 1), // '▍' LEFT THREE EIGHTHS BLOCK - 0x258d => self.draw_block(canvas, Alignment.left, three_eighths, 1), + 0x258d => self.draw_block(canvas, .left, three_eighths, 1), // '▎' LEFT ONE QUARTER BLOCK - 0x258e => self.draw_block(canvas, Alignment.left, one_quarter, 1), + 0x258e => self.draw_block(canvas, .left, one_quarter, 1), // '▏' LEFT ONE EIGHTH BLOCK - 0x258f => self.draw_block(canvas, Alignment.left, one_eighth, 1), + 0x258f => self.draw_block(canvas, .left, one_eighth, 1), // '▐' RIGHT HALF BLOCK - 0x2590 => self.draw_block(canvas, Alignment.right, half, 1), + 0x2590 => self.draw_block(canvas, .right, half, 1), // '░' 0x2591 => self.draw_light_shade(canvas), // '▒' @@ -557,9 +557,9 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void // '▓' 0x2593 => self.draw_dark_shade(canvas), // '▔' UPPER ONE EIGHTH BLOCK - 0x2594 => self.draw_block(canvas, Alignment.upper, 1, one_eighth), + 0x2594 => self.draw_block(canvas, .upper, 1, one_eighth), // '▕' RIGHT ONE EIGHTH BLOCK - 0x2595 => self.draw_block(canvas, Alignment.right, one_eighth, 1), + 0x2595 => self.draw_block(canvas, .right, one_eighth, 1), // '▖' 0x2596 => self.draw_quadrant(canvas, .{ .bl = true }), // '▗' @@ -588,35 +588,35 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void octant_min...octant_max => self.draw_octant(canvas, cp), // '🬼' - 0x1fb3c => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb3c => try self.draw_smooth_mosaic(canvas, .from( \\... \\... \\#.. \\##. )), // '🬽' - 0x1fb3d => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb3d => try self.draw_smooth_mosaic(canvas, .from( \\... \\... \\#\. \\### )), // '🬾' - 0x1fb3e => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb3e => try self.draw_smooth_mosaic(canvas, .from( \\... \\#.. \\#\. \\##. )), // '🬿' - 0x1fb3f => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb3f => try self.draw_smooth_mosaic(canvas, .from( \\... \\#.. \\##. \\### )), // '🭀' - 0x1fb40 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb40 => try self.draw_smooth_mosaic(canvas, .from( \\#.. \\#.. \\##. @@ -624,42 +624,42 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void )), // '🭁' - 0x1fb41 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb41 => try self.draw_smooth_mosaic(canvas, .from( \\/## \\### \\### \\### )), // '🭂' - 0x1fb42 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb42 => try self.draw_smooth_mosaic(canvas, .from( \\./# \\### \\### \\### )), // '🭃' - 0x1fb43 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb43 => try self.draw_smooth_mosaic(canvas, .from( \\.## \\.## \\### \\### )), // '🭄' - 0x1fb44 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb44 => try self.draw_smooth_mosaic(canvas, .from( \\..# \\.## \\### \\### )), // '🭅' - 0x1fb45 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb45 => try self.draw_smooth_mosaic(canvas, .from( \\.## \\.## \\.## \\### )), // '🭆' - 0x1fb46 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb46 => try self.draw_smooth_mosaic(canvas, .from( \\... \\./# \\### @@ -667,35 +667,35 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void )), // '🭇' - 0x1fb47 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb47 => try self.draw_smooth_mosaic(canvas, .from( \\... \\... \\..# \\.## )), // '🭈' - 0x1fb48 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb48 => try self.draw_smooth_mosaic(canvas, .from( \\... \\... \\./# \\### )), // '🭉' - 0x1fb49 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb49 => try self.draw_smooth_mosaic(canvas, .from( \\... \\..# \\./# \\.## )), // '🭊' - 0x1fb4a => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb4a => try self.draw_smooth_mosaic(canvas, .from( \\... \\..# \\.## \\### )), // '🭋' - 0x1fb4b => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb4b => try self.draw_smooth_mosaic(canvas, .from( \\..# \\..# \\.## @@ -703,42 +703,42 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void )), // '🭌' - 0x1fb4c => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb4c => try self.draw_smooth_mosaic(canvas, .from( \\##\ \\### \\### \\### )), // '🭍' - 0x1fb4d => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb4d => try self.draw_smooth_mosaic(canvas, .from( \\#\. \\### \\### \\### )), // '🭎' - 0x1fb4e => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb4e => try self.draw_smooth_mosaic(canvas, .from( \\##. \\##. \\### \\### )), // '🭏' - 0x1fb4f => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb4f => try self.draw_smooth_mosaic(canvas, .from( \\#.. \\##. \\### \\### )), // '🭐' - 0x1fb50 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb50 => try self.draw_smooth_mosaic(canvas, .from( \\##. \\##. \\##. \\### )), // '🭑' - 0x1fb51 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb51 => try self.draw_smooth_mosaic(canvas, .from( \\... \\#\. \\### @@ -746,35 +746,35 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void )), // '🭒' - 0x1fb52 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb52 => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\### \\\## )), // '🭓' - 0x1fb53 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb53 => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\### \\.\# )), // '🭔' - 0x1fb54 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb54 => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\.## \\.## )), // '🭕' - 0x1fb55 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb55 => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\.## \\..# )), // '🭖' - 0x1fb56 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb56 => try self.draw_smooth_mosaic(canvas, .from( \\### \\.## \\.## @@ -782,35 +782,35 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void )), // '🭗' - 0x1fb57 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb57 => try self.draw_smooth_mosaic(canvas, .from( \\##. \\#.. \\... \\... )), // '🭘' - 0x1fb58 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb58 => try self.draw_smooth_mosaic(canvas, .from( \\### \\#/. \\... \\... )), // '🭙' - 0x1fb59 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb59 => try self.draw_smooth_mosaic(canvas, .from( \\##. \\#/. \\#.. \\... )), // '🭚' - 0x1fb5a => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb5a => try self.draw_smooth_mosaic(canvas, .from( \\### \\##. \\#.. \\... )), // '🭛' - 0x1fb5b => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb5b => try self.draw_smooth_mosaic(canvas, .from( \\##. \\##. \\#.. @@ -818,42 +818,42 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void )), // '🭜' - 0x1fb5c => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb5c => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\#/. \\... )), // '🭝' - 0x1fb5d => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb5d => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\### \\##/ )), // '🭞' - 0x1fb5e => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb5e => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\### \\#/. )), // '🭟' - 0x1fb5f => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb5f => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\##. \\##. )), // '🭠' - 0x1fb60 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb60 => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\##. \\#.. )), // '🭡' - 0x1fb61 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb61 => try self.draw_smooth_mosaic(canvas, .from( \\### \\##. \\##. @@ -861,42 +861,42 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void )), // '🭢' - 0x1fb62 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb62 => try self.draw_smooth_mosaic(canvas, .from( \\.## \\..# \\... \\... )), // '🭣' - 0x1fb63 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb63 => try self.draw_smooth_mosaic(canvas, .from( \\### \\.\# \\... \\... )), // '🭤' - 0x1fb64 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb64 => try self.draw_smooth_mosaic(canvas, .from( \\.## \\.\# \\..# \\... )), // '🭥' - 0x1fb65 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb65 => try self.draw_smooth_mosaic(canvas, .from( \\### \\.## \\..# \\... )), // '🭦' - 0x1fb66 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb66 => try self.draw_smooth_mosaic(canvas, .from( \\.## \\.## \\..# \\..# )), // '🭧' - 0x1fb67 => try self.draw_smooth_mosaic(canvas, SmoothMosaic.from( + 0x1fb67 => try self.draw_smooth_mosaic(canvas, .from( \\### \\### \\.\# @@ -959,79 +959,79 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void 0x1fb7b => self.draw_horizontal_one_eighth_block_n(canvas, 6), // '🮂' UPPER ONE QUARTER BLOCK - 0x1fb82 => self.draw_block(canvas, Alignment.upper, 1, one_quarter), + 0x1fb82 => self.draw_block(canvas, .upper, 1, one_quarter), // '🮃' UPPER THREE EIGHTHS BLOCK - 0x1fb83 => self.draw_block(canvas, Alignment.upper, 1, three_eighths), + 0x1fb83 => self.draw_block(canvas, .upper, 1, three_eighths), // '🮄' UPPER FIVE EIGHTHS BLOCK - 0x1fb84 => self.draw_block(canvas, Alignment.upper, 1, five_eighths), + 0x1fb84 => self.draw_block(canvas, .upper, 1, five_eighths), // '🮅' UPPER THREE QUARTERS BLOCK - 0x1fb85 => self.draw_block(canvas, Alignment.upper, 1, three_quarters), + 0x1fb85 => self.draw_block(canvas, .upper, 1, three_quarters), // '🮆' UPPER SEVEN EIGHTHS BLOCK - 0x1fb86 => self.draw_block(canvas, Alignment.upper, 1, seven_eighths), + 0x1fb86 => self.draw_block(canvas, .upper, 1, seven_eighths), // '🭼' LEFT AND LOWER ONE EIGHTH BLOCK 0x1fb7c => { - self.draw_block(canvas, Alignment.left, one_eighth, 1); - self.draw_block(canvas, Alignment.lower, 1, one_eighth); + self.draw_block(canvas, .left, one_eighth, 1); + self.draw_block(canvas, .lower, 1, one_eighth); }, // '🭽' LEFT AND UPPER ONE EIGHTH BLOCK 0x1fb7d => { - self.draw_block(canvas, Alignment.left, one_eighth, 1); - self.draw_block(canvas, Alignment.upper, 1, one_eighth); + self.draw_block(canvas, .left, one_eighth, 1); + self.draw_block(canvas, .upper, 1, one_eighth); }, // '🭾' RIGHT AND UPPER ONE EIGHTH BLOCK 0x1fb7e => { - self.draw_block(canvas, Alignment.right, one_eighth, 1); - self.draw_block(canvas, Alignment.upper, 1, one_eighth); + self.draw_block(canvas, .right, one_eighth, 1); + self.draw_block(canvas, .upper, 1, one_eighth); }, // '🭿' RIGHT AND LOWER ONE EIGHTH BLOCK 0x1fb7f => { - self.draw_block(canvas, Alignment.right, one_eighth, 1); - self.draw_block(canvas, Alignment.lower, 1, one_eighth); + self.draw_block(canvas, .right, one_eighth, 1); + self.draw_block(canvas, .lower, 1, one_eighth); }, // '🮀' UPPER AND LOWER ONE EIGHTH BLOCK 0x1fb80 => { - self.draw_block(canvas, Alignment.upper, 1, one_eighth); - self.draw_block(canvas, Alignment.lower, 1, one_eighth); + self.draw_block(canvas, .upper, 1, one_eighth); + self.draw_block(canvas, .lower, 1, one_eighth); }, // '🮁' 0x1fb81 => self.draw_horizontal_one_eighth_1358_block(canvas), // '🮇' RIGHT ONE QUARTER BLOCK - 0x1fb87 => self.draw_block(canvas, Alignment.right, one_quarter, 1), + 0x1fb87 => self.draw_block(canvas, .right, one_quarter, 1), // '🮈' RIGHT THREE EIGHTHS BLOCK - 0x1fb88 => self.draw_block(canvas, Alignment.right, three_eighths, 1), + 0x1fb88 => self.draw_block(canvas, .right, three_eighths, 1), // '🮉' RIGHT FIVE EIGHTHS BLOCK - 0x1fb89 => self.draw_block(canvas, Alignment.right, five_eighths, 1), + 0x1fb89 => self.draw_block(canvas, .right, five_eighths, 1), // '🮊' RIGHT THREE QUARTERS BLOCK - 0x1fb8a => self.draw_block(canvas, Alignment.right, three_quarters, 1), + 0x1fb8a => self.draw_block(canvas, .right, three_quarters, 1), // '🮋' RIGHT SEVEN EIGHTHS BLOCK - 0x1fb8b => self.draw_block(canvas, Alignment.right, seven_eighths, 1), + 0x1fb8b => self.draw_block(canvas, .right, seven_eighths, 1), // '🮌' - 0x1fb8c => self.draw_block_shade(canvas, Alignment.left, half, 1, .medium), + 0x1fb8c => self.draw_block_shade(canvas, .left, half, 1, .medium), // '🮍' - 0x1fb8d => self.draw_block_shade(canvas, Alignment.right, half, 1, .medium), + 0x1fb8d => self.draw_block_shade(canvas, .right, half, 1, .medium), // '🮎' - 0x1fb8e => self.draw_block_shade(canvas, Alignment.upper, 1, half, .medium), + 0x1fb8e => self.draw_block_shade(canvas, .upper, 1, half, .medium), // '🮏' - 0x1fb8f => self.draw_block_shade(canvas, Alignment.lower, 1, half, .medium), + 0x1fb8f => self.draw_block_shade(canvas, .lower, 1, half, .medium), // '🮐' 0x1fb90 => self.draw_medium_shade(canvas), // '🮑' 0x1fb91 => { self.draw_medium_shade(canvas); - self.draw_block(canvas, Alignment.upper, 1, half); + self.draw_block(canvas, .upper, 1, half); }, // '🮒' 0x1fb92 => { self.draw_medium_shade(canvas); - self.draw_block(canvas, Alignment.lower, 1, half); + self.draw_block(canvas, .lower, 1, half); }, // '🮔' 0x1fb94 => { self.draw_medium_shade(canvas); - self.draw_block(canvas, Alignment.right, half, 1); + self.draw_block(canvas, .right, half, 1); }, // '🮕' 0x1fb95 => self.draw_checkerboard_fill(canvas, 0), @@ -1117,194 +1117,194 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void }, // '🯎' - 0x1fbce => self.draw_block(canvas, Alignment.left, two_thirds, 1), + 0x1fbce => self.draw_block(canvas, .left, two_thirds, 1), // '🯏' - 0x1fbcf => self.draw_block(canvas, Alignment.left, one_third, 1), + 0x1fbcf => self.draw_block(canvas, .left, one_third, 1), // '🯐' 0x1fbd0 => self.draw_cell_diagonal( canvas, - Alignment.middle_right, - Alignment.lower_left, + .middle_right, + .lower_left, ), // '🯑' 0x1fbd1 => self.draw_cell_diagonal( canvas, - Alignment.upper_right, - Alignment.middle_left, + .upper_right, + .middle_left, ), // '🯒' 0x1fbd2 => self.draw_cell_diagonal( canvas, - Alignment.upper_left, - Alignment.middle_right, + .upper_left, + .middle_right, ), // '🯓' 0x1fbd3 => self.draw_cell_diagonal( canvas, - Alignment.middle_left, - Alignment.lower_right, + .middle_left, + .lower_right, ), // '🯔' 0x1fbd4 => self.draw_cell_diagonal( canvas, - Alignment.upper_left, - Alignment.lower_center, + .upper_left, + .lower_center, ), // '🯕' 0x1fbd5 => self.draw_cell_diagonal( canvas, - Alignment.upper_center, - Alignment.lower_right, + .upper_center, + .lower_right, ), // '🯖' 0x1fbd6 => self.draw_cell_diagonal( canvas, - Alignment.upper_right, - Alignment.lower_center, + .upper_right, + .lower_center, ), // '🯗' 0x1fbd7 => self.draw_cell_diagonal( canvas, - Alignment.upper_center, - Alignment.lower_left, + .upper_center, + .lower_left, ), // '🯘' 0x1fbd8 => { self.draw_cell_diagonal( canvas, - Alignment.upper_left, - Alignment.middle_center, + .upper_left, + .middle_center, ); self.draw_cell_diagonal( canvas, - Alignment.middle_center, - Alignment.upper_right, + .middle_center, + .upper_right, ); }, // '🯙' 0x1fbd9 => { self.draw_cell_diagonal( canvas, - Alignment.upper_right, - Alignment.middle_center, + .upper_right, + .middle_center, ); self.draw_cell_diagonal( canvas, - Alignment.middle_center, - Alignment.lower_right, + .middle_center, + .lower_right, ); }, // '🯚' 0x1fbda => { self.draw_cell_diagonal( canvas, - Alignment.lower_left, - Alignment.middle_center, + .lower_left, + .middle_center, ); self.draw_cell_diagonal( canvas, - Alignment.middle_center, - Alignment.lower_right, + .middle_center, + .lower_right, ); }, // '🯛' 0x1fbdb => { self.draw_cell_diagonal( canvas, - Alignment.upper_left, - Alignment.middle_center, + .upper_left, + .middle_center, ); self.draw_cell_diagonal( canvas, - Alignment.middle_center, - Alignment.lower_left, + .middle_center, + .lower_left, ); }, // '🯜' 0x1fbdc => { self.draw_cell_diagonal( canvas, - Alignment.upper_left, - Alignment.lower_center, + .upper_left, + .lower_center, ); self.draw_cell_diagonal( canvas, - Alignment.lower_center, - Alignment.upper_right, + .lower_center, + .upper_right, ); }, // '🯝' 0x1fbdd => { self.draw_cell_diagonal( canvas, - Alignment.upper_right, - Alignment.middle_left, + .upper_right, + .middle_left, ); self.draw_cell_diagonal( canvas, - Alignment.middle_left, - Alignment.lower_right, + .middle_left, + .lower_right, ); }, // '🯞' 0x1fbde => { self.draw_cell_diagonal( canvas, - Alignment.lower_left, - Alignment.upper_center, + .lower_left, + .upper_center, ); self.draw_cell_diagonal( canvas, - Alignment.upper_center, - Alignment.lower_right, + .upper_center, + .lower_right, ); }, // '🯟' 0x1fbdf => { self.draw_cell_diagonal( canvas, - Alignment.upper_left, - Alignment.middle_right, + .upper_left, + .middle_right, ); self.draw_cell_diagonal( canvas, - Alignment.middle_right, - Alignment.lower_left, + .middle_right, + .lower_left, ); }, // '🯠' - 0x1fbe0 => self.draw_circle(canvas, Alignment.top, false), + 0x1fbe0 => self.draw_circle(canvas, .top, false), // '🯡' - 0x1fbe1 => self.draw_circle(canvas, Alignment.right, false), + 0x1fbe1 => self.draw_circle(canvas, .right, false), // '🯢' - 0x1fbe2 => self.draw_circle(canvas, Alignment.bottom, false), + 0x1fbe2 => self.draw_circle(canvas, .bottom, false), // '🯣' - 0x1fbe3 => self.draw_circle(canvas, Alignment.left, false), + 0x1fbe3 => self.draw_circle(canvas, .left, false), // '🯤' - 0x1fbe4 => self.draw_block(canvas, Alignment.upper_center, 0.5, 0.5), + 0x1fbe4 => self.draw_block(canvas, .upper_center, 0.5, 0.5), // '🯥' - 0x1fbe5 => self.draw_block(canvas, Alignment.lower_center, 0.5, 0.5), + 0x1fbe5 => self.draw_block(canvas, .lower_center, 0.5, 0.5), // '🯦' - 0x1fbe6 => self.draw_block(canvas, Alignment.middle_left, 0.5, 0.5), + 0x1fbe6 => self.draw_block(canvas, .middle_left, 0.5, 0.5), // '🯧' - 0x1fbe7 => self.draw_block(canvas, Alignment.middle_right, 0.5, 0.5), + 0x1fbe7 => self.draw_block(canvas, .middle_right, 0.5, 0.5), // '🯨' - 0x1fbe8 => self.draw_circle(canvas, Alignment.top, true), + 0x1fbe8 => self.draw_circle(canvas, .top, true), // '🯩' - 0x1fbe9 => self.draw_circle(canvas, Alignment.right, true), + 0x1fbe9 => self.draw_circle(canvas, .right, true), // '🯪' - 0x1fbea => self.draw_circle(canvas, Alignment.bottom, true), + 0x1fbea => self.draw_circle(canvas, .bottom, true), // '🯫' - 0x1fbeb => self.draw_circle(canvas, Alignment.left, true), + 0x1fbeb => self.draw_circle(canvas, .left, true), // '🯬' - 0x1fbec => self.draw_circle(canvas, Alignment.top_right, true), + 0x1fbec => self.draw_circle(canvas, .top_right, true), // '🯭' - 0x1fbed => self.draw_circle(canvas, Alignment.bottom_left, true), + 0x1fbed => self.draw_circle(canvas, .bottom_left, true), // '🯮' - 0x1fbee => self.draw_circle(canvas, Alignment.bottom_right, true), + 0x1fbee => self.draw_circle(canvas, .bottom_right, true), // '🯯' - 0x1fbef => self.draw_circle(canvas, Alignment.top_left, true), + 0x1fbef => self.draw_circle(canvas, .top_left, true), // (Below:) // Branch drawing character set, used for drawing git-like From 2384bd69cc25db7228dcb2e90ea1d296bbf0ba84 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Mon, 26 May 2025 21:39:15 -0600 Subject: [PATCH 014/371] style: use decl literals This commit changes a LOT of areas of the code to use decl literals instead of redundantly referring to the type. These changes were mostly driven by some regex searches and then manual adjustment on a case-by-case basis. I almost certainly missed quite a few places where decl literals could be used, but this is a good first step in converting things, and other instances can be addressed when they're discovered. I tested GLFW+Metal and building the framework on macOS and tested a GTK build on Linux, so I'm 99% sure I didn't introduce any syntax errors or other problems with this. (fingers crossed) --- pkg/fontconfig/pattern.zig | 4 +- pkg/glfw/Monitor.zig | 2 +- pkg/glfw/opengl.zig | 2 +- src/Command.zig | 2 +- src/Surface.zig | 2 +- src/apprt/embedded.zig | 12 +++--- src/apprt/gtk/ClipboardConfirmationWindow.zig | 14 +++---- src/apprt/gtk/ConfigErrorsDialog.zig | 6 +-- src/apprt/gtk/ResizeOverlay.zig | 4 +- src/apprt/gtk/Split.zig | 2 +- src/apprt/gtk/Surface.zig | 2 +- src/apprt/gtk/Window.zig | 8 ++-- src/apprt/gtk/inspector.zig | 2 +- src/apprt/gtk/winproto/x11.zig | 2 +- src/build/SharedDeps.zig | 8 ++-- src/cli/args.zig | 4 +- src/config/Config.zig | 8 ++-- src/config/formatter.zig | 2 +- src/crash/sentry_envelope.zig | 2 +- src/font/CodepointResolver.zig | 16 +++---- src/font/Collection.zig | 18 ++++---- src/font/DeferredFace.zig | 2 +- src/font/SharedGrid.zig | 2 +- src/font/SharedGridSet.zig | 16 +++---- src/font/face/coretext.zig | 2 +- src/font/face/freetype_convert.zig | 2 +- src/font/shaper/coretext.zig | 10 ++--- src/font/shaper/feature.zig | 2 +- src/font/shaper/harfbuzz.zig | 8 ++-- src/font/sprite/canvas.zig | 2 +- src/global.zig | 2 +- src/input/Binding.zig | 4 +- src/input/KeyEncoder.zig | 2 +- src/inspector/termio.zig | 2 +- src/os/args.zig | 2 +- src/renderer/Thread.zig | 2 +- src/renderer/cursor.zig | 2 +- src/renderer/link.zig | 2 +- src/renderer/metal/cell.zig | 2 +- src/renderer/size.zig | 4 +- src/terminal/PageList.zig | 12 +++--- src/terminal/Parser.zig | 4 +- src/terminal/Screen.zig | 12 +++--- src/terminal/Selection.zig | 8 ++-- src/terminal/StringMap.zig | 2 +- src/terminal/Terminal.zig | 10 ++--- src/terminal/bitmap_allocator.zig | 8 ++-- src/terminal/hash_map.zig | 42 +++++++++---------- src/terminal/kitty/graphics_command.zig | 18 ++++---- src/terminal/kitty/graphics_exec.zig | 2 +- src/terminal/osc.zig | 4 +- src/terminal/page.zig | 20 ++++----- src/terminal/search.zig | 4 +- src/terminal/sgr.zig | 4 +- src/terminal/style.zig | 8 ++-- src/terminal/x11_color.zig | 2 +- src/unicode/props.zig | 2 +- 57 files changed, 177 insertions(+), 177 deletions(-) diff --git a/pkg/fontconfig/pattern.zig b/pkg/fontconfig/pattern.zig index e0ec27a69..3a623e223 100644 --- a/pkg/fontconfig/pattern.zig +++ b/pkg/fontconfig/pattern.zig @@ -44,7 +44,7 @@ pub const Pattern = opaque { &val, ))).toError(); - return Value.init(&val); + return .init(&val); } pub fn delete(self: *Pattern, prop: Property) bool { @@ -138,7 +138,7 @@ pub const Pattern = opaque { return Entry{ .result = @enumFromInt(result), .binding = @enumFromInt(binding), - .value = Value.init(&value), + .value = .init(&value), }; } }; diff --git a/pkg/glfw/Monitor.zig b/pkg/glfw/Monitor.zig index 4accb23cd..3b194965a 100644 --- a/pkg/glfw/Monitor.zig +++ b/pkg/glfw/Monitor.zig @@ -281,7 +281,7 @@ pub inline fn setGamma(self: Monitor, gamma: f32) void { /// see also: monitor_gamma pub inline fn getGammaRamp(self: Monitor) ?GammaRamp { internal_debug.assertInitialized(); - if (c.glfwGetGammaRamp(self.handle)) |ramp| return GammaRamp.fromC(ramp.*); + if (c.glfwGetGammaRamp(self.handle)) |ramp| return .fromC(ramp.*); return null; } diff --git a/pkg/glfw/opengl.zig b/pkg/glfw/opengl.zig index 04bc3a65c..8fe2efbed 100644 --- a/pkg/glfw/opengl.zig +++ b/pkg/glfw/opengl.zig @@ -47,7 +47,7 @@ pub inline fn makeContextCurrent(window: ?Window) void { /// see also: context_current, glfwMakeContextCurrent pub inline fn getCurrentContext() ?Window { internal_debug.assertInitialized(); - if (c.glfwGetCurrentContext()) |handle| return Window.from(handle); + if (c.glfwGetCurrentContext()) |handle| return .from(handle); return null; } diff --git a/src/Command.zig b/src/Command.zig index e17c1b370..281dcce40 100644 --- a/src/Command.zig +++ b/src/Command.zig @@ -370,7 +370,7 @@ pub fn wait(self: Command, block: bool) !Exit { } }; - return Exit.init(res.status); + return .init(res.status); } /// Sets command->data to data. diff --git a/src/Surface.zig b/src/Surface.zig index f9e232340..32f7487d3 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -463,7 +463,7 @@ pub fn init( // Create our terminal grid with the initial size const app_mailbox: App.Mailbox = .{ .rt_app = rt_app, .mailbox = &app.mailbox }; var renderer_impl = try Renderer.init(alloc, .{ - .config = try Renderer.DerivedConfig.init(alloc, config), + .config = try .init(alloc, config), .font_grid = font_grid, .size = size, .surface_mailbox = .{ .surface = self, .app = app_mailbox }, diff --git a/src/apprt/embedded.zig b/src/apprt/embedded.zig index 7bc84bcad..97466e9b5 100644 --- a/src/apprt/embedded.zig +++ b/src/apprt/embedded.zig @@ -423,7 +423,7 @@ pub const Surface = struct { pub fn init(self: *Surface, app: *App, opts: Options) !void { self.* = .{ .app = app, - .platform = try Platform.init(opts.platform_tag, opts.platform), + .platform = try .init(opts.platform_tag, opts.platform), .userdata = opts.userdata, .core_surface = undefined, .content_scale = .{ @@ -522,7 +522,7 @@ pub const Surface = struct { const alloc = self.app.core_app.alloc; const inspector = try alloc.create(Inspector); errdefer alloc.destroy(inspector); - inspector.* = try Inspector.init(self); + inspector.* = try .init(self); self.inspector = inspector; return inspector; } @@ -1180,7 +1180,7 @@ pub const CAPI = struct { // Create our runtime app var app = try global.alloc.create(App); errdefer global.alloc.destroy(app); - app.* = try App.init(core_app, config, opts.*); + app.* = try .init(core_app, config, opts.*); errdefer app.terminate(); return app; @@ -1949,7 +1949,7 @@ pub const CAPI = struct { } export fn ghostty_inspector_metal_init(ptr: *Inspector, device: objc.c.id) bool { - return ptr.initMetal(objc.Object.fromId(device)); + return ptr.initMetal(.fromId(device)); } export fn ghostty_inspector_metal_render( @@ -1958,8 +1958,8 @@ pub const CAPI = struct { descriptor: objc.c.id, ) void { return ptr.renderMetal( - objc.Object.fromId(command_buffer), - objc.Object.fromId(descriptor), + .fromId(command_buffer), + .fromId(descriptor), ) catch |err| { log.err("error rendering inspector err={}", .{err}); return; diff --git a/src/apprt/gtk/ClipboardConfirmationWindow.zig b/src/apprt/gtk/ClipboardConfirmationWindow.zig index f10fc79ac..fab1aa893 100644 --- a/src/apprt/gtk/ClipboardConfirmationWindow.zig +++ b/src/apprt/gtk/ClipboardConfirmationWindow.zig @@ -69,16 +69,16 @@ fn init( request: apprt.ClipboardRequest, is_secure_input: bool, ) !void { - var builder = switch (DialogType) { + var builder: Builder = switch (DialogType) { adw.AlertDialog => switch (request) { - .osc_52_read => Builder.init("ccw-osc-52-read", 1, 5), - .osc_52_write => Builder.init("ccw-osc-52-write", 1, 5), - .paste => Builder.init("ccw-paste", 1, 5), + .osc_52_read => .init("ccw-osc-52-read", 1, 5), + .osc_52_write => .init("ccw-osc-52-write", 1, 5), + .paste => .init("ccw-paste", 1, 5), }, adw.MessageDialog => switch (request) { - .osc_52_read => Builder.init("ccw-osc-52-read", 1, 2), - .osc_52_write => Builder.init("ccw-osc-52-write", 1, 2), - .paste => Builder.init("ccw-paste", 1, 2), + .osc_52_read => .init("ccw-osc-52-read", 1, 2), + .osc_52_write => .init("ccw-osc-52-write", 1, 2), + .paste => .init("ccw-paste", 1, 2), }, else => unreachable, }; diff --git a/src/apprt/gtk/ConfigErrorsDialog.zig b/src/apprt/gtk/ConfigErrorsDialog.zig index ccc5599ad..da70ccce1 100644 --- a/src/apprt/gtk/ConfigErrorsDialog.zig +++ b/src/apprt/gtk/ConfigErrorsDialog.zig @@ -32,9 +32,9 @@ pub fn maybePresent(app: *App, window: ?*Window) void { const config_errors_dialog = config_errors_dialog: { if (app.config_errors_dialog) |config_errors_dialog| break :config_errors_dialog config_errors_dialog; - var builder = switch (DialogType) { - adw.AlertDialog => Builder.init("config-errors-dialog", 1, 5), - adw.MessageDialog => Builder.init("config-errors-dialog", 1, 2), + var builder: Builder = switch (DialogType) { + adw.AlertDialog => .init("config-errors-dialog", 1, 5), + adw.MessageDialog => .init("config-errors-dialog", 1, 2), else => unreachable, }; diff --git a/src/apprt/gtk/ResizeOverlay.zig b/src/apprt/gtk/ResizeOverlay.zig index 767cf097d..2ab59624a 100644 --- a/src/apprt/gtk/ResizeOverlay.zig +++ b/src/apprt/gtk/ResizeOverlay.zig @@ -50,12 +50,12 @@ first: bool = true, pub fn init(self: *ResizeOverlay, surface: *Surface, config: *const configpkg.Config) void { self.* = .{ .surface = surface, - .config = DerivedConfig.init(config), + .config = .init(config), }; } pub fn updateConfig(self: *ResizeOverlay, config: *const configpkg.Config) void { - self.config = DerivedConfig.init(config); + self.config = .init(config); } /// De-initialize the ResizeOverlay. This removes any pending idlers/timers that diff --git a/src/apprt/gtk/Split.zig b/src/apprt/gtk/Split.zig index 9caa9ab56..fb719c3c9 100644 --- a/src/apprt/gtk/Split.zig +++ b/src/apprt/gtk/Split.zig @@ -138,7 +138,7 @@ pub fn init( .container = container, .top_left = .{ .surface = tl }, .bottom_right = .{ .surface = br }, - .orientation = Orientation.fromDirection(direction), + .orientation = .fromDirection(direction), }; // Replace the previous containers element with our split. This allows a diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index bcb78e087..30a3d28f7 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -1191,7 +1191,7 @@ pub fn mouseOverLink(self: *Surface, uri_: ?[]const u8) void { return; } - self.url_widget = URLWidget.init(self.overlay, uriZ); + self.url_widget = .init(self.overlay, uriZ); } pub fn supportsClipboard( diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index 4a5926a97..aa1f0a4b1 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -136,7 +136,7 @@ pub fn init(self: *Window, app: *App) !void { self.* = .{ .app = app, .last_config = @intFromPtr(&app.config), - .config = DerivedConfig.init(&app.config), + .config = .init(&app.config), .window = undefined, .headerbar = undefined, .tab_overview = null, @@ -148,7 +148,7 @@ pub fn init(self: *Window, app: *App) !void { }; // Create the window - self.window = adw.ApplicationWindow.new(app.app.as(gtk.Application)); + self.window = .new(app.app.as(gtk.Application)); const gtk_window = self.window.as(gtk.Window); const gtk_widget = self.window.as(gtk.Widget); errdefer gtk_window.destroy(); @@ -333,7 +333,7 @@ pub fn init(self: *Window, app: *App) !void { } // Setup our toast overlay if we have one - self.toast_overlay = adw.ToastOverlay.new(); + self.toast_overlay = .new(); self.toast_overlay.setChild(self.notebook.asWidget()); box.append(self.toast_overlay.as(gtk.Widget)); @@ -463,7 +463,7 @@ pub fn updateConfig( if (self.last_config == this_config) return; self.last_config = this_config; - self.config = DerivedConfig.init(config); + self.config = .init(config); // We always resync our appearance whenever the config changes. try self.syncAppearance(); diff --git a/src/apprt/gtk/inspector.zig b/src/apprt/gtk/inspector.zig index e3e61e258..3adeb9711 100644 --- a/src/apprt/gtk/inspector.zig +++ b/src/apprt/gtk/inspector.zig @@ -138,7 +138,7 @@ const Window = struct { }; // Create the window - self.window = gtk.ApplicationWindow.new(inspector.surface.app.app.as(gtk.Application)); + self.window = .new(inspector.surface.app.app.as(gtk.Application)); errdefer self.window.as(gtk.Window).destroy(); self.window.as(gtk.Window).setTitle(i18n._("Ghostty: Terminal Inspector")); diff --git a/src/apprt/gtk/winproto/x11.zig b/src/apprt/gtk/winproto/x11.zig index c2b6bf416..387905b18 100644 --- a/src/apprt/gtk/winproto/x11.zig +++ b/src/apprt/gtk/winproto/x11.zig @@ -109,7 +109,7 @@ pub const App = struct { return .{ .display = xlib_display, .base_event_code = base_event_code, - .atoms = Atoms.init(gdk_x11_display), + .atoms = .init(gdk_x11_display), }; } diff --git a/src/build/SharedDeps.zig b/src/build/SharedDeps.zig index 0df261600..512975ac0 100644 --- a/src/build/SharedDeps.zig +++ b/src/build/SharedDeps.zig @@ -24,9 +24,9 @@ pub const LazyPathList = std.ArrayList(std.Build.LazyPath); pub fn init(b: *std.Build, cfg: *const Config) !SharedDeps { var result: SharedDeps = .{ .config = cfg, - .help_strings = try HelpStrings.init(b, cfg), - .unicode_tables = try UnicodeTables.init(b), - .framedata = try GhosttyFrameData.init(b), + .help_strings = try .init(b, cfg), + .unicode_tables = try .init(b), + .framedata = try .init(b), // Setup by retarget .options = undefined, @@ -72,7 +72,7 @@ fn initTarget( target: std.Build.ResolvedTarget, ) !void { // Update our metallib - self.metallib = MetallibStep.create(b, .{ + self.metallib = .create(b, .{ .name = "Ghostty", .target = target, .sources = &.{b.path("src/renderer/shaders/cell.metal")}, diff --git a/src/cli/args.zig b/src/cli/args.zig index 4860cdd74..68972a622 100644 --- a/src/cli/args.zig +++ b/src/cli/args.zig @@ -84,7 +84,7 @@ pub fn parse( // If the arena is unset, we create it. We mark that we own it // only so that we can clean it up on error. if (dst._arena == null) { - dst._arena = ArenaAllocator.init(alloc); + dst._arena = .init(alloc); arena_owned = true; } @@ -481,7 +481,7 @@ pub fn parseAutoStruct(comptime T: type, alloc: Allocator, v: []const u8) !T { // Keep track of which fields were set so we can error if a required // field was not set. const FieldSet = std.StaticBitSet(info.fields.len); - var fields_set: FieldSet = FieldSet.initEmpty(); + var fields_set: FieldSet = .initEmpty(); // We split each value by "," var iter = std.mem.splitSequence(u8, v, ","); diff --git a/src/config/Config.zig b/src/config/Config.zig index 6f1e89d41..8d08113bc 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2531,7 +2531,7 @@ pub fn load(alloc_gpa: Allocator) !Config { pub fn default(alloc_gpa: Allocator) Allocator.Error!Config { // Build up our basic config var result: Config = .{ - ._arena = ArenaAllocator.init(alloc_gpa), + ._arena = .init(alloc_gpa), }; errdefer result.deinit(); const alloc = result._arena.?.allocator(); @@ -3332,7 +3332,7 @@ pub fn parseManuallyHook( /// be deallocated while shallow clones exist. pub fn shallowClone(self: *const Config, alloc_gpa: Allocator) Config { var result = self.*; - result._arena = ArenaAllocator.init(alloc_gpa); + result._arena = .init(alloc_gpa); return result; } @@ -5975,7 +5975,7 @@ pub const QuickTerminalSize = struct { it.next() orelse return error.ValueRequired, cli.args.whitespace, ); - self.primary = try Size.parse(primary); + self.primary = try .parse(primary); self.secondary = secondary: { const secondary = std.mem.trim( @@ -5983,7 +5983,7 @@ pub const QuickTerminalSize = struct { it.next() orelse break :secondary null, cli.args.whitespace, ); - break :secondary try Size.parse(secondary); + break :secondary try .parse(secondary); }; if (it.next()) |_| return error.TooManyArguments; diff --git a/src/config/formatter.zig b/src/config/formatter.zig index ca3da1d91..cabf80953 100644 --- a/src/config/formatter.zig +++ b/src/config/formatter.zig @@ -153,7 +153,7 @@ pub const FileFormatter = struct { // If we're change-tracking then we need the default config to // compare against. var default: ?Config = if (self.changed) - try Config.default(self.alloc) + try .default(self.alloc) else null; defer if (default) |*v| v.deinit(); diff --git a/src/crash/sentry_envelope.zig b/src/crash/sentry_envelope.zig index 70eb99f51..6b675554c 100644 --- a/src/crash/sentry_envelope.zig +++ b/src/crash/sentry_envelope.zig @@ -331,7 +331,7 @@ pub const Item = union(enum) { // Decode the item. self.* = switch (encoded.type) { - .attachment => .{ .attachment = try Attachment.decode( + .attachment => .{ .attachment = try .decode( alloc, encoded, ) }, diff --git a/src/font/CodepointResolver.zig b/src/font/CodepointResolver.zig index 37093b59a..16536300c 100644 --- a/src/font/CodepointResolver.zig +++ b/src/font/CodepointResolver.zig @@ -37,7 +37,7 @@ collection: Collection, /// The set of statuses and whether they're enabled or not. This defaults /// to true. This can be changed at runtime with no ill effect. -styles: StyleStatus = StyleStatus.initFill(true), +styles: StyleStatus = .initFill(true), /// If discovery is available, we'll look up fonts where we can't find /// the codepoint. This can be set after initialization. @@ -140,7 +140,7 @@ pub fn getIndex( // handle this. if (self.sprite) |sprite| { if (sprite.hasCodepoint(cp, p)) { - return Collection.Index.initSpecial(.sprite); + return .initSpecial(.sprite); } } @@ -388,7 +388,7 @@ test getIndex { { errdefer c.deinit(alloc); - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, @@ -398,7 +398,7 @@ test getIndex { _ = try c.add( alloc, .regular, - .{ .loaded = try Face.init( + .{ .loaded = try .init( lib, testEmoji, .{ .size = .{ .points = 12 } }, @@ -408,7 +408,7 @@ test getIndex { _ = try c.add( alloc, .regular, - .{ .loaded = try Face.init( + .{ .loaded = try .init( lib, testEmojiText, .{ .size = .{ .points = 12 } }, @@ -467,17 +467,17 @@ test "getIndex disabled font style" { var c = Collection.init(); c.load_options = .{ .library = lib }; - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, ) }); - _ = try c.add(alloc, .bold, .{ .loaded = try Face.init( + _ = try c.add(alloc, .bold, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, ) }); - _ = try c.add(alloc, .italic, .{ .loaded = try Face.init( + _ = try c.add(alloc, .italic, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, diff --git a/src/font/Collection.zig b/src/font/Collection.zig index 59f89d402..8533331bc 100644 --- a/src/font/Collection.zig +++ b/src/font/Collection.zig @@ -55,7 +55,7 @@ load_options: ?LoadOptions = null, pub fn init() Collection { // Initialize our styles array, preallocating some space that is // likely to be used. - return .{ .faces = StyleArray.initFill(.{}) }; + return .{ .faces = .initFill(.{}) }; } pub fn deinit(self: *Collection, alloc: Allocator) void { @@ -707,7 +707,7 @@ test "add full" { defer c.deinit(alloc); for (0..Index.Special.start - 1) |_| { - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12 } }, @@ -755,7 +755,7 @@ test getFace { var c = init(); defer c.deinit(alloc); - const idx = try c.add(alloc, .regular, .{ .loaded = try Face.init( + const idx = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, @@ -779,7 +779,7 @@ test getIndex { var c = init(); defer c.deinit(alloc); - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, @@ -811,7 +811,7 @@ test completeStyles { defer c.deinit(alloc); c.load_options = .{ .library = lib }; - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, @@ -838,7 +838,7 @@ test setSize { defer c.deinit(alloc); c.load_options = .{ .library = lib }; - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, @@ -861,7 +861,7 @@ test hasCodepoint { defer c.deinit(alloc); c.load_options = .{ .library = lib }; - const idx = try c.add(alloc, .regular, .{ .loaded = try Face.init( + const idx = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, @@ -885,7 +885,7 @@ test "hasCodepoint emoji default graphical" { defer c.deinit(alloc); c.load_options = .{ .library = lib }; - const idx = try c.add(alloc, .regular, .{ .loaded = try Face.init( + const idx = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testEmoji, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, @@ -908,7 +908,7 @@ test "metrics" { defer c.deinit(alloc); c.load_options = .{ .library = lib }; - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, diff --git a/src/font/DeferredFace.zig b/src/font/DeferredFace.zig index 8794ccea9..f9ce0bff5 100644 --- a/src/font/DeferredFace.zig +++ b/src/font/DeferredFace.zig @@ -254,7 +254,7 @@ fn loadWebCanvas( opts: font.face.Options, ) !Face { const wc = self.wc.?; - return try Face.initNamed(wc.alloc, wc.font_str, opts, wc.presentation); + return try .initNamed(wc.alloc, wc.font_str, opts, wc.presentation); } /// Returns true if this face can satisfy the given codepoint and diff --git a/src/font/SharedGrid.zig b/src/font/SharedGrid.zig index 72e97fad8..35770f920 100644 --- a/src/font/SharedGrid.zig +++ b/src/font/SharedGrid.zig @@ -319,7 +319,7 @@ fn testGrid(mode: TestMode, alloc: Allocator, lib: Library) !SharedGrid { switch (mode) { .normal => { - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12, .xdpi = 96, .ydpi = 96 } }, diff --git a/src/font/SharedGridSet.zig b/src/font/SharedGridSet.zig index 8ad30629e..858d7930f 100644 --- a/src/font/SharedGridSet.zig +++ b/src/font/SharedGridSet.zig @@ -126,7 +126,7 @@ pub fn ref( .ref = 1, }; - grid.* = try SharedGrid.init(self.alloc, resolver: { + grid.* = try .init(self.alloc, resolver: { // Build our collection. This is the expensive operation that // involves finding fonts, loading them (maybe, some are deferred), // etc. @@ -258,7 +258,7 @@ fn collection( _ = try c.add( self.alloc, .regular, - .{ .fallback_loaded = try Face.init( + .{ .fallback_loaded = try .init( self.font_lib, font.embedded.regular, load_options.faceOptions(), @@ -267,7 +267,7 @@ fn collection( _ = try c.add( self.alloc, .bold, - .{ .fallback_loaded = try Face.init( + .{ .fallback_loaded = try .init( self.font_lib, font.embedded.bold, load_options.faceOptions(), @@ -276,7 +276,7 @@ fn collection( _ = try c.add( self.alloc, .italic, - .{ .fallback_loaded = try Face.init( + .{ .fallback_loaded = try .init( self.font_lib, font.embedded.italic, load_options.faceOptions(), @@ -285,7 +285,7 @@ fn collection( _ = try c.add( self.alloc, .bold_italic, - .{ .fallback_loaded = try Face.init( + .{ .fallback_loaded = try .init( self.font_lib, font.embedded.bold_italic, load_options.faceOptions(), @@ -318,7 +318,7 @@ fn collection( _ = try c.add( self.alloc, .regular, - .{ .fallback_loaded = try Face.init( + .{ .fallback_loaded = try .init( self.font_lib, font.embedded.emoji, load_options.faceOptions(), @@ -327,7 +327,7 @@ fn collection( _ = try c.add( self.alloc, .regular, - .{ .fallback_loaded = try Face.init( + .{ .fallback_loaded = try .init( self.font_lib, font.embedded.emoji_text, load_options.faceOptions(), @@ -391,7 +391,7 @@ fn discover(self: *SharedGridSet) !?*Discover { // If we initialized, use it if (self.font_discover) |*v| return v; - self.font_discover = Discover.init(); + self.font_discover = .init(); return &self.font_discover.?; } diff --git a/src/font/face/coretext.zig b/src/font/face/coretext.zig index 639eae43c..06bba661f 100644 --- a/src/font/face/coretext.zig +++ b/src/font/face/coretext.zig @@ -97,7 +97,7 @@ pub const Face = struct { errdefer if (comptime harfbuzz_shaper) hb_font.destroy(); const color: ?ColorState = if (traits.color_glyphs) - try ColorState.init(ct_font) + try .init(ct_font) else null; errdefer if (color) |v| v.deinit(); diff --git a/src/font/face/freetype_convert.zig b/src/font/face/freetype_convert.zig index 6df350bfa..3a7cf8c98 100644 --- a/src/font/face/freetype_convert.zig +++ b/src/font/face/freetype_convert.zig @@ -30,7 +30,7 @@ fn genMap() Map { // Initialize to no converter var i: usize = 0; while (i < freetype.c.FT_PIXEL_MODE_MAX) : (i += 1) { - result[i] = AtlasArray.initFill(null); + result[i] = .initFill(null); } // Map our converters diff --git a/src/font/shaper/coretext.zig b/src/font/shaper/coretext.zig index f2ac5b85d..8e2c45c69 100644 --- a/src/font/shaper/coretext.zig +++ b/src/font/shaper/coretext.zig @@ -191,7 +191,7 @@ pub const Shaper = struct { // Create the CF release thread. var cf_release_thread = try alloc.create(CFReleaseThread); errdefer alloc.destroy(cf_release_thread); - cf_release_thread.* = try CFReleaseThread.init(alloc); + cf_release_thread.* = try .init(alloc); errdefer cf_release_thread.deinit(); // Start the CF release thread. @@ -1768,7 +1768,7 @@ fn testShaperWithFont(alloc: Allocator, font_req: TestFont) !TestShaper { c.load_options = .{ .library = lib }; // Setup group - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12 } }, @@ -1776,7 +1776,7 @@ fn testShaperWithFont(alloc: Allocator, font_req: TestFont) !TestShaper { if (font.options.backend != .coretext) { // Coretext doesn't support Noto's format - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testEmoji, .{ .size = .{ .points = 12 } }, @@ -1795,7 +1795,7 @@ fn testShaperWithFont(alloc: Allocator, font_req: TestFont) !TestShaper { errdefer face.deinit(); _ = try c.add(alloc, .regular, .{ .deferred = face }); } - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testEmojiText, .{ .size = .{ .points = 12 } }, @@ -1803,7 +1803,7 @@ fn testShaperWithFont(alloc: Allocator, font_req: TestFont) !TestShaper { const grid_ptr = try alloc.create(SharedGrid); errdefer alloc.destroy(grid_ptr); - grid_ptr.* = try SharedGrid.init(alloc, .{ .collection = c }); + grid_ptr.* = try .init(alloc, .{ .collection = c }); errdefer grid_ptr.*.deinit(alloc); var shaper = try Shaper.init(alloc, .{}); diff --git a/src/font/shaper/feature.zig b/src/font/shaper/feature.zig index c2d49234d..66d0cb1f7 100644 --- a/src/font/shaper/feature.zig +++ b/src/font/shaper/feature.zig @@ -21,7 +21,7 @@ pub const Feature = struct { pub fn fromString(str: []const u8) ?Feature { var fbs = std.io.fixedBufferStream(str); const reader = fbs.reader(); - return Feature.fromReader(reader); + return .fromReader(reader); } /// Parse a single font feature setting from a std.io.Reader, with a version diff --git a/src/font/shaper/harfbuzz.zig b/src/font/shaper/harfbuzz.zig index eb8130f79..361cbbe93 100644 --- a/src/font/shaper/harfbuzz.zig +++ b/src/font/shaper/harfbuzz.zig @@ -1227,7 +1227,7 @@ fn testShaperWithFont(alloc: Allocator, font_req: TestFont) !TestShaper { c.load_options = .{ .library = lib }; // Setup group - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testFont, .{ .size = .{ .points = 12 } }, @@ -1235,7 +1235,7 @@ fn testShaperWithFont(alloc: Allocator, font_req: TestFont) !TestShaper { if (comptime !font.options.backend.hasCoretext()) { // Coretext doesn't support Noto's format - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testEmoji, .{ .size = .{ .points = 12 } }, @@ -1254,7 +1254,7 @@ fn testShaperWithFont(alloc: Allocator, font_req: TestFont) !TestShaper { errdefer face.deinit(); _ = try c.add(alloc, .regular, .{ .deferred = face }); } - _ = try c.add(alloc, .regular, .{ .loaded = try Face.init( + _ = try c.add(alloc, .regular, .{ .loaded = try .init( lib, testEmojiText, .{ .size = .{ .points = 12 } }, @@ -1262,7 +1262,7 @@ fn testShaperWithFont(alloc: Allocator, font_req: TestFont) !TestShaper { const grid_ptr = try alloc.create(SharedGrid); errdefer alloc.destroy(grid_ptr); - grid_ptr.* = try SharedGrid.init(alloc, .{ .collection = c }); + grid_ptr.* = try .init(alloc, .{ .collection = c }); errdefer grid_ptr.*.deinit(alloc); var shaper = try Shaper.init(alloc, .{}); diff --git a/src/font/sprite/canvas.zig b/src/font/sprite/canvas.zig index ed00aef12..a5ca7b290 100644 --- a/src/font/sprite/canvas.zig +++ b/src/font/sprite/canvas.zig @@ -150,7 +150,7 @@ pub const Canvas = struct { /// Acquires a z2d drawing context, caller MUST deinit context. pub fn getContext(self: *Canvas) z2d.Context { - return z2d.Context.init(self.alloc, &self.sfc); + return .init(self.alloc, &self.sfc); } /// Draw and fill a single pixel diff --git a/src/global.zig b/src/global.zig index 375c10538..d11dd775b 100644 --- a/src/global.zig +++ b/src/global.zig @@ -139,7 +139,7 @@ pub const GlobalState = struct { std.log.info("libxev default backend={s}", .{@tagName(xev.backend)}); // As early as possible, initialize our resource limits. - self.rlimits = ResourceLimits.init(); + self.rlimits = .init(); // Initialize our crash reporting. crash.init(self.alloc) catch |err| { diff --git a/src/input/Binding.zig b/src/input/Binding.zig index 59adc7149..3818d99a6 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -71,7 +71,7 @@ pub const Parser = struct { // parse the action now. return .{ .trigger_it = .{ .input = input[0..eql_idx] }, - .action = try Action.parse(input[eql_idx + 1 ..]), + .action = try .parse(input[eql_idx + 1 ..]), .flags = flags, }; } @@ -158,7 +158,7 @@ const SequenceIterator = struct { const rem = self.input[self.i..]; const idx = std.mem.indexOf(u8, rem, ">") orelse rem.len; defer self.i += idx + 1; - return try Trigger.parse(rem[0..idx]); + return try .parse(rem[0..idx]); } /// Returns true if there are no more triggers to parse. diff --git a/src/input/KeyEncoder.zig b/src/input/KeyEncoder.zig index 41634f2f1..b5f18b5a2 100644 --- a/src/input/KeyEncoder.zig +++ b/src/input/KeyEncoder.zig @@ -164,7 +164,7 @@ fn kitty( var seq: KittySequence = .{ .key = entry.code, .final = entry.final, - .mods = KittyMods.fromInput( + .mods = .fromInput( self.event.action, self.event.key, all_mods, diff --git a/src/inspector/termio.zig b/src/inspector/termio.zig index 6aa6628ab..5ab9d3cd4 100644 --- a/src/inspector/termio.zig +++ b/src/inspector/termio.zig @@ -308,7 +308,7 @@ pub const VTHandler = struct { current_seq: usize = 1, /// Exclude certain actions by tag. - filter_exclude: ActionTagSet = ActionTagSet.initMany(&.{.print}), + filter_exclude: ActionTagSet = .initMany(&.{.print}), filter_text: *cimgui.c.ImGuiTextFilter, const ActionTagSet = std.EnumSet(terminal.Parser.Action.Tag); diff --git a/src/os/args.zig b/src/os/args.zig index 9f7401c94..a531a418b 100644 --- a/src/os/args.zig +++ b/src/os/args.zig @@ -12,7 +12,7 @@ const macos = @import("macos"); /// but handles macOS using NSProcessInfo instead of libc argc/argv. pub fn iterator(allocator: Allocator) ArgIterator.InitError!ArgIterator { //if (true) return try std.process.argsWithAllocator(allocator); - return ArgIterator.initWithAllocator(allocator); + return .initWithAllocator(allocator); } /// Duck-typed to std.process.ArgIterator diff --git a/src/renderer/Thread.zig b/src/renderer/Thread.zig index 46ef8609b..1e9c29b26 100644 --- a/src/renderer/Thread.zig +++ b/src/renderer/Thread.zig @@ -155,7 +155,7 @@ pub fn init( return .{ .alloc = alloc, - .config = DerivedConfig.init(config), + .config = .init(config), .loop = loop, .wakeup = wakeup_h, .stop = stop_h, diff --git a/src/renderer/cursor.zig b/src/renderer/cursor.zig index d8769d9e2..287b83450 100644 --- a/src/renderer/cursor.zig +++ b/src/renderer/cursor.zig @@ -62,7 +62,7 @@ pub fn style( } // Otherwise, we use whatever style the terminal wants. - return Style.fromTerminal(state.terminal.screen.cursor.cursor_style); + return .fromTerminal(state.terminal.screen.cursor.cursor_style); } test "cursor: default uses configured style" { diff --git a/src/renderer/link.zig b/src/renderer/link.zig index 994190ec8..410fb8632 100644 --- a/src/renderer/link.zig +++ b/src/renderer/link.zig @@ -179,7 +179,7 @@ pub const Set = struct { if (current) |*sel| { sel.endPtr().* = cell_pin; } else { - current = terminal.Selection.init( + current = .init( cell_pin, cell_pin, false, diff --git a/src/renderer/metal/cell.zig b/src/renderer/metal/cell.zig index 61b8887fd..e1bcb7b9f 100644 --- a/src/renderer/metal/cell.zig +++ b/src/renderer/metal/cell.zig @@ -44,7 +44,7 @@ fn ArrayListPool(comptime T: type) type { }; for (self.lists) |*list| { - list.* = try ArrayListT.initCapacity(alloc, initial_capacity); + list.* = try .initCapacity(alloc, initial_capacity); } return self; diff --git a/src/renderer/size.zig b/src/renderer/size.zig index 83e921a26..b26c1581e 100644 --- a/src/renderer/size.zig +++ b/src/renderer/size.zig @@ -22,7 +22,7 @@ pub const Size = struct { /// taking the screen size, removing padding, and dividing by the cell /// dimensions. pub fn grid(self: Size) GridSize { - return GridSize.init(self.screen.subPadding(self.padding), self.cell); + return .init(self.screen.subPadding(self.padding), self.cell); } /// The size of the terminal. This is the same as the screen without @@ -39,7 +39,7 @@ pub const Size = struct { self.padding = explicit; // Now we can calculate the balanced padding - self.padding = Padding.balanced( + self.padding = .balanced( self.screen, self.grid(), self.cell, diff --git a/src/terminal/PageList.zig b/src/terminal/PageList.zig index 95519fe99..300af8e13 100644 --- a/src/terminal/PageList.zig +++ b/src/terminal/PageList.zig @@ -287,8 +287,8 @@ fn initPages( // Initialize the first set of pages to contain our viewport so that // the top of the first page is always the active area. node.* = .{ - .data = Page.initBuf( - OffsetBuf.init(page_buf), + .data = .initBuf( + .init(page_buf), Page.layout(cap), ), }; @@ -472,7 +472,7 @@ pub fn clone( }; // Setup our pools - break :alloc try MemoryPool.init( + break :alloc try .init( alloc, std.heap.page_allocator, page_count, @@ -1201,7 +1201,7 @@ const ReflowCursor = struct { node.data.size.rows = 1; list.pages.insertAfter(self.node, node); - self.* = ReflowCursor.init(node); + self.* = .init(node); self.new_rows = new_rows; } @@ -1817,7 +1817,7 @@ pub fn grow(self: *PageList) !?*List.Node { @memset(buf, 0); // Initialize our new page and reinsert it as the last - first.data = Page.initBuf(OffsetBuf.init(buf), layout); + first.data = .initBuf(.init(buf), layout); first.data.size.rows = 1; self.pages.insertAfter(last, first); @@ -1989,7 +1989,7 @@ fn createPageExt( // to undefined, 0xAA. if (comptime std.debug.runtime_safety) @memset(page_buf, 0); - page.* = .{ .data = Page.initBuf(OffsetBuf.init(page_buf), layout) }; + page.* = .{ .data = .initBuf(.init(page_buf), layout) }; page.data.size.rows = 0; if (total_size) |v| { diff --git a/src/terminal/Parser.zig b/src/terminal/Parser.zig index 4e74f04ba..14ed6d6df 100644 --- a/src/terminal/Parser.zig +++ b/src/terminal/Parser.zig @@ -217,7 +217,7 @@ intermediates_idx: u8 = 0, /// Param tracking, building params: [MAX_PARAMS]u16 = undefined, -params_sep: Action.CSI.SepList = Action.CSI.SepList.initEmpty(), +params_sep: Action.CSI.SepList = .initEmpty(), params_idx: u8 = 0, param_acc: u16 = 0, param_acc_idx: u8 = 0, @@ -395,7 +395,7 @@ fn doAction(self: *Parser, action: TransitionAction, c: u8) ?Action { pub fn clear(self: *Parser) void { self.intermediates_idx = 0; self.params_idx = 0; - self.params_sep = Action.CSI.SepList.initEmpty(); + self.params_sep = .initEmpty(); self.param_acc = 0; self.param_acc_idx = 0; } diff --git a/src/terminal/Screen.zig b/src/terminal/Screen.zig index 9ab4b23e2..2688b03a7 100644 --- a/src/terminal/Screen.zig +++ b/src/terminal/Screen.zig @@ -171,7 +171,7 @@ pub const SavedCursor = struct { /// State required for all charset operations. pub const CharsetState = struct { /// The list of graphical charsets by slot - charsets: CharsetArray = CharsetArray.initFill(charsets.Charset.utf8), + charsets: CharsetArray = .initFill(charsets.Charset.utf8), /// GL is the slot to use when using a 7-bit printable char (up to 127) /// GR used for 8-bit printable chars. @@ -2433,7 +2433,7 @@ pub fn selectLine(self: *const Screen, opts: SelectLine) ?Selection { return null; }; - return Selection.init(start, end, false); + return .init(start, end, false); } /// Return the selection for all contents on the screen. Surrounding @@ -2489,7 +2489,7 @@ pub fn selectAll(self: *Screen) ?Selection { return null; }; - return Selection.init(start, end, false); + return .init(start, end, false); } /// Select the nearest word to start point that is between start_pt and @@ -2624,7 +2624,7 @@ pub fn selectWord(self: *Screen, pin: Pin) ?Selection { break :start prev; }; - return Selection.init(start, end, false); + return .init(start, end, false); } /// Select the command output under the given point. The limits of the output @@ -2724,7 +2724,7 @@ pub fn selectOutput(self: *Screen, pin: Pin) ?Selection { break :boundary it_prev; }; - return Selection.init(start, end, false); + return .init(start, end, false); } /// Returns the selection bounds for the prompt at the given point. If the @@ -2805,7 +2805,7 @@ pub fn selectPrompt(self: *Screen, pin: Pin) ?Selection { break :end it_prev; }; - return Selection.init(start, end, false); + return .init(start, end, false); } pub const LineIterator = struct { diff --git a/src/terminal/Selection.zig b/src/terminal/Selection.zig index a90595d20..267f223d5 100644 --- a/src/terminal/Selection.zig +++ b/src/terminal/Selection.zig @@ -228,7 +228,7 @@ pub fn order(self: Selection, s: *const Screen) Order { /// Note that only forward and reverse are useful desired orders for this /// function. All other orders act as if forward order was desired. pub fn ordered(self: Selection, s: *const Screen, desired: Order) Selection { - if (self.order(s) == desired) return Selection.init( + if (self.order(s) == desired) return .init( self.start(), self.end(), self.rectangle, @@ -237,9 +237,9 @@ pub fn ordered(self: Selection, s: *const Screen, desired: Order) Selection { const tl = self.topLeft(s); const br = self.bottomRight(s); return switch (desired) { - .forward => Selection.init(tl, br, self.rectangle), - .reverse => Selection.init(br, tl, self.rectangle), - else => Selection.init(tl, br, self.rectangle), + .forward => .init(tl, br, self.rectangle), + .reverse => .init(br, tl, self.rectangle), + else => .init(tl, br, self.rectangle), }; } diff --git a/src/terminal/StringMap.zig b/src/terminal/StringMap.zig index 9892c13df..dde69d25e 100644 --- a/src/terminal/StringMap.zig +++ b/src/terminal/StringMap.zig @@ -80,7 +80,7 @@ pub const Match = struct { const end_idx: usize = @intCast(self.region.ends()[0] - 1); const start_pt = self.map.map[self.offset + start_idx]; const end_pt = self.map.map[self.offset + end_idx]; - return Selection.init(start_pt, end_pt, false); + return .init(start_pt, end_pt, false); } }; diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index efb9684eb..595fee1ba 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -79,7 +79,7 @@ default_palette: color.Palette = color.default, color_palette: struct { const Mask = std.StaticBitSet(@typeInfo(color.Palette).array.len); colors: color.Palette = color.default, - mask: Mask = Mask.initEmpty(), + mask: Mask = .initEmpty(), } = .{}, /// The previous printed character. This is used for the repeat previous @@ -210,9 +210,9 @@ pub fn init( .cols = cols, .rows = rows, .active_screen = .primary, - .screen = try Screen.init(alloc, cols, rows, opts.max_scrollback), - .secondary_screen = try Screen.init(alloc, cols, rows, 0), - .tabstops = try Tabstops.init(alloc, cols, TABSTOP_INTERVAL), + .screen = try .init(alloc, cols, rows, opts.max_scrollback), + .secondary_screen = try .init(alloc, cols, rows, 0), + .tabstops = try .init(alloc, cols, TABSTOP_INTERVAL), .scrolling_region = .{ .top = 0, .bottom = rows - 1, @@ -2454,7 +2454,7 @@ pub fn resize( // Resize our tabstops if (self.cols != cols) { self.tabstops.deinit(alloc); - self.tabstops = try Tabstops.init(alloc, cols, 8); + self.tabstops = try .init(alloc, cols, 8); } // If we're making the screen smaller, dealloc the unused items. diff --git a/src/terminal/bitmap_allocator.zig b/src/terminal/bitmap_allocator.zig index f96d39831..68d968768 100644 --- a/src/terminal/bitmap_allocator.zig +++ b/src/terminal/bitmap_allocator.zig @@ -403,7 +403,7 @@ test "BitmapAllocator alloc sequentially" { const buf = try alloc.alignedAlloc(u8, Alloc.base_align, layout.total_size); defer alloc.free(buf); - var bm = Alloc.init(OffsetBuf.init(buf), layout); + var bm = Alloc.init(.init(buf), layout); const ptr = try bm.alloc(u8, buf, 1); ptr[0] = 'A'; @@ -429,7 +429,7 @@ test "BitmapAllocator alloc non-byte" { const buf = try alloc.alignedAlloc(u8, Alloc.base_align, layout.total_size); defer alloc.free(buf); - var bm = Alloc.init(OffsetBuf.init(buf), layout); + var bm = Alloc.init(.init(buf), layout); const ptr = try bm.alloc(u21, buf, 1); ptr[0] = 'A'; @@ -453,7 +453,7 @@ test "BitmapAllocator alloc non-byte multi-chunk" { const buf = try alloc.alignedAlloc(u8, Alloc.base_align, layout.total_size); defer alloc.free(buf); - var bm = Alloc.init(OffsetBuf.init(buf), layout); + var bm = Alloc.init(.init(buf), layout); const ptr = try bm.alloc(u21, buf, 6); try testing.expectEqual(@as(usize, 6), ptr.len); for (ptr) |*v| v.* = 'A'; @@ -478,7 +478,7 @@ test "BitmapAllocator alloc large" { const buf = try alloc.alignedAlloc(u8, Alloc.base_align, layout.total_size); defer alloc.free(buf); - var bm = Alloc.init(OffsetBuf.init(buf), layout); + var bm = Alloc.init(.init(buf), layout); const ptr = try bm.alloc(u8, buf, 129); ptr[0] = 'A'; bm.free(buf, ptr); diff --git a/src/terminal/hash_map.zig b/src/terminal/hash_map.zig index 0cc17a747..9a16be3b2 100644 --- a/src/terminal/hash_map.zig +++ b/src/terminal/hash_map.zig @@ -893,7 +893,7 @@ test "HashMap basic usage" { const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); const count = 5; var i: u32 = 0; @@ -927,7 +927,7 @@ test "HashMap ensureTotalCapacity" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); const initial_capacity = map.capacity(); try testing.expect(initial_capacity >= 20); @@ -947,7 +947,7 @@ test "HashMap ensureUnusedCapacity with tombstones" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); var i: i32 = 0; while (i < 100) : (i += 1) { @@ -965,7 +965,7 @@ test "HashMap clearRetainingCapacity" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); map.clearRetainingCapacity(); @@ -996,7 +996,7 @@ test "HashMap ensureTotalCapacity with existing elements" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); try map.put(0, 0); try expectEqual(map.count(), 1); @@ -1015,7 +1015,7 @@ test "HashMap remove" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); var i: u32 = 0; while (i < 16) : (i += 1) { @@ -1053,7 +1053,7 @@ test "HashMap reverse removes" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); var i: u32 = 0; while (i < 16) : (i += 1) { @@ -1081,7 +1081,7 @@ test "HashMap multiple removes on same metadata" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); var i: u32 = 0; while (i < 16) : (i += 1) { @@ -1124,7 +1124,7 @@ test "HashMap put and remove loop in random order" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); var keys = std.ArrayList(u32).init(alloc); defer keys.deinit(); @@ -1162,7 +1162,7 @@ test "HashMap put" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); var i: u32 = 0; while (i < 16) : (i += 1) { @@ -1193,7 +1193,7 @@ test "HashMap put full load" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); for (0..cap) |i| try map.put(i, i); for (0..cap) |i| try expectEqual(map.get(i).?, i); @@ -1209,7 +1209,7 @@ test "HashMap putAssumeCapacity" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); var i: u32 = 0; while (i < 20) : (i += 1) { @@ -1244,7 +1244,7 @@ test "HashMap repeat putAssumeCapacity/remove" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); const limit = cap; @@ -1280,7 +1280,7 @@ test "HashMap getOrPut" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); var i: u32 = 0; while (i < 10) : (i += 1) { @@ -1309,7 +1309,7 @@ test "HashMap basic hash map usage" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); try testing.expect((try map.fetchPut(1, 11)) == null); try testing.expect((try map.fetchPut(2, 22)) == null); @@ -1360,7 +1360,7 @@ test "HashMap ensureUnusedCapacity" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); try map.ensureUnusedCapacity(32); try testing.expectError(error.OutOfMemory, map.ensureUnusedCapacity(cap + 1)); @@ -1374,7 +1374,7 @@ test "HashMap removeByPtr" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); var i: i32 = undefined; i = 0; @@ -1405,7 +1405,7 @@ test "HashMap removeByPtr 0 sized key" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); try map.put(0, 0); @@ -1429,7 +1429,7 @@ test "HashMap repeat fetchRemove" { const layout = Map.layoutForCapacity(cap); const buf = try alloc.alignedAlloc(u8, Map.base_align, layout.total_size); defer alloc.free(buf); - var map = Map.init(OffsetBuf.init(buf), layout); + var map = Map.init(.init(buf), layout); map.putAssumeCapacity(0, {}); map.putAssumeCapacity(1, {}); @@ -1457,7 +1457,7 @@ test "OffsetHashMap basic usage" { const layout = OffsetMap.layout(cap); const buf = try alloc.alignedAlloc(u8, OffsetMap.base_align, layout.total_size); defer alloc.free(buf); - var offset_map = OffsetMap.init(OffsetBuf.init(buf), layout); + var offset_map = OffsetMap.init(.init(buf), layout); var map = offset_map.map(buf.ptr); const count = 5; @@ -1492,7 +1492,7 @@ test "OffsetHashMap remake map" { const layout = OffsetMap.layout(cap); const buf = try alloc.alignedAlloc(u8, OffsetMap.base_align, layout.total_size); defer alloc.free(buf); - var offset_map = OffsetMap.init(OffsetBuf.init(buf), layout); + var offset_map = OffsetMap.init(.init(buf), layout); { var map = offset_map.map(buf.ptr); diff --git a/src/terminal/kitty/graphics_command.zig b/src/terminal/kitty/graphics_command.zig index 61ba33a4d..adc6edafe 100644 --- a/src/terminal/kitty/graphics_command.zig +++ b/src/terminal/kitty/graphics_command.zig @@ -155,17 +155,17 @@ pub const Parser = struct { break :action c; }; const control: Command.Control = switch (action) { - 'q' => .{ .query = try Transmission.parse(self.kv) }, - 't' => .{ .transmit = try Transmission.parse(self.kv) }, + 'q' => .{ .query = try .parse(self.kv) }, + 't' => .{ .transmit = try .parse(self.kv) }, 'T' => .{ .transmit_and_display = .{ - .transmission = try Transmission.parse(self.kv), - .display = try Display.parse(self.kv), + .transmission = try .parse(self.kv), + .display = try .parse(self.kv), } }, - 'p' => .{ .display = try Display.parse(self.kv) }, - 'd' => .{ .delete = try Delete.parse(self.kv) }, - 'f' => .{ .transmit_animation_frame = try AnimationFrameLoading.parse(self.kv) }, - 'a' => .{ .control_animation = try AnimationControl.parse(self.kv) }, - 'c' => .{ .compose_animation = try AnimationFrameComposition.parse(self.kv) }, + 'p' => .{ .display = try .parse(self.kv) }, + 'd' => .{ .delete = try .parse(self.kv) }, + 'f' => .{ .transmit_animation_frame = try .parse(self.kv) }, + 'a' => .{ .control_animation = try .parse(self.kv) }, + 'c' => .{ .compose_animation = try .parse(self.kv) }, else => return error.InvalidFormat, }; diff --git a/src/terminal/kitty/graphics_exec.zig b/src/terminal/kitty/graphics_exec.zig index 25c819b10..f917c104a 100644 --- a/src/terminal/kitty/graphics_exec.zig +++ b/src/terminal/kitty/graphics_exec.zig @@ -324,7 +324,7 @@ fn loadAndAddImage( } break :loading loading.*; - } else try LoadingImage.init(alloc, cmd); + } else try .init(alloc, cmd); // We only want to deinit on error. If we're chunking, then we don't // want to deinit at all. If we're not chunking, then we'll deinit diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index ce7afdf64..932964137 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -1354,8 +1354,8 @@ pub const Parser = struct { } switch (self.command) { - .report_color => |*c| c.terminator = Terminator.init(terminator_ch), - .kitty_color_protocol => |*c| c.terminator = Terminator.init(terminator_ch), + .report_color => |*c| c.terminator = .init(terminator_ch), + .kitty_color_protocol => |*c| c.terminator = .init(terminator_ch), else => {}, } diff --git a/src/terminal/page.zig b/src/terminal/page.zig index acb757592..d7f252af1 100644 --- a/src/terminal/page.zig +++ b/src/terminal/page.zig @@ -241,23 +241,23 @@ pub const Page = struct { l.styles_layout, .{}, ), - .string_alloc = StringAlloc.init( + .string_alloc = .init( buf.add(l.string_alloc_start), l.string_alloc_layout, ), - .grapheme_alloc = GraphemeAlloc.init( + .grapheme_alloc = .init( buf.add(l.grapheme_alloc_start), l.grapheme_alloc_layout, ), - .grapheme_map = GraphemeMap.init( + .grapheme_map = .init( buf.add(l.grapheme_map_start), l.grapheme_map_layout, ), - .hyperlink_map = hyperlink.Map.init( + .hyperlink_map = .init( buf.add(l.hyperlink_map_start), l.hyperlink_map_layout, ), - .hyperlink_set = hyperlink.Set.init( + .hyperlink_set = .init( buf.add(l.hyperlink_set_start), l.hyperlink_set_layout, .{}, @@ -280,7 +280,7 @@ pub const Page = struct { // We zero the page memory as u64 instead of u8 because // we can and it's empirically quite a bit faster. @memset(@as([*]u64, @ptrCast(self.memory))[0 .. self.memory.len / 8], 0); - self.* = initBuf(OffsetBuf.init(self.memory), layout(self.capacity)); + self.* = initBuf(.init(self.memory), layout(self.capacity)); } pub const IntegrityError = error{ @@ -2260,7 +2260,7 @@ test "Page appendGrapheme small" { defer page.deinit(); const rac = page.getRowAndCell(0, 0); - rac.cell.* = Cell.init(0x09); + rac.cell.* = .init(0x09); // One try page.appendGrapheme(rac.row, rac.cell, 0x0A); @@ -2289,7 +2289,7 @@ test "Page appendGrapheme larger than chunk" { defer page.deinit(); const rac = page.getRowAndCell(0, 0); - rac.cell.* = Cell.init(0x09); + rac.cell.* = .init(0x09); const count = grapheme_chunk_len * 10; for (0..count) |i| { @@ -2312,11 +2312,11 @@ test "Page clearGrapheme not all cells" { defer page.deinit(); const rac = page.getRowAndCell(0, 0); - rac.cell.* = Cell.init(0x09); + rac.cell.* = .init(0x09); try page.appendGrapheme(rac.row, rac.cell, 0x0A); const rac2 = page.getRowAndCell(1, 0); - rac2.cell.* = Cell.init(0x09); + rac2.cell.* = .init(0x09); try page.appendGrapheme(rac2.row, rac2.cell, 0x0A); // Clear it diff --git a/src/terminal/search.zig b/src/terminal/search.zig index 56b181c48..2f87f894b 100644 --- a/src/terminal/search.zig +++ b/src/terminal/search.zig @@ -365,7 +365,7 @@ const SlidingWindow = struct { } self.assertIntegrity(); - return Selection.init(tl, br, false); + return .init(tl, br, false); } /// Convert a data index into a pin. @@ -417,7 +417,7 @@ const SlidingWindow = struct { // Initialize our metadata for the node. var meta: Meta = .{ .node = node, - .cell_map = Page.CellMap.init(alloc), + .cell_map = .init(alloc), }; errdefer meta.deinit(); diff --git a/src/terminal/sgr.zig b/src/terminal/sgr.zig index 2bc32c5f9..e4b85fbdd 100644 --- a/src/terminal/sgr.zig +++ b/src/terminal/sgr.zig @@ -98,7 +98,7 @@ pub const Attribute = union(enum) { /// Parser parses the attributes from a list of SGR parameters. pub const Parser = struct { params: []const u16, - params_sep: SepList = SepList.initEmpty(), + params_sep: SepList = .initEmpty(), idx: usize = 0, /// Next returns the next attribute or null if there are no more attributes. @@ -376,7 +376,7 @@ fn testParse(params: []const u16) Attribute { } fn testParseColon(params: []const u16) Attribute { - var p: Parser = .{ .params = params, .params_sep = SepList.initFull() }; + var p: Parser = .{ .params = params, .params_sep = .initFull() }; return p.next().?; } diff --git a/src/terminal/style.zig b/src/terminal/style.zig index 34b07772a..f35a4e1f7 100644 --- a/src/terminal/style.zig +++ b/src/terminal/style.zig @@ -302,9 +302,9 @@ pub const Style = struct { .underline = std.meta.activeTag(style.underline_color), }, .data = .{ - .fg = Data.fromColor(style.fg_color), - .bg = Data.fromColor(style.bg_color), - .underline = Data.fromColor(style.underline_color), + .fg = .fromColor(style.fg_color), + .bg = .fromColor(style.bg_color), + .underline = .fromColor(style.underline_color), }, .flags = style.flags, }; @@ -349,7 +349,7 @@ test "Set basic usage" { const style: Style = .{ .flags = .{ .bold = true } }; const style2: Style = .{ .flags = .{ .italic = true } }; - var set = Set.init(OffsetBuf.init(buf), layout, .{}); + var set = Set.init(.init(buf), layout, .{}); // Add style const id = try set.add(buf, style); diff --git a/src/terminal/x11_color.zig b/src/terminal/x11_color.zig index 88bc30f09..977cd4538 100644 --- a/src/terminal/x11_color.zig +++ b/src/terminal/x11_color.zig @@ -33,7 +33,7 @@ fn colorMap() !ColorMap { } assert(i == len); - return ColorMap.initComptime(kvs); + return .initComptime(kvs); } /// This is the rgb.txt file from the X11 project. This was last sourced diff --git a/src/unicode/props.zig b/src/unicode/props.zig index 8c7621b79..99c57aa0a 100644 --- a/src/unicode/props.zig +++ b/src/unicode/props.zig @@ -125,7 +125,7 @@ pub fn get(cp: u21) Properties { return .{ .width = @intCast(@min(2, @max(0, zg_width))), - .grapheme_boundary_class = GraphemeBoundaryClass.init(cp), + .grapheme_boundary_class = .init(cp), }; } From 468bfce09167eefc63721959369435d5e7f9d479 Mon Sep 17 00:00:00 2001 From: Kat <65649991+00-kat@users.noreply.github.com> Date: Tue, 27 May 2025 22:40:01 +1000 Subject: [PATCH 015/371] Correct `$XDG_CONFIG_DIR` to `$XDG_CONFIG_HOME` in theme documentation. --- src/cli/list_themes.zig | 2 +- src/config/Config.zig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cli/list_themes.zig b/src/cli/list_themes.zig index 54f4c0969..4bb8a74eb 100644 --- a/src/cli/list_themes.zig +++ b/src/cli/list_themes.zig @@ -77,7 +77,7 @@ const ThemeListElement = struct { /// Two different directories will be searched for themes. /// /// The first directory is the `themes` subdirectory of your Ghostty -/// configuration directory. This is `$XDG_CONFIG_DIR/ghostty/themes` or +/// configuration directory. This is `$XDG_CONFIG_HOME/ghostty/themes` or /// `~/.config/ghostty/themes`. /// /// The second directory is the `themes` subdirectory of the Ghostty resources diff --git a/src/config/Config.zig b/src/config/Config.zig index 6f1e89d41..4eb419f87 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -410,7 +410,7 @@ pub const renamed = std.StaticStringMap([]const u8).initComptime(&.{ /// include path separators unless it is an absolute pathname. /// /// The first directory is the `themes` subdirectory of your Ghostty -/// configuration directory. This is `$XDG_CONFIG_DIR/ghostty/themes` or +/// configuration directory. This is `$XDG_CONFIG_HOME/ghostty/themes` or /// `~/.config/ghostty/themes`. /// /// The second directory is the `themes` subdirectory of the Ghostty resources From 1ce654494504dedde11b0bbe7ae1493a9db45c4d Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Sun, 25 May 2025 19:00:28 -0600 Subject: [PATCH 016/371] Wrap comment at 80 cols --- src/terminal/point.zig | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/terminal/point.zig b/src/terminal/point.zig index 12b71014b..f2544f90c 100644 --- a/src/terminal/point.zig +++ b/src/terminal/point.zig @@ -3,10 +3,12 @@ const Allocator = std.mem.Allocator; const assert = std.debug.assert; const size = @import("size.zig"); -/// The possible reference locations for a point. When someone says "(42, 80)" in the context of a terminal, that could mean multiple -/// things: it is in the current visible viewport? the current active -/// area of the screen where the cursor is? the entire scrollback history? -/// etc. This tag is used to differentiate those cases. +/// The possible reference locations for a point. When someone says "(42, 80)" +/// in the context of a terminal, that could mean multiple things: it is in the +/// current visible viewport? the current active area of the screen where the +/// cursor is? the entire scrollback history? etc. +/// +/// This tag is used to differentiate those cases. pub const Tag = enum { /// Top-left is part of the active area where a running program can /// jump the cursor and make changes. The active area is the "editable" From 58592d3f65aff9d055ce264fac5e50776233aa52 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Sun, 25 May 2025 19:01:39 -0600 Subject: [PATCH 017/371] GTK: Don't clamp cursorpos, allow negative values Other apprts don't do this, so this should be consistent. --- src/apprt/gtk/Surface.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 30a3d28f7..1ee00ff1b 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -1563,7 +1563,7 @@ fn gtkMouseMotion( const scaled = self.scaledCoordinates(x, y); const pos: apprt.CursorPos = .{ - .x = @floatCast(@max(0, scaled.x)), + .x = @floatCast(scaled.x), .y = @floatCast(scaled.y), }; From ecdac8c8c1993b9daaf27745a8ed5583e4ac57d1 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Sun, 25 May 2025 19:24:29 -0600 Subject: [PATCH 018/371] terminal: rework selection logic in core surface This logic is cleaner and produces better behavior when selecting by dragging the mouse outside the bounds of the surface, previously when doing this on the left side of the surface selections would include the first cell of the next row, this is no longer the case. This introduces methods on PageList.Pin which move a pin left or right while wrapping to the prev/next row, or clamping to the ends of the row. These need unit tests. --- src/Surface.zig | 274 +++++++++++++++++++------------------- src/terminal/PageList.zig | 68 ++++++++++ 2 files changed, 205 insertions(+), 137 deletions(-) diff --git a/src/Surface.zig b/src/Surface.zig index 32f7487d3..3726c37c7 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -3678,163 +3678,163 @@ fn dragLeftClickSingle( drag_pin: terminal.Pin, xpos: f64, ) !void { - // NOTE(mitchellh): This logic super sucks. There has to be an easier way - // to calculate this, but this is good for a v1. Selection isn't THAT - // common so its not like this performance heavy code is running that - // often. - // TODO: unit test this, this logic sucks + // TODO: Unit tests for this logic, maybe extract it out to a pure + // function so that it can be tested without mocking state. - // If we were selecting, and we switched directions, then we restart - // calculations because it forces us to reconsider if the first cell is - // selected. - self.checkResetSelSwitch(drag_pin); - - // Our logic for determining if the starting cell is selected: + // Explanation: // - // - The "xboundary" is 60% the width of a cell from the left. We choose - // 60% somewhat arbitrarily based on feeling. - // - If we started our click left of xboundary, backwards selections - // can NEVER select the current char. - // - If we started our click right of xboundary, backwards selections - // ALWAYS selected the current char, but we must move the cursor - // left of the xboundary. - // - Inverted logic for forwards selections. + // # Normal selections // + // ## Left-to-right selections + // - The clicked cell is included if it was clicked to the left of its + // threshold point and the drag location is right of the threshold point. + // - The cell under the cursor (the "drag cell") is included if the drag + // location is right of its threshold point. + // + // ## Right-to-left selections + // - The clicked cell is included if it was clicked to the right of its + // threshold point and the drag location is left of the threshold point. + // - The cell under the cursor (the "drag cell") is included if the drag + // location is left of its threshold point. + // + // # Rectangular selections + // + // Rectangular selections are handled similarly, except that + // entire columns are considered rather than individual cells. - // Our clicking point const click_pin = self.mouse.left_click_pin.?.*; - // the boundary point at which we consider selection or non-selection - const cell_width_f64: f64 = @floatFromInt(self.size.cell.width); - const cell_xboundary = cell_width_f64 * 0.6; + // We only include cells in the selection if the threshold point lies + // between the start and end points of the selection. A threshold of + // 60% of the cell width was chosen empirically because it felt good. + const threshold_point: u32 = @intFromFloat( + @as(f64, @floatFromInt(self.size.cell.width)) * 0.6, + ); - // first xpos of the clicked cell adjusted for padding - const left_padding_f64: f64 = @as(f64, @floatFromInt(self.size.padding.left)); - const cell_xstart = @as(f64, @floatFromInt(click_pin.x)) * cell_width_f64; - const cell_start_xpos = self.mouse.left_click_xpos - cell_xstart - left_padding_f64; + // We use this to clamp the pixel positions below. + const max_x = self.size.grid().columns * self.size.cell.width - 1; - // If this is the same cell, then we only start the selection if weve - // moved past the boundary point the opposite direction from where we - // started. - if (click_pin.eql(drag_pin)) { - // Ensuring to adjusting the cursor position for padding - const cell_xpos = xpos - cell_xstart - left_padding_f64; - const selected: bool = if (cell_start_xpos < cell_xboundary) - cell_xpos >= cell_xboundary - else - cell_xpos < cell_xboundary; + // We need to know how far across in the cell the drag pos is, so + // we subtract the padding and then take it modulo the cell width. + const drag_x = @min( + max_x, + @as(u32, @intFromFloat(@max(0.0, xpos))) -| self.size.padding.left, + ); + const drag_x_frac = drag_x % self.size.cell.width; - try self.setSelection(if (selected) terminal.Selection.init( - drag_pin, - drag_pin, - SurfaceMouse.isRectangleSelectState(self.mouse.mods), - ) else null); + // We figure out the fractional part of the click x position similarly. + // + // NOTE: This click_x position may be incorrect for the current location + // of the click pin, since it's a tracked pin that can move, so we + // should only use this for the fractional position not absolute. + const click_x = @min( + max_x, + @as(u32, @intFromFloat(@max(0.0, self.mouse.left_click_xpos))) -| + self.size.padding.left, + ); + const click_x_frac = click_x % self.size.cell.width; - return; - } + // Whether or not this is a rectangular selection. + const rectangle_selection = + SurfaceMouse.isRectangleSelectState(self.mouse.mods); - // If this is a different cell and we haven't started selection, - // we determine the starting cell first. - if (self.io.terminal.screen.selection == null) { - // - If we're moving to a point before the start, then we select - // the starting cell if we started after the boundary, else - // we start selection of the prior cell. - // - Inverse logic for a point after the start. - const start: terminal.Pin = if (dragLeftClickBefore( - drag_pin, - click_pin, - self.mouse.mods, - )) start: { - if (cell_start_xpos >= cell_xboundary) break :start click_pin; - if (click_pin.x > 0) break :start click_pin.left(1); - var start = click_pin.up(1) orelse click_pin; - start.x = self.io.terminal.screen.pages.cols - 1; - break :start start; - } else start: { - if (cell_start_xpos < cell_xboundary) break :start click_pin; - if (click_pin.x < self.io.terminal.screen.pages.cols - 1) - break :start click_pin.right(1); - var start = click_pin.down(1) orelse click_pin; - start.x = 0; - break :start start; - }; + // Whether the click pin and drag pin are equal. + const same_pin = drag_pin.eql(click_pin); - try self.setSelection(terminal.Selection.init( - start, - drag_pin, - SurfaceMouse.isRectangleSelectState(self.mouse.mods), - )); - return; - } + // Whether or not the end point of our selection is before the start point. + const end_before_start = ebs: { + if (same_pin) { + break :ebs drag_x_frac < click_x_frac; + } - // TODO: detect if selection point is passed the point where we've - // actually written data before and disallow it. - - // We moved! Set the selection end point. The start point should be - // set earlier. - assert(self.io.terminal.screen.selection != null); - const sel = self.io.terminal.screen.selection.?; - try self.setSelection(terminal.Selection.init( - sel.start(), - drag_pin, - sel.rectangle, - )); -} - -// Resets the selection if we switched directions, depending on the select -// mode. See dragLeftClickSingle for more details. -fn checkResetSelSwitch( - self: *Surface, - drag_pin: terminal.Pin, -) void { - const screen = &self.io.terminal.screen; - const sel = screen.selection orelse return; - const sel_start = sel.start(); - const sel_end = sel.end(); - - var reset: bool = false; - if (sel.rectangle) { - // When we're in rectangle mode, we reset the selection relative to - // the click point depending on the selection mode we're in, with - // the exception of single-column selections, which we always reset - // on if we drift. - if (sel_start.x == sel_end.x) { - reset = drag_pin.x != sel_start.x; - } else { - reset = switch (sel.order(screen)) { - .forward => drag_pin.x < sel_start.x or drag_pin.before(sel_start), - .reverse => drag_pin.x > sel_start.x or sel_start.before(drag_pin), - .mirrored_forward => drag_pin.x > sel_start.x or drag_pin.before(sel_start), - .mirrored_reverse => drag_pin.x < sel_start.x or sel_start.before(drag_pin), + // Special handling for rectangular selections, we only use x position. + if (rectangle_selection) { + break :ebs switch (std.math.order(drag_pin.x, click_pin.x)) { + .eq => drag_x_frac < click_x_frac, + .lt => true, + .gt => false, }; } - } else { - // Normal select uses simpler logic that is just based on the - // selection start/end. - reset = if (sel_end.before(sel_start)) - sel_start.before(drag_pin) + + break :ebs drag_pin.before(click_pin); + }; + + // Whether or not the the click pin cell + // should be included in the selection. + const include_click_cell = if (end_before_start) + click_x_frac >= threshold_point + else + click_x_frac < threshold_point; + + // Whether or not the the drag pin cell + // should be included in the selection. + const include_drag_cell = if (end_before_start) + drag_x_frac < threshold_point + else + drag_x_frac >= threshold_point; + + // If the click cell should be included in the selection then it's the + // start, otherwise we get the previous or next cell to it depending on + // the type and direction of the selection. + const start_pin = + if (include_click_cell) + click_pin + else if (end_before_start) + if (rectangle_selection) + click_pin.leftClamp(1) + else + click_pin.leftWrap(1) orelse click_pin + else if (rectangle_selection) + click_pin.rightClamp(1) else - drag_pin.before(sel_start); + click_pin.rightWrap(1) orelse click_pin; + + // Likewise for the end pin with the drag cell. + const end_pin = + if (include_drag_cell) + drag_pin + else if (end_before_start) + if (rectangle_selection) + drag_pin.rightClamp(1) + else + drag_pin.rightWrap(1) orelse drag_pin + else if (rectangle_selection) + drag_pin.leftClamp(1) + else + drag_pin.leftWrap(1) orelse drag_pin; + + // If the click cell is the same as the drag cell and the click cell + // shouldn't be included, or if the cells are adjacent such that the + // start or end pin becomes the other cell, and that cell should not + // be included, then we have no selection, so we set it to null. + // + // If in rectangular selection mode, we compare columns as well. + // + // TODO(qwerasd): this can/should probably be refactored, it's a bit + // repetitive and does excess work in rectangle mode. + if ((!include_click_cell and same_pin) or + (!include_click_cell and rectangle_selection and click_pin.x == drag_pin.x) or + (!include_click_cell and end_pin.eql(click_pin)) or + (!include_click_cell and rectangle_selection and end_pin.x == click_pin.x) or + (!include_drag_cell and start_pin.eql(drag_pin)) or + (!include_drag_cell and rectangle_selection and start_pin.x == drag_pin.x)) + { + try self.setSelection(null); + return; } - // Nullifying a selection can't fail. - if (reset) self.setSelection(null) catch unreachable; -} + // TODO: Clamp selection to the screen area, don't + // let it extend past the last written row. -// Handles how whether or not the drag screen point is before the click point. -// When we are in rectangle select, we only interpret the x axis to determine -// where to start the selection (before or after the click point). See -// dragLeftClickSingle for more details. -fn dragLeftClickBefore( - drag_pin: terminal.Pin, - click_pin: terminal.Pin, - mods: input.Mods, -) bool { - if (mods.ctrlOrSuper() and mods.alt) { - return drag_pin.x < click_pin.x; - } + try self.setSelection( + terminal.Selection.init( + start_pin, + end_pin, + rectangle_selection, + ), + ); - return drag_pin.before(click_pin); + return; } /// Call to notify Ghostty that the color scheme for the terminal has diff --git a/src/terminal/PageList.zig b/src/terminal/PageList.zig index 300af8e13..a0eb3edd1 100644 --- a/src/terminal/PageList.zig +++ b/src/terminal/PageList.zig @@ -3572,6 +3572,74 @@ pub const Pin = struct { return result; } + /// Move the pin left n columns, stopping at the start of the row. + pub fn leftClamp(self: Pin, n: size.CellCountInt) Pin { + var result = self; + result.x -|= n; + return result; + } + + /// Move the pin right n columns, stopping at the end of the row. + pub fn rightClamp(self: Pin, n: size.CellCountInt) Pin { + var result = self; + result.x = @min(self.x +| n, self.node.data.size.cols - 1); + return result; + } + + /// Move the pin left n cells, wrapping to the previous row as needed. + /// + /// If the offset goes beyond the top of the screen, returns null. + /// + /// TODO: Unit tests. + pub fn leftWrap(self: Pin, n: usize) ?Pin { + // NOTE: This assumes that all pages have the same width, which may + // be violated under certain circumstances by incomplete reflow. + const cols = self.node.data.size.cols; + const remaining_in_row = self.x; + + if (n <= remaining_in_row) return self.left(n); + + const extra_after_remaining = n - remaining_in_row; + + const rows_off = 1 + extra_after_remaining / cols; + + switch (self.upOverflow(rows_off)) { + .offset => |v| { + var result = v; + result.x = @intCast(cols - extra_after_remaining % cols); + return result; + }, + .overflow => return null, + } + } + + /// Move the pin right n cells, wrapping to the next row as needed. + /// + /// If the offset goes beyond the bottom of the screen, returns null. + /// + /// TODO: Unit tests. + pub fn rightWrap(self: Pin, n: usize) ?Pin { + // NOTE: This assumes that all pages have the same width, which may + // be violated under certain circumstances by incomplete reflow. + const cols = self.node.data.size.cols; + const remaining_in_row = cols - self.x - 1; + + if (n <= remaining_in_row) return self.right(n); + + const extra_after_remaining = n - remaining_in_row; + + const rows_off = 1 + extra_after_remaining / cols; + + switch (self.downOverflow(rows_off)) { + .offset => |v| { + var result = v; + result.x = @intCast(extra_after_remaining % cols - 1); + return result; + }, + .overflow => return null, + } + } + /// Move the pin down a certain number of rows, or return null if /// the pin goes beyond the end of the screen. pub fn down(self: Pin, n: usize) ?Pin { From 4d11673318e91d020655b1c4313de96c1084be47 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Mon, 26 May 2025 12:33:36 -0600 Subject: [PATCH 019/371] unit test mouse selection logic Adds many test cases for expected behavior of the selection logic, this will allow changes to be made more confidently in the future without fear of regressions. --- src/Surface.zig | 1164 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1128 insertions(+), 36 deletions(-) diff --git a/src/Surface.zig b/src/Surface.zig index 3726c37c7..ffe39d46d 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -3676,11 +3676,29 @@ fn dragLeftClickTriple( fn dragLeftClickSingle( self: *Surface, drag_pin: terminal.Pin, - xpos: f64, + drag_x: f64, ) !void { - // TODO: Unit tests for this logic, maybe extract it out to a pure - // function so that it can be tested without mocking state. + // This logic is in a separate function so that it can be unit tested. + try self.setSelection(mouseSelection( + self.mouse.left_click_pin.?.*, + drag_pin, + @intFromFloat(@max(0.0, self.mouse.left_click_xpos)), + @intFromFloat(@max(0.0, drag_x)), + self.mouse.mods, + self.size, + )); +} +/// Calculates the appropriate selection given pins and pixel x positions for +/// the click point and the drag point, as well as mouse mods and screen size. +fn mouseSelection( + click_pin: terminal.Pin, + drag_pin: terminal.Pin, + click_x: u32, + drag_x: u32, + mods: input.Mods, + size: rendererpkg.Size, +) ?terminal.Selection { // Explanation: // // # Normal selections @@ -3702,41 +3720,25 @@ fn dragLeftClickSingle( // Rectangular selections are handled similarly, except that // entire columns are considered rather than individual cells. - const click_pin = self.mouse.left_click_pin.?.*; - // We only include cells in the selection if the threshold point lies // between the start and end points of the selection. A threshold of // 60% of the cell width was chosen empirically because it felt good. - const threshold_point: u32 = @intFromFloat( - @as(f64, @floatFromInt(self.size.cell.width)) * 0.6, - ); + const threshold_point: u32 = @intFromFloat(@round( + @as(f64, @floatFromInt(size.cell.width)) * 0.6, + )); // We use this to clamp the pixel positions below. - const max_x = self.size.grid().columns * self.size.cell.width - 1; + const max_x = size.grid().columns * size.cell.width - 1; // We need to know how far across in the cell the drag pos is, so // we subtract the padding and then take it modulo the cell width. - const drag_x = @min( - max_x, - @as(u32, @intFromFloat(@max(0.0, xpos))) -| self.size.padding.left, - ); - const drag_x_frac = drag_x % self.size.cell.width; + const drag_x_frac = @min(max_x, drag_x -| size.padding.left) % size.cell.width; // We figure out the fractional part of the click x position similarly. - // - // NOTE: This click_x position may be incorrect for the current location - // of the click pin, since it's a tracked pin that can move, so we - // should only use this for the fractional position not absolute. - const click_x = @min( - max_x, - @as(u32, @intFromFloat(@max(0.0, self.mouse.left_click_xpos))) -| - self.size.padding.left, - ); - const click_x_frac = click_x % self.size.cell.width; + const click_x_frac = @min(max_x, click_x -| size.padding.left) % size.cell.width; // Whether or not this is a rectangular selection. - const rectangle_selection = - SurfaceMouse.isRectangleSelectState(self.mouse.mods); + const rectangle_selection = SurfaceMouse.isRectangleSelectState(mods); // Whether the click pin and drag pin are equal. const same_pin = drag_pin.eql(click_pin); @@ -3819,22 +3821,17 @@ fn dragLeftClickSingle( (!include_drag_cell and start_pin.eql(drag_pin)) or (!include_drag_cell and rectangle_selection and start_pin.x == drag_pin.x)) { - try self.setSelection(null); - return; + return null; } // TODO: Clamp selection to the screen area, don't // let it extend past the last written row. - try self.setSelection( - terminal.Selection.init( - start_pin, - end_pin, - rectangle_selection, - ), + return terminal.Selection.init( + start_pin, + end_pin, + rectangle_selection, ); - - return; } /// Call to notify Ghostty that the color scheme for the terminal has @@ -4819,3 +4816,1098 @@ fn presentSurface(self: *Surface) !void { {}, ); } + +test "Surface: selection logic" { + // Our screen size is 10x5 cells that are + // 10x20 px, with 5px padding on all sides. + const size: rendererpkg.Size = .{ + .cell = .{ .width = 10, .height = 20 }, + .padding = .{ .left = 5, .top = 5, .right = 5, .bottom = 5 }, + .screen = .{ .width = 110, .height = 110 }, + }; + var screen = try terminal.Screen.init(std.testing.allocator, 10, 5, 0); + defer screen.deinit(); + + // We are testing normal selection logic here so no mods. + const mods: input.Mods = .{}; + + const expectEqual = std.testing.expectEqualDeep; + + // LTR, including click and drag pin cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + + const start_pin = click_pin; + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // LTR, including click pin cell but not drag pin cell + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + + const start_pin = click_pin; + const end_pin = drag_pin.left(1); + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // LTR, including drag pin cell but not click pin cell + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At rightmost px in cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At rightmost px in cell. + + const start_pin = click_pin.right(1); + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // LTR, including neither click nor drag pin cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + + const start_pin = click_pin.right(1); + const end_pin = drag_pin.left(1); + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // LTR, empty selection (single cell on only left half) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + const drag_pin = click_pin; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 1; // At px 1 within the cell. + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // LTR, empty selection (single cell on only right half) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + const drag_pin = click_pin; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 2; // 1px left of right edge of cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // LTR, empty selection (between two cells, not crossing threshold) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 4, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // --- RTL + + // RTL, including click and drag pin cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + + const start_pin = click_pin; + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, including click pin cell but not drag pin cell + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + + const start_pin = click_pin; + const end_pin = drag_pin.right(1); + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, including drag pin cell but not click pin cell + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within cell. + + const start_pin = click_pin.left(1); + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, including neither click nor drag pin cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + + const start_pin = click_pin.left(1); + const end_pin = drag_pin.right(1); + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, empty selection (single cell on only left half) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + const drag_pin = click_pin; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 1; // At px 1 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // RTL, empty selection (single cell on only right half) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + const drag_pin = click_pin; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 2; // 1px left of right edge of cell + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // RTL, empty selection (between two cells, not crossing threshold) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 4, .y = 3 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 3 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // -- Wrapping + + // LTR, wrap excluded cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 9, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 0, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell + + const start_pin = screen.pages.pin(.{ + .viewport = .{ .x = 0, .y = 3 }, + }) orelse unreachable; + const end_pin = screen.pages.pin(.{ + .viewport = .{ .x = 9, .y = 3 }, + }) orelse unreachable; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, wrap excluded cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 0, .y = 4 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 9, .y = 2 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + + const start_pin = screen.pages.pin(.{ + .viewport = .{ .x = 9, .y = 3 }, + }) orelse unreachable; + const end_pin = screen.pages.pin(.{ + .viewport = .{ .x = 0, .y = 3 }, + }) orelse unreachable; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = false, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } +} + +test "Surface: rectangle selection logic" { + // Our screen size is 10x5 cells that are + // 10x20 px, with 5px padding on all sides. + const size: rendererpkg.Size = .{ + .cell = .{ .width = 10, .height = 20 }, + .padding = .{ .left = 5, .top = 5, .right = 5, .bottom = 5 }, + .screen = .{ .width = 110, .height = 110 }, + }; + var screen = try terminal.Screen.init(std.testing.allocator, 10, 5, 0); + defer screen.deinit(); + + // We hold ctrl and alt so that this test is platform-agnostic. + const mods: input.Mods = .{ + .ctrl = true, + .alt = true, + }; + + try std.testing.expect(SurfaceMouse.isRectangleSelectState(mods)); + + const expectEqual = std.testing.expectEqualDeep; + + // LTR, including click and drag pin cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + + const start_pin = click_pin; + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // LTR, including click pin cell but not drag pin cell + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + + const start_pin = click_pin; + const end_pin = drag_pin.left(1); + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // LTR, including drag pin cell but not click pin cell + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At rightmost px in cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At rightmost px in cell. + + const start_pin = click_pin.right(1); + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // LTR, including neither click nor drag pin cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + + const start_pin = click_pin.right(1); + const end_pin = drag_pin.left(1); + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // LTR, empty selection (single column on only left half) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 1; // At px 1 within the cell. + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // LTR, empty selection (single column on only right half) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 2; // 1px left of right edge of cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // LTR, empty selection (between two columns, not crossing threshold) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 4, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // --- RTL + + // RTL, including click and drag pin cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + + const start_pin = click_pin; + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, including click pin cell but not drag pin cell + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + + const start_pin = click_pin; + const end_pin = drag_pin.right(1); + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, including drag pin cell but not click pin cell + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within cell. + + const start_pin = click_pin.left(1); + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, including neither click nor drag pin cells + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 5, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At the rightmost px of the cell. + + const start_pin = click_pin.left(1); + const end_pin = drag_pin.right(1); + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, empty selection (single column on only left half) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 1; // At px 1 within the cell. + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 1; // At px 0 within the cell. + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // RTL, empty selection (single column on only right half) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 2; // 1px left of right edge of cell + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // RTL, empty selection (between two cells, not crossing threshold) + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 4, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 3, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + + try expectEqual( + null, + mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + ), + ); + } + + // -- Wrapping + + // LTR, do not wrap + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 9, .y = 2 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 0, .y = 4 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell + + const start_pin = click_pin; + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } + + // RTL, do not wrap + { + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = 0, .y = 4 }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = 9, .y = 2 }, + }) orelse unreachable; + + const click_x = + @as(u32, click_pin.x) * size.cell.width + size.padding.left + + 0; // At px 0 within the cell + const drag_x = + @as(u32, drag_pin.x) * size.cell.width + size.padding.left + + size.cell.width - 1; // At right edge of cell + + const start_pin = click_pin; + const end_pin = drag_pin; + + try expectEqual(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = true, + }, mouseSelection( + click_pin, + drag_pin, + click_x, + drag_x, + mods, + size, + )); + } +} From 6aa84d0e92ad4b88692a6da8c2834821574b5773 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Mon, 26 May 2025 14:31:59 -0600 Subject: [PATCH 020/371] test: introduce helper function for mouse selection tests Removes a lot of repeated code and makes the test cases easier to understand at a glance. --- src/Surface.zig | 1448 +++++++++++++---------------------------------- 1 file changed, 390 insertions(+), 1058 deletions(-) diff --git a/src/Surface.zig b/src/Surface.zig index ffe39d46d..8b4f58496 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -4817,7 +4817,29 @@ fn presentSurface(self: *Surface) !void { ); } -test "Surface: selection logic" { +/// Utility function for the unit tests for mouse selection logic. +/// +/// Tests a click and drag on a 10x5 cell grid, x positions are given in +/// fractional cells, e.g. 3.1 would be 10% through the cell at x = 3. +/// +/// NOTE: The size tested with has 10px wide cells, meaning only one digit +/// after the decimal place has any meaning, e.g. 3.14 is equal to 3.1. +/// +/// The provided start_x/y and end_x/y are the expected start and end points +/// of the resulting selection. +fn testMouseSelection( + click_x: f64, + click_y: u32, + drag_x: f64, + drag_y: u32, + start_x: terminal.size.CellCountInt, + start_y: u32, + end_x: terminal.size.CellCountInt, + end_y: u32, + rect: bool, +) !void { + assert(builtin.is_test); + // Our screen size is 10x5 cells that are // 10x20 px, with 5px padding on all sides. const size: rendererpkg.Size = .{ @@ -4828,1086 +4850,396 @@ test "Surface: selection logic" { var screen = try terminal.Screen.init(std.testing.allocator, 10, 5, 0); defer screen.deinit(); - // We are testing normal selection logic here so no mods. - const mods: input.Mods = .{}; + // We hold both ctrl and alt for rectangular + // select so that this test is platform agnostic. + const mods: input.Mods = .{ + .ctrl = rect, + .alt = rect, + }; - const expectEqual = std.testing.expectEqualDeep; + try std.testing.expectEqual(rect, SurfaceMouse.isRectangleSelectState(mods)); - // LTR, including click and drag pin cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 3 }, - }) orelse unreachable; + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = @intFromFloat(@floor(click_x)), .y = click_y }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = @intFromFloat(@floor(drag_x)), .y = drag_y }, + }) orelse unreachable; - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. + const cell_width_f64: f64 = @floatFromInt(size.cell.width); + const click_x_pos: u32 = + @as(u32, @intFromFloat(@floor(click_x * cell_width_f64))) + + size.padding.left; + const drag_x_pos: u32 = + @as(u32, @intFromFloat(@floor(drag_x * cell_width_f64))) + + size.padding.left; - const start_pin = click_pin; - const end_pin = drag_pin; + const start_pin = screen.pages.pin(.{ + .viewport = .{ .x = start_x, .y = start_y }, + }) orelse unreachable; + const end_pin = screen.pages.pin(.{ + .viewport = .{ .x = end_x, .y = end_y }, + }) orelse unreachable; - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( + try std.testing.expectEqualDeep(terminal.Selection{ + .bounds = .{ .untracked = .{ + .start = start_pin, + .end = end_pin, + } }, + .rectangle = rect, + }, mouseSelection( + click_pin, + drag_pin, + click_x_pos, + drag_x_pos, + mods, + size, + )); +} + +/// Like `testMouseSelection` but checks that the resulting selection is null. +/// +/// See `testMouseSelection` for more details. +fn testMouseSelectionIsNull( + click_x: f64, + click_y: u32, + drag_x: f64, + drag_y: u32, + rect: bool, +) !void { + assert(builtin.is_test); + + // Our screen size is 10x5 cells that are + // 10x20 px, with 5px padding on all sides. + const size: rendererpkg.Size = .{ + .cell = .{ .width = 10, .height = 20 }, + .padding = .{ .left = 5, .top = 5, .right = 5, .bottom = 5 }, + .screen = .{ .width = 110, .height = 110 }, + }; + var screen = try terminal.Screen.init(std.testing.allocator, 10, 5, 0); + defer screen.deinit(); + + // We hold both ctrl and alt for rectangular + // select so that this test is platform agnostic. + const mods: input.Mods = .{ + .ctrl = rect, + .alt = rect, + }; + + try std.testing.expectEqual(rect, SurfaceMouse.isRectangleSelectState(mods)); + + const click_pin = screen.pages.pin(.{ + .viewport = .{ .x = @intFromFloat(@floor(click_x)), .y = click_y }, + }) orelse unreachable; + const drag_pin = screen.pages.pin(.{ + .viewport = .{ .x = @intFromFloat(@floor(drag_x)), .y = drag_y }, + }) orelse unreachable; + + const cell_width_f64: f64 = @floatFromInt(size.cell.width); + const click_x_pos: u32 = + @as(u32, @intFromFloat(@floor(click_x * cell_width_f64))) + + size.padding.left; + const drag_x_pos: u32 = + @as(u32, @intFromFloat(@floor(drag_x * cell_width_f64))) + + size.padding.left; + + try std.testing.expectEqual( + null, + mouseSelection( click_pin, drag_pin, - click_x, - drag_x, + click_x_pos, + drag_x_pos, mods, size, - )); - } + ), + ); +} - // LTR, including click pin cell but not drag pin cell - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 3 }, - }) orelse unreachable; +test "Surface: selection logic" { + // We disable format to make these easier to + // read by pairing sets of coordinates per line. + // zig fmt: off - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. + // -- LTR + // single cell selection + try testMouseSelection( + 3.0, 3, // click + 3.9, 3, // drag + 3, 3, // expected start + 3, 3, // expected end + false, // regular selection + ); + // including click and drag pin cells + try testMouseSelection( + 3.0, 3, // click + 5.9, 3, // drag + 3, 3, // expected start + 5, 3, // expected end + false, // regular selection + ); + // including click pin cell but not drag pin cell + try testMouseSelection( + 3.0, 3, // click + 5.0, 3, // drag + 3, 3, // expected start + 4, 3, // expected end + false, // regular selection + ); + // including drag pin cell but not click pin cell + try testMouseSelection( + 3.9, 3, // click + 5.9, 3, // drag + 4, 3, // expected start + 5, 3, // expected end + false, // regular selection + ); + // including neither click nor drag pin cells + try testMouseSelection( + 3.9, 3, // click + 5.0, 3, // drag + 4, 3, // expected start + 4, 3, // expected end + false, // regular selection + ); + // empty selection (single cell on only left half) + try testMouseSelectionIsNull( + 3.0, 3, // click + 3.1, 3, // drag + false, // regular selection + ); + // empty selection (single cell on only right half) + try testMouseSelectionIsNull( + 3.8, 3, // click + 3.9, 3, // drag + false, // regular selection + ); + // empty selection (between two cells, not crossing threshold) + try testMouseSelectionIsNull( + 3.9, 3, // click + 4.0, 3, // drag + false, // regular selection + ); - const start_pin = click_pin; - const end_pin = drag_pin.left(1); - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // LTR, including drag pin cell but not click pin cell - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 3 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At rightmost px in cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At rightmost px in cell. - - const start_pin = click_pin.right(1); - const end_pin = drag_pin; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // LTR, including neither click nor drag pin cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 3 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - - const start_pin = click_pin.right(1); - const end_pin = drag_pin.left(1); - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // LTR, empty selection (single cell on only left half) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - const drag_pin = click_pin; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 1; // At px 1 within the cell. - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // LTR, empty selection (single cell on only right half) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - const drag_pin = click_pin; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 2; // 1px left of right edge of cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // LTR, empty selection (between two cells, not crossing threshold) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 4, .y = 3 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // --- RTL - - // RTL, including click and drag pin cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - - const start_pin = click_pin; - const end_pin = drag_pin; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // RTL, including click pin cell but not drag pin cell - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - - const start_pin = click_pin; - const end_pin = drag_pin.right(1); - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // RTL, including drag pin cell but not click pin cell - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within cell. - - const start_pin = click_pin.left(1); - const end_pin = drag_pin; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // RTL, including neither click nor drag pin cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - - const start_pin = click_pin.left(1); - const end_pin = drag_pin.right(1); - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // RTL, empty selection (single cell on only left half) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - const drag_pin = click_pin; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 1; // At px 1 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // RTL, empty selection (single cell on only right half) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - const drag_pin = click_pin; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 2; // 1px left of right edge of cell - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // RTL, empty selection (between two cells, not crossing threshold) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 4, .y = 3 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 3 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } + // -- RTL + // single cell selection + try testMouseSelection( + 3.9, 3, // click + 3.0, 3, // drag + 3, 3, // expected start + 3, 3, // expected end + false, // regular selection + ); + // including click and drag pin cells + try testMouseSelection( + 5.9, 3, // click + 3.0, 3, // drag + 5, 3, // expected start + 3, 3, // expected end + false, // regular selection + ); + // including click pin cell but not drag pin cell + try testMouseSelection( + 5.9, 3, // click + 3.9, 3, // drag + 5, 3, // expected start + 4, 3, // expected end + false, // regular selection + ); + // including drag pin cell but not click pin cell + try testMouseSelection( + 5.0, 3, // click + 3.0, 3, // drag + 4, 3, // expected start + 3, 3, // expected end + false, // regular selection + ); + // including neither click nor drag pin cells + try testMouseSelection( + 5.0, 3, // click + 3.9, 3, // drag + 4, 3, // expected start + 4, 3, // expected end + false, // regular selection + ); + // empty selection (single cell on only left half) + try testMouseSelectionIsNull( + 3.1, 3, // click + 3.0, 3, // drag + false, // regular selection + ); + // empty selection (single cell on only right half) + try testMouseSelectionIsNull( + 3.9, 3, // click + 3.8, 3, // drag + false, // regular selection + ); + // empty selection (between two cells, not crossing threshold) + try testMouseSelectionIsNull( + 4.0, 3, // click + 3.9, 3, // drag + false, // regular selection + ); // -- Wrapping - // LTR, wrap excluded cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 9, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 0, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell - - const start_pin = screen.pages.pin(.{ - .viewport = .{ .x = 0, .y = 3 }, - }) orelse unreachable; - const end_pin = screen.pages.pin(.{ - .viewport = .{ .x = 9, .y = 3 }, - }) orelse unreachable; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - + try testMouseSelection( + 9.9, 2, // click + 0.0, 4, // drag + 0, 3, // expected start + 9, 3, // expected end + false, // regular selection + ); // RTL, wrap excluded cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 0, .y = 4 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 9, .y = 2 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - - const start_pin = screen.pages.pin(.{ - .viewport = .{ .x = 9, .y = 3 }, - }) orelse unreachable; - const end_pin = screen.pages.pin(.{ - .viewport = .{ .x = 0, .y = 3 }, - }) orelse unreachable; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = false, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } + try testMouseSelection( + 0.0, 4, // click + 9.9, 2, // drag + 9, 3, // expected start + 0, 3, // expected end + false, // regular selection + ); } test "Surface: rectangle selection logic" { - // Our screen size is 10x5 cells that are - // 10x20 px, with 5px padding on all sides. - const size: rendererpkg.Size = .{ - .cell = .{ .width = 10, .height = 20 }, - .padding = .{ .left = 5, .top = 5, .right = 5, .bottom = 5 }, - .screen = .{ .width = 110, .height = 110 }, - }; - var screen = try terminal.Screen.init(std.testing.allocator, 10, 5, 0); - defer screen.deinit(); + // We disable format to make these easier to + // read by pairing sets of coordinates per line. + // zig fmt: off - // We hold ctrl and alt so that this test is platform-agnostic. - const mods: input.Mods = .{ - .ctrl = true, - .alt = true, - }; + // -- LTR + // single column selection + try testMouseSelection( + 3.0, 2, // click + 3.9, 4, // drag + 3, 2, // expected start + 3, 4, // expected end + true, //rectangle selection + ); + // including click and drag pin columns + try testMouseSelection( + 3.0, 2, // click + 5.9, 4, // drag + 3, 2, // expected start + 5, 4, // expected end + true, //rectangle selection + ); + // including click pin column but not drag pin column + try testMouseSelection( + 3.0, 2, // click + 5.0, 4, // drag + 3, 2, // expected start + 4, 4, // expected end + true, //rectangle selection + ); + // including drag pin column but not click pin column + try testMouseSelection( + 3.9, 2, // click + 5.9, 4, // drag + 4, 2, // expected start + 5, 4, // expected end + true, //rectangle selection + ); + // including neither click nor drag pin columns + try testMouseSelection( + 3.9, 2, // click + 5.0, 4, // drag + 4, 2, // expected start + 4, 4, // expected end + true, //rectangle selection + ); + // empty selection (single column on only left half) + try testMouseSelectionIsNull( + 3.0, 2, // click + 3.1, 4, // drag + true, //rectangle selection + ); + // empty selection (single column on only right half) + try testMouseSelectionIsNull( + 3.8, 2, // click + 3.9, 4, // drag + true, //rectangle selection + ); + // empty selection (between two columns, not crossing threshold) + try testMouseSelectionIsNull( + 3.9, 2, // click + 4.0, 4, // drag + true, //rectangle selection + ); - try std.testing.expect(SurfaceMouse.isRectangleSelectState(mods)); - - const expectEqual = std.testing.expectEqualDeep; - - // LTR, including click and drag pin cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - - const start_pin = click_pin; - const end_pin = drag_pin; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // LTR, including click pin cell but not drag pin cell - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - - const start_pin = click_pin; - const end_pin = drag_pin.left(1); - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // LTR, including drag pin cell but not click pin cell - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At rightmost px in cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At rightmost px in cell. - - const start_pin = click_pin.right(1); - const end_pin = drag_pin; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // LTR, including neither click nor drag pin cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - - const start_pin = click_pin.right(1); - const end_pin = drag_pin.left(1); - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // LTR, empty selection (single column on only left half) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 1; // At px 1 within the cell. - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // LTR, empty selection (single column on only right half) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 2; // 1px left of right edge of cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // LTR, empty selection (between two columns, not crossing threshold) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 4, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // --- RTL - - // RTL, including click and drag pin cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - - const start_pin = click_pin; - const end_pin = drag_pin; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // RTL, including click pin cell but not drag pin cell - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - - const start_pin = click_pin; - const end_pin = drag_pin.right(1); - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // RTL, including drag pin cell but not click pin cell - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within cell. - - const start_pin = click_pin.left(1); - const end_pin = drag_pin; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // RTL, including neither click nor drag pin cells - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 5, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At the rightmost px of the cell. - - const start_pin = click_pin.left(1); - const end_pin = drag_pin.right(1); - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - - // RTL, empty selection (single column on only left half) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 1; // At px 1 within the cell. - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 1; // At px 0 within the cell. - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // RTL, empty selection (single column on only right half) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 2; // 1px left of right edge of cell - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } - - // RTL, empty selection (between two cells, not crossing threshold) - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 4, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 3, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - - try expectEqual( - null, - mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - ), - ); - } + // -- RTL + // single column selection + try testMouseSelection( + 3.9, 2, // click + 3.0, 4, // drag + 3, 2, // expected start + 3, 4, // expected end + true, //rectangle selection + ); + // including click and drag pin columns + try testMouseSelection( + 5.9, 2, // click + 3.0, 4, // drag + 5, 2, // expected start + 3, 4, // expected end + true, //rectangle selection + ); + // including click pin column but not drag pin column + try testMouseSelection( + 5.9, 2, // click + 3.9, 4, // drag + 5, 2, // expected start + 4, 4, // expected end + true, //rectangle selection + ); + // including drag pin column but not click pin column + try testMouseSelection( + 5.0, 2, // click + 3.0, 4, // drag + 4, 2, // expected start + 3, 4, // expected end + true, //rectangle selection + ); + // including neither click nor drag pin columns + try testMouseSelection( + 5.0, 2, // click + 3.9, 4, // drag + 4, 2, // expected start + 4, 4, // expected end + true, //rectangle selection + ); + // empty selection (single column on only left half) + try testMouseSelectionIsNull( + 3.1, 2, // click + 3.0, 4, // drag + true, //rectangle selection + ); + // empty selection (single column on only right half) + try testMouseSelectionIsNull( + 3.9, 2, // click + 3.8, 4, // drag + true, //rectangle selection + ); + // empty selection (between two columns, not crossing threshold) + try testMouseSelectionIsNull( + 4.0, 2, // click + 3.9, 4, // drag + true, //rectangle selection + ); // -- Wrapping - // LTR, do not wrap - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 9, .y = 2 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 0, .y = 4 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell - - const start_pin = click_pin; - const end_pin = drag_pin; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } - + try testMouseSelection( + 9.9, 2, // click + 0.0, 4, // drag + 9, 2, // expected start + 0, 4, // expected end + true, //rectangle selection + ); // RTL, do not wrap - { - const click_pin = screen.pages.pin(.{ - .viewport = .{ .x = 0, .y = 4 }, - }) orelse unreachable; - const drag_pin = screen.pages.pin(.{ - .viewport = .{ .x = 9, .y = 2 }, - }) orelse unreachable; - - const click_x = - @as(u32, click_pin.x) * size.cell.width + size.padding.left + - 0; // At px 0 within the cell - const drag_x = - @as(u32, drag_pin.x) * size.cell.width + size.padding.left + - size.cell.width - 1; // At right edge of cell - - const start_pin = click_pin; - const end_pin = drag_pin; - - try expectEqual(terminal.Selection{ - .bounds = .{ .untracked = .{ - .start = start_pin, - .end = end_pin, - } }, - .rectangle = true, - }, mouseSelection( - click_pin, - drag_pin, - click_x, - drag_x, - mods, - size, - )); - } + try testMouseSelection( + 0.0, 4, // click + 9.9, 2, // drag + 0, 4, // expected start + 9, 2, // expected end + true, //rectangle selection + ); } From ba02f0ae22b06fa7e0f1a5b7b38f073c935b8c1e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 27 May 2025 09:45:31 -0700 Subject: [PATCH 021/371] decl literal --- src/Surface.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Surface.zig b/src/Surface.zig index 8b4f58496..0a2885dff 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -3827,7 +3827,7 @@ fn mouseSelection( // TODO: Clamp selection to the screen area, don't // let it extend past the last written row. - return terminal.Selection.init( + return .init( start_pin, end_pin, rectangle_selection, From 21c97aa9d64769061351df82eee7e0b7a27de71e Mon Sep 17 00:00:00 2001 From: Jonatan Borkowski Date: Sun, 25 May 2025 22:22:07 +0200 Subject: [PATCH 022/371] add support for buffer switching with CSI ? 47 h/l --- src/terminal/modes.zig | 1 + src/termio/stream_handler.zig | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/terminal/modes.zig b/src/terminal/modes.zig index 60ecc7698..b36266b32 100644 --- a/src/terminal/modes.zig +++ b/src/terminal/modes.zig @@ -206,6 +206,7 @@ const entries: []const ModeEntry = &.{ .{ .name = "cursor_visible", .value = 25, .default = true }, .{ .name = "enable_mode_3", .value = 40 }, .{ .name = "reverse_wrap", .value = 45 }, + .{ .name = "alt_screen_legacy", .value = 47 }, .{ .name = "keypad_keys", .value = 66 }, .{ .name = "enable_left_and_right_margin", .value = 69 }, .{ .name = "mouse_event_normal", .value = 1000 }, diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 299c7cd45..ffd00e14d 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -582,6 +582,16 @@ pub const StreamHandler = struct { self.terminal.scrolling_region.right = self.terminal.cols - 1; }, + .alt_screen_legacy => { + if (enabled) + self.terminal.alternateScreen(.{}) + else + self.terminal.primaryScreen(.{}); + + // Schedule a render since we changed screens + try self.queueRender(); + }, + .alt_screen => { const opts: terminal.Terminal.AlternateScreenOptions = .{ .cursor_save = false, From 6f7e9d5bea9840627888a6c3c9e89056680ec721 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Tue, 27 May 2025 21:55:28 -0600 Subject: [PATCH 023/371] code style: use `@splat` where possible As of Zig 0.14.0, `@splat` can be used for array types, which eliminates a lot of redundant syntax and makes things generally cleaner. I've explicitly avoided applying this change in the renderer files for now since it would just create rebasing conflicts in my renderer rework branch which I'll be PR-ing pretty soon. --- src/Surface.zig | 2 +- src/datastruct/cache_table.zig | 2 +- src/font/SharedGridSet.zig | 2 +- src/font/sprite/Box.zig | 2 +- src/terminal/Tabstops.zig | 2 +- src/terminal/Terminal.zig | 2 +- src/terminal/kitty/key.zig | 4 ++-- src/terminal/ref_counted_set.zig | 6 +++--- src/terminfo/Source.zig | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Surface.zig b/src/Surface.zig index 0a2885dff..01639964b 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -160,7 +160,7 @@ pub const InputEffect = enum { /// Mouse state for the surface. const Mouse = struct { /// The last tracked mouse button state by button. - click_state: [input.MouseButton.max]input.MouseButtonState = .{.release} ** input.MouseButton.max, + click_state: [input.MouseButton.max]input.MouseButtonState = @splat(.release), /// The last mods state when the last mouse button (whatever it was) was /// pressed or release. diff --git a/src/datastruct/cache_table.zig b/src/datastruct/cache_table.zig index 40d36cc24..fbfb30d71 100644 --- a/src/datastruct/cache_table.zig +++ b/src/datastruct/cache_table.zig @@ -70,7 +70,7 @@ pub fn CacheTable( /// become a pointless check, but hopefully branch prediction picks /// up on it at that point. The memory cost isn't too bad since it's /// just bytes, so should be a fraction the size of the main table. - lengths: [bucket_count]u8 = [_]u8{0} ** bucket_count, + lengths: [bucket_count]u8 = @splat(0), /// An instance of the context structure. /// Must be initialized before calling any operations. diff --git a/src/font/SharedGridSet.zig b/src/font/SharedGridSet.zig index 858d7930f..e3e61907b 100644 --- a/src/font/SharedGridSet.zig +++ b/src/font/SharedGridSet.zig @@ -498,7 +498,7 @@ pub const Key = struct { /// each style. For example, bold is from /// offsets[@intFromEnum(.bold) - 1] to /// offsets[@intFromEnum(.bold)]. - style_offsets: StyleOffsets = .{0} ** style_offsets_len, + style_offsets: StyleOffsets = @splat(0), /// The codepoint map configuration. codepoint_map: CodepointMap = .{}, diff --git a/src/font/sprite/Box.zig b/src/font/sprite/Box.zig index b1ebfe3a9..f3942b83d 100644 --- a/src/font/sprite/Box.zig +++ b/src/font/sprite/Box.zig @@ -2517,7 +2517,7 @@ fn draw_octant(self: Box, canvas: *font.sprite.Canvas, cp: u32) void { const octants: [octants_len]Octant = comptime octants: { @setEvalBranchQuota(10_000); - var result: [octants_len]Octant = .{Octant{}} ** octants_len; + var result: [octants_len]Octant = @splat(.{}); var i: usize = 0; const data = @embedFile("octants.txt"); diff --git a/src/terminal/Tabstops.zig b/src/terminal/Tabstops.zig index 5a54fb28b..4ab5133d9 100644 --- a/src/terminal/Tabstops.zig +++ b/src/terminal/Tabstops.zig @@ -44,7 +44,7 @@ const masks = blk: { cols: usize = 0, /// Preallocated tab stops. -prealloc_stops: [prealloc_count]Unit = [1]Unit{0} ** prealloc_count, +prealloc_stops: [prealloc_count]Unit = @splat(0), /// Dynamically expanded stops above prealloc stops. dynamic_stops: []Unit = &[0]Unit{}, diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index 595fee1ba..bb6702201 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -2329,7 +2329,7 @@ pub fn printAttributes(self: *Terminal, buf: []u8) ![]const u8 { try writer.writeByte('0'); const pen = self.screen.cursor.style; - var attrs = [_]u8{0} ** 8; + var attrs: [8]u8 = @splat(0); var i: usize = 0; if (pen.flags.bold) { diff --git a/src/terminal/kitty/key.zig b/src/terminal/kitty/key.zig index 8bafcb7dc..0883c90f2 100644 --- a/src/terminal/kitty/key.zig +++ b/src/terminal/kitty/key.zig @@ -8,7 +8,7 @@ const std = @import("std"); pub const FlagStack = struct { const len = 8; - flags: [len]Flags = .{Flags{}} ** len, + flags: [len]Flags = @splat(.{}), idx: u3 = 0, /// Return the current stack value @@ -51,7 +51,7 @@ pub const FlagStack = struct { // could send a huge number of pop commands to waste cpu. if (n >= self.flags.len) { self.idx = 0; - self.flags = .{Flags{}} ** len; + self.flags = @splat(.{}); return; } diff --git a/src/terminal/ref_counted_set.zig b/src/terminal/ref_counted_set.zig index 8023461f3..153e331a6 100644 --- a/src/terminal/ref_counted_set.zig +++ b/src/terminal/ref_counted_set.zig @@ -115,7 +115,7 @@ pub fn RefCountedSet( /// input. We handle this gracefully by returning an error /// anywhere where we're about to insert if there's any /// item with a PSL in the last slot of the stats array. - psl_stats: [32]Id = [_]Id{0} ** 32, + psl_stats: [32]Id = @splat(0), /// The backing store of items items: Offset(Item), @@ -663,7 +663,7 @@ pub fn RefCountedSet( const table = self.table.ptr(base); const items = self.items.ptr(base); - var psl_stats: [32]Id = [_]Id{0} ** 32; + var psl_stats: [32]Id = @splat(0); for (items[0..self.layout.cap], 0..) |item, id| { if (item.meta.bucket < std.math.maxInt(Id)) { @@ -676,7 +676,7 @@ pub fn RefCountedSet( assert(std.mem.eql(Id, &psl_stats, &self.psl_stats)); - psl_stats = [_]Id{0} ** 32; + psl_stats = @splat(0); for (table[0..self.layout.table_cap], 0..) |id, bucket| { const item = items[id]; diff --git a/src/terminfo/Source.zig b/src/terminfo/Source.zig index 8ffd9cabb..7692e6f54 100644 --- a/src/terminfo/Source.zig +++ b/src/terminfo/Source.zig @@ -74,7 +74,7 @@ pub fn xtgettcapMap(comptime self: Source) std.StaticStringMap([]const u8) { // We have all of our capabilities plus To, TN, and RGB which aren't // in the capabilities list but are query-able. const len = self.capabilities.len + 3; - var kvs: [len]KV = .{.{ "", "" }} ** len; + var kvs: [len]KV = @splat(.{ "", "" }); // We first build all of our entries with raw K=V pairs. kvs[0] = .{ "TN", self.names[0] }; From d1501a492530b99c00a11fdd58d5ec411ac7c937 Mon Sep 17 00:00:00 2001 From: Daniel Wennberg Date: Tue, 27 May 2025 22:15:43 -0700 Subject: [PATCH 024/371] fix: properly intialize key event in GlobalEventTap --- .../Sources/Features/Global Keybinds/GlobalEventTap.swift | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/macos/Sources/Features/Global Keybinds/GlobalEventTap.swift b/macos/Sources/Features/Global Keybinds/GlobalEventTap.swift index 935c2fb03..644285c9a 100644 --- a/macos/Sources/Features/Global Keybinds/GlobalEventTap.swift +++ b/macos/Sources/Features/Global Keybinds/GlobalEventTap.swift @@ -141,12 +141,7 @@ fileprivate func cgEventFlagsChangedHandler( guard let event: NSEvent = .init(cgEvent: cgEvent) else { return result } // Build our event input and call ghostty - var key_ev = ghostty_input_key_s() - key_ev.action = GHOSTTY_ACTION_PRESS - key_ev.mods = Ghostty.ghosttyMods(event.modifierFlags) - key_ev.keycode = UInt32(event.keyCode) - key_ev.text = nil - key_ev.composing = false + var key_ev = event.ghosttyKeyEvent(GHOSTTY_ACTION_PRESS) if (ghostty_app_key(ghostty, key_ev)) { GlobalEventTap.logger.info("global key event handled event=\(event)") return nil From 9c1abf487e0f05cebc4f3e932e1a5a8cdb5aa6a6 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Fri, 23 May 2025 17:15:40 -0500 Subject: [PATCH 025/371] OSC: start adding structure to allow multiple color operations per OSC --- src/terminal/osc.zig | 418 ++++++++++++++++++++++++++++------ src/terminal/stream.zig | 7 + src/termio/stream_handler.zig | 175 ++++++++++++++ 3 files changed, 526 insertions(+), 74 deletions(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 932964137..7729eaa6b 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -109,6 +109,13 @@ pub const Command = union(enum) { value: []const u8, }, + /// OSC color operations + color_operation: struct { + source: ColorOperationSource, + operations: std.ArrayListUnmanaged(ColorOperation) = .empty, + terminator: Terminator = .st, + }, + /// OSC 4, OSC 10, and OSC 11 color report. report_color: struct { /// OSC 4 requests a palette color, OSC 10 requests the foreground @@ -182,6 +189,32 @@ pub const Command = union(enum) { /// Wait input (OSC 9;5) wait_input: void, + pub const ColorOperationSource = enum(u16) { + osc_4 = 4, + osc_10 = 10, + osc_11 = 11, + osc_12 = 12, + osc_104 = 104, + + pub fn format( + self: ColorOperationSource, + comptime _: []const u8, + _: std.fmt.FormatOptions, + writer: anytype, + ) !void { + try writer.print("{d}", .{@intFromEnum(self)}); + } + }; + + pub const ColorOperation = union(enum) { + set: struct { + kind: ColorKind, + color: RGB, + }, + reset: ColorKind, + report: ColorKind, + }; + pub const ColorKind = union(enum) { palette: u8, foreground, @@ -234,6 +267,15 @@ pub const Terminator = enum { .bel => "\x07", }; } + + pub fn format( + self: Terminator, + comptime _: []const u8, + _: std.fmt.FormatOptions, + writer: anytype, + ) !void { + try writer.writeAll(self.string()); + } }; pub const Parser = struct { @@ -288,6 +330,7 @@ pub const Parser = struct { @"0", @"1", @"10", + @"104", @"11", @"12", @"13", @@ -327,17 +370,16 @@ pub const Parser = struct { clipboard_kind_end, // Get/set color palette index - color_palette_index, - color_palette_index_end, + osc_4, + + // Reset color palette index + osc_104, // Hyperlinks hyperlink_param_key, hyperlink_param_value, hyperlink_uri, - // Reset color palette index - reset_color_palette_index, - // rxvt extension. Only used for OSC 777 and only the value "notify" is // supported rxvt_extension, @@ -423,6 +465,10 @@ pub const Parser = struct { v.list.deinit(); self.command = default; }, + .color_operation => |*v| { + v.operations.deinit(self.alloc.?); + self.command = default; + }, else => {}, } } @@ -503,18 +549,26 @@ pub const Parser = struct { .@"10" => switch (c) { ';' => self.state = .query_fg_color, - '4' => { - self.command = .{ .reset_color = .{ - .kind = .{ .palette = 0 }, - .value = "", - } }; + '4' => self.state = .@"104", + else => self.state = .invalid, + }, - self.state = .reset_color_palette_index; + .@"104" => switch (c) { + ';' => osc_104: { + if (self.alloc == null) { + log.info("OSC 104 requires an allocator, but none was provided", .{}); + self.state = .invalid; + break :osc_104; + } + self.state = .osc_104; + self.buf_start = self.buf_idx; self.complete = true; }, else => self.state = .invalid, }, + .osc_104 => {}, + .@"11" => switch (c) { ';' => self.state = .query_bg_color, '0' => { @@ -621,65 +675,20 @@ pub const Parser = struct { }, .@"4" => switch (c) { - ';' => { - self.state = .color_palette_index; - self.buf_start = self.buf_idx; - }, - else => self.state = .invalid, - }, - - .color_palette_index => switch (c) { - '0'...'9' => {}, - ';' => blk: { - const str = self.buf[self.buf_start .. self.buf_idx - 1]; - if (str.len == 0) { + ';' => osc_4: { + if (self.alloc == null) { + log.info("OSC 4 requires an allocator, but none was provided", .{}); self.state = .invalid; - break :blk; + break :osc_4; } - - if (std.fmt.parseUnsigned(u8, str, 10)) |num| { - self.state = .color_palette_index_end; - self.temp_state = .{ .num = num }; - } else |err| switch (err) { - error.Overflow => self.state = .invalid, - error.InvalidCharacter => unreachable, - } - }, - else => self.state = .invalid, - }, - - .color_palette_index_end => switch (c) { - '?' => { - self.command = .{ .report_color = .{ - .kind = .{ .palette = @intCast(self.temp_state.num) }, - } }; - + self.state = .osc_4; + self.buf_start = self.buf_idx; self.complete = true; }, - else => { - self.command = .{ .set_color = .{ - .kind = .{ .palette = @intCast(self.temp_state.num) }, - .value = "", - } }; - - self.state = .string; - self.temp_state = .{ .str = &self.command.set_color.value }; - self.buf_start = self.buf_idx - 1; - }, + else => self.state = .invalid, }, - .reset_color_palette_index => switch (c) { - ';' => { - self.state = .string; - self.temp_state = .{ .str = &self.command.reset_color.value }; - self.buf_start = self.buf_idx; - self.complete = false; - }, - else => { - self.state = .invalid; - self.complete = false; - }, - }, + .osc_4 => {}, .@"5" => switch (c) { '2' => self.state = .@"52", @@ -1327,6 +1336,104 @@ pub const Parser = struct { self.temp_state.str.* = list.items; } + fn parseOSC4(self: *Parser) void { + assert(self.state == .osc_4); + + const alloc = self.alloc orelse return; + + self.command = .{ + .color_operation = .{ + .source = .osc_4, + .operations = std.ArrayListUnmanaged(Command.ColorOperation).initCapacity(alloc, 8) catch |err| { + log.warn("unable to allocate memory for OSC 4 parsing: {}", .{err}); + self.state = .invalid; + return; + }, + }, + }; + + const str = self.buf[self.buf_start..self.buf_idx]; + var it = std.mem.splitScalar(u8, str, ';'); + while (it.next()) |index_str| { + const index = std.fmt.parseUnsigned(u8, index_str, 10) catch |err| switch (err) { + error.Overflow, error.InvalidCharacter => { + log.warn("invalid palette index spec in OSC 4: {s}", .{index_str}); + // skip any spec + _ = it.next(); + continue; + }, + }; + const spec_str = it.next() orelse continue; + if (std.mem.eql(u8, spec_str, "?")) { + self.command.color_operation.operations.append( + alloc, + .{ + .report = .{ .palette = index }, + }, + ) catch |err| { + log.warn("unable to append color operation: {}", .{err}); + return; + }; + } else { + const color = RGB.parse(spec_str) catch |err| { + log.warn("invalid color specification {s} in OSC 4: {}", .{ spec_str, err }); + continue; + }; + self.command.color_operation.operations.append( + alloc, + .{ + .set = .{ + .kind = .{ + .palette = index, + }, + .color = color, + }, + }, + ) catch |err| { + log.warn("unable to append color operation: {}", .{err}); + return; + }; + } + } + } + + fn parseOSC104(self: *Parser) void { + assert(self.state == .osc_104); + + const alloc = self.alloc orelse return; + + self.command = .{ + .color_operation = .{ + .source = .osc_104, + .operations = std.ArrayListUnmanaged(Command.ColorOperation).initCapacity(alloc, 8) catch |err| { + log.warn("unable to allocate memory for OSC 104 parsing: {}", .{err}); + self.state = .invalid; + return; + }, + }, + }; + + const str = self.buf[self.buf_start..self.buf_idx]; + var it = std.mem.splitScalar(u8, str, ';'); + while (it.next()) |index_str| { + const index = std.fmt.parseUnsigned(u8, index_str, 10) catch |err| switch (err) { + error.Overflow, error.InvalidCharacter => { + log.warn("invalid palette index spec in OSC 104: {s}", .{index_str}); + continue; + }, + }; + self.command.color_operation.operations.append( + alloc, + .{ + .reset = .{ .palette = index }, + }, + ) catch |err| { + log.warn("unable to append color operation: {}", .{err}); + return; + }; + } + } + /// End the sequence and return the command, if any. If the return value /// is null, then no valid command was found. The optional terminator_ch /// is the final character in the OSC sequence. This is used to determine @@ -1350,12 +1457,15 @@ pub const Parser = struct { .allocable_string => self.endAllocableString(), .kitty_color_protocol_key => self.endKittyColorProtocolOption(.key_only, true), .kitty_color_protocol_value => self.endKittyColorProtocolOption(.key_and_value, true), + .osc_4 => self.parseOSC4(), + .osc_104 => self.parseOSC104(), else => {}, } switch (self.command) { .report_color => |*c| c.terminator = .init(terminator_ch), .kitty_color_protocol => |*c| c.terminator = .init(terminator_ch), + .color_operation => |*c| c.terminator = .init(terminator_ch), else => {}, } @@ -1729,32 +1839,192 @@ test "OSC: set background color" { try testing.expectEqualStrings(cmd.set_color.value, "rgb:f/ff/ffff"); } -test "OSC: get palette color" { +test "OSC: OSC4: get palette color 1" { const testing = std.testing; - var p: Parser = .{}; + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; const input = "4;1;?"; for (input) |ch| p.next(ch); const cmd = p.end('\x1b').?; - try testing.expect(cmd == .report_color); - try testing.expectEqual(Command.ColorKind{ .palette = 1 }, cmd.report_color.kind); - try testing.expectEqual(cmd.report_color.terminator, .st); + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.items.len == 1); + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .report); + try testing.expectEqual(Command.ColorKind{ .palette = 1 }, op.report); + try testing.expectEqual(cmd.color_operation.terminator, .st); } -test "OSC: set palette color" { +test "OSC: OSC4: get palette color 2" { const testing = std.testing; - var p: Parser = .{}; + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "4;1;?;2;?"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.items.len == 2); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .report); + try testing.expectEqual(Command.ColorKind{ .palette = 1 }, op.report); + } + { + const op = cmd.color_operation.operations.items[1]; + try testing.expect(op == .report); + try testing.expectEqual(Command.ColorKind{ .palette = 2 }, op.report); + } + try testing.expectEqual(cmd.color_operation.terminator, .st); +} + +test "OSC: OSC4: set palette color 1" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; const input = "4;17;rgb:aa/bb/cc"; for (input) |ch| p.next(ch); const cmd = p.end('\x1b').?; - try testing.expect(cmd == .set_color); - try testing.expectEqual(Command.ColorKind{ .palette = 17 }, cmd.set_color.kind); - try testing.expectEqualStrings(cmd.set_color.value, "rgb:aa/bb/cc"); + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.items.len == 1); + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .set); + try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.set.kind); + try testing.expectEqual( + RGB{ .r = 0xaa, .g = 0xbb, .b = 0xcc }, + op.set.color, + ); +} + +test "OSC: OSC4: set palette color 2" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "4;17;rgb:aa/bb/cc;1;rgb:00/11/22"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.items.len == 2); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .set); + try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.set.kind); + try testing.expectEqual( + RGB{ .r = 0xaa, .g = 0xbb, .b = 0xcc }, + op.set.color, + ); + } + { + const op = cmd.color_operation.operations.items[1]; + try testing.expect(op == .set); + try testing.expectEqual(Command.ColorKind{ .palette = 1 }, op.set.kind); + try testing.expectEqual( + RGB{ .r = 0x00, .g = 0x11, .b = 0x22 }, + op.set.color, + ); + } +} + +test "OSC: OSC4: mix get/set palette color" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "4;17;rgb:aa/bb/cc;254;?"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.items.len == 2); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .set); + try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.set.kind); + try testing.expectEqual( + RGB{ .r = 0xaa, .g = 0xbb, .b = 0xcc }, + op.set.color, + ); + } + { + const op = cmd.color_operation.operations.items[1]; + try testing.expect(op == .report); + try testing.expectEqual(Command.ColorKind{ .palette = 254 }, op.report); + } +} + +test "OSC: OSC104: reset palette color 1" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "104;17"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_104); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .reset); + try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.reset); + } +} + +test "OSC: OSC104: reset palette color 2" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "104;17;111"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_104); + try testing.expect(cmd.color_operation.operations.items.len == 2); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .reset); + try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.reset); + } + { + const op = cmd.color_operation.operations.items[1]; + try testing.expect(op == .reset); + try testing.expectEqual(Command.ColorKind{ .palette = 111 }, op.reset); + } } test "OSC: conemu sleep" { diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index 76fa6c129..2a1ae80c9 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -1555,6 +1555,13 @@ pub fn Stream(comptime Handler: type) type { } else log.warn("unimplemented OSC callback: {}", .{cmd}); }, + .color_operation => |v| { + if (@hasDecl(T, "handleColorOperation")) { + try self.handler.handleColorOperation(v.source, v.operations.items, v.terminator); + return; + } else log.warn("unimplemented OSC callback: {}", .{cmd}); + }, + .report_color => |v| { if (@hasDecl(T, "reportColor")) { try self.handler.reportColor(v.kind, v.terminator); diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index ffd00e14d..57a1eeacf 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1195,6 +1195,181 @@ pub const StreamHandler = struct { } } + pub fn handleColorOperation( + self: *StreamHandler, + source: terminal.osc.Command.ColorOperationSource, + operations: []terminal.osc.Command.ColorOperation, + terminator: terminal.osc.Terminator, + ) !void { + var buffer: [1024]u8 = undefined; + var fba: std.heap.FixedBufferAllocator = .init(&buffer); + const alloc = fba.allocator(); + + var response: std.ArrayListUnmanaged(u8) = .empty; + const writer = response.writer(alloc); + + var report: bool = false; + + try writer.print("\x1b]{}", .{source}); + + for (operations) |op| { + switch (op) { + .set => |set| { + switch (set.kind) { + .palette => |i| { + self.terminal.flags.dirty.palette = true; + self.terminal.color_palette.colors[i] = set.color; + self.terminal.color_palette.mask.set(i); + }, + .foreground => { + self.foreground_color = set.color; + _ = self.renderer_mailbox.push(.{ + .foreground_color = set.color, + }, .{ .forever = {} }); + }, + .background => { + self.background_color = set.color; + _ = self.renderer_mailbox.push(.{ + .background_color = set.color, + }, .{ .forever = {} }); + }, + .cursor => { + self.cursor_color = set.color; + _ = self.renderer_mailbox.push(.{ + .cursor_color = set.color, + }, .{ .forever = {} }); + }, + } + + // Notify the surface of the color change + self.surfaceMessageWriter(.{ .color_change = .{ + .kind = set.kind, + .color = set.color, + } }); + }, + + .reset => |kind| { + switch (kind) { + .palette => |i| { + const mask = &self.terminal.color_palette.mask; + self.terminal.flags.dirty.palette = true; + self.terminal.color_palette.colors[i] = self.terminal.default_palette[i]; + mask.unset(i); + + self.surfaceMessageWriter(.{ + .color_change = .{ + .kind = .{ .palette = @intCast(i) }, + .color = self.terminal.color_palette.colors[i], + }, + }); + }, + .foreground => { + self.foreground_color = null; + _ = self.renderer_mailbox.push(.{ + .foreground_color = self.foreground_color, + }, .{ .forever = {} }); + + self.surfaceMessageWriter(.{ .color_change = .{ + .kind = .foreground, + .color = self.default_foreground_color, + } }); + }, + .background => { + self.background_color = null; + _ = self.renderer_mailbox.push(.{ + .background_color = self.background_color, + }, .{ .forever = {} }); + + self.surfaceMessageWriter(.{ .color_change = .{ + .kind = .background, + .color = self.default_background_color, + } }); + }, + .cursor => { + self.cursor_color = null; + + _ = self.renderer_mailbox.push(.{ + .cursor_color = self.cursor_color, + }, .{ .forever = {} }); + + if (self.default_cursor_color) |color| { + self.surfaceMessageWriter(.{ .color_change = .{ + .kind = .cursor, + .color = color, + } }); + } + }, + } + }, + + .report => |kind| report: { + if (self.osc_color_report_format == .none) break :report; + + report = true; + + const color = switch (kind) { + .palette => |i| self.terminal.color_palette.colors[i], + .foreground => self.foreground_color orelse self.default_foreground_color, + .background => self.background_color orelse self.default_background_color, + .cursor => self.cursor_color orelse + self.default_cursor_color orelse + self.foreground_color orelse + self.default_foreground_color, + }; + + switch (self.osc_color_report_format) { + .@"16-bit" => switch (kind) { + .palette => |i| try writer.print( + ";{d};rgb:{x:0>4}/{x:0>4}/{x:0>4}", + .{ + i, + @as(u16, color.r) * 257, + @as(u16, color.g) * 257, + @as(u16, color.b) * 257, + }, + ), + else => try writer.print( + ";rgb:{x:0>4}/{x:0>4}/{x:0>4}", + .{ + @as(u16, color.r) * 257, + @as(u16, color.g) * 257, + @as(u16, color.b) * 257, + }, + ), + }, + + .@"8-bit" => switch (kind) { + .palette => |i| try writer.print( + ";{d};rgb:{x:0>2}/{x:0>2}/{x:0>2}", + .{ + i, + @as(u16, color.r), + @as(u16, color.g), + @as(u16, color.b), + }, + ), + else => try writer.print( + ";rgb:{x:0>2}/{x:0>2}/{x:0>2}", + .{ + @as(u16, color.r), + @as(u16, color.g), + @as(u16, color.b), + }, + ), + }, + + .none => unreachable, + } + }, + } + } + if (report) { + try writer.writeAll(terminator.string()); + const msg: termio.Message = .{ .write_stable = response.items }; + self.messageWriter(msg); + } + } + /// Implements OSC 4, OSC 10, and OSC 11, which reports palette color, /// default foreground color, and background color respectively. pub fn reportColor( From 5ec1c15ecfe5e2a29f4e0c9cbe116aeed7ad62d5 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Fri, 23 May 2025 18:05:59 -0500 Subject: [PATCH 026/371] OSC: add more tests --- src/terminal/osc.zig | 170 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 153 insertions(+), 17 deletions(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 7729eaa6b..778196160 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -1357,8 +1357,8 @@ pub const Parser = struct { while (it.next()) |index_str| { const index = std.fmt.parseUnsigned(u8, index_str, 10) catch |err| switch (err) { error.Overflow, error.InvalidCharacter => { - log.warn("invalid palette index spec in OSC 4: {s}", .{index_str}); - // skip any spec + log.warn("invalid color palette index in OSC 4: {s} {}", .{ index_str, err }); + // skip any color spec _ = it.next(); continue; }, @@ -1376,7 +1376,7 @@ pub const Parser = struct { }; } else { const color = RGB.parse(spec_str) catch |err| { - log.warn("invalid color specification {s} in OSC 4: {}", .{ spec_str, err }); + log.warn("invalid color specification in OSC 4: {s} {}", .{ spec_str, err }); continue; }; self.command.color_operation.operations.append( @@ -1418,7 +1418,7 @@ pub const Parser = struct { while (it.next()) |index_str| { const index = std.fmt.parseUnsigned(u8, index_str, 10) catch |err| switch (err) { error.Overflow, error.InvalidCharacter => { - log.warn("invalid palette index spec in OSC 104: {s}", .{index_str}); + log.warn("invalid color palette index in OSC 104: {s} {}", .{ index_str, err }); continue; }, }; @@ -1854,10 +1854,15 @@ test "OSC: OSC4: get palette color 1" { try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); try testing.expect(cmd.color_operation.operations.items.len == 1); - const op = cmd.color_operation.operations.items[0]; - try testing.expect(op == .report); - try testing.expectEqual(Command.ColorKind{ .palette = 1 }, op.report); - try testing.expectEqual(cmd.color_operation.terminator, .st); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 1 }, + op.report, + ); + try testing.expectEqual(cmd.color_operation.terminator, .st); + } } test "OSC: OSC4: get palette color 2" { @@ -1878,12 +1883,18 @@ test "OSC: OSC4: get palette color 2" { { const op = cmd.color_operation.operations.items[0]; try testing.expect(op == .report); - try testing.expectEqual(Command.ColorKind{ .palette = 1 }, op.report); + try testing.expectEqual( + Command.ColorKind{ .palette = 1 }, + op.report, + ); } { const op = cmd.color_operation.operations.items[1]; try testing.expect(op == .report); - try testing.expectEqual(Command.ColorKind{ .palette = 2 }, op.report); + try testing.expectEqual( + Command.ColorKind{ .palette = 2 }, + op.report, + ); } try testing.expectEqual(cmd.color_operation.terminator, .st); } @@ -1905,7 +1916,10 @@ test "OSC: OSC4: set palette color 1" { try testing.expect(cmd.color_operation.operations.items.len == 1); const op = cmd.color_operation.operations.items[0]; try testing.expect(op == .set); - try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.set.kind); + try testing.expectEqual( + Command.ColorKind{ .palette = 17 }, + op.set.kind, + ); try testing.expectEqual( RGB{ .r = 0xaa, .g = 0xbb, .b = 0xcc }, op.set.color, @@ -1930,7 +1944,10 @@ test "OSC: OSC4: set palette color 2" { { const op = cmd.color_operation.operations.items[0]; try testing.expect(op == .set); - try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.set.kind); + try testing.expectEqual( + Command.ColorKind{ .palette = 17 }, + op.set.kind, + ); try testing.expectEqual( RGB{ .r = 0xaa, .g = 0xbb, .b = 0xcc }, op.set.color, @@ -1939,7 +1956,10 @@ test "OSC: OSC4: set palette color 2" { { const op = cmd.color_operation.operations.items[1]; try testing.expect(op == .set); - try testing.expectEqual(Command.ColorKind{ .palette = 1 }, op.set.kind); + try testing.expectEqual( + Command.ColorKind{ .palette = 1 }, + op.set.kind, + ); try testing.expectEqual( RGB{ .r = 0x00, .g = 0x11, .b = 0x22 }, op.set.color, @@ -1947,6 +1967,60 @@ test "OSC: OSC4: set palette color 2" { } } +test "OSC: OSC4: get with invalid index" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "4;1111;?;1;?"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 1 }, + op.report, + ); + } +} + +test "OSC: OSC4: set with invalid index" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "4;256;#ffffff;1;#aabbcc"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .set); + try testing.expectEqual( + Command.ColorKind{ .palette = 1 }, + op.set.kind, + ); + try testing.expectEqual( + RGB{ .r = 0xaa, .g = 0xbb, .b = 0xcc }, + op.set.color, + ); + } +} + test "OSC: OSC4: mix get/set palette color" { const testing = std.testing; @@ -1965,7 +2039,10 @@ test "OSC: OSC4: mix get/set palette color" { { const op = cmd.color_operation.operations.items[0]; try testing.expect(op == .set); - try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.set.kind); + try testing.expectEqual( + Command.ColorKind{ .palette = 17 }, + op.set.kind, + ); try testing.expectEqual( RGB{ .r = 0xaa, .g = 0xbb, .b = 0xcc }, op.set.color, @@ -1996,7 +2073,10 @@ test "OSC: OSC104: reset palette color 1" { { const op = cmd.color_operation.operations.items[0]; try testing.expect(op == .reset); - try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.reset); + try testing.expectEqual( + Command.ColorKind{ .palette = 17 }, + op.reset, + ); } } @@ -2018,12 +2098,68 @@ test "OSC: OSC104: reset palette color 2" { { const op = cmd.color_operation.operations.items[0]; try testing.expect(op == .reset); - try testing.expectEqual(Command.ColorKind{ .palette = 17 }, op.reset); + try testing.expectEqual( + Command.ColorKind{ .palette = 17 }, + op.reset, + ); } { const op = cmd.color_operation.operations.items[1]; try testing.expect(op == .reset); - try testing.expectEqual(Command.ColorKind{ .palette = 111 }, op.reset); + try testing.expectEqual( + Command.ColorKind{ .palette = 111 }, + op.reset, + ); + } +} + +test "OSC: OSC104: invalid palette index" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "104;ffff;111"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_104); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .reset); + try testing.expectEqual( + Command.ColorKind{ .palette = 111 }, + op.reset, + ); + } +} + +test "OSC: OSC104: empty palette index" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "104;;111"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_104); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .reset); + try testing.expectEqual( + Command.ColorKind{ .palette = 111 }, + op.reset, + ); } } From 5bb74929554e298651298d32f73ef29de14e4294 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Fri, 23 May 2025 20:44:33 -0500 Subject: [PATCH 027/371] OSC: convert OSC 110, 111, and 112 and add more tests --- src/terminal/Parser.zig | 21 +- src/terminal/osc.zig | 554 +++++++++++++++++++++++++--------- src/terminal/stream.zig | 21 -- src/termio/stream_handler.zig | 197 ------------ 4 files changed, 437 insertions(+), 356 deletions(-) diff --git a/src/terminal/Parser.zig b/src/terminal/Parser.zig index 14ed6d6df..80772d71f 100644 --- a/src/terminal/Parser.zig +++ b/src/terminal/Parser.zig @@ -877,7 +877,12 @@ test "osc: change window title (end in esc)" { // https://github.com/darrenstarr/VtNetCore/pull/14 // Saw this on HN, decided to add a test case because why not. test "osc: 112 incomplete sequence" { - var p = init(); + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = init(); + p.osc_parser.alloc = arena.allocator(); + _ = p.next(0x1B); _ = p.next(']'); _ = p.next('1'); @@ -892,8 +897,18 @@ test "osc: 112 incomplete sequence" { try testing.expect(a[2] == null); const cmd = a[0].?.osc_dispatch; - try testing.expect(cmd == .reset_color); - try testing.expectEqual(cmd.reset_color.kind, .cursor); + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .bel); + try testing.expect(cmd.color_operation.source == .osc_112); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .reset); + try testing.expectEqual( + osc.Command.ColorKind.cursor, + op.reset, + ); + } } } diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 778196160..7b9239e43 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -116,37 +116,6 @@ pub const Command = union(enum) { terminator: Terminator = .st, }, - /// OSC 4, OSC 10, and OSC 11 color report. - report_color: struct { - /// OSC 4 requests a palette color, OSC 10 requests the foreground - /// color, OSC 11 the background color. - kind: ColorKind, - - /// We must reply with the same string terminator (ST) as used in the - /// request. - terminator: Terminator = .st, - }, - - /// Modify the foreground (OSC 10) or background color (OSC 11), or a palette color (OSC 4) - set_color: struct { - /// OSC 4 sets a palette color, OSC 10 sets the foreground color, OSC 11 - /// the background color. - kind: ColorKind, - - /// The color spec as a string - value: []const u8, - }, - - /// Reset a palette color (OSC 104) or the foreground (OSC 110), background - /// (OSC 111), or cursor (OSC 112) color. - reset_color: struct { - kind: ColorKind, - - /// OSC 104 can have parameters indicating which palette colors to - /// reset. - value: []const u8, - }, - /// Kitty color protocol, OSC 21 /// https://sw.kovidgoyal.net/kitty/color-stack/#id1 kitty_color_protocol: kitty.color.OSC, @@ -195,6 +164,9 @@ pub const Command = union(enum) { osc_11 = 11, osc_12 = 12, osc_104 = 104, + osc_110 = 110, + osc_111 = 111, + osc_112 = 112, pub fn format( self: ColorOperationSource, @@ -347,15 +319,6 @@ pub const Parser = struct { @"8", @"9", - // OSC 10 is used to query or set the current foreground color. - query_fg_color, - - // OSC 11 is used to query or set the current background color. - query_bg_color, - - // OSC 12 is used to query or set the current cursor color. - query_cursor_color, - // We're in a semantic prompt OSC command but we aren't sure // what the command is yet, i.e. `133;` semantic_prompt, @@ -372,9 +335,27 @@ pub const Parser = struct { // Get/set color palette index osc_4, + // Get/set foreground color + osc_10, + + // Get/set background color + osc_11, + + // Get/set cursor color + osc_12, + // Reset color palette index osc_104, + // Reset foreground color + osc_110, + + // Reset background color + osc_111, + + // Reset cursor color + osc_112, + // Hyperlinks hyperlink_param_key, hyperlink_param_value, @@ -548,15 +529,26 @@ pub const Parser = struct { }, .@"10" => switch (c) { - ';' => self.state = .query_fg_color, + ';' => osc_10: { + if (self.alloc == null) { + log.warn("OSC 10 requires an allocator, but none was provided", .{}); + self.state = .invalid; + break :osc_10; + } + self.state = .osc_10; + self.buf_start = self.buf_idx; + self.complete = true; + }, '4' => self.state = .@"104", else => self.state = .invalid, }, + .osc_10 => {}, + .@"104" => switch (c) { ';' => osc_104: { if (self.alloc == null) { - log.info("OSC 104 requires an allocator, but none was provided", .{}); + log.warn("OSC 104 requires an allocator, but none was provided", .{}); self.state = .invalid; break :osc_104; } @@ -570,30 +562,73 @@ pub const Parser = struct { .osc_104 => {}, .@"11" => switch (c) { - ';' => self.state = .query_bg_color, - '0' => { - self.command = .{ .reset_color = .{ .kind = .foreground, .value = undefined } }; + ';' => osc_11: { + if (self.alloc == null) { + log.warn("OSC 11 requires an allocator, but none was provided", .{}); + self.state = .invalid; + break :osc_11; + } + self.state = .osc_11; + self.buf_start = self.buf_idx; self.complete = true; - self.state = .invalid; }, - '1' => { - self.command = .{ .reset_color = .{ .kind = .background, .value = undefined } }; + '0' => osc_110: { + if (self.alloc == null) { + log.warn("OSC 110 requires an allocator, but none was provided", .{}); + self.state = .invalid; + break :osc_110; + } + self.state = .osc_110; + self.buf_start = self.buf_idx; self.complete = true; - self.state = .invalid; }, - '2' => { - self.command = .{ .reset_color = .{ .kind = .cursor, .value = undefined } }; + '1' => osc_111: { + if (self.alloc == null) { + log.warn("OSC 111 requires an allocator, but none was provided", .{}); + self.state = .invalid; + break :osc_111; + } + self.state = .osc_111; + self.buf_start = self.buf_idx; + self.complete = true; + }, + '2' => osc_112: { + if (self.alloc == null) { + log.warn("OSC 112 requires an allocator, but none was provided", .{}); + self.state = .invalid; + break :osc_112; + } + self.state = .osc_112; + self.buf_start = self.buf_idx; self.complete = true; - self.state = .invalid; }, else => self.state = .invalid, }, + .osc_11 => {}, + + .osc_110 => {}, + + .osc_111 => {}, + + .osc_112 => {}, + .@"12" => switch (c) { - ';' => self.state = .query_cursor_color, + ';' => osc_12: { + if (self.alloc == null) { + log.warn("OSC 12 requires an allocator, but none was provided", .{}); + self.state = .invalid; + break :osc_12; + } + self.state = .osc_12; + self.buf_start = self.buf_idx; + self.complete = true; + }, else => self.state = .invalid, }, + .osc_12 => {}, + .@"13" => switch (c) { '3' => self.state = .@"133", else => self.state = .invalid, @@ -978,60 +1013,6 @@ pub const Parser = struct { }, }, - .query_fg_color => switch (c) { - '?' => { - self.command = .{ .report_color = .{ .kind = .foreground } }; - self.complete = true; - self.state = .invalid; - }, - else => { - self.command = .{ .set_color = .{ - .kind = .foreground, - .value = "", - } }; - - self.state = .string; - self.temp_state = .{ .str = &self.command.set_color.value }; - self.buf_start = self.buf_idx - 1; - }, - }, - - .query_bg_color => switch (c) { - '?' => { - self.command = .{ .report_color = .{ .kind = .background } }; - self.complete = true; - self.state = .invalid; - }, - else => { - self.command = .{ .set_color = .{ - .kind = .background, - .value = "", - } }; - - self.state = .string; - self.temp_state = .{ .str = &self.command.set_color.value }; - self.buf_start = self.buf_idx - 1; - }, - }, - - .query_cursor_color => switch (c) { - '?' => { - self.command = .{ .report_color = .{ .kind = .cursor } }; - self.complete = true; - self.state = .invalid; - }, - else => { - self.command = .{ .set_color = .{ - .kind = .cursor, - .value = "", - } }; - - self.state = .string; - self.temp_state = .{ .str = &self.command.set_color.value }; - self.buf_start = self.buf_idx - 1; - }, - }, - .semantic_prompt => switch (c) { 'A' => { self.state = .semantic_option_start; @@ -1397,6 +1378,115 @@ pub const Parser = struct { } } + fn parseOSC101112(self: *Parser) void { + assert(switch (self.state) { + .osc_10, .osc_11, .osc_12 => true, + else => false, + }); + + const alloc = self.alloc orelse return; + + self.command = .{ + .color_operation = .{ + .source = switch (self.state) { + .osc_10 => .osc_10, + .osc_11 => .osc_11, + .osc_12 => .osc_12, + else => unreachable, + }, + .operations = std.ArrayListUnmanaged(Command.ColorOperation).initCapacity(alloc, 1) catch |err| { + log.warn("unable to allocate memory for OSC 10/11/12 parsing: {}", .{err}); + self.state = .invalid; + return; + }, + }, + }; + const str = self.buf[self.buf_start..self.buf_idx]; + var it = std.mem.splitScalar(u8, str, ';'); + const color_str = it.next() orelse { + log.warn("OSC 10/11/12 requires an argument", .{}); + self.state = .invalid; + return; + }; + if (std.mem.eql(u8, color_str, "?")) { + self.command.color_operation.operations.append( + alloc, + .{ + .report = switch (self.state) { + .osc_10 => .foreground, + .osc_11 => .background, + .osc_12 => .cursor, + else => unreachable, + }, + }, + ) catch |err| { + log.warn("unable to append color operation: {}", .{err}); + return; + }; + } else { + const color = RGB.parse(color_str) catch |err| { + log.warn("invalid color specification in OSC 10/11/12: {s} {}", .{ color_str, err }); + return; + }; + self.command.color_operation.operations.append( + alloc, + .{ + .set = .{ + .kind = switch (self.state) { + .osc_10 => .foreground, + .osc_11 => .background, + .osc_12 => .cursor, + else => unreachable, + }, + .color = color, + }, + }, + ) catch |err| { + log.warn("unable to append color operation: {}", .{err}); + return; + }; + } + } + + fn parseOSC110111112(self: *Parser) void { + assert(switch (self.state) { + .osc_110, .osc_111, .osc_112 => true, + else => false, + }); + + const alloc = self.alloc orelse return; + + self.command = .{ + .color_operation = .{ + .source = switch (self.state) { + .osc_110 => .osc_110, + .osc_111 => .osc_111, + .osc_112 => .osc_112, + else => unreachable, + }, + .operations = std.ArrayListUnmanaged(Command.ColorOperation).initCapacity(alloc, 1) catch |err| { + log.warn("unable to allocate memory for OSC 110/111/112 parsing: {}", .{err}); + self.state = .invalid; + return; + }, + }, + }; + self.command.color_operation.operations.append( + alloc, + .{ + .reset = switch (self.state) { + .osc_110 => .foreground, + .osc_111 => .background, + .osc_112 => .cursor, + else => unreachable, + }, + }, + ) catch |err| { + log.warn("unable to append color operation: {}", .{err}); + return; + }; + } + fn parseOSC104(self: *Parser) void { assert(self.state == .osc_104); @@ -1457,13 +1547,22 @@ pub const Parser = struct { .allocable_string => self.endAllocableString(), .kitty_color_protocol_key => self.endKittyColorProtocolOption(.key_only, true), .kitty_color_protocol_value => self.endKittyColorProtocolOption(.key_and_value, true), - .osc_4 => self.parseOSC4(), - .osc_104 => self.parseOSC104(), + .osc_4, + => self.parseOSC4(), + .osc_10, + .osc_11, + .osc_12, + => self.parseOSC101112(), + .osc_104, + => self.parseOSC104(), + .osc_110, + .osc_111, + .osc_112, + => self.parseOSC110111112(), else => {}, } switch (self.command) { - .report_color => |*c| c.terminator = .init(terminator_ch), .kitty_color_protocol => |*c| c.terminator = .init(terminator_ch), .color_operation => |*c| c.terminator = .init(terminator_ch), else => {}, @@ -1674,17 +1773,86 @@ test "OSC: end_of_input" { try testing.expect(cmd == .end_of_input); } -test "OSC: reset cursor color" { +test "OSC: OSC110: reset cursor color" { const testing = std.testing; - var p: Parser = .{}; + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); - const input = "112"; + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "110"; for (input) |ch| p.next(ch); const cmd = p.end(null).?; - try testing.expect(cmd == .reset_color); - try testing.expectEqual(cmd.reset_color.kind, .cursor); + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .st); + try testing.expect(cmd.color_operation.source == .osc_110); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .reset); + try testing.expectEqual( + Command.ColorKind.foreground, + op.reset, + ); + } +} + +test "OSC: OSC111: reset cursor color" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "111"; + for (input) |ch| p.next(ch); + + const cmd = p.end(null).?; + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .st); + try testing.expect(cmd.color_operation.source == .osc_111); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .reset); + try testing.expectEqual( + Command.ColorKind.background, + op.reset, + ); + } +} + +test "OSC: OSC112: reset cursor color" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "112"; + for (input) |ch| { + log.warn("feeding {c} {s}", .{ ch, @tagName(p.state) }); + p.next(ch); + } + log.warn("finish: {s}", .{@tagName(p.state)}); + + const cmd = p.end(null).?; + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .st); + try testing.expect(cmd.color_operation.source == .osc_112); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .reset); + try testing.expectEqual( + Command.ColorKind.cursor, + op.reset, + ); + } } test "OSC: get/set clipboard" { @@ -1781,62 +1949,178 @@ test "OSC: longer than buffer" { try testing.expect(p.complete == false); } -test "OSC: report default foreground color" { +test "OSC: OSC10: report default foreground color" { const testing = std.testing; - var p: Parser = .{}; + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; const input = "10;?"; for (input) |ch| p.next(ch); // This corresponds to ST = ESC followed by \ const cmd = p.end('\x1b').?; - try testing.expect(cmd == .report_color); - try testing.expectEqual(cmd.report_color.kind, .foreground); - try testing.expectEqual(cmd.report_color.terminator, .st); + + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .st); + try testing.expect(cmd.color_operation.source == .osc_10); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind.foreground, + op.report, + ); + } } -test "OSC: set foreground color" { +test "OSC: OSC10: set foreground color" { const testing = std.testing; - var p: Parser = .{}; + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; const input = "10;rgbi:0.0/0.5/1.0"; for (input) |ch| p.next(ch); const cmd = p.end('\x07').?; - try testing.expect(cmd == .set_color); - try testing.expectEqual(cmd.set_color.kind, .foreground); - try testing.expectEqualStrings(cmd.set_color.value, "rgbi:0.0/0.5/1.0"); + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .bel); + try testing.expect(cmd.color_operation.source == .osc_10); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .set); + try testing.expectEqual( + Command.ColorKind.foreground, + op.set.kind, + ); + try testing.expectEqual( + RGB{ .r = 0x00, .g = 0x7f, .b = 0xff }, + op.set.color, + ); + } } -test "OSC: report default background color" { +test "OSC: OSC11: report default background color" { const testing = std.testing; - var p: Parser = .{}; + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; const input = "11;?"; for (input) |ch| p.next(ch); // This corresponds to ST = BEL character const cmd = p.end('\x07').?; - try testing.expect(cmd == .report_color); - try testing.expectEqual(cmd.report_color.kind, .background); - try testing.expectEqual(cmd.report_color.terminator, .bel); + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .bel); + try testing.expect(cmd.color_operation.source == .osc_11); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind.background, + op.report, + ); + } + try testing.expectEqual(cmd.color_operation.terminator, .bel); } -test "OSC: set background color" { +test "OSC: OSC11: set background color" { const testing = std.testing; - var p: Parser = .{}; + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; const input = "11;rgb:f/ff/ffff"; for (input) |ch| p.next(ch); const cmd = p.end('\x1b').?; - try testing.expect(cmd == .set_color); - try testing.expectEqual(cmd.set_color.kind, .background); - try testing.expectEqualStrings(cmd.set_color.value, "rgb:f/ff/ffff"); + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .st); + try testing.expect(cmd.color_operation.source == .osc_11); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .set); + try testing.expectEqual( + Command.ColorKind.background, + op.set.kind, + ); + try testing.expectEqual( + RGB{ .r = 0xff, .g = 0xff, .b = 0xff }, + op.set.color, + ); + } +} + +test "OSC: OSC12: report background color" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "12;?"; + for (input) |ch| p.next(ch); + + // This corresponds to ST = BEL character + const cmd = p.end('\x07').?; + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .bel); + try testing.expect(cmd.color_operation.source == .osc_12); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind.cursor, + op.report, + ); + } + try testing.expectEqual(cmd.color_operation.terminator, .bel); +} + +test "OSC: OSC12: set background color" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "12;rgb:f/ff/ffff"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .st); + try testing.expect(cmd.color_operation.source == .osc_12); + try testing.expect(cmd.color_operation.operations.items.len == 1); + { + const op = cmd.color_operation.operations.items[0]; + try testing.expect(op == .set); + try testing.expectEqual( + Command.ColorKind.cursor, + op.set.kind, + ); + try testing.expectEqual( + RGB{ .r = 0xff, .g = 0xff, .b = 0xff }, + op.set.color, + ); + } } test "OSC: OSC4: get palette color 1" { diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index 2a1ae80c9..08ce23098 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -1562,27 +1562,6 @@ pub fn Stream(comptime Handler: type) type { } else log.warn("unimplemented OSC callback: {}", .{cmd}); }, - .report_color => |v| { - if (@hasDecl(T, "reportColor")) { - try self.handler.reportColor(v.kind, v.terminator); - return; - } else log.warn("unimplemented OSC callback: {}", .{cmd}); - }, - - .set_color => |v| { - if (@hasDecl(T, "setColor")) { - try self.handler.setColor(v.kind, v.value); - return; - } else log.warn("unimplemented OSC callback: {}", .{cmd}); - }, - - .reset_color => |v| { - if (@hasDecl(T, "resetColor")) { - try self.handler.resetColor(v.kind, v.value); - return; - } else log.warn("unimplemented OSC callback: {}", .{cmd}); - }, - .kitty_color_protocol => |v| { if (@hasDecl(T, "sendKittyColorReport")) { try self.handler.sendKittyColorReport(v); diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 57a1eeacf..396aae01f 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1370,203 +1370,6 @@ pub const StreamHandler = struct { } } - /// Implements OSC 4, OSC 10, and OSC 11, which reports palette color, - /// default foreground color, and background color respectively. - pub fn reportColor( - self: *StreamHandler, - kind: terminal.osc.Command.ColorKind, - terminator: terminal.osc.Terminator, - ) !void { - if (self.osc_color_report_format == .none) return; - - const color = switch (kind) { - .palette => |i| self.terminal.color_palette.colors[i], - .foreground => self.foreground_color orelse self.default_foreground_color, - .background => self.background_color orelse self.default_background_color, - .cursor => self.cursor_color orelse - self.default_cursor_color orelse - self.foreground_color orelse - self.default_foreground_color, - }; - - var msg: termio.Message = .{ .write_small = .{} }; - const resp = switch (self.osc_color_report_format) { - .@"16-bit" => switch (kind) { - .palette => |i| try std.fmt.bufPrint( - &msg.write_small.data, - "\x1B]{s};{d};rgb:{x:0>4}/{x:0>4}/{x:0>4}{s}", - .{ - kind.code(), - i, - @as(u16, color.r) * 257, - @as(u16, color.g) * 257, - @as(u16, color.b) * 257, - terminator.string(), - }, - ), - else => try std.fmt.bufPrint( - &msg.write_small.data, - "\x1B]{s};rgb:{x:0>4}/{x:0>4}/{x:0>4}{s}", - .{ - kind.code(), - @as(u16, color.r) * 257, - @as(u16, color.g) * 257, - @as(u16, color.b) * 257, - terminator.string(), - }, - ), - }, - - .@"8-bit" => switch (kind) { - .palette => |i| try std.fmt.bufPrint( - &msg.write_small.data, - "\x1B]{s};{d};rgb:{x:0>2}/{x:0>2}/{x:0>2}{s}", - .{ - kind.code(), - i, - @as(u16, color.r), - @as(u16, color.g), - @as(u16, color.b), - terminator.string(), - }, - ), - else => try std.fmt.bufPrint( - &msg.write_small.data, - "\x1B]{s};rgb:{x:0>2}/{x:0>2}/{x:0>2}{s}", - .{ - kind.code(), - @as(u16, color.r), - @as(u16, color.g), - @as(u16, color.b), - terminator.string(), - }, - ), - }, - .none => unreachable, // early return above - }; - msg.write_small.len = @intCast(resp.len); - self.messageWriter(msg); - } - - pub fn setColor( - self: *StreamHandler, - kind: terminal.osc.Command.ColorKind, - value: []const u8, - ) !void { - const color = try terminal.color.RGB.parse(value); - - switch (kind) { - .palette => |i| { - self.terminal.flags.dirty.palette = true; - self.terminal.color_palette.colors[i] = color; - self.terminal.color_palette.mask.set(i); - }, - .foreground => { - self.foreground_color = color; - _ = self.renderer_mailbox.push(.{ - .foreground_color = color, - }, .{ .forever = {} }); - }, - .background => { - self.background_color = color; - _ = self.renderer_mailbox.push(.{ - .background_color = color, - }, .{ .forever = {} }); - }, - .cursor => { - self.cursor_color = color; - _ = self.renderer_mailbox.push(.{ - .cursor_color = color, - }, .{ .forever = {} }); - }, - } - - // Notify the surface of the color change - self.surfaceMessageWriter(.{ .color_change = .{ - .kind = kind, - .color = color, - } }); - } - - pub fn resetColor( - self: *StreamHandler, - kind: terminal.osc.Command.ColorKind, - value: []const u8, - ) !void { - switch (kind) { - .palette => { - const mask = &self.terminal.color_palette.mask; - if (value.len == 0) { - // Find all bit positions in the mask which are set and - // reset those indices to the default palette - var it = mask.iterator(.{}); - while (it.next()) |i| { - self.terminal.flags.dirty.palette = true; - self.terminal.color_palette.colors[i] = self.terminal.default_palette[i]; - mask.unset(i); - - self.surfaceMessageWriter(.{ .color_change = .{ - .kind = .{ .palette = @intCast(i) }, - .color = self.terminal.color_palette.colors[i], - } }); - } - } else { - var it = std.mem.tokenizeScalar(u8, value, ';'); - while (it.next()) |param| { - // Skip invalid parameters - const i = std.fmt.parseUnsigned(u8, param, 10) catch continue; - if (mask.isSet(i)) { - self.terminal.flags.dirty.palette = true; - self.terminal.color_palette.colors[i] = self.terminal.default_palette[i]; - mask.unset(i); - - self.surfaceMessageWriter(.{ .color_change = .{ - .kind = .{ .palette = @intCast(i) }, - .color = self.terminal.color_palette.colors[i], - } }); - } - } - } - }, - .foreground => { - self.foreground_color = null; - _ = self.renderer_mailbox.push(.{ - .foreground_color = self.foreground_color, - }, .{ .forever = {} }); - - self.surfaceMessageWriter(.{ .color_change = .{ - .kind = .foreground, - .color = self.default_foreground_color, - } }); - }, - .background => { - self.background_color = null; - _ = self.renderer_mailbox.push(.{ - .background_color = self.background_color, - }, .{ .forever = {} }); - - self.surfaceMessageWriter(.{ .color_change = .{ - .kind = .background, - .color = self.default_background_color, - } }); - }, - .cursor => { - self.cursor_color = null; - - _ = self.renderer_mailbox.push(.{ - .cursor_color = self.cursor_color, - }, .{ .forever = {} }); - - if (self.default_cursor_color) |color| { - self.surfaceMessageWriter(.{ .color_change = .{ - .kind = .cursor, - .color = color, - } }); - } - }, - } - } - pub fn showDesktopNotification( self: *StreamHandler, title: []const u8, From 1288296fdc718308049b124f031a3899973e59ab Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Fri, 23 May 2025 22:04:26 -0500 Subject: [PATCH 028/371] OSC: add a datastructure to prevent some (most?) allocations --- src/datastruct/list.zig | 100 ++++++++++++++++ src/terminal/Parser.zig | 6 +- src/terminal/osc.zig | 216 +++++++++++++++++++++------------- src/terminal/stream.zig | 2 +- src/termio/stream_handler.zig | 6 +- 5 files changed, 246 insertions(+), 84 deletions(-) create mode 100644 src/datastruct/list.zig diff --git a/src/datastruct/list.zig b/src/datastruct/list.zig new file mode 100644 index 000000000..e5f8bb483 --- /dev/null +++ b/src/datastruct/list.zig @@ -0,0 +1,100 @@ +const std = @import("std"); + +const assert = std.debug.assert; + +/// Datastructure to manage a (usually) small list of items. To prevent allocations +/// on the heap, statically allocate a small array that gets used to store items. Once +/// that small array is full then memory will be dynamically allocated on the heap +/// to store items. +pub fn ArrayListStaticUnmanaged(comptime static_size: usize, comptime T: type) type { + return struct { + count: usize, + static: [static_size]T, + dynamic: std.ArrayListUnmanaged(T), + + const Self = @This(); + + pub const empty: Self = .{ + .count = 0, + .static = undefined, + .dynamic = .empty, + }; + + pub fn deinit(self: *Self, alloc: std.mem.Allocator) void { + self.dynamic.deinit(alloc); + } + + pub fn append(self: *Self, alloc: std.mem.Allocator, item: T) !void { + if (self.count < static_size) { + self.static[self.count] = item; + self.count += 1; + assert(self.count <= static_size); + return; + } + try self.dynamic.append(alloc, item); + self.count += 1; + assert(self.count == static_size + self.dynamic.items.len); + } + + pub const Iterator = struct { + context: *const Self, + index: usize, + + pub fn next(self: *Iterator) ?T { + if (self.index >= self.context.count) return null; + + if (self.index < static_size) { + defer self.index += 1; + return self.context.static[self.index]; + } + + assert(self.index - static_size < self.context.dynamic.items.len); + + defer self.index += 1; + return self.context.dynamic.items[self.index - static_size]; + } + }; + + pub fn iterator(self: *const Self) Iterator { + return .{ + .context = self, + .index = 0, + }; + } + }; +} + +test "ArrayListStaticUnmanged: 1" { + const alloc = std.testing.allocator; + + var l: ArrayListStaticUnmanaged(1, usize) = .empty; + defer l.deinit(alloc); + + try l.append(alloc, 1); + + try std.testing.expectEqual(1, l.count); + try std.testing.expectEqual(1, l.static[0]); + try std.testing.expectEqual(0, l.dynamic.items.len); + + var it = l.iterator(); + try std.testing.expectEqual(1, it.next().?); + try std.testing.expectEqual(null, it.next()); +} + +test "ArrayListStaticUnmanged: 2" { + const alloc = std.testing.allocator; + + var l: ArrayListStaticUnmanaged(1, usize) = .empty; + defer l.deinit(alloc); + + try l.append(alloc, 1); + try l.append(alloc, 2); + + try std.testing.expectEqual(2, l.count); + try std.testing.expectEqual(1, l.static[0]); + try std.testing.expectEqual(1, l.dynamic.items.len); + var it = l.iterator(); + try std.testing.expectEqual(1, it.next().?); + try std.testing.expectEqual(2, it.next().?); + try std.testing.expectEqual(null, it.next()); +} diff --git a/src/terminal/Parser.zig b/src/terminal/Parser.zig index 80772d71f..0f035f7fb 100644 --- a/src/terminal/Parser.zig +++ b/src/terminal/Parser.zig @@ -900,15 +900,17 @@ test "osc: 112 incomplete sequence" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); try testing.expect(cmd.color_operation.source == .osc_112); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .reset); try testing.expectEqual( osc.Command.ColorKind.cursor, op.reset, ); } + try std.testing.expect(it.next() == null); } } diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 7b9239e43..0f5ecf724 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -13,6 +13,8 @@ const Allocator = mem.Allocator; const RGB = @import("color.zig").RGB; const kitty = @import("kitty.zig"); +const ArrayListStaticUnmanaged = @import("../datastruct/list.zig").ArrayListStaticUnmanaged; + const log = std.log.scoped(.osc); pub const Command = union(enum) { @@ -112,7 +114,7 @@ pub const Command = union(enum) { /// OSC color operations color_operation: struct { source: ColorOperationSource, - operations: std.ArrayListUnmanaged(ColorOperation) = .empty, + operations: ColorOperationList = .empty, terminator: Terminator = .st, }, @@ -187,6 +189,8 @@ pub const Command = union(enum) { report: ColorKind, }; + pub const ColorOperationList = ArrayListStaticUnmanaged(4, ColorOperation); + pub const ColorKind = union(enum) { palette: u8, foreground, @@ -1325,11 +1329,7 @@ pub const Parser = struct { self.command = .{ .color_operation = .{ .source = .osc_4, - .operations = std.ArrayListUnmanaged(Command.ColorOperation).initCapacity(alloc, 8) catch |err| { - log.warn("unable to allocate memory for OSC 4 parsing: {}", .{err}); - self.state = .invalid; - return; - }, + .operations = .empty, }, }; @@ -1394,11 +1394,7 @@ pub const Parser = struct { .osc_12 => .osc_12, else => unreachable, }, - .operations = std.ArrayListUnmanaged(Command.ColorOperation).initCapacity(alloc, 1) catch |err| { - log.warn("unable to allocate memory for OSC 10/11/12 parsing: {}", .{err}); - self.state = .invalid; - return; - }, + .operations = .empty, }, }; const str = self.buf[self.buf_start..self.buf_idx]; @@ -1464,11 +1460,7 @@ pub const Parser = struct { .osc_112 => .osc_112, else => unreachable, }, - .operations = std.ArrayListUnmanaged(Command.ColorOperation).initCapacity(alloc, 1) catch |err| { - log.warn("unable to allocate memory for OSC 110/111/112 parsing: {}", .{err}); - self.state = .invalid; - return; - }, + .operations = .empty, }, }; self.command.color_operation.operations.append( @@ -1495,11 +1487,7 @@ pub const Parser = struct { self.command = .{ .color_operation = .{ .source = .osc_104, - .operations = std.ArrayListUnmanaged(Command.ColorOperation).initCapacity(alloc, 8) catch |err| { - log.warn("unable to allocate memory for OSC 104 parsing: {}", .{err}); - self.state = .invalid; - return; - }, + .operations = .empty, }, }; @@ -1788,15 +1776,17 @@ test "OSC: OSC110: reset cursor color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_110); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .reset); try testing.expectEqual( Command.ColorKind.foreground, op.reset, ); } + try testing.expect(it.next() == null); } test "OSC: OSC111: reset cursor color" { @@ -1814,15 +1804,17 @@ test "OSC: OSC111: reset cursor color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_111); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .reset); try testing.expectEqual( Command.ColorKind.background, op.reset, ); } + try testing.expect(it.next() == null); } test "OSC: OSC112: reset cursor color" { @@ -1834,25 +1826,55 @@ test "OSC: OSC112: reset cursor color" { var p: Parser = .{ .alloc = arena.allocator() }; const input = "112"; - for (input) |ch| { - log.warn("feeding {c} {s}", .{ ch, @tagName(p.state) }); - p.next(ch); - } - log.warn("finish: {s}", .{@tagName(p.state)}); + for (input) |ch| p.next(ch); const cmd = p.end(null).?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_112); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .reset); try testing.expectEqual( Command.ColorKind.cursor, op.reset, ); } + try testing.expect(it.next() == null); +} + +test "OSC: OSC112: reset cursor color with semicolon" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "112;"; + for (input) |ch| { + log.warn("feeding {c} {s}", .{ ch, @tagName(p.state) }); + p.next(ch); + } + log.warn("finish: {s}", .{@tagName(p.state)}); + + const cmd = p.end(0x07).?; + try testing.expect(cmd == .color_operation); + try testing.expectEqual(cmd.color_operation.terminator, .bel); + try testing.expect(cmd.color_operation.source == .osc_112); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); + { + const op = it.next().?; + try testing.expect(op == .reset); + try testing.expectEqual( + Command.ColorKind.cursor, + op.reset, + ); + } + try testing.expect(it.next() == null); } test "OSC: get/set clipboard" { @@ -1966,15 +1988,17 @@ test "OSC: OSC10: report default foreground color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_10); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .report); try testing.expectEqual( Command.ColorKind.foreground, op.report, ); } + try testing.expect(it.next() == null); } test "OSC: OSC10: set foreground color" { @@ -1992,9 +2016,10 @@ test "OSC: OSC10: set foreground color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); try testing.expect(cmd.color_operation.source == .osc_10); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .set); try testing.expectEqual( Command.ColorKind.foreground, @@ -2005,6 +2030,7 @@ test "OSC: OSC10: set foreground color" { op.set.color, ); } + try testing.expect(it.next() == null); } test "OSC: OSC11: report default background color" { @@ -2023,9 +2049,10 @@ test "OSC: OSC11: report default background color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); try testing.expect(cmd.color_operation.source == .osc_11); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .report); try testing.expectEqual( Command.ColorKind.background, @@ -2033,6 +2060,7 @@ test "OSC: OSC11: report default background color" { ); } try testing.expectEqual(cmd.color_operation.terminator, .bel); + try testing.expect(it.next() == null); } test "OSC: OSC11: set background color" { @@ -2050,9 +2078,10 @@ test "OSC: OSC11: set background color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_11); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .set); try testing.expectEqual( Command.ColorKind.background, @@ -2063,6 +2092,7 @@ test "OSC: OSC11: set background color" { op.set.color, ); } + try testing.expect(it.next() == null); } test "OSC: OSC12: report background color" { @@ -2081,9 +2111,10 @@ test "OSC: OSC12: report background color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); try testing.expect(cmd.color_operation.source == .osc_12); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .report); try testing.expectEqual( Command.ColorKind.cursor, @@ -2091,6 +2122,7 @@ test "OSC: OSC12: report background color" { ); } try testing.expectEqual(cmd.color_operation.terminator, .bel); + try testing.expect(it.next() == null); } test "OSC: OSC12: set background color" { @@ -2108,9 +2140,10 @@ test "OSC: OSC12: set background color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_12); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .set); try testing.expectEqual( Command.ColorKind.cursor, @@ -2121,6 +2154,7 @@ test "OSC: OSC12: set background color" { op.set.color, ); } + try testing.expect(it.next() == null); } test "OSC: OSC4: get palette color 1" { @@ -2137,9 +2171,10 @@ test "OSC: OSC4: get palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .report); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, @@ -2147,6 +2182,7 @@ test "OSC: OSC4: get palette color 1" { ); try testing.expectEqual(cmd.color_operation.terminator, .st); } + try testing.expect(it.next() == null); } test "OSC: OSC4: get palette color 2" { @@ -2163,9 +2199,10 @@ test "OSC: OSC4: get palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.items.len == 2); + try testing.expect(cmd.color_operation.operations.count == 2); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .report); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, @@ -2173,7 +2210,7 @@ test "OSC: OSC4: get palette color 2" { ); } { - const op = cmd.color_operation.operations.items[1]; + const op = it.next().?; try testing.expect(op == .report); try testing.expectEqual( Command.ColorKind{ .palette = 2 }, @@ -2181,6 +2218,7 @@ test "OSC: OSC4: get palette color 2" { ); } try testing.expectEqual(cmd.color_operation.terminator, .st); + try testing.expect(it.next() == null); } test "OSC: OSC4: set palette color 1" { @@ -2197,17 +2235,21 @@ test "OSC: OSC4: set palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.items.len == 1); - const op = cmd.color_operation.operations.items[0]; - try testing.expect(op == .set); - try testing.expectEqual( - Command.ColorKind{ .palette = 17 }, - op.set.kind, - ); - try testing.expectEqual( - RGB{ .r = 0xaa, .g = 0xbb, .b = 0xcc }, - op.set.color, - ); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); + { + const op = it.next().?; + try testing.expect(op == .set); + try testing.expectEqual( + Command.ColorKind{ .palette = 17 }, + op.set.kind, + ); + try testing.expectEqual( + RGB{ .r = 0xaa, .g = 0xbb, .b = 0xcc }, + op.set.color, + ); + } + try testing.expect(it.next() == null); } test "OSC: OSC4: set palette color 2" { @@ -2224,9 +2266,10 @@ test "OSC: OSC4: set palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.items.len == 2); + try testing.expect(cmd.color_operation.operations.count == 2); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .set); try testing.expectEqual( Command.ColorKind{ .palette = 17 }, @@ -2238,7 +2281,7 @@ test "OSC: OSC4: set palette color 2" { ); } { - const op = cmd.color_operation.operations.items[1]; + const op = it.next().?; try testing.expect(op == .set); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, @@ -2249,6 +2292,7 @@ test "OSC: OSC4: set palette color 2" { op.set.color, ); } + try testing.expect(it.next() == null); } test "OSC: OSC4: get with invalid index" { @@ -2265,15 +2309,17 @@ test "OSC: OSC4: get with invalid index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .report); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, op.report, ); } + try testing.expect(it.next() == null); } test "OSC: OSC4: set with invalid index" { @@ -2290,9 +2336,10 @@ test "OSC: OSC4: set with invalid index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .set); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, @@ -2303,6 +2350,7 @@ test "OSC: OSC4: set with invalid index" { op.set.color, ); } + try testing.expect(it.next() == null); } test "OSC: OSC4: mix get/set palette color" { @@ -2319,9 +2367,10 @@ test "OSC: OSC4: mix get/set palette color" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.items.len == 2); + try testing.expect(cmd.color_operation.operations.count == 2); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .set); try testing.expectEqual( Command.ColorKind{ .palette = 17 }, @@ -2333,10 +2382,11 @@ test "OSC: OSC4: mix get/set palette color" { ); } { - const op = cmd.color_operation.operations.items[1]; + const op = it.next().?; try testing.expect(op == .report); try testing.expectEqual(Command.ColorKind{ .palette = 254 }, op.report); } + try testing.expect(it.next() == null); } test "OSC: OSC104: reset palette color 1" { @@ -2353,15 +2403,17 @@ test "OSC: OSC104: reset palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_104); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 17 }, op.reset, ); } + try testing.expect(it.next() == null); } test "OSC: OSC104: reset palette color 2" { @@ -2378,9 +2430,10 @@ test "OSC: OSC104: reset palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_104); - try testing.expect(cmd.color_operation.operations.items.len == 2); + try testing.expect(cmd.color_operation.operations.count == 2); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 17 }, @@ -2388,13 +2441,14 @@ test "OSC: OSC104: reset palette color 2" { ); } { - const op = cmd.color_operation.operations.items[1]; + const op = it.next().?; try testing.expect(op == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 111 }, op.reset, ); } + try testing.expect(it.next() == null); } test "OSC: OSC104: invalid palette index" { @@ -2411,15 +2465,17 @@ test "OSC: OSC104: invalid palette index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_104); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 111 }, op.reset, ); } + try testing.expect(it.next() == null); } test "OSC: OSC104: empty palette index" { @@ -2436,15 +2492,17 @@ test "OSC: OSC104: empty palette index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_104); - try testing.expect(cmd.color_operation.operations.items.len == 1); + try testing.expect(cmd.color_operation.operations.count == 1); + var it = cmd.color_operation.operations.iterator(); { - const op = cmd.color_operation.operations.items[0]; + const op = it.next().?; try testing.expect(op == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 111 }, op.reset, ); } + try std.testing.expect(it.next() == null); } test "OSC: conemu sleep" { diff --git a/src/terminal/stream.zig b/src/terminal/stream.zig index 08ce23098..fd30720b3 100644 --- a/src/terminal/stream.zig +++ b/src/terminal/stream.zig @@ -1557,7 +1557,7 @@ pub fn Stream(comptime Handler: type) type { .color_operation => |v| { if (@hasDecl(T, "handleColorOperation")) { - try self.handler.handleColorOperation(v.source, v.operations.items, v.terminator); + try self.handler.handleColorOperation(v.source, &v.operations, v.terminator); return; } else log.warn("unimplemented OSC callback: {}", .{cmd}); }, diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 396aae01f..fd450f229 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1198,7 +1198,7 @@ pub const StreamHandler = struct { pub fn handleColorOperation( self: *StreamHandler, source: terminal.osc.Command.ColorOperationSource, - operations: []terminal.osc.Command.ColorOperation, + operations: *const terminal.osc.Command.ColorOperationList, terminator: terminal.osc.Terminator, ) !void { var buffer: [1024]u8 = undefined; @@ -1212,7 +1212,9 @@ pub const StreamHandler = struct { try writer.print("\x1b]{}", .{source}); - for (operations) |op| { + var it = operations.iterator(); + + while (it.next()) |op| { switch (op) { .set => |set| { switch (set.kind) { From 04e8e521719e040e36e0814fd6944220a7e1cbd5 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Fri, 23 May 2025 22:26:01 -0500 Subject: [PATCH 029/371] OSC: reflow comment --- src/datastruct/list.zig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/datastruct/list.zig b/src/datastruct/list.zig index e5f8bb483..7e9b78761 100644 --- a/src/datastruct/list.zig +++ b/src/datastruct/list.zig @@ -2,10 +2,10 @@ const std = @import("std"); const assert = std.debug.assert; -/// Datastructure to manage a (usually) small list of items. To prevent allocations -/// on the heap, statically allocate a small array that gets used to store items. Once -/// that small array is full then memory will be dynamically allocated on the heap -/// to store items. +/// Datastructure to manage a (usually) small list of items. To prevent +/// allocations on the heap, statically allocate a small array that gets used to +/// store items. Once that small array is full then memory will be dynamically +/// allocated on the heap to store items. pub fn ArrayListStaticUnmanaged(comptime static_size: usize, comptime T: type) type { return struct { count: usize, From 1d9d253e4d2651f5c075082e94bf0eecbcd706e8 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Fri, 23 May 2025 22:26:21 -0500 Subject: [PATCH 030/371] OSC: fix bug with buffer disappearing --- src/termio/stream_handler.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index fd450f229..51dec5347 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1367,7 +1367,7 @@ pub const StreamHandler = struct { } if (report) { try writer.writeAll(terminator.string()); - const msg: termio.Message = .{ .write_stable = response.items }; + const msg = try termio.Message.writeReq(self.alloc, response.items); self.messageWriter(msg); } } From 397a8b13e06b74ba5a9a73f4bcbecf769ba3f485 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Fri, 23 May 2025 22:57:18 -0500 Subject: [PATCH 031/371] OSC: more tests --- src/terminal/osc.zig | 205 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 204 insertions(+), 1 deletion(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 0f5ecf724..a8906b74f 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -2295,7 +2295,7 @@ test "OSC: OSC4: set palette color 2" { try testing.expect(it.next() == null); } -test "OSC: OSC4: get with invalid index" { +test "OSC: OSC4: get with invalid index 1" { const testing = std.testing; var arena = std.heap.ArenaAllocator.init(std.testing.allocator); @@ -2322,6 +2322,209 @@ test "OSC: OSC4: get with invalid index" { try testing.expect(it.next() == null); } +test "OSC: OSC4: get with invalid index 2" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "4;5;?;1111;?;1;?"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.count == 2); + var it = cmd.color_operation.operations.iterator(); + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 5 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 1 }, + op.report, + ); + } + try testing.expect(it.next() == null); +} + +// Inspired by Microsoft Edit +test "OSC: OSC4: multiple get 8a" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "4;0;?;1;?;2;?;3;?;4;?;5;?;6;?;7;?"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.count == 8); + var it = cmd.color_operation.operations.iterator(); + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 0 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 1 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 2 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 3 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 4 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 5 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 6 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 7 }, + op.report, + ); + } + try testing.expect(it.next() == null); +} + +// Inspired by Microsoft Edit +test "OSC: OSC4: multiple get 8b" { + const testing = std.testing; + + var arena = std.heap.ArenaAllocator.init(std.testing.allocator); + defer arena.deinit(); + + var p: Parser = .{ .alloc = arena.allocator() }; + + const input = "4;8;?;9;?;10;?;11;?;12;?;13;?;14;?;15;?"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.operations.count == 8); + var it = cmd.color_operation.operations.iterator(); + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 8 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 9 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 10 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 11 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 12 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 13 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 14 }, + op.report, + ); + } + { + const op = it.next().?; + try testing.expect(op == .report); + try testing.expectEqual( + Command.ColorKind{ .palette = 15 }, + op.report, + ); + } + try testing.expect(it.next() == null); +} + test "OSC: OSC4: set with invalid index" { const testing = std.testing; From 479fa9f809b079e638941afe8394564e2bffbd8f Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 08:04:33 -0500 Subject: [PATCH 032/371] OSC: use std.SegmentedList instead of custom data structure --- src/datastruct/list.zig | 100 ----------- src/terminal/Parser.zig | 6 +- src/terminal/osc.zig | 308 ++++++++++++++++------------------ src/termio/stream_handler.zig | 4 +- 4 files changed, 154 insertions(+), 264 deletions(-) delete mode 100644 src/datastruct/list.zig diff --git a/src/datastruct/list.zig b/src/datastruct/list.zig deleted file mode 100644 index 7e9b78761..000000000 --- a/src/datastruct/list.zig +++ /dev/null @@ -1,100 +0,0 @@ -const std = @import("std"); - -const assert = std.debug.assert; - -/// Datastructure to manage a (usually) small list of items. To prevent -/// allocations on the heap, statically allocate a small array that gets used to -/// store items. Once that small array is full then memory will be dynamically -/// allocated on the heap to store items. -pub fn ArrayListStaticUnmanaged(comptime static_size: usize, comptime T: type) type { - return struct { - count: usize, - static: [static_size]T, - dynamic: std.ArrayListUnmanaged(T), - - const Self = @This(); - - pub const empty: Self = .{ - .count = 0, - .static = undefined, - .dynamic = .empty, - }; - - pub fn deinit(self: *Self, alloc: std.mem.Allocator) void { - self.dynamic.deinit(alloc); - } - - pub fn append(self: *Self, alloc: std.mem.Allocator, item: T) !void { - if (self.count < static_size) { - self.static[self.count] = item; - self.count += 1; - assert(self.count <= static_size); - return; - } - try self.dynamic.append(alloc, item); - self.count += 1; - assert(self.count == static_size + self.dynamic.items.len); - } - - pub const Iterator = struct { - context: *const Self, - index: usize, - - pub fn next(self: *Iterator) ?T { - if (self.index >= self.context.count) return null; - - if (self.index < static_size) { - defer self.index += 1; - return self.context.static[self.index]; - } - - assert(self.index - static_size < self.context.dynamic.items.len); - - defer self.index += 1; - return self.context.dynamic.items[self.index - static_size]; - } - }; - - pub fn iterator(self: *const Self) Iterator { - return .{ - .context = self, - .index = 0, - }; - } - }; -} - -test "ArrayListStaticUnmanged: 1" { - const alloc = std.testing.allocator; - - var l: ArrayListStaticUnmanaged(1, usize) = .empty; - defer l.deinit(alloc); - - try l.append(alloc, 1); - - try std.testing.expectEqual(1, l.count); - try std.testing.expectEqual(1, l.static[0]); - try std.testing.expectEqual(0, l.dynamic.items.len); - - var it = l.iterator(); - try std.testing.expectEqual(1, it.next().?); - try std.testing.expectEqual(null, it.next()); -} - -test "ArrayListStaticUnmanged: 2" { - const alloc = std.testing.allocator; - - var l: ArrayListStaticUnmanaged(1, usize) = .empty; - defer l.deinit(alloc); - - try l.append(alloc, 1); - try l.append(alloc, 2); - - try std.testing.expectEqual(2, l.count); - try std.testing.expectEqual(1, l.static[0]); - try std.testing.expectEqual(1, l.dynamic.items.len); - var it = l.iterator(); - try std.testing.expectEqual(1, it.next().?); - try std.testing.expectEqual(2, it.next().?); - try std.testing.expectEqual(null, it.next()); -} diff --git a/src/terminal/Parser.zig b/src/terminal/Parser.zig index 0f035f7fb..df18fbc7a 100644 --- a/src/terminal/Parser.zig +++ b/src/terminal/Parser.zig @@ -900,11 +900,11 @@ test "osc: 112 incomplete sequence" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); try testing.expect(cmd.color_operation.source == .osc_112); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( osc.Command.ColorKind.cursor, op.reset, diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index a8906b74f..449713ff2 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -13,8 +13,6 @@ const Allocator = mem.Allocator; const RGB = @import("color.zig").RGB; const kitty = @import("kitty.zig"); -const ArrayListStaticUnmanaged = @import("../datastruct/list.zig").ArrayListStaticUnmanaged; - const log = std.log.scoped(.osc); pub const Command = union(enum) { @@ -111,10 +109,18 @@ pub const Command = union(enum) { value: []const u8, }, - /// OSC color operations + /// OSC color operations to set, reset, or report color settings. Some OSCs + /// allow multiple operations to be specified in a single OSC so we need a + /// list-like datastructure to manage them. We use std.SegmentedList because + /// it minimizes the number of allocations and copies because a large + /// majority of the time there will be only one operation per OSC. + /// + /// Currently, these OSCs are handled by `color_operation`: + /// + /// 4, 10, 11, 12, 104, 110, 111, 112 color_operation: struct { source: ColorOperationSource, - operations: ColorOperationList = .empty, + operations: ColorOperationList = .{}, terminator: Terminator = .st, }, @@ -189,7 +195,7 @@ pub const Command = union(enum) { report: ColorKind, }; - pub const ColorOperationList = ArrayListStaticUnmanaged(4, ColorOperation); + pub const ColorOperationList = std.SegmentedList(ColorOperation, 4); pub const ColorKind = union(enum) { palette: u8, @@ -1329,7 +1335,6 @@ pub const Parser = struct { self.command = .{ .color_operation = .{ .source = .osc_4, - .operations = .empty, }, }; @@ -1346,34 +1351,30 @@ pub const Parser = struct { }; const spec_str = it.next() orelse continue; if (std.mem.eql(u8, spec_str, "?")) { - self.command.color_operation.operations.append( - alloc, - .{ - .report = .{ .palette = index }, - }, - ) catch |err| { + const op = self.command.color_operation.operations.addOne(alloc) catch |err| { log.warn("unable to append color operation: {}", .{err}); return; }; + op.* = .{ + .report = .{ .palette = index }, + }; } else { const color = RGB.parse(spec_str) catch |err| { log.warn("invalid color specification in OSC 4: {s} {}", .{ spec_str, err }); continue; }; - self.command.color_operation.operations.append( - alloc, - .{ - .set = .{ - .kind = .{ - .palette = index, - }, - .color = color, - }, - }, - ) catch |err| { + const op = self.command.color_operation.operations.addOne(alloc) catch |err| { log.warn("unable to append color operation: {}", .{err}); return; }; + op.* = .{ + .set = .{ + .kind = .{ + .palette = index, + }, + .color = color, + }, + }; } } } @@ -1394,7 +1395,6 @@ pub const Parser = struct { .osc_12 => .osc_12, else => unreachable, }, - .operations = .empty, }, }; const str = self.buf[self.buf_start..self.buf_idx]; @@ -1405,42 +1405,38 @@ pub const Parser = struct { return; }; if (std.mem.eql(u8, color_str, "?")) { - self.command.color_operation.operations.append( - alloc, - .{ - .report = switch (self.state) { - .osc_10 => .foreground, - .osc_11 => .background, - .osc_12 => .cursor, - else => unreachable, - }, - }, - ) catch |err| { + const op = self.command.color_operation.operations.addOne(alloc) catch |err| { log.warn("unable to append color operation: {}", .{err}); return; }; + op.* = .{ + .report = switch (self.state) { + .osc_10 => .foreground, + .osc_11 => .background, + .osc_12 => .cursor, + else => unreachable, + }, + }; } else { const color = RGB.parse(color_str) catch |err| { log.warn("invalid color specification in OSC 10/11/12: {s} {}", .{ color_str, err }); return; }; - self.command.color_operation.operations.append( - alloc, - .{ - .set = .{ - .kind = switch (self.state) { - .osc_10 => .foreground, - .osc_11 => .background, - .osc_12 => .cursor, - else => unreachable, - }, - .color = color, - }, - }, - ) catch |err| { + const op = self.command.color_operation.operations.addOne(alloc) catch |err| { log.warn("unable to append color operation: {}", .{err}); return; }; + op.* = .{ + .set = .{ + .kind = switch (self.state) { + .osc_10 => .foreground, + .osc_11 => .background, + .osc_12 => .cursor, + else => unreachable, + }, + .color = color, + }, + }; } } @@ -1460,23 +1456,20 @@ pub const Parser = struct { .osc_112 => .osc_112, else => unreachable, }, - .operations = .empty, }, }; - self.command.color_operation.operations.append( - alloc, - .{ - .reset = switch (self.state) { - .osc_110 => .foreground, - .osc_111 => .background, - .osc_112 => .cursor, - else => unreachable, - }, - }, - ) catch |err| { + const op = self.command.color_operation.operations.addOne(alloc) catch |err| { log.warn("unable to append color operation: {}", .{err}); return; }; + op.* = .{ + .reset = switch (self.state) { + .osc_110 => .foreground, + .osc_111 => .background, + .osc_112 => .cursor, + else => unreachable, + }, + }; } fn parseOSC104(self: *Parser) void { @@ -1487,7 +1480,6 @@ pub const Parser = struct { self.command = .{ .color_operation = .{ .source = .osc_104, - .operations = .empty, }, }; @@ -1500,15 +1492,13 @@ pub const Parser = struct { continue; }, }; - self.command.color_operation.operations.append( - alloc, - .{ - .reset = .{ .palette = index }, - }, - ) catch |err| { + const op = self.command.color_operation.operations.addOne(alloc) catch |err| { log.warn("unable to append color operation: {}", .{err}); return; }; + op.* = .{ + .reset = .{ .palette = index }, + }; } } @@ -1776,11 +1766,11 @@ test "OSC: OSC110: reset cursor color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_110); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( Command.ColorKind.foreground, op.reset, @@ -1804,11 +1794,11 @@ test "OSC: OSC111: reset cursor color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_111); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( Command.ColorKind.background, op.reset, @@ -1832,11 +1822,11 @@ test "OSC: OSC112: reset cursor color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_112); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( Command.ColorKind.cursor, op.reset, @@ -1864,11 +1854,11 @@ test "OSC: OSC112: reset cursor color with semicolon" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); try testing.expect(cmd.color_operation.source == .osc_112); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( Command.ColorKind.cursor, op.reset, @@ -1988,11 +1978,11 @@ test "OSC: OSC10: report default foreground color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_10); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind.foreground, op.report, @@ -2016,11 +2006,11 @@ test "OSC: OSC10: set foreground color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); try testing.expect(cmd.color_operation.source == .osc_10); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .set); + try testing.expect(op.* == .set); try testing.expectEqual( Command.ColorKind.foreground, op.set.kind, @@ -2049,11 +2039,11 @@ test "OSC: OSC11: report default background color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); try testing.expect(cmd.color_operation.source == .osc_11); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind.background, op.report, @@ -2078,11 +2068,11 @@ test "OSC: OSC11: set background color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_11); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .set); + try testing.expect(op.* == .set); try testing.expectEqual( Command.ColorKind.background, op.set.kind, @@ -2111,11 +2101,11 @@ test "OSC: OSC12: report background color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); try testing.expect(cmd.color_operation.source == .osc_12); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind.cursor, op.report, @@ -2140,11 +2130,11 @@ test "OSC: OSC12: set background color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); try testing.expect(cmd.color_operation.source == .osc_12); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .set); + try testing.expect(op.* == .set); try testing.expectEqual( Command.ColorKind.cursor, op.set.kind, @@ -2171,11 +2161,11 @@ test "OSC: OSC4: get palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, op.report, @@ -2199,11 +2189,11 @@ test "OSC: OSC4: get palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 2); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 2); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, op.report, @@ -2211,7 +2201,7 @@ test "OSC: OSC4: get palette color 2" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 2 }, op.report, @@ -2235,11 +2225,11 @@ test "OSC: OSC4: set palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .set); + try testing.expect(op.* == .set); try testing.expectEqual( Command.ColorKind{ .palette = 17 }, op.set.kind, @@ -2266,11 +2256,11 @@ test "OSC: OSC4: set palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 2); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 2); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .set); + try testing.expect(op.* == .set); try testing.expectEqual( Command.ColorKind{ .palette = 17 }, op.set.kind, @@ -2282,7 +2272,7 @@ test "OSC: OSC4: set palette color 2" { } { const op = it.next().?; - try testing.expect(op == .set); + try testing.expect(op.* == .set); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, op.set.kind, @@ -2309,11 +2299,11 @@ test "OSC: OSC4: get with invalid index 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, op.report, @@ -2336,11 +2326,11 @@ test "OSC: OSC4: get with invalid index 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 2); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 2); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 5 }, op.report, @@ -2348,7 +2338,7 @@ test "OSC: OSC4: get with invalid index 2" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, op.report, @@ -2372,11 +2362,11 @@ test "OSC: OSC4: multiple get 8a" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 8); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 8); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 0 }, op.report, @@ -2384,7 +2374,7 @@ test "OSC: OSC4: multiple get 8a" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, op.report, @@ -2392,7 +2382,7 @@ test "OSC: OSC4: multiple get 8a" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 2 }, op.report, @@ -2400,7 +2390,7 @@ test "OSC: OSC4: multiple get 8a" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 3 }, op.report, @@ -2408,7 +2398,7 @@ test "OSC: OSC4: multiple get 8a" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 4 }, op.report, @@ -2416,7 +2406,7 @@ test "OSC: OSC4: multiple get 8a" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 5 }, op.report, @@ -2424,7 +2414,7 @@ test "OSC: OSC4: multiple get 8a" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 6 }, op.report, @@ -2432,7 +2422,7 @@ test "OSC: OSC4: multiple get 8a" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 7 }, op.report, @@ -2456,11 +2446,11 @@ test "OSC: OSC4: multiple get 8b" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 8); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 8); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 8 }, op.report, @@ -2468,7 +2458,7 @@ test "OSC: OSC4: multiple get 8b" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 9 }, op.report, @@ -2476,7 +2466,7 @@ test "OSC: OSC4: multiple get 8b" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 10 }, op.report, @@ -2484,7 +2474,7 @@ test "OSC: OSC4: multiple get 8b" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 11 }, op.report, @@ -2492,7 +2482,7 @@ test "OSC: OSC4: multiple get 8b" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 12 }, op.report, @@ -2500,7 +2490,7 @@ test "OSC: OSC4: multiple get 8b" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 13 }, op.report, @@ -2508,7 +2498,7 @@ test "OSC: OSC4: multiple get 8b" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 14 }, op.report, @@ -2516,7 +2506,7 @@ test "OSC: OSC4: multiple get 8b" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual( Command.ColorKind{ .palette = 15 }, op.report, @@ -2539,11 +2529,11 @@ test "OSC: OSC4: set with invalid index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .set); + try testing.expect(op.* == .set); try testing.expectEqual( Command.ColorKind{ .palette = 1 }, op.set.kind, @@ -2570,11 +2560,11 @@ test "OSC: OSC4: mix get/set palette color" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_4); - try testing.expect(cmd.color_operation.operations.count == 2); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 2); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .set); + try testing.expect(op.* == .set); try testing.expectEqual( Command.ColorKind{ .palette = 17 }, op.set.kind, @@ -2586,7 +2576,7 @@ test "OSC: OSC4: mix get/set palette color" { } { const op = it.next().?; - try testing.expect(op == .report); + try testing.expect(op.* == .report); try testing.expectEqual(Command.ColorKind{ .palette = 254 }, op.report); } try testing.expect(it.next() == null); @@ -2606,11 +2596,11 @@ test "OSC: OSC104: reset palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_104); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 17 }, op.reset, @@ -2633,11 +2623,11 @@ test "OSC: OSC104: reset palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_104); - try testing.expect(cmd.color_operation.operations.count == 2); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 2); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 17 }, op.reset, @@ -2645,7 +2635,7 @@ test "OSC: OSC104: reset palette color 2" { } { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 111 }, op.reset, @@ -2668,11 +2658,11 @@ test "OSC: OSC104: invalid palette index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_104); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 111 }, op.reset, @@ -2695,11 +2685,11 @@ test "OSC: OSC104: empty palette index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expect(cmd.color_operation.source == .osc_104); - try testing.expect(cmd.color_operation.operations.count == 1); - var it = cmd.color_operation.operations.iterator(); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; - try testing.expect(op == .reset); + try testing.expect(op.* == .reset); try testing.expectEqual( Command.ColorKind{ .palette = 111 }, op.reset, diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 51dec5347..5977f6564 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1212,10 +1212,10 @@ pub const StreamHandler = struct { try writer.print("\x1b]{}", .{source}); - var it = operations.iterator(); + var it = operations.constIterator(0); while (it.next()) |op| { - switch (op) { + switch (op.*) { .set => |set| { switch (set.kind) { .palette => |i| { From bd4d1950ce12855479424a7d7713bc65383e6d32 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 08:17:31 -0500 Subject: [PATCH 033/371] OSC: remove unused code --- src/terminal/osc.zig | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 449713ff2..0c429c70e 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -202,15 +202,6 @@ pub const Command = union(enum) { foreground, background, cursor, - - pub fn code(self: ColorKind) []const u8 { - return switch (self) { - .palette => "4", - .foreground => "10", - .background => "11", - .cursor => "12", - }; - } }; pub const ProgressState = enum { From f2dfd9f6779f0cabb61f2c4ef3a70216ab9d42de Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 08:18:09 -0500 Subject: [PATCH 034/371] OSC: improve formatting of ColorOperationSource --- src/terminal/osc.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 0c429c70e..78a3560af 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -179,10 +179,10 @@ pub const Command = union(enum) { pub fn format( self: ColorOperationSource, comptime _: []const u8, - _: std.fmt.FormatOptions, + options: std.fmt.FormatOptions, writer: anytype, ) !void { - try writer.print("{d}", .{@intFromEnum(self)}); + try std.fmt.formatInt(@intFromEnum(self), 10, .lower, options, writer); } }; From e0ddc7a2fa66b5e990fc1bfa6ddc0e3ef930bb40 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 08:32:10 -0500 Subject: [PATCH 035/371] OSC: clean up color_operation handling --- src/termio/stream_handler.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 5977f6564..4bb0f9c9d 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1201,6 +1201,9 @@ pub const StreamHandler = struct { operations: *const terminal.osc.Command.ColorOperationList, terminator: terminal.osc.Terminator, ) !void { + // return early if there is nothing to do + if (operations.count() == 0) return; + var buffer: [1024]u8 = undefined; var fba: std.heap.FixedBufferAllocator = .init(&buffer); const alloc = fba.allocator(); @@ -1366,6 +1369,8 @@ pub const StreamHandler = struct { } } if (report) { + // If any of the operations were reports, finialize the report + // string and send it to the terminal. try writer.writeAll(terminator.string()); const msg = try termio.Message.writeReq(self.alloc, response.items); self.messageWriter(msg); From 35384670c4c80f532966955c2e4ad78dc41e2a48 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 08:59:37 -0500 Subject: [PATCH 036/371] OSC: fix typo --- src/termio/stream_handler.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 4bb0f9c9d..ca16b0bd2 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1369,7 +1369,7 @@ pub const StreamHandler = struct { } } if (report) { - // If any of the operations were reports, finialize the report + // If any of the operations were reports, finalize the report // string and send it to the terminal. try writer.writeAll(terminator.string()); const msg = try termio.Message.writeReq(self.alloc, response.items); From fa03115f01abf63e45e37316479e291150fc6787 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 10:52:36 -0500 Subject: [PATCH 037/371] OSC: don't use arena during testing --- src/terminal/Parser.zig | 6 +- src/terminal/osc.zig | 147 ++++++++++++++-------------------------- 2 files changed, 51 insertions(+), 102 deletions(-) diff --git a/src/terminal/Parser.zig b/src/terminal/Parser.zig index df18fbc7a..8cf2996d6 100644 --- a/src/terminal/Parser.zig +++ b/src/terminal/Parser.zig @@ -877,11 +877,9 @@ test "osc: change window title (end in esc)" { // https://github.com/darrenstarr/VtNetCore/pull/14 // Saw this on HN, decided to add a test case because why not. test "osc: 112 incomplete sequence" { - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - var p: Parser = init(); - p.osc_parser.alloc = arena.allocator(); + defer p.deinit(); + p.osc_parser.alloc = std.testing.allocator; _ = p.next(0x1B); _ = p.next(']'); diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 78a3560af..7e5a71536 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -1745,10 +1745,8 @@ test "OSC: end_of_input" { test "OSC: OSC110: reset cursor color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "110"; for (input) |ch| p.next(ch); @@ -1773,10 +1771,8 @@ test "OSC: OSC110: reset cursor color" { test "OSC: OSC111: reset cursor color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "111"; for (input) |ch| p.next(ch); @@ -1801,10 +1797,8 @@ test "OSC: OSC111: reset cursor color" { test "OSC: OSC112: reset cursor color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "112"; for (input) |ch| p.next(ch); @@ -1829,10 +1823,8 @@ test "OSC: OSC112: reset cursor color" { test "OSC: OSC112: reset cursor color with semicolon" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "112;"; for (input) |ch| { @@ -1888,9 +1880,8 @@ test "OSC: get/set clipboard (optional parameter)" { test "OSC: get/set clipboard with allocator" { const testing = std.testing; - const alloc = testing.allocator; - var p: Parser = .{ .alloc = alloc }; + var p: Parser = .{ .alloc = testing.allocator }; defer p.deinit(); const input = "52;s;?"; @@ -1955,10 +1946,8 @@ test "OSC: longer than buffer" { test "OSC: OSC10: report default foreground color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "10;?"; for (input) |ch| p.next(ch); @@ -1985,10 +1974,8 @@ test "OSC: OSC10: report default foreground color" { test "OSC: OSC10: set foreground color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "10;rgbi:0.0/0.5/1.0"; for (input) |ch| p.next(ch); @@ -2017,10 +2004,8 @@ test "OSC: OSC10: set foreground color" { test "OSC: OSC11: report default background color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "11;?"; for (input) |ch| p.next(ch); @@ -2047,10 +2032,8 @@ test "OSC: OSC11: report default background color" { test "OSC: OSC11: set background color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "11;rgb:f/ff/ffff"; for (input) |ch| p.next(ch); @@ -2079,10 +2062,8 @@ test "OSC: OSC11: set background color" { test "OSC: OSC12: report background color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "12;?"; for (input) |ch| p.next(ch); @@ -2109,10 +2090,8 @@ test "OSC: OSC12: report background color" { test "OSC: OSC12: set background color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "12;rgb:f/ff/ffff"; for (input) |ch| p.next(ch); @@ -2141,10 +2120,8 @@ test "OSC: OSC12: set background color" { test "OSC: OSC4: get palette color 1" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;1;?"; for (input) |ch| p.next(ch); @@ -2169,10 +2146,8 @@ test "OSC: OSC4: get palette color 1" { test "OSC: OSC4: get palette color 2" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;1;?;2;?"; for (input) |ch| p.next(ch); @@ -2205,10 +2180,8 @@ test "OSC: OSC4: get palette color 2" { test "OSC: OSC4: set palette color 1" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;17;rgb:aa/bb/cc"; for (input) |ch| p.next(ch); @@ -2236,10 +2209,8 @@ test "OSC: OSC4: set palette color 1" { test "OSC: OSC4: set palette color 2" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;17;rgb:aa/bb/cc;1;rgb:00/11/22"; for (input) |ch| p.next(ch); @@ -2279,10 +2250,8 @@ test "OSC: OSC4: set palette color 2" { test "OSC: OSC4: get with invalid index 1" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;1111;?;1;?"; for (input) |ch| p.next(ch); @@ -2306,10 +2275,8 @@ test "OSC: OSC4: get with invalid index 1" { test "OSC: OSC4: get with invalid index 2" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;5;?;1111;?;1;?"; for (input) |ch| p.next(ch); @@ -2342,10 +2309,8 @@ test "OSC: OSC4: get with invalid index 2" { test "OSC: OSC4: multiple get 8a" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;0;?;1;?;2;?;3;?;4;?;5;?;6;?;7;?"; for (input) |ch| p.next(ch); @@ -2426,10 +2391,8 @@ test "OSC: OSC4: multiple get 8a" { test "OSC: OSC4: multiple get 8b" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;8;?;9;?;10;?;11;?;12;?;13;?;14;?;15;?"; for (input) |ch| p.next(ch); @@ -2509,10 +2472,8 @@ test "OSC: OSC4: multiple get 8b" { test "OSC: OSC4: set with invalid index" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;256;#ffffff;1;#aabbcc"; for (input) |ch| p.next(ch); @@ -2540,10 +2501,8 @@ test "OSC: OSC4: set with invalid index" { test "OSC: OSC4: mix get/set palette color" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "4;17;rgb:aa/bb/cc;254;?"; for (input) |ch| p.next(ch); @@ -2576,10 +2535,8 @@ test "OSC: OSC4: mix get/set palette color" { test "OSC: OSC104: reset palette color 1" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "104;17"; for (input) |ch| p.next(ch); @@ -2603,10 +2560,8 @@ test "OSC: OSC104: reset palette color 1" { test "OSC: OSC104: reset palette color 2" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "104;17;111"; for (input) |ch| p.next(ch); @@ -2638,10 +2593,8 @@ test "OSC: OSC104: reset palette color 2" { test "OSC: OSC104: invalid palette index" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "104;ffff;111"; for (input) |ch| p.next(ch); @@ -2665,10 +2618,8 @@ test "OSC: OSC104: invalid palette index" { test "OSC: OSC104: empty palette index" { const testing = std.testing; - var arena = std.heap.ArenaAllocator.init(std.testing.allocator); - defer arena.deinit(); - - var p: Parser = .{ .alloc = arena.allocator() }; + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); const input = "104;;111"; for (input) |ch| p.next(ch); From bcf4d55dad47472e317130f4372fb3ddfa35b512 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 11:30:17 -0500 Subject: [PATCH 038/371] OSC: nest ColorOperation-related structs --- src/apprt/surface.zig | 2 +- src/terminal/Parser.zig | 4 +- src/terminal/osc.zig | 232 +++++++++++++++++----------------- src/termio/stream_handler.zig | 4 +- 4 files changed, 122 insertions(+), 120 deletions(-) diff --git a/src/apprt/surface.zig b/src/apprt/surface.zig index 6de41c544..dce6a3a56 100644 --- a/src/apprt/surface.zig +++ b/src/apprt/surface.zig @@ -74,7 +74,7 @@ pub const Message = union(enum) { /// A terminal color was changed using OSC sequences. color_change: struct { - kind: terminal.osc.Command.ColorKind, + kind: terminal.osc.Command.ColorOperation.Kind, color: terminal.color.RGB, }, diff --git a/src/terminal/Parser.zig b/src/terminal/Parser.zig index 8cf2996d6..ec3f322f6 100644 --- a/src/terminal/Parser.zig +++ b/src/terminal/Parser.zig @@ -897,14 +897,14 @@ test "osc: 112 incomplete sequence" { const cmd = a[0].?.osc_dispatch; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); - try testing.expect(cmd.color_operation.source == .osc_112); + try testing.expect(cmd.color_operation.source == .reset_cursor); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - osc.Command.ColorKind.cursor, + osc.Command.ColorOperation.Kind.cursor, op.reset, ); } diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 7e5a71536..67f665f1a 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -119,8 +119,8 @@ pub const Command = union(enum) { /// /// 4, 10, 11, 12, 104, 110, 111, 112 color_operation: struct { - source: ColorOperationSource, - operations: ColorOperationList = .{}, + source: ColorOperation.Source, + operations: ColorOperation.List = .{}, terminator: Terminator = .st, }, @@ -166,42 +166,44 @@ pub const Command = union(enum) { /// Wait input (OSC 9;5) wait_input: void, - pub const ColorOperationSource = enum(u16) { - osc_4 = 4, - osc_10 = 10, - osc_11 = 11, - osc_12 = 12, - osc_104 = 104, - osc_110 = 110, - osc_111 = 111, - osc_112 = 112, - - pub fn format( - self: ColorOperationSource, - comptime _: []const u8, - options: std.fmt.FormatOptions, - writer: anytype, - ) !void { - try std.fmt.formatInt(@intFromEnum(self), 10, .lower, options, writer); - } - }; - pub const ColorOperation = union(enum) { + pub const Source = enum(u16) { + // these numbers are based on the OSC operation code + // see https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Operating-System-Commands + get_set_palette = 4, + get_set_foreground = 10, + get_set_background = 11, + get_set_cursor = 12, + reset_palette = 104, + reset_foreground = 110, + reset_background = 111, + reset_cursor = 112, + + pub fn format( + self: Source, + comptime _: []const u8, + options: std.fmt.FormatOptions, + writer: anytype, + ) !void { + try std.fmt.formatInt(@intFromEnum(self), 10, .lower, options, writer); + } + }; + + pub const List = std.SegmentedList(ColorOperation, 4); + + pub const Kind = union(enum) { + palette: u8, + foreground, + background, + cursor, + }; + set: struct { - kind: ColorKind, + kind: Kind, color: RGB, }, - reset: ColorKind, - report: ColorKind, - }; - - pub const ColorOperationList = std.SegmentedList(ColorOperation, 4); - - pub const ColorKind = union(enum) { - palette: u8, - foreground, - background, - cursor, + reset: Kind, + report: Kind, }; pub const ProgressState = enum { @@ -1325,7 +1327,7 @@ pub const Parser = struct { self.command = .{ .color_operation = .{ - .source = .osc_4, + .source = .get_set_palette, }, }; @@ -1381,9 +1383,9 @@ pub const Parser = struct { self.command = .{ .color_operation = .{ .source = switch (self.state) { - .osc_10 => .osc_10, - .osc_11 => .osc_11, - .osc_12 => .osc_12, + .osc_10 => .get_set_foreground, + .osc_11 => .get_set_background, + .osc_12 => .get_set_cursor, else => unreachable, }, }, @@ -1442,9 +1444,9 @@ pub const Parser = struct { self.command = .{ .color_operation = .{ .source = switch (self.state) { - .osc_110 => .osc_110, - .osc_111 => .osc_111, - .osc_112 => .osc_112, + .osc_110 => .reset_foreground, + .osc_111 => .reset_background, + .osc_112 => .reset_cursor, else => unreachable, }, }, @@ -1470,7 +1472,7 @@ pub const Parser = struct { self.command = .{ .color_operation = .{ - .source = .osc_104, + .source = .get_set_palette, }, }; @@ -1742,7 +1744,7 @@ test "OSC: end_of_input" { try testing.expect(cmd == .end_of_input); } -test "OSC: OSC110: reset cursor color" { +test "OSC: OSC110: reset foreground color" { const testing = std.testing; var p: Parser = .{ .alloc = testing.allocator }; @@ -1754,21 +1756,21 @@ test "OSC: OSC110: reset cursor color" { const cmd = p.end(null).?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); - try testing.expect(cmd.color_operation.source == .osc_110); + try testing.expect(cmd.color_operation.source == .reset_foreground); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - Command.ColorKind.foreground, + Command.ColorOperation.Kind.foreground, op.reset, ); } try testing.expect(it.next() == null); } -test "OSC: OSC111: reset cursor color" { +test "OSC: OSC111: reset background color" { const testing = std.testing; var p: Parser = .{ .alloc = testing.allocator }; @@ -1780,14 +1782,14 @@ test "OSC: OSC111: reset cursor color" { const cmd = p.end(null).?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); - try testing.expect(cmd.color_operation.source == .osc_111); + try testing.expect(cmd.color_operation.source == .reset_background); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - Command.ColorKind.background, + Command.ColorOperation.Kind.background, op.reset, ); } @@ -1806,14 +1808,14 @@ test "OSC: OSC112: reset cursor color" { const cmd = p.end(null).?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); - try testing.expect(cmd.color_operation.source == .osc_112); + try testing.expect(cmd.color_operation.source == .reset_cursor); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - Command.ColorKind.cursor, + Command.ColorOperation.Kind.cursor, op.reset, ); } @@ -1836,14 +1838,14 @@ test "OSC: OSC112: reset cursor color with semicolon" { const cmd = p.end(0x07).?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); - try testing.expect(cmd.color_operation.source == .osc_112); + try testing.expect(cmd.color_operation.source == .reset_cursor); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - Command.ColorKind.cursor, + Command.ColorOperation.Kind.cursor, op.reset, ); } @@ -1943,7 +1945,7 @@ test "OSC: longer than buffer" { try testing.expect(p.complete == false); } -test "OSC: OSC10: report default foreground color" { +test "OSC: OSC10: report foreground color" { const testing = std.testing; var p: Parser = .{ .alloc = testing.allocator }; @@ -1957,14 +1959,14 @@ test "OSC: OSC10: report default foreground color" { try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); - try testing.expect(cmd.color_operation.source == .osc_10); + try testing.expect(cmd.color_operation.source == .get_set_foreground); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind.foreground, + Command.ColorOperation.Kind.foreground, op.report, ); } @@ -1983,14 +1985,14 @@ test "OSC: OSC10: set foreground color" { const cmd = p.end('\x07').?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); - try testing.expect(cmd.color_operation.source == .osc_10); + try testing.expect(cmd.color_operation.source == .get_set_foreground); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .set); try testing.expectEqual( - Command.ColorKind.foreground, + Command.ColorOperation.Kind.foreground, op.set.kind, ); try testing.expectEqual( @@ -2001,7 +2003,7 @@ test "OSC: OSC10: set foreground color" { try testing.expect(it.next() == null); } -test "OSC: OSC11: report default background color" { +test "OSC: OSC11: report background color" { const testing = std.testing; var p: Parser = .{ .alloc = testing.allocator }; @@ -2014,14 +2016,14 @@ test "OSC: OSC11: report default background color" { const cmd = p.end('\x07').?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); - try testing.expect(cmd.color_operation.source == .osc_11); + try testing.expect(cmd.color_operation.source == .get_set_background); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind.background, + Command.ColorOperation.Kind.background, op.report, ); } @@ -2041,14 +2043,14 @@ test "OSC: OSC11: set background color" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); - try testing.expect(cmd.color_operation.source == .osc_11); + try testing.expect(cmd.color_operation.source == .get_set_background); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .set); try testing.expectEqual( - Command.ColorKind.background, + Command.ColorOperation.Kind.background, op.set.kind, ); try testing.expectEqual( @@ -2059,7 +2061,7 @@ test "OSC: OSC11: set background color" { try testing.expect(it.next() == null); } -test "OSC: OSC12: report background color" { +test "OSC: OSC12: report cursor color" { const testing = std.testing; var p: Parser = .{ .alloc = testing.allocator }; @@ -2072,14 +2074,14 @@ test "OSC: OSC12: report background color" { const cmd = p.end('\x07').?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .bel); - try testing.expect(cmd.color_operation.source == .osc_12); + try testing.expect(cmd.color_operation.source == .get_set_cursor); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind.cursor, + Command.ColorOperation.Kind.cursor, op.report, ); } @@ -2087,7 +2089,7 @@ test "OSC: OSC12: report background color" { try testing.expect(it.next() == null); } -test "OSC: OSC12: set background color" { +test "OSC: OSC12: set cursor color" { const testing = std.testing; var p: Parser = .{ .alloc = testing.allocator }; @@ -2099,14 +2101,14 @@ test "OSC: OSC12: set background color" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); try testing.expectEqual(cmd.color_operation.terminator, .st); - try testing.expect(cmd.color_operation.source == .osc_12); + try testing.expect(cmd.color_operation.source == .get_set_cursor); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .set); try testing.expectEqual( - Command.ColorKind.cursor, + Command.ColorOperation.Kind.cursor, op.set.kind, ); try testing.expectEqual( @@ -2128,14 +2130,14 @@ test "OSC: OSC4: get palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 1 }, + Command.ColorOperation.Kind{ .palette = 1 }, op.report, ); try testing.expectEqual(cmd.color_operation.terminator, .st); @@ -2154,14 +2156,14 @@ test "OSC: OSC4: get palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 2); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 1 }, + Command.ColorOperation.Kind{ .palette = 1 }, op.report, ); } @@ -2169,7 +2171,7 @@ test "OSC: OSC4: get palette color 2" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 2 }, + Command.ColorOperation.Kind{ .palette = 2 }, op.report, ); } @@ -2188,14 +2190,14 @@ test "OSC: OSC4: set palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .set); try testing.expectEqual( - Command.ColorKind{ .palette = 17 }, + Command.ColorOperation.Kind{ .palette = 17 }, op.set.kind, ); try testing.expectEqual( @@ -2217,14 +2219,14 @@ test "OSC: OSC4: set palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 2); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .set); try testing.expectEqual( - Command.ColorKind{ .palette = 17 }, + Command.ColorOperation.Kind{ .palette = 17 }, op.set.kind, ); try testing.expectEqual( @@ -2236,7 +2238,7 @@ test "OSC: OSC4: set palette color 2" { const op = it.next().?; try testing.expect(op.* == .set); try testing.expectEqual( - Command.ColorKind{ .palette = 1 }, + Command.ColorOperation.Kind{ .palette = 1 }, op.set.kind, ); try testing.expectEqual( @@ -2258,14 +2260,14 @@ test "OSC: OSC4: get with invalid index 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 1 }, + Command.ColorOperation.Kind{ .palette = 1 }, op.report, ); } @@ -2283,14 +2285,14 @@ test "OSC: OSC4: get with invalid index 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 2); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 5 }, + Command.ColorOperation.Kind{ .palette = 5 }, op.report, ); } @@ -2298,7 +2300,7 @@ test "OSC: OSC4: get with invalid index 2" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 1 }, + Command.ColorOperation.Kind{ .palette = 1 }, op.report, ); } @@ -2317,14 +2319,14 @@ test "OSC: OSC4: multiple get 8a" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 8); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 0 }, + Command.ColorOperation.Kind{ .palette = 0 }, op.report, ); } @@ -2332,7 +2334,7 @@ test "OSC: OSC4: multiple get 8a" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 1 }, + Command.ColorOperation.Kind{ .palette = 1 }, op.report, ); } @@ -2340,7 +2342,7 @@ test "OSC: OSC4: multiple get 8a" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 2 }, + Command.ColorOperation.Kind{ .palette = 2 }, op.report, ); } @@ -2348,7 +2350,7 @@ test "OSC: OSC4: multiple get 8a" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 3 }, + Command.ColorOperation.Kind{ .palette = 3 }, op.report, ); } @@ -2356,7 +2358,7 @@ test "OSC: OSC4: multiple get 8a" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 4 }, + Command.ColorOperation.Kind{ .palette = 4 }, op.report, ); } @@ -2364,7 +2366,7 @@ test "OSC: OSC4: multiple get 8a" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 5 }, + Command.ColorOperation.Kind{ .palette = 5 }, op.report, ); } @@ -2372,7 +2374,7 @@ test "OSC: OSC4: multiple get 8a" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 6 }, + Command.ColorOperation.Kind{ .palette = 6 }, op.report, ); } @@ -2380,7 +2382,7 @@ test "OSC: OSC4: multiple get 8a" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 7 }, + Command.ColorOperation.Kind{ .palette = 7 }, op.report, ); } @@ -2399,14 +2401,14 @@ test "OSC: OSC4: multiple get 8b" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 8); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 8 }, + Command.ColorOperation.Kind{ .palette = 8 }, op.report, ); } @@ -2414,7 +2416,7 @@ test "OSC: OSC4: multiple get 8b" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 9 }, + Command.ColorOperation.Kind{ .palette = 9 }, op.report, ); } @@ -2422,7 +2424,7 @@ test "OSC: OSC4: multiple get 8b" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 10 }, + Command.ColorOperation.Kind{ .palette = 10 }, op.report, ); } @@ -2430,7 +2432,7 @@ test "OSC: OSC4: multiple get 8b" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 11 }, + Command.ColorOperation.Kind{ .palette = 11 }, op.report, ); } @@ -2438,7 +2440,7 @@ test "OSC: OSC4: multiple get 8b" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 12 }, + Command.ColorOperation.Kind{ .palette = 12 }, op.report, ); } @@ -2446,7 +2448,7 @@ test "OSC: OSC4: multiple get 8b" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 13 }, + Command.ColorOperation.Kind{ .palette = 13 }, op.report, ); } @@ -2454,7 +2456,7 @@ test "OSC: OSC4: multiple get 8b" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 14 }, + Command.ColorOperation.Kind{ .palette = 14 }, op.report, ); } @@ -2462,7 +2464,7 @@ test "OSC: OSC4: multiple get 8b" { const op = it.next().?; try testing.expect(op.* == .report); try testing.expectEqual( - Command.ColorKind{ .palette = 15 }, + Command.ColorOperation.Kind{ .palette = 15 }, op.report, ); } @@ -2480,14 +2482,14 @@ test "OSC: OSC4: set with invalid index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .set); try testing.expectEqual( - Command.ColorKind{ .palette = 1 }, + Command.ColorOperation.Kind{ .palette = 1 }, op.set.kind, ); try testing.expectEqual( @@ -2509,14 +2511,14 @@ test "OSC: OSC4: mix get/set palette color" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_4); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 2); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .set); try testing.expectEqual( - Command.ColorKind{ .palette = 17 }, + Command.ColorOperation.Kind{ .palette = 17 }, op.set.kind, ); try testing.expectEqual( @@ -2527,7 +2529,7 @@ test "OSC: OSC4: mix get/set palette color" { { const op = it.next().?; try testing.expect(op.* == .report); - try testing.expectEqual(Command.ColorKind{ .palette = 254 }, op.report); + try testing.expectEqual(Command.ColorOperation.Kind{ .palette = 254 }, op.report); } try testing.expect(it.next() == null); } @@ -2543,14 +2545,14 @@ test "OSC: OSC104: reset palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_104); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - Command.ColorKind{ .palette = 17 }, + Command.ColorOperation.Kind{ .palette = 17 }, op.reset, ); } @@ -2568,14 +2570,14 @@ test "OSC: OSC104: reset palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_104); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 2); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - Command.ColorKind{ .palette = 17 }, + Command.ColorOperation.Kind{ .palette = 17 }, op.reset, ); } @@ -2583,7 +2585,7 @@ test "OSC: OSC104: reset palette color 2" { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - Command.ColorKind{ .palette = 111 }, + Command.ColorOperation.Kind{ .palette = 111 }, op.reset, ); } @@ -2601,14 +2603,14 @@ test "OSC: OSC104: invalid palette index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_104); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - Command.ColorKind{ .palette = 111 }, + Command.ColorOperation.Kind{ .palette = 111 }, op.reset, ); } @@ -2626,14 +2628,14 @@ test "OSC: OSC104: empty palette index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .osc_104); + try testing.expect(cmd.color_operation.source == .get_set_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; try testing.expect(op.* == .reset); try testing.expectEqual( - Command.ColorKind{ .palette = 111 }, + Command.ColorOperation.Kind{ .palette = 111 }, op.reset, ); } diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index ca16b0bd2..554a87805 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1197,8 +1197,8 @@ pub const StreamHandler = struct { pub fn handleColorOperation( self: *StreamHandler, - source: terminal.osc.Command.ColorOperationSource, - operations: *const terminal.osc.Command.ColorOperationList, + source: terminal.osc.Command.ColorOperation.Source, + operations: *const terminal.osc.Command.ColorOperation.List, terminator: terminal.osc.Terminator, ) !void { // return early if there is nothing to do From 5fb32fd8a0d43412cf9375ad5f1fe850f23810ca Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 11:37:34 -0500 Subject: [PATCH 039/371] OSC: add comptime check for size of OSC Command --- src/terminal/osc.zig | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 67f665f1a..63d3e4c6b 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -189,7 +189,7 @@ pub const Command = union(enum) { } }; - pub const List = std.SegmentedList(ColorOperation, 4); + pub const List = std.SegmentedList(ColorOperation, 2); pub const Kind = union(enum) { palette: u8, @@ -213,6 +213,11 @@ pub const Command = union(enum) { indeterminate, pause, }; + + comptime { + assert(@sizeOf(Command) == 64); + // @compileLog(@sizeOf(Command)); + } }; /// The terminator used to end an OSC command. For OSC commands that demand From f0fc82c80f070937234198f6404e3626c514ad9f Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 12:12:28 -0500 Subject: [PATCH 040/371] OSC: account for 32-bit systems in comptime Command size check --- src/terminal/osc.zig | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 63d3e4c6b..8ca4326c5 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -215,7 +215,11 @@ pub const Command = union(enum) { }; comptime { - assert(@sizeOf(Command) == 64); + assert(@sizeOf(Command) == switch (@sizeOf(usize)) { + 4 => 44, + 8 => 64, + else => unreachable, + }); // @compileLog(@sizeOf(Command)); } }; From 1104993c940a26dcf3baad6917e988ea0c913cfb Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 16:42:55 -0500 Subject: [PATCH 041/371] OSC: move some processing back inside the OSC state machine --- src/terminal/osc.zig | 423 ++++++++++++++++++++++++------------------- 1 file changed, 238 insertions(+), 185 deletions(-) diff --git a/src/terminal/osc.zig b/src/terminal/osc.zig index 8ca4326c5..d0b59e834 100644 --- a/src/terminal/osc.zig +++ b/src/terminal/osc.zig @@ -345,7 +345,8 @@ pub const Parser = struct { clipboard_kind_end, // Get/set color palette index - osc_4, + osc_4_index, + osc_4_color, // Get/set foreground color osc_10, @@ -359,15 +360,6 @@ pub const Parser = struct { // Reset color palette index osc_104, - // Reset foreground color - osc_110, - - // Reset background color - osc_111, - - // Reset cursor color - osc_112, - // Hyperlinks hyperlink_param_key, hyperlink_param_value, @@ -547,6 +539,11 @@ pub const Parser = struct { self.state = .invalid; break :osc_10; } + self.command = .{ + .color_operation = .{ + .source = .get_set_foreground, + }, + }; self.state = .osc_10; self.buf_start = self.buf_idx; self.complete = true; @@ -555,7 +552,10 @@ pub const Parser = struct { else => self.state = .invalid, }, - .osc_10 => {}, + .osc_10, .osc_11, .osc_12 => switch (c) { + ';' => self.parseOSC101112(false), + else => {}, + }, .@"104" => switch (c) { ';' => osc_104: { @@ -564,6 +564,11 @@ pub const Parser = struct { self.state = .invalid; break :osc_104; } + self.command = .{ + .color_operation = .{ + .source = .reset_palette, + }, + }; self.state = .osc_104; self.buf_start = self.buf_idx; self.complete = true; @@ -571,7 +576,10 @@ pub const Parser = struct { else => self.state = .invalid, }, - .osc_104 => {}, + .osc_104 => switch (c) { + ';' => self.parseOSC104(false), + else => {}, + }, .@"11" => switch (c) { ';' => osc_11: { @@ -580,51 +588,52 @@ pub const Parser = struct { self.state = .invalid; break :osc_11; } + self.command = .{ + .color_operation = .{ + .source = .get_set_background, + }, + }; self.state = .osc_11; self.buf_start = self.buf_idx; self.complete = true; }, - '0' => osc_110: { + '0'...'2' => blk: { if (self.alloc == null) { - log.warn("OSC 110 requires an allocator, but none was provided", .{}); + log.warn("OSC 11{c} requires an allocator, but none was provided", .{c}); self.state = .invalid; - break :osc_110; + break :blk; } - self.state = .osc_110; - self.buf_start = self.buf_idx; - self.complete = true; - }, - '1' => osc_111: { - if (self.alloc == null) { - log.warn("OSC 111 requires an allocator, but none was provided", .{}); - self.state = .invalid; - break :osc_111; - } - self.state = .osc_111; - self.buf_start = self.buf_idx; - self.complete = true; - }, - '2' => osc_112: { - if (self.alloc == null) { - log.warn("OSC 112 requires an allocator, but none was provided", .{}); - self.state = .invalid; - break :osc_112; - } - self.state = .osc_112; - self.buf_start = self.buf_idx; + + const alloc = self.alloc orelse return; + + self.command = .{ + .color_operation = .{ + .source = switch (c) { + '0' => .reset_foreground, + '1' => .reset_background, + '2' => .reset_cursor, + else => unreachable, + }, + }, + }; + const op = self.command.color_operation.operations.addOne(alloc) catch |err| { + log.warn("unable to append color operation: {}", .{err}); + return; + }; + op.* = .{ + .reset = switch (c) { + '0' => .foreground, + '1' => .background, + '2' => .cursor, + else => unreachable, + }, + }; + self.state = .swallow; self.complete = true; }, else => self.state = .invalid, }, - .osc_11 => {}, - - .osc_110 => {}, - - .osc_111 => {}, - - .osc_112 => {}, - .@"12" => switch (c) { ';' => osc_12: { if (self.alloc == null) { @@ -632,6 +641,11 @@ pub const Parser = struct { self.state = .invalid; break :osc_12; } + self.command = .{ + .color_operation = .{ + .source = .get_set_cursor, + }, + }; self.state = .osc_12; self.buf_start = self.buf_idx; self.complete = true; @@ -639,8 +653,6 @@ pub const Parser = struct { else => self.state = .invalid, }, - .osc_12 => {}, - .@"13" => switch (c) { '3' => self.state = .@"133", else => self.state = .invalid, @@ -728,14 +740,30 @@ pub const Parser = struct { self.state = .invalid; break :osc_4; } - self.state = .osc_4; + self.command = .{ + .color_operation = .{ + .source = .get_set_palette, + }, + }; + self.state = .osc_4_index; self.buf_start = self.buf_idx; self.complete = true; }, else => self.state = .invalid, }, - .osc_4 => {}, + .osc_4_index => switch (c) { + ';' => self.state = .osc_4_color, + else => {}, + }, + + .osc_4_color => switch (c) { + ';' => { + self.parseOSC4(false); + self.state = .osc_4_index; + }, + else => {}, + }, .@"5" => switch (c) { '2' => self.state = .@"52", @@ -1329,85 +1357,104 @@ pub const Parser = struct { self.temp_state.str.* = list.items; } - fn parseOSC4(self: *Parser) void { - assert(self.state == .osc_4); + fn parseOSC4(self: *Parser, final: bool) void { + assert(self.state == .osc_4_color); + assert(self.command == .color_operation); + assert(self.command.color_operation.source == .get_set_palette); const alloc = self.alloc orelse return; + const operations = &self.command.color_operation.operations; - self.command = .{ - .color_operation = .{ - .source = .get_set_palette, + const str = self.buf[self.buf_start .. self.buf_idx - (1 - @intFromBool(final))]; + self.buf_start = 0; + self.buf_idx = 0; + + var it = std.mem.splitScalar(u8, str, ';'); + const index_str = it.next() orelse { + log.warn("OSC 4 is missing palette index", .{}); + return; + }; + const spec_str = it.next() orelse { + log.warn("OSC 4 is missing color spec", .{}); + return; + }; + const index = std.fmt.parseUnsigned(u8, index_str, 10) catch |err| switch (err) { + error.Overflow, error.InvalidCharacter => { + log.warn("invalid color palette index in OSC 4: {s} {}", .{ index_str, err }); + return; }, }; - - const str = self.buf[self.buf_start..self.buf_idx]; - var it = std.mem.splitScalar(u8, str, ';'); - while (it.next()) |index_str| { - const index = std.fmt.parseUnsigned(u8, index_str, 10) catch |err| switch (err) { - error.Overflow, error.InvalidCharacter => { - log.warn("invalid color palette index in OSC 4: {s} {}", .{ index_str, err }); - // skip any color spec - _ = it.next(); - continue; + if (std.mem.eql(u8, spec_str, "?")) { + const op = operations.addOne(alloc) catch |err| { + log.warn("unable to append color operation: {}", .{err}); + return; + }; + op.* = .{ + .report = .{ .palette = index }, + }; + } else { + const color = RGB.parse(spec_str) catch |err| { + log.warn("invalid color specification in OSC 4: '{s}' {}", .{ spec_str, err }); + return; + }; + const op = operations.addOne(alloc) catch |err| { + log.warn("unable to append color operation: {}", .{err}); + return; + }; + op.* = .{ + .set = .{ + .kind = .{ + .palette = index, + }, + .color = color, }, }; - const spec_str = it.next() orelse continue; - if (std.mem.eql(u8, spec_str, "?")) { - const op = self.command.color_operation.operations.addOne(alloc) catch |err| { - log.warn("unable to append color operation: {}", .{err}); - return; - }; - op.* = .{ - .report = .{ .palette = index }, - }; - } else { - const color = RGB.parse(spec_str) catch |err| { - log.warn("invalid color specification in OSC 4: {s} {}", .{ spec_str, err }); - continue; - }; - const op = self.command.color_operation.operations.addOne(alloc) catch |err| { - log.warn("unable to append color operation: {}", .{err}); - return; - }; - op.* = .{ - .set = .{ - .kind = .{ - .palette = index, - }, - .color = color, - }, - }; - } } } - fn parseOSC101112(self: *Parser) void { + fn parseOSC101112(self: *Parser, final: bool) void { assert(switch (self.state) { .osc_10, .osc_11, .osc_12 => true, else => false, }); + assert(self.command == .color_operation); + assert(self.command.color_operation.source == switch (self.state) { + .osc_10 => Command.ColorOperation.Source.get_set_foreground, + .osc_11 => Command.ColorOperation.Source.get_set_background, + .osc_12 => Command.ColorOperation.Source.get_set_cursor, + else => unreachable, + }); + + const spec_str = self.buf[self.buf_start .. self.buf_idx - (1 - @intFromBool(final))]; + + if (self.command.color_operation.operations.count() > 0) { + // don't emit the warning if the string is empty + if (spec_str.len == 0) return; + + log.warn("OSC 1{s} can only accept 1 color", .{switch (self.state) { + .osc_10 => "0", + .osc_11 => "1", + .osc_12 => "2", + else => unreachable, + }}); + return; + } + + if (spec_str.len == 0) { + log.warn("OSC 1{s} requires an argument", .{switch (self.state) { + .osc_10 => "0", + .osc_11 => "1", + .osc_12 => "2", + else => unreachable, + }}); + return; + } const alloc = self.alloc orelse return; + const operations = &self.command.color_operation.operations; - self.command = .{ - .color_operation = .{ - .source = switch (self.state) { - .osc_10 => .get_set_foreground, - .osc_11 => .get_set_background, - .osc_12 => .get_set_cursor, - else => unreachable, - }, - }, - }; - const str = self.buf[self.buf_start..self.buf_idx]; - var it = std.mem.splitScalar(u8, str, ';'); - const color_str = it.next() orelse { - log.warn("OSC 10/11/12 requires an argument", .{}); - self.state = .invalid; - return; - }; - if (std.mem.eql(u8, color_str, "?")) { - const op = self.command.color_operation.operations.addOne(alloc) catch |err| { + if (std.mem.eql(u8, spec_str, "?")) { + const op = operations.addOne(alloc) catch |err| { log.warn("unable to append color operation: {}", .{err}); return; }; @@ -1420,11 +1467,20 @@ pub const Parser = struct { }, }; } else { - const color = RGB.parse(color_str) catch |err| { - log.warn("invalid color specification in OSC 10/11/12: {s} {}", .{ color_str, err }); + const color = RGB.parse(spec_str) catch |err| { + log.warn("invalid color specification in OSC 1{s}: {s} {}", .{ + switch (self.state) { + .osc_10 => "0", + .osc_11 => "1", + .osc_12 => "2", + else => unreachable, + }, + spec_str, + err, + }); return; }; - const op = self.command.color_operation.operations.addOne(alloc) catch |err| { + const op = operations.addOne(alloc) catch |err| { log.warn("unable to append color operation: {}", .{err}); return; }; @@ -1442,22 +1498,21 @@ pub const Parser = struct { } } - fn parseOSC110111112(self: *Parser) void { - assert(switch (self.state) { - .osc_110, .osc_111, .osc_112 => true, - else => false, - }); + fn parseOSC104(self: *Parser, final: bool) void { + assert(self.state == .osc_104); + assert(self.command == .color_operation); + assert(self.command.color_operation.source == .reset_palette); const alloc = self.alloc orelse return; - self.command = .{ - .color_operation = .{ - .source = switch (self.state) { - .osc_110 => .reset_foreground, - .osc_111 => .reset_background, - .osc_112 => .reset_cursor, - else => unreachable, - }, + const index_str = self.buf[self.buf_start .. self.buf_idx - (1 - @intFromBool(final))]; + self.buf_start = 0; + self.buf_idx = 0; + + const index = std.fmt.parseUnsigned(u8, index_str, 10) catch |err| switch (err) { + error.Overflow, error.InvalidCharacter => { + log.warn("invalid color palette index in OSC 104: {s} {}", .{ index_str, err }); + return; }, }; const op = self.command.color_operation.operations.addOne(alloc) catch |err| { @@ -1465,45 +1520,10 @@ pub const Parser = struct { return; }; op.* = .{ - .reset = switch (self.state) { - .osc_110 => .foreground, - .osc_111 => .background, - .osc_112 => .cursor, - else => unreachable, - }, + .reset = .{ .palette = index }, }; } - fn parseOSC104(self: *Parser) void { - assert(self.state == .osc_104); - - const alloc = self.alloc orelse return; - - self.command = .{ - .color_operation = .{ - .source = .get_set_palette, - }, - }; - - const str = self.buf[self.buf_start..self.buf_idx]; - var it = std.mem.splitScalar(u8, str, ';'); - while (it.next()) |index_str| { - const index = std.fmt.parseUnsigned(u8, index_str, 10) catch |err| switch (err) { - error.Overflow, error.InvalidCharacter => { - log.warn("invalid color palette index in OSC 104: {s} {}", .{ index_str, err }); - continue; - }, - }; - const op = self.command.color_operation.operations.addOne(alloc) catch |err| { - log.warn("unable to append color operation: {}", .{err}); - return; - }; - op.* = .{ - .reset = .{ .palette = index }, - }; - } - } - /// End the sequence and return the command, if any. If the return value /// is null, then no valid command was found. The optional terminator_ch /// is the final character in the OSC sequence. This is used to determine @@ -1527,18 +1547,9 @@ pub const Parser = struct { .allocable_string => self.endAllocableString(), .kitty_color_protocol_key => self.endKittyColorProtocolOption(.key_only, true), .kitty_color_protocol_value => self.endKittyColorProtocolOption(.key_and_value, true), - .osc_4, - => self.parseOSC4(), - .osc_10, - .osc_11, - .osc_12, - => self.parseOSC101112(), - .osc_104, - => self.parseOSC104(), - .osc_110, - .osc_111, - .osc_112, - => self.parseOSC110111112(), + .osc_4_color => self.parseOSC4(true), + .osc_10, .osc_11, .osc_12 => self.parseOSC101112(true), + .osc_104 => self.parseOSC104(true), else => {}, } @@ -1838,10 +1849,7 @@ test "OSC: OSC112: reset cursor color with semicolon" { defer p.deinit(); const input = "112;"; - for (input) |ch| { - log.warn("feeding {c} {s}", .{ ch, @tagName(p.state) }); - p.next(ch); - } + for (input) |ch| p.next(ch); log.warn("finish: {s}", .{@tagName(p.state)}); const cmd = p.end(0x07).?; @@ -2538,7 +2546,52 @@ test "OSC: OSC4: mix get/set palette color" { { const op = it.next().?; try testing.expect(op.* == .report); - try testing.expectEqual(Command.ColorOperation.Kind{ .palette = 254 }, op.report); + try testing.expectEqual( + Command.ColorOperation.Kind{ .palette = 254 }, + op.report, + ); + } + try testing.expect(it.next() == null); +} + +test "OSC: OSC4: incomplete color/spec 1" { + const testing = std.testing; + + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); + + const input = "4;17"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .get_set_palette); + try testing.expect(cmd.color_operation.operations.count() == 0); + var it = cmd.color_operation.operations.constIterator(0); + try testing.expect(it.next() == null); +} + +test "OSC: OSC4: incomplete color/spec 2" { + const testing = std.testing; + + var p: Parser = .{ .alloc = testing.allocator }; + defer p.deinit(); + + const input = "4;17;?;42"; + for (input) |ch| p.next(ch); + + const cmd = p.end('\x1b').?; + try testing.expect(cmd == .color_operation); + try testing.expect(cmd.color_operation.source == .get_set_palette); + try testing.expect(cmd.color_operation.operations.count() == 1); + var it = cmd.color_operation.operations.constIterator(0); + { + const op = it.next().?; + try testing.expect(op.* == .report); + try testing.expectEqual( + Command.ColorOperation.Kind{ .palette = 17 }, + op.report, + ); } try testing.expect(it.next() == null); } @@ -2554,7 +2607,7 @@ test "OSC: OSC104: reset palette color 1" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .get_set_palette); + try testing.expect(cmd.color_operation.source == .reset_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { @@ -2579,8 +2632,8 @@ test "OSC: OSC104: reset palette color 2" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .get_set_palette); - try testing.expect(cmd.color_operation.operations.count() == 2); + try testing.expect(cmd.color_operation.source == .reset_palette); + try testing.expectEqual(2, cmd.color_operation.operations.count()); var it = cmd.color_operation.operations.constIterator(0); { const op = it.next().?; @@ -2612,7 +2665,7 @@ test "OSC: OSC104: invalid palette index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .get_set_palette); + try testing.expect(cmd.color_operation.source == .reset_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { @@ -2637,7 +2690,7 @@ test "OSC: OSC104: empty palette index" { const cmd = p.end('\x1b').?; try testing.expect(cmd == .color_operation); - try testing.expect(cmd.color_operation.source == .get_set_palette); + try testing.expect(cmd.color_operation.source == .reset_palette); try testing.expect(cmd.color_operation.operations.count() == 1); var it = cmd.color_operation.operations.constIterator(0); { From d3cb6d0d41835f9e57d4dca6b927440e0f505bb4 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Thu, 29 May 2025 15:45:51 -0500 Subject: [PATCH 042/371] GTK: add action to show the GTK inspector The default keybinds for showing the GTK inspector (`ctrl+shift+i` and `ctrl+shift+d`) don't work reliably in Ghostty due to the way Ghostty handles input. You can show the GTK inspector by setting the environment variable `GTK_DEBUG` to `interactive` before starting Ghostty but that's not always convenient. This adds a keybind action that will show the GTK inspector. Due to API limitations toggling the GTK inspector using the keybind action is impractical because GTK does not provide a convenient API to determine if the GTK inspector is already showing. Thus we limit ourselves to strictly showing the GTK inspector. To close the GTK inspector the user must click the close button on the GTK inspector window. If the GTK inspector window is already visible but is hidden, calling the keybind action will not bring the GTK inspector window to the front. --- include/ghostty.h | 1 + .../TerminalCommandPalette.swift | 3 ++- src/App.zig | 1 + src/apprt/action.zig | 4 ++++ src/apprt/glfw.zig | 1 + src/apprt/gtk/App.zig | 19 +++++++++++++++++++ src/input/Binding.zig | 4 ++++ src/input/command.zig | 6 ++++++ 8 files changed, 38 insertions(+), 1 deletion(-) diff --git a/include/ghostty.h b/include/ghostty.h index 950f5ef80..6b1625a30 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -653,6 +653,7 @@ typedef enum { GHOSTTY_ACTION_INITIAL_SIZE, GHOSTTY_ACTION_CELL_SIZE, GHOSTTY_ACTION_INSPECTOR, + GHOSTTY_ACTION_SHOW_GTK_INSPECTOR, GHOSTTY_ACTION_RENDER_INSPECTOR, GHOSTTY_ACTION_DESKTOP_NOTIFICATION, GHOSTTY_ACTION_SET_TITLE, diff --git a/macos/Sources/Features/Command Palette/TerminalCommandPalette.swift b/macos/Sources/Features/Command Palette/TerminalCommandPalette.swift index 57a76dd43..47f2baf23 100644 --- a/macos/Sources/Features/Command Palette/TerminalCommandPalette.swift +++ b/macos/Sources/Features/Command Palette/TerminalCommandPalette.swift @@ -29,7 +29,8 @@ struct TerminalCommandPaletteView: View { let key = String(cString: c.action_key) switch (key) { case "toggle_tab_overview", - "toggle_window_decorations": + "toggle_window_decorations", + "show_gtk_inspector": return false default: return true diff --git a/src/App.zig b/src/App.zig index 005b745a6..39db2e2f9 100644 --- a/src/App.zig +++ b/src/App.zig @@ -445,6 +445,7 @@ pub fn performAction( .toggle_quick_terminal => _ = try rt_app.performAction(.app, .toggle_quick_terminal, {}), .toggle_visibility => _ = try rt_app.performAction(.app, .toggle_visibility, {}), .check_for_updates => _ = try rt_app.performAction(.app, .check_for_updates, {}), + .show_gtk_inspector => _ = try rt_app.performAction(.app, .show_gtk_inspector, {}), } } diff --git a/src/apprt/action.zig b/src/apprt/action.zig index 8a23bc1a4..7866db182 100644 --- a/src/apprt/action.zig +++ b/src/apprt/action.zig @@ -165,6 +165,9 @@ pub const Action = union(Key) { /// Control whether the inspector is shown or hidden. inspector: Inspector, + /// Show the GTK inspector. + show_gtk_inspector, + /// The inspector for the given target has changes and should be /// rendered at the next opportunity. render_inspector, @@ -284,6 +287,7 @@ pub const Action = union(Key) { initial_size, cell_size, inspector, + show_gtk_inspector, render_inspector, desktop_notification, set_title, diff --git a/src/apprt/glfw.zig b/src/apprt/glfw.zig index 221d5344a..d67567aee 100644 --- a/src/apprt/glfw.zig +++ b/src/apprt/glfw.zig @@ -250,6 +250,7 @@ pub const App = struct { .reset_window_size, .ring_bell, .check_for_updates, + .show_gtk_inspector, => { log.info("unimplemented action={}", .{action}); return false; diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 55c0be5e0..d1c8f2c59 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -481,6 +481,7 @@ pub fn performAction( .config_change => self.configChange(target, value.config), .reload_config => try self.reloadConfig(target, value), .inspector => self.controlInspector(target, value), + .show_gtk_inspector => self.showGTKInspector(), .desktop_notification => self.showDesktopNotification(target, value), .set_title => try self.setTitle(target, value), .pwd => try self.setPwd(target, value), @@ -687,6 +688,12 @@ fn controlInspector( surface.controlInspector(mode); } +fn showGTKInspector( + _: *const App, +) void { + gtk.Window.setInteractiveDebugging(@intFromBool(true)); +} + fn toggleMaximize(_: *App, target: apprt.Target) void { switch (target) { .app => {}, @@ -1060,6 +1067,7 @@ fn syncActionAccelerators(self: *App) !void { try self.syncActionAccelerator("app.open-config", .{ .open_config = {} }); try self.syncActionAccelerator("app.reload-config", .{ .reload_config = {} }); try self.syncActionAccelerator("win.toggle-inspector", .{ .inspector = .toggle }); + try self.syncActionAccelerator("app.show-gtk-inspector", .show_gtk_inspector); try self.syncActionAccelerator("win.toggle-command-palette", .toggle_command_palette); try self.syncActionAccelerator("win.close", .{ .close_window = {} }); try self.syncActionAccelerator("win.new-window", .{ .new_window = {} }); @@ -1655,6 +1663,16 @@ fn gtkActionPresentSurface( ); } +fn gtkActionShowGTKInspector( + _: *gio.SimpleAction, + _: ?*glib.Variant, + self: *App, +) callconv(.c) void { + self.core_app.performAction(self, .show_gtk_inspector) catch |err| { + log.err("error showing GTK inspector err={}", .{err}); + }; +} + /// This is called to setup the action map that this application supports. /// This should be called only once on startup. fn initActions(self: *App) void { @@ -1673,6 +1691,7 @@ fn initActions(self: *App) void { .{ "open-config", gtkActionOpenConfig, null }, .{ "reload-config", gtkActionReloadConfig, null }, .{ "present-surface", gtkActionPresentSurface, t }, + .{ "show-gtk-inspector", gtkActionShowGTKInspector, null }, }; inline for (actions) |entry| { const action = gio.SimpleAction.new(entry[0], entry[2]); diff --git a/src/input/Binding.zig b/src/input/Binding.zig index 3818d99a6..4a5fb4522 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -397,6 +397,9 @@ pub const Action = union(enum) { /// keybind = cmd+i=inspector:toggle inspector: InspectorMode, + /// Show the GTK inspector. + show_gtk_inspector, + /// Open the configuration file in the default OS editor. If your default OS /// editor isn't configured then this will fail. Currently, any failures to /// open the configuration will show up only in the logs. @@ -795,6 +798,7 @@ pub const Action = union(enum) { .toggle_quick_terminal, .toggle_visibility, .check_for_updates, + .show_gtk_inspector, => .app, // These are app but can be special-cased in a surface context. diff --git a/src/input/command.zig b/src/input/command.zig index 8ef4a5f0e..53d1b6b3d 100644 --- a/src/input/command.zig +++ b/src/input/command.zig @@ -298,6 +298,12 @@ fn actionCommands(action: Action.Key) []const Command { .description = "Toggle the inspector.", }}, + .show_gtk_inspector => comptime &.{.{ + .action = .show_gtk_inspector, + .title = "Show the GTK Inspector", + .description = "Show the GTK inspector.", + }}, + .open_config => comptime &.{.{ .action = .open_config, .title = "Open Config", From 0f1860f066cff0f4f93fa8d7bbe161cda3f3cb98 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 29 May 2025 14:47:29 -0700 Subject: [PATCH 043/371] build: use a libc txt file to point to correct Apple SDK This fixes an issue where Ghostty would not build against the macOS 15.5 SDK. What was happening was that Zig was adding its embedded libc paths to the clang command line, which included old headers that were incompatible with the latest (macOS 15.5) SDK. Ghostty was adding the newer paths but they were being overridden by the embedded libc paths. The reason this was happening is because Zig was using its own logic to find the libc paths and this was colliding with the paths we were setting manually. To fix this, we now use a `libc.txt` file that explicitly tells Zig where to find libc, and we base this on our own SDK search logic. --- pkg/apple-sdk/build.zig | 91 +++++++++++++++++++++++++++++++-------- pkg/breakpad/build.zig | 2 +- pkg/cimgui/build.zig | 3 +- pkg/freetype/build.zig | 2 +- pkg/glfw/build.zig | 5 +-- pkg/glslang/build.zig | 6 +-- pkg/harfbuzz/build.zig | 3 +- pkg/highway/build.zig | 3 +- pkg/libintl/build.zig | 2 +- pkg/libpng/build.zig | 2 +- pkg/macos/build.zig | 5 +-- pkg/oniguruma/build.zig | 2 +- pkg/sentry/build.zig | 3 +- pkg/simdutf/build.zig | 2 +- pkg/spirv-cross/build.zig | 2 +- pkg/utfcpp/build.zig | 2 +- pkg/wuffs/build.zig | 5 --- pkg/zlib/build.zig | 2 +- src/build/SharedDeps.zig | 2 +- 19 files changed, 92 insertions(+), 52 deletions(-) diff --git a/pkg/apple-sdk/build.zig b/pkg/apple-sdk/build.zig index 1be733dd6..18a6c0968 100644 --- a/pkg/apple-sdk/build.zig +++ b/pkg/apple-sdk/build.zig @@ -7,12 +7,17 @@ pub fn build(b: *std.Build) !void { _ = optimize; } -/// Add the SDK framework, include, and library paths to the given module. -/// The module target is used to determine the SDK to use so it must have -/// a resolved target. -pub fn addPaths(b: *std.Build, m: *std.Build.Module) !void { +/// Setup the step to point to the proper Apple SDK for libc and +/// frameworks. This expects and relies on the native SDK being +/// installed on the system. Ghostty doesn't support cross-compilation +/// for Apple platforms. +pub fn addPaths( + b: *std.Build, + step: *std.Build.Step.Compile, +) !void { // The cache. This always uses b.allocator and never frees memory - // (which is idiomatic for a Zig build exe). + // (which is idiomatic for a Zig build exe). We cache the libc txt + // file we create because it is expensive to generate (subprocesses). const Cache = struct { const Key = struct { arch: std.Target.Cpu.Arch, @@ -20,27 +25,72 @@ pub fn addPaths(b: *std.Build, m: *std.Build.Module) !void { abi: std.Target.Abi, }; - var map: std.AutoHashMapUnmanaged(Key, ?[]const u8) = .{}; + var map: std.AutoHashMapUnmanaged(Key, ?struct { + libc: std.Build.LazyPath, + framework: []const u8, + system_include: []const u8, + library: []const u8, + }) = .{}; }; - const target = m.resolved_target.?.result; + const target = step.rootModuleTarget(); const gop = try Cache.map.getOrPut(b.allocator, .{ .arch = target.cpu.arch, .os = target.os.tag, .abi = target.abi, }); - // This executes `xcrun` to get the SDK path. We don't want to execute - // this multiple times so we cache the value. if (!gop.found_existing) { - gop.value_ptr.* = std.zig.system.darwin.getSdk( - b.allocator, - m.resolved_target.?.result, - ); + // Detect our SDK using the "findNative" Zig stdlib function. + // This is really important because it forces using `xcrun` to + // find the SDK path. + const libc = try std.zig.LibCInstallation.findNative(.{ + .allocator = b.allocator, + .target = step.rootModuleTarget(), + .verbose = false, + }); + + // Render the file compatible with the `--libc` Zig flag. + var list: std.ArrayList(u8) = .init(b.allocator); + defer list.deinit(); + try libc.render(list.writer()); + + // Create a temporary file to store the libc path because + // `--libc` expects a file path. + const wf = b.addWriteFiles(); + const path = wf.add("libc.txt", list.items); + + // Determine our framework path. Zig has a bug where it doesn't + // parse this from the libc txt file for `-framework` flags: + // https://github.com/ziglang/zig/issues/24024 + const framework_path = framework: { + const down1 = std.fs.path.dirname(libc.sys_include_dir.?).?; + const down2 = std.fs.path.dirname(down1).?; + break :framework try std.fs.path.join(b.allocator, &.{ + down2, + "System", + "Library", + "Frameworks", + }); + }; + + const library_path = library: { + const down1 = std.fs.path.dirname(libc.sys_include_dir.?).?; + break :library try std.fs.path.join(b.allocator, &.{ + down1, + "lib", + }); + }; + + gop.value_ptr.* = .{ + .libc = path, + .framework = framework_path, + .system_include = libc.sys_include_dir.?, + .library = library_path, + }; } - // The active SDK we want to use - const path = gop.value_ptr.* orelse return switch (target.os.tag) { + const value = gop.value_ptr.* orelse return switch (target.os.tag) { // Return a more descriptive error. Before we just returned the // generic error but this was confusing a lot of community members. // It costs us nothing in the build script to return something better. @@ -50,7 +100,12 @@ pub fn addPaths(b: *std.Build, m: *std.Build.Module) !void { .watchos => error.XcodeWatchOSSDKNotFound, else => error.XcodeAppleSDKNotFound, }; - m.addSystemFrameworkPath(.{ .cwd_relative = b.pathJoin(&.{ path, "/System/Library/Frameworks" }) }); - m.addSystemIncludePath(.{ .cwd_relative = b.pathJoin(&.{ path, "/usr/include" }) }); - m.addLibraryPath(.{ .cwd_relative = b.pathJoin(&.{ path, "/usr/lib" }) }); + + step.setLibCFile(value.libc); + + // This is only necessary until this bug is fixed: + // https://github.com/ziglang/zig/issues/24024 + step.root_module.addSystemFrameworkPath(.{ .cwd_relative = value.framework }); + step.root_module.addSystemIncludePath(.{ .cwd_relative = value.system_include }); + step.root_module.addLibraryPath(.{ .cwd_relative = value.library }); } diff --git a/pkg/breakpad/build.zig b/pkg/breakpad/build.zig index e2fdec7ad..42247b12c 100644 --- a/pkg/breakpad/build.zig +++ b/pkg/breakpad/build.zig @@ -13,7 +13,7 @@ pub fn build(b: *std.Build) !void { lib.addIncludePath(b.path("vendor")); if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } var flags = std.ArrayList([]const u8).init(b.allocator); diff --git a/pkg/cimgui/build.zig b/pkg/cimgui/build.zig index c76b53966..3ca735383 100644 --- a/pkg/cimgui/build.zig +++ b/pkg/cimgui/build.zig @@ -84,8 +84,7 @@ pub fn build(b: *std.Build) !void { if (target.result.os.tag.isDarwin()) { if (!target.query.isNative()) { - try @import("apple_sdk").addPaths(b, lib.root_module); - try @import("apple_sdk").addPaths(b, module); + try @import("apple_sdk").addPaths(b, lib); } lib.addCSourceFile(.{ .file = imgui.path("backends/imgui_impl_metal.mm"), diff --git a/pkg/freetype/build.zig b/pkg/freetype/build.zig index bfe27e5aa..e9f72210a 100644 --- a/pkg/freetype/build.zig +++ b/pkg/freetype/build.zig @@ -69,7 +69,7 @@ fn buildLib(b: *std.Build, module: *std.Build.Module, options: anytype) !*std.Bu lib.linkLibC(); if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } var flags = std.ArrayList([]const u8).init(b.allocator); diff --git a/pkg/glfw/build.zig b/pkg/glfw/build.zig index cc61f18b2..142a558da 100644 --- a/pkg/glfw/build.zig +++ b/pkg/glfw/build.zig @@ -24,7 +24,7 @@ pub fn build(b: *std.Build) !void { .optimize = optimize, }); if (target.result.os.tag.isDarwin()) { - try apple_sdk.addPaths(b, exe.root_module); + try apple_sdk.addPaths(b, exe); } const tests_run = b.addRunArtifact(exe); @@ -122,8 +122,7 @@ fn buildLib( }, .macos => { - try apple_sdk.addPaths(b, lib.root_module); - try apple_sdk.addPaths(b, module); + try apple_sdk.addPaths(b, lib); // Transitive dependencies, explicit linkage of these works around // ziglang/zig#17130 diff --git a/pkg/glslang/build.zig b/pkg/glslang/build.zig index 629490aa4..747216a39 100644 --- a/pkg/glslang/build.zig +++ b/pkg/glslang/build.zig @@ -16,10 +16,6 @@ pub fn build(b: *std.Build) !void { module.addIncludePath(upstream.path("")); module.addIncludePath(b.path("override")); - if (target.result.os.tag.isDarwin()) { - const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, module); - } if (target.query.isNative()) { const test_exe = b.addTest(.{ @@ -55,7 +51,7 @@ fn buildGlslang( lib.addIncludePath(b.path("override")); if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } var flags = std.ArrayList([]const u8).init(b.allocator); diff --git a/pkg/harfbuzz/build.zig b/pkg/harfbuzz/build.zig index d0dd6d01c..3bdc30a32 100644 --- a/pkg/harfbuzz/build.zig +++ b/pkg/harfbuzz/build.zig @@ -93,8 +93,7 @@ fn buildLib(b: *std.Build, module: *std.Build.Module, options: anytype) !*std.Bu lib.linkLibCpp(); if (target.result.os.tag.isDarwin()) { - try apple_sdk.addPaths(b, lib.root_module); - try apple_sdk.addPaths(b, module); + try apple_sdk.addPaths(b, lib); } const dynamic_link_opts = options.dynamic_link_opts; diff --git a/pkg/highway/build.zig b/pkg/highway/build.zig index c72ca355f..5036316da 100644 --- a/pkg/highway/build.zig +++ b/pkg/highway/build.zig @@ -23,8 +23,7 @@ pub fn build(b: *std.Build) !void { if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); - try apple_sdk.addPaths(b, module); + try apple_sdk.addPaths(b, lib); } var flags = std.ArrayList([]const u8).init(b.allocator); diff --git a/pkg/libintl/build.zig b/pkg/libintl/build.zig index 53eb67f16..1baed195a 100644 --- a/pkg/libintl/build.zig +++ b/pkg/libintl/build.zig @@ -40,7 +40,7 @@ pub fn build(b: *std.Build) !void { if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } if (b.lazyDependency("gettext", .{})) |upstream| { diff --git a/pkg/libpng/build.zig b/pkg/libpng/build.zig index d012f2712..8729398f8 100644 --- a/pkg/libpng/build.zig +++ b/pkg/libpng/build.zig @@ -15,7 +15,7 @@ pub fn build(b: *std.Build) !void { } if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } // For dynamic linking, we prefer dynamic linking and to search by diff --git a/pkg/macos/build.zig b/pkg/macos/build.zig index 911664a2f..df76da9b4 100644 --- a/pkg/macos/build.zig +++ b/pkg/macos/build.zig @@ -45,8 +45,7 @@ pub fn build(b: *std.Build) !void { module.linkFramework("CoreVideo", .{}); module.linkFramework("QuartzCore", .{}); - try apple_sdk.addPaths(b, lib.root_module); - try apple_sdk.addPaths(b, module); + try apple_sdk.addPaths(b, lib); } b.installArtifact(lib); @@ -58,7 +57,7 @@ pub fn build(b: *std.Build) !void { .optimize = optimize, }); if (target.result.os.tag.isDarwin()) { - try apple_sdk.addPaths(b, test_exe.root_module); + try apple_sdk.addPaths(b, test_exe); } test_exe.linkLibrary(lib); diff --git a/pkg/oniguruma/build.zig b/pkg/oniguruma/build.zig index 1c93bbf9a..c23d744df 100644 --- a/pkg/oniguruma/build.zig +++ b/pkg/oniguruma/build.zig @@ -67,7 +67,7 @@ fn buildLib(b: *std.Build, module: *std.Build.Module, options: anytype) !*std.Bu if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } if (b.lazyDependency("oniguruma", .{})) |upstream| { diff --git a/pkg/sentry/build.zig b/pkg/sentry/build.zig index 3c0019710..0e6993ad4 100644 --- a/pkg/sentry/build.zig +++ b/pkg/sentry/build.zig @@ -20,8 +20,7 @@ pub fn build(b: *std.Build) !void { lib.linkLibC(); if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); - try apple_sdk.addPaths(b, module); + try apple_sdk.addPaths(b, lib); } var flags = std.ArrayList([]const u8).init(b.allocator); diff --git a/pkg/simdutf/build.zig b/pkg/simdutf/build.zig index 859653443..30de40fea 100644 --- a/pkg/simdutf/build.zig +++ b/pkg/simdutf/build.zig @@ -14,7 +14,7 @@ pub fn build(b: *std.Build) !void { if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } var flags = std.ArrayList([]const u8).init(b.allocator); diff --git a/pkg/spirv-cross/build.zig b/pkg/spirv-cross/build.zig index c7d0d2039..ff67e3e72 100644 --- a/pkg/spirv-cross/build.zig +++ b/pkg/spirv-cross/build.zig @@ -44,7 +44,7 @@ fn buildSpirvCross( lib.linkLibCpp(); if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } var flags = std.ArrayList([]const u8).init(b.allocator); diff --git a/pkg/utfcpp/build.zig b/pkg/utfcpp/build.zig index 6b80fec7b..8e1a3cb20 100644 --- a/pkg/utfcpp/build.zig +++ b/pkg/utfcpp/build.zig @@ -13,7 +13,7 @@ pub fn build(b: *std.Build) !void { if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } var flags = std.ArrayList([]const u8).init(b.allocator); diff --git a/pkg/wuffs/build.zig b/pkg/wuffs/build.zig index d47771c22..4d144e76a 100644 --- a/pkg/wuffs/build.zig +++ b/pkg/wuffs/build.zig @@ -11,11 +11,6 @@ pub fn build(b: *std.Build) !void { .link_libc = true, }); - if (target.result.os.tag.isDarwin()) { - const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, module); - } - const unit_tests = b.addTest(.{ .root_source_file = b.path("src/main.zig"), .target = target, diff --git a/pkg/zlib/build.zig b/pkg/zlib/build.zig index 28ae62424..28344c989 100644 --- a/pkg/zlib/build.zig +++ b/pkg/zlib/build.zig @@ -12,7 +12,7 @@ pub fn build(b: *std.Build) !void { lib.linkLibC(); if (target.result.os.tag.isDarwin()) { const apple_sdk = @import("apple_sdk"); - try apple_sdk.addPaths(b, lib.root_module); + try apple_sdk.addPaths(b, lib); } if (b.lazyDependency("zlib", .{})) |upstream| { diff --git a/src/build/SharedDeps.zig b/src/build/SharedDeps.zig index 512975ac0..d3741a358 100644 --- a/src/build/SharedDeps.zig +++ b/src/build/SharedDeps.zig @@ -377,7 +377,7 @@ pub fn add( // We always require the system SDK so that our system headers are available. // This makes things like `os/log.h` available for cross-compiling. if (step.rootModuleTarget().os.tag.isDarwin()) { - try @import("apple_sdk").addPaths(b, step.root_module); + try @import("apple_sdk").addPaths(b, step); const metallib = self.metallib.?; metallib.output.addStepDependencies(&step.step); From c5e5d61438343e888a83fe5fa190442ec5eb4534 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 29 May 2025 09:52:49 -0700 Subject: [PATCH 044/371] terminal: bring alt screen behaviors much closer in line with xterm This brings the behavior of mode 47, 1047, and 1049 much closer to xterm's behavior. I found that our prior implementation had many deficiencies. For example, we weren't properly copying the cursor state back to the primary screen from the alternate screen for modes 47 and 1047. And we weren't saving/restoring cursor state unconditionally for mode 1049 even if we were already in the alternate screen. These are weird, edgy behaviors that I don't think anyone expected (evidence by there being no bug reports about them), but they are bugs nontheless. Many tests added. --- src/terminal/Terminal.zig | 470 ++++++++++++++++++++++++++-------- src/termio/stream_handler.zig | 31 +-- 2 files changed, 368 insertions(+), 133 deletions(-) diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index bb6702201..be7a58f9b 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -2515,39 +2515,37 @@ pub fn getScreen(self: *Terminal, t: ScreenType) *Screen { &self.secondary_screen; } -/// Options for switching to the alternate screen. -pub const AlternateScreenOptions = struct { - cursor_save: bool = false, - clear_on_enter: bool = false, - clear_on_exit: bool = false, -}; - -/// Switch to the alternate screen buffer. +/// Switch to the given screen type (alternate or primary). /// -/// The alternate screen buffer: -/// * has its own grid -/// * has its own cursor state (included saved cursor) -/// * does not support scrollback +/// This does NOT handle behaviors such as clearing the screen, +/// copying the cursor, etc. This should be handled by downstream +/// callers. /// -pub fn alternateScreen( - self: *Terminal, - options: AlternateScreenOptions, -) void { - //log.info("alt screen active={} options={} cursor={}", .{ self.active_screen, options, self.screen.cursor }); +/// After calling this function, the `self.screen` field will point +/// to the current screen, and the returned value will be the previous +/// screen. If the return value is null, then the screen was not +/// switched because it was already the active screen. +/// +/// Note: This is written in a generic way so that we can support +/// more than two screens in the future if needed. There isn't +/// currently a spec for this, but it is something I think might +/// be useful in the future. +pub fn switchScreen(self: *Terminal, t: ScreenType) ?*Screen { + // If we're already on the requested screen we do nothing. + if (self.active_screen == t) return null; - // TODO: test - // TODO(mitchellh): what happens if we enter alternate screen multiple times? - // for now, we ignore... - if (self.active_screen == .alternate) return; - - // If we requested cursor save, we save the cursor in the primary screen - if (options.cursor_save) self.saveCursor(); + // We always end hyperlink state when switching screens. + // We need to do this on the original screen. + self.screen.endHyperlink(); // Switch the screens const old = self.screen; self.screen = self.secondary_screen; self.secondary_screen = old; - self.active_screen = .alternate; + self.active_screen = t; + + // The new screen should not have any hyperlinks set + assert(self.screen.cursor.hyperlink_id == 0); // Bring our charset state with us self.screen.charset = old.charset; @@ -2555,62 +2553,122 @@ pub fn alternateScreen( // Clear our selection self.screen.clearSelection(); - // Mark kitty images as dirty so they redraw + // Mark kitty images as dirty so they redraw. Without this set + // the images will remain where they were (the dirty bit on + // the screen only tracks the terminal grid, not the images). self.screen.kitty_images.dirty = true; - // Mark our terminal as dirty + // Mark our terminal as dirty to redraw the grid. self.flags.dirty.clear = true; - // Bring our pen with us - self.screen.cursorCopy(old.cursor, .{ - .hyperlink = false, - }) catch |err| { - log.warn("cursor copy failed entering alt screen err={}", .{err}); - }; + return &self.secondary_screen; +} - if (options.clear_on_enter) { - self.eraseDisplay(.complete, false); +/// Switch screen via a mode switch (e.g. mode 47, 1047, 1049). +/// This is a much more opinionated operation than `switchScreen` +/// since it also handles the behaviors of the specific mode, +/// such as clearing the screen, saving/restoring the cursor, +/// etc. +/// +/// This should be used for legacy compatibility with VT protocols, +/// but more modern usage should use `switchScreen` instead and handle +/// details like clearing the screen, cursor saving, etc. manually. +pub fn switchScreenMode( + self: *Terminal, + mode: SwitchScreenMode, + enabled: bool, +) void { + // The behavior in this function is completely based on reading + // the xterm source, specifically "charproc.c" for + // `srm_ALTBUF`, `srm_OPT_ALTBUF`, and `srm_OPT_ALTBUF_CURSOR`. + // We shouldn't touch anything in here without adding a unit + // test AND verifying the behavior with xterm. + + switch (mode) { + .@"47" => {}, + + // If we're disabling 1047 and we're on alt screen then + // we clear the screen. + .@"1047" => if (!enabled and self.active_screen == .alternate) { + self.eraseDisplay(.complete, false); + }, + + // 1049 unconditionally saves the cursor on enabling, even + // if we're already on the alternate screen. + .@"1049" => if (enabled) self.saveCursor(), + } + + // Switch screens first to whatever we're going to. + const to: ScreenType = if (enabled) .alternate else .primary; + const old_ = self.switchScreen(to); + + switch (mode) { + // For these modes, we need to copy the cursor. We only copy + // the cursor if the screen actually changed, otherwise the + // cursor is already copied. The cursor is copied regardless + // of destination screen. + .@"47", .@"1047" => if (old_) |old| { + self.screen.cursorCopy(old.cursor, .{ + .hyperlink = false, + }) catch |err| { + log.warn( + "cursor copy failed entering alt screen err={}", + .{err}, + ); + }; + }, + + // Mode 1049 restores cursor on the primary screen when + // we disable it. + .@"1049" => if (enabled) { + assert(self.active_screen == .alternate); + self.eraseDisplay(.complete, false); + + // When we enter alt screen with 1049, we always copy the + // cursor from the primary screen (if we weren't already + // on it). + if (old_) |old| { + self.screen.cursorCopy(old.cursor, .{ + .hyperlink = false, + }) catch |err| { + log.warn( + "cursor copy failed entering alt screen err={}", + .{err}, + ); + }; + } + } else { + assert(self.active_screen == .primary); + self.restoreCursor() catch |err| { + log.warn( + "restore cursor on switch screen failed to={} err={}", + .{ to, err }, + ); + }; + }, } } -/// Switch back to the primary screen (reset alternate screen mode). -pub fn primaryScreen( - self: *Terminal, - options: AlternateScreenOptions, -) void { - //log.info("primary screen active={} options={}", .{ self.active_screen, options }); +/// Modal screen changes. These map to the literal terminal +/// modes to enable or disable alternate screen modes. They each +/// have subtle behaviors so we define them as an enum here. +pub const SwitchScreenMode = enum { + /// Legacy alternate screen mode. This goes to the alternate + /// screen or primary screen and only copies the cursor. The + /// screen is not erased. + @"47", - // TODO: test - // TODO(mitchellh): what happens if we enter alternate screen multiple times? - if (self.active_screen == .primary) return; + /// Alternate screen mode where the alternate screen is cleared + /// on exit. The primary screen is never cleared. The cursor is + /// copied. + @"1047", - if (options.clear_on_exit) self.eraseDisplay(.complete, false); - - // Switch the screens - const old = self.screen; - self.screen = self.secondary_screen; - self.secondary_screen = old; - self.active_screen = .primary; - - // Clear our selection - self.screen.clearSelection(); - - // Mark kitty images as dirty so they redraw - self.screen.kitty_images.dirty = true; - - // Mark our terminal as dirty - self.flags.dirty.clear = true; - - // We always end hyperlink state - self.screen.endHyperlink(); - - // Restore the cursor from the primary screen. This should not - // fail because we should not have to allocate memory since swapping - // screens does not create new cursors. - if (options.cursor_save) self.restoreCursor() catch |err| { - log.warn("restore cursor on primary screen failed err={}", .{err}); - }; -} + /// Save primary screen cursor, switch to alternate screen, + /// and clear the alternate screen on entry. On exit, + /// do not clear the screen, and restore the cursor on the + /// primary screen. + @"1049", +}; /// Return the current string value of the terminal. Newlines are /// encoded as "\n". This omits any formatting such as fg/bg. @@ -9203,37 +9261,6 @@ test "Terminal: saveCursor" { try testing.expect(t.modes.get(.origin)); } -test "Terminal: saveCursor with screen change" { - const alloc = testing.allocator; - var t = try init(alloc, .{ .cols = 3, .rows = 3 }); - defer t.deinit(alloc); - - try t.setAttribute(.{ .bold = {} }); - t.setCursorPos(t.screen.cursor.y + 1, 3); - try testing.expect(t.screen.cursor.x == 2); - t.screen.charset.gr = .G3; - t.modes.set(.origin, true); - t.alternateScreen(.{ - .cursor_save = true, - .clear_on_enter = true, - }); - // make sure our cursor and charset have come with us - try testing.expect(t.screen.cursor.style.flags.bold); - try testing.expect(t.screen.cursor.x == 2); - try testing.expect(t.screen.charset.gr == .G3); - try testing.expect(t.modes.get(.origin)); - t.screen.charset.gr = .G0; - try t.setAttribute(.{ .reset_bold = {} }); - t.modes.set(.origin, false); - t.primaryScreen(.{ - .cursor_save = true, - .clear_on_enter = true, - }); - try testing.expect(t.screen.cursor.style.flags.bold); - try testing.expect(t.screen.charset.gr == .G3); - try testing.expect(t.modes.get(.origin)); -} - test "Terminal: saveCursor position" { const alloc = testing.allocator; var t = try init(alloc, .{ .cols = 10, .rows = 5 }); @@ -10472,7 +10499,7 @@ test "Terminal: cursorIsAtPrompt alternate screen" { try testing.expect(t.cursorIsAtPrompt()); // Secondary screen is never a prompt - t.alternateScreen(.{}); + t.switchScreenMode(.@"1049", true); try testing.expect(!t.cursorIsAtPrompt()); t.markSemanticPrompt(.prompt); try testing.expect(!t.cursorIsAtPrompt()); @@ -10556,7 +10583,7 @@ test "Terminal: fullReset clears alt screen kitty keyboard state" { var t = try init(testing.allocator, .{ .cols = 10, .rows = 10 }); defer t.deinit(testing.allocator); - t.alternateScreen(.{}); + t.switchScreenMode(.@"1049", true); t.screen.kitty_keyboard.push(.{ .disambiguate = true, .report_events = false, @@ -10564,7 +10591,7 @@ test "Terminal: fullReset clears alt screen kitty keyboard state" { .report_all = true, .report_associated = true, }); - t.primaryScreen(.{}); + t.switchScreenMode(.@"1049", false); t.fullReset(); try testing.expectEqual(0, t.secondary_screen.kitty_keyboard.current().int()); @@ -10869,3 +10896,236 @@ test "Terminal: DECCOLM resets scroll region" { try testing.expectEqual(@as(usize, 0), t.scrolling_region.left); try testing.expectEqual(@as(usize, 79), t.scrolling_region.right); } + +test "Terminal: mode 47 alt screen plain" { + const alloc = testing.allocator; + var t = try init(alloc, .{ .rows = 5, .cols = 5 }); + defer t.deinit(alloc); + + // Print on primary screen + try t.printString("1A"); + + // Go to alt screen with mode 47 + t.switchScreenMode(.@"47", true); + try testing.expectEqual(ScreenType.alternate, t.active_screen); + + // Screen should be empty + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings("", str); + } + + // Print on alt screen. This should be off center because + // we copy the cursor over from the primary screen + try t.printString("2B"); + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings(" 2B", str); + } + + // Go back to primary + t.switchScreenMode(.@"47", false); + try testing.expectEqual(ScreenType.primary, t.active_screen); + + // Primary screen should still have the original content + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings("1A", str); + } + + // Go back to alt screen with mode 47 + t.switchScreenMode(.@"47", true); + try testing.expectEqual(ScreenType.alternate, t.active_screen); + + // Screen should retain content + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings(" 2B", str); + } +} + +test "Terminal: mode 47 copies cursor both directions" { + const alloc = testing.allocator; + var t = try init(alloc, .{ .rows = 5, .cols = 5 }); + defer t.deinit(alloc); + + // Color our cursor red + try t.setAttribute(.{ .direct_color_fg = .{ .r = 0xFF, .g = 0, .b = 0x7F } }); + + // Go to alt screen with mode 47 + t.switchScreenMode(.@"47", true); + try testing.expectEqual(ScreenType.alternate, t.active_screen); + + // Verify that our style is set + { + try testing.expect(t.screen.cursor.style_id != style.default_id); + const page = &t.screen.cursor.page_pin.node.data; + try testing.expectEqual(@as(usize, 1), page.styles.count()); + try testing.expect(page.styles.refCount(page.memory, t.screen.cursor.style_id) > 0); + } + + // Set a new style + try t.setAttribute(.{ .direct_color_fg = .{ .r = 0, .g = 0xFF, .b = 0 } }); + + // Go back to primary + t.switchScreenMode(.@"47", false); + try testing.expectEqual(ScreenType.primary, t.active_screen); + + // Verify that our style is still set + { + try testing.expect(t.screen.cursor.style_id != style.default_id); + const page = &t.screen.cursor.page_pin.node.data; + try testing.expectEqual(@as(usize, 1), page.styles.count()); + try testing.expect(page.styles.refCount(page.memory, t.screen.cursor.style_id) > 0); + } +} + +test "Terminal: mode 1047 alt screen plain" { + const alloc = testing.allocator; + var t = try init(alloc, .{ .rows = 5, .cols = 5 }); + defer t.deinit(alloc); + + // Print on primary screen + try t.printString("1A"); + + // Go to alt screen with mode 47 + t.switchScreenMode(.@"1047", true); + try testing.expectEqual(ScreenType.alternate, t.active_screen); + + // Screen should be empty + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings("", str); + } + + // Print on alt screen. This should be off center because + // we copy the cursor over from the primary screen + try t.printString("2B"); + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings(" 2B", str); + } + + // Go back to primary + t.switchScreenMode(.@"1047", false); + try testing.expectEqual(ScreenType.primary, t.active_screen); + + // Primary screen should still have the original content + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings("1A", str); + } + + // Go back to alt screen with mode 1047 + t.switchScreenMode(.@"1047", true); + try testing.expectEqual(ScreenType.alternate, t.active_screen); + + // Screen should be empty + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings("", str); + } +} + +test "Terminal: mode 1047 copies cursor both directions" { + const alloc = testing.allocator; + var t = try init(alloc, .{ .rows = 5, .cols = 5 }); + defer t.deinit(alloc); + + // Color our cursor red + try t.setAttribute(.{ .direct_color_fg = .{ .r = 0xFF, .g = 0, .b = 0x7F } }); + + // Go to alt screen with mode 47 + t.switchScreenMode(.@"1047", true); + try testing.expectEqual(ScreenType.alternate, t.active_screen); + + // Verify that our style is set + { + try testing.expect(t.screen.cursor.style_id != style.default_id); + const page = &t.screen.cursor.page_pin.node.data; + try testing.expectEqual(@as(usize, 1), page.styles.count()); + try testing.expect(page.styles.refCount(page.memory, t.screen.cursor.style_id) > 0); + } + + // Set a new style + try t.setAttribute(.{ .direct_color_fg = .{ .r = 0, .g = 0xFF, .b = 0 } }); + + // Go back to primary + t.switchScreenMode(.@"1047", false); + try testing.expectEqual(ScreenType.primary, t.active_screen); + + // Verify that our style is still set + { + try testing.expect(t.screen.cursor.style_id != style.default_id); + const page = &t.screen.cursor.page_pin.node.data; + try testing.expectEqual(@as(usize, 1), page.styles.count()); + try testing.expect(page.styles.refCount(page.memory, t.screen.cursor.style_id) > 0); + } +} + +test "Terminal: mode 1049 alt screen plain" { + const alloc = testing.allocator; + var t = try init(alloc, .{ .rows = 5, .cols = 5 }); + defer t.deinit(alloc); + + // Print on primary screen + try t.printString("1A"); + + // Go to alt screen with mode 47 + t.switchScreenMode(.@"1049", true); + try testing.expectEqual(ScreenType.alternate, t.active_screen); + + // Screen should be empty + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings("", str); + } + + // Print on alt screen. This should be off center because + // we copy the cursor over from the primary screen + try t.printString("2B"); + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings(" 2B", str); + } + + // Go back to primary + t.switchScreenMode(.@"1049", false); + try testing.expectEqual(ScreenType.primary, t.active_screen); + + // Primary screen should still have the original content + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings("1A", str); + } + + // Write, our cursor should be restored back. + try t.printString("C"); + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings("1AC", str); + } + + // Go back to alt screen with mode 1049 + t.switchScreenMode(.@"1049", true); + try testing.expectEqual(ScreenType.alternate, t.active_screen); + + // Screen should be empty + { + const str = try t.plainString(testing.allocator); + defer testing.allocator.free(str); + try testing.expectEqualStrings("", str); + } +} diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index ffd00e14d..96565b30d 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -583,42 +583,17 @@ pub const StreamHandler = struct { }, .alt_screen_legacy => { - if (enabled) - self.terminal.alternateScreen(.{}) - else - self.terminal.primaryScreen(.{}); - - // Schedule a render since we changed screens + self.terminal.switchScreenMode(.@"47", enabled); try self.queueRender(); }, .alt_screen => { - const opts: terminal.Terminal.AlternateScreenOptions = .{ - .cursor_save = false, - .clear_on_enter = false, - }; - - if (enabled) - self.terminal.alternateScreen(opts) - else - self.terminal.primaryScreen(opts); - - // Schedule a render since we changed screens + self.terminal.switchScreenMode(.@"1047", enabled); try self.queueRender(); }, .alt_screen_save_cursor_clear_enter => { - const opts: terminal.Terminal.AlternateScreenOptions = .{ - .cursor_save = true, - .clear_on_enter = true, - }; - - if (enabled) - self.terminal.alternateScreen(opts) - else - self.terminal.primaryScreen(opts); - - // Schedule a render since we changed screens + self.terminal.switchScreenMode(.@"1049", enabled); try self.queueRender(); }, From 891b23917b3bbd0c07bffa96ae53da5dad062fd7 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 29 May 2025 16:03:01 -0700 Subject: [PATCH 045/371] input: "ignore" binding action are still be processed by the OS/GUI Related to #7468 This changes the behavior of "ignore". Previously, Ghostty would consider "ignore" actions consumed but do nothing. They were like a black hole. Now, Ghostty returns `ignored` which lets the apprt forward the event to the OS/GUI. This enables keys that would otherwise be pty-encoded to be processed later, such as for GTK to show the GTK inspector. --- src/Surface.zig | 18 ++++++++++++------ src/input/Binding.zig | 11 +++++++++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/Surface.zig b/src/Surface.zig index 01639964b..62a0ce549 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -2069,12 +2069,18 @@ fn maybeHandleBinding( break :performed try self.performBindingAction(action); }; - // If we performed an action and it was a closing action, - // our "self" pointer is not safe to use anymore so we need to - // just exit immediately. - if (performed and closingAction(action)) { - log.debug("key binding is a closing binding, halting key event processing", .{}); - return .closed; + if (performed) { + // If we performed an action and it was a closing action, + // our "self" pointer is not safe to use anymore so we need to + // just exit immediately. + if (closingAction(action)) { + log.debug("key binding is a closing binding, halting key event processing", .{}); + return .closed; + } + + // If our action was "ignore" then we return the special input + // effect of "ignored". + if (action == .ignore) return .ignored; } // If we have the performable flag and the action was not performed, diff --git a/src/input/Binding.zig b/src/input/Binding.zig index 3818d99a6..bda0cfd47 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -222,13 +222,20 @@ pub fn lessThan(_: void, lhs: Binding, rhs: Binding) bool { /// The set of actions that a keybinding can take. pub const Action = union(enum) { - /// Ignore this key combination, don't send it to the child process, just - /// black hole it. + /// Ignore this key combination, don't send it to the child process, + /// pretend that it never happened at the Ghostty level. The key + /// combination may still be processed by the OS or other + /// applications. ignore, /// This action is used to flag that the binding should be removed from /// the set. This should never exist in an active set and `set.put` has an /// assertion to verify this. + /// + /// This is only able to unbind bindings that were previously + /// bound to Ghostty. This cannot unbind bindings that were not + /// bound by Ghostty (e.g. bindings set by the OS or some other + /// application). unbind, /// Send a CSI sequence. The value should be the CSI sequence without the From 4d18c06804f1567c5b3efad60331c636f3eb4f28 Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Fri, 30 May 2025 14:04:14 +0200 Subject: [PATCH 046/371] gtk(wayland): customize keyboard interactivity for quick terminal Fixes #7476 --- src/apprt/gtk/Window.zig | 2 ++ src/apprt/gtk/winproto/wayland.zig | 28 ++++++++++++++++-------- src/config/Config.zig | 35 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index aa1f0a4b1..d9d2da057 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -90,6 +90,7 @@ pub const DerivedConfig = struct { quick_terminal_position: configpkg.Config.QuickTerminalPosition, quick_terminal_size: configpkg.Config.QuickTerminalSize, quick_terminal_autohide: bool, + quick_terminal_keyboard_interactivity: configpkg.Config.QuickTerminalKeyboardInteractivity, maximize: bool, fullscreen: bool, @@ -109,6 +110,7 @@ pub const DerivedConfig = struct { .quick_terminal_position = config.@"quick-terminal-position", .quick_terminal_size = config.@"quick-terminal-size", .quick_terminal_autohide = config.@"quick-terminal-autohide", + .quick_terminal_keyboard_interactivity = config.@"quick-terminal-keyboard-interactivity", .maximize = config.maximize, .fullscreen = config.fullscreen, diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index 5f5feca6e..5a4f24ff7 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -110,7 +110,6 @@ pub const App = struct { gtk4_layer_shell.initForWindow(window); gtk4_layer_shell.setLayer(window, .top); - gtk4_layer_shell.setKeyboardMode(window, .on_demand); } fn registryListener( @@ -356,9 +355,9 @@ pub const Window = struct { fn syncQuickTerminal(self: *Window) !void { const window = self.apprt_window.window.as(gtk.Window); - const position = self.apprt_window.config.quick_terminal_position; + const config = &self.apprt_window.config; - const anchored_edge: ?gtk4_layer_shell.ShellEdge = switch (position) { + const anchored_edge: ?gtk4_layer_shell.ShellEdge = switch (config.quick_terminal_position) { .left => .left, .right => .right, .top => .top, @@ -366,6 +365,15 @@ pub const Window = struct { .center => null, }; + gtk4_layer_shell.setKeyboardMode( + window, + switch (config.quick_terminal_keyboard_interactivity) { + .none => .none, + .@"on-demand" => .on_demand, + .exclusive => .exclusive, + }, + ); + for (std.meta.tags(gtk4_layer_shell.ShellEdge)) |edge| { if (anchored_edge) |anchored| { if (edge == anchored) { @@ -412,16 +420,18 @@ pub const Window = struct { apprt_window: *ApprtWindow, ) callconv(.c) void { const window = apprt_window.window.as(gtk.Window); - const size = apprt_window.config.quick_terminal_size; - const position = apprt_window.config.quick_terminal_position; + const config = &apprt_window.config; var monitor_size: gdk.Rectangle = undefined; monitor.getGeometry(&monitor_size); - const dims = size.calculate(position, .{ - .width = @intCast(monitor_size.f_width), - .height = @intCast(monitor_size.f_height), - }); + const dims = config.quick_terminal_size.calculate( + config.quick_terminal_position, + .{ + .width = @intCast(monitor_size.f_width), + .height = @intCast(monitor_size.f_height), + }, + ); window.setDefaultSize(@intCast(dims.width), @intCast(dims.height)); } diff --git a/src/config/Config.zig b/src/config/Config.zig index a20719a8f..b59334160 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -1808,6 +1808,34 @@ keybind: Keybinds = .{}, /// On Linux the behavior is always equivalent to `move`. @"quick-terminal-space-behavior": QuickTerminalSpaceBehavior = .move, +/// Determines under which circumstances that the quick terminal should receive +/// keyboard input. See the corresponding [Wayland documentation](https://wayland.app/protocols/wlr-layer-shell-unstable-v1#zwlr_layer_surface_v1:enum:keyboard_interactivity) +/// for a more detailed explanation of the behavior of each option. +/// +/// > [!NOTE] +/// > The exact behavior of each option may differ significantly across +/// > compositors -- experiment with them on your system to find one that +/// > suits your liking! +/// +/// Valid values are: +/// +/// * `none` +/// +/// The quick terminal will not receive any keyboard input. +/// +/// * `on-demand` (default) +/// +/// The quick terminal would only receive keyboard input when it is focused. +/// +/// * `exclusive` +/// +/// The quick terminal will always receive keyboard input, even when another +/// window is currently focused. +/// +/// Only has an effect on Linux Wayland. +/// On macOS the behavior is always equivalent to `on-demand`. +@"quick-terminal-keyboard-interactivity": QuickTerminalKeyboardInteractivity = .@"on-demand", + /// Whether to enable shell integration auto-injection or not. Shell integration /// greatly enhances the terminal experience by enabling a number of features: /// @@ -6138,6 +6166,13 @@ pub const QuickTerminalSpaceBehavior = enum { move, }; +/// See quick-terminal-keyboard-interactivity +pub const QuickTerminalKeyboardInteractivity = enum { + none, + @"on-demand", + exclusive, +}; + /// See grapheme-width-method pub const GraphemeWidthMethod = enum { legacy, From 6fac355363abb63c148adbb99f7b4a430cb494a5 Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Fri, 30 May 2025 14:44:29 +0200 Subject: [PATCH 047/371] gtk(wayland): fallback when on-demand mode isn't supported This shouldn't be a real problem anymore since as of now (May 2025) all major compositors support at least version 4, but let's do this just in case. --- pkg/gtk4-layer-shell/src/main.zig | 4 ++++ src/apprt/gtk/winproto/wayland.zig | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/pkg/gtk4-layer-shell/src/main.zig b/pkg/gtk4-layer-shell/src/main.zig index 88d99772b..d7eafa135 100644 --- a/pkg/gtk4-layer-shell/src/main.zig +++ b/pkg/gtk4-layer-shell/src/main.zig @@ -27,6 +27,10 @@ pub fn isSupported() bool { return c.gtk_layer_is_supported() != 0; } +pub fn getProtocolVersion() c_uint { + return c.gtk_layer_get_protocol_version(); +} + pub fn initForWindow(window: *gtk.Window) void { c.gtk_layer_init_for_window(@ptrCast(window)); } diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index 5a4f24ff7..e6861b1ed 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -369,7 +369,13 @@ pub const Window = struct { window, switch (config.quick_terminal_keyboard_interactivity) { .none => .none, - .@"on-demand" => .on_demand, + .@"on-demand" => on_demand: { + if (gtk4_layer_shell.getProtocolVersion() < 4) { + log.warn("your compositor does not support on-demand keyboard access; falling back to exclusive access", .{}); + break :on_demand .exclusive; + } + break :on_demand .on_demand; + }, .exclusive => .exclusive, }, ); From 71a1ece7e91112a9f3dc7c57ef31a5bea7b0897c Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Fri, 30 May 2025 14:50:26 +0200 Subject: [PATCH 048/371] gtk(wayland): gtk4-layer-shell -> layer-shell It was getting a bit too unwieldy. --- src/apprt/gtk/winproto/wayland.zig | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index e6861b1ed..a8eaa5be7 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -6,8 +6,8 @@ const build_options = @import("build_options"); const gdk = @import("gdk"); const gdk_wayland = @import("gdk_wayland"); const gobject = @import("gobject"); -const gtk4_layer_shell = @import("gtk4-layer-shell"); const gtk = @import("gtk"); +const layer_shell = @import("gtk4-layer-shell"); const wayland = @import("wayland"); const Config = @import("../../../config.zig").Config; @@ -98,7 +98,7 @@ pub const App = struct { } pub fn supportsQuickTerminal(_: App) bool { - if (!gtk4_layer_shell.isSupported()) { + if (!layer_shell.isSupported()) { log.warn("your compositor does not support the wlr-layer-shell protocol; disabling quick terminal", .{}); return false; } @@ -108,8 +108,8 @@ pub const App = struct { pub fn initQuickTerminal(_: *App, apprt_window: *ApprtWindow) !void { const window = apprt_window.window.as(gtk.Window); - gtk4_layer_shell.initForWindow(window); - gtk4_layer_shell.setLayer(window, .top); + layer_shell.initForWindow(window); + layer_shell.setLayer(window, .top); } fn registryListener( @@ -357,7 +357,7 @@ pub const Window = struct { const window = self.apprt_window.window.as(gtk.Window); const config = &self.apprt_window.config; - const anchored_edge: ?gtk4_layer_shell.ShellEdge = switch (config.quick_terminal_position) { + const anchored_edge: ?layer_shell.ShellEdge = switch (config.quick_terminal_position) { .left => .left, .right => .right, .top => .top, @@ -365,12 +365,12 @@ pub const Window = struct { .center => null, }; - gtk4_layer_shell.setKeyboardMode( + layer_shell.setKeyboardMode( window, switch (config.quick_terminal_keyboard_interactivity) { .none => .none, .@"on-demand" => on_demand: { - if (gtk4_layer_shell.getProtocolVersion() < 4) { + if (layer_shell.getProtocolVersion() < 4) { log.warn("your compositor does not support on-demand keyboard access; falling back to exclusive access", .{}); break :on_demand .exclusive; } @@ -380,18 +380,18 @@ pub const Window = struct { }, ); - for (std.meta.tags(gtk4_layer_shell.ShellEdge)) |edge| { + for (std.meta.tags(layer_shell.ShellEdge)) |edge| { if (anchored_edge) |anchored| { if (edge == anchored) { - gtk4_layer_shell.setMargin(window, edge, 0); - gtk4_layer_shell.setAnchor(window, edge, true); + layer_shell.setMargin(window, edge, 0); + layer_shell.setAnchor(window, edge, true); continue; } } // Arbitrary margin - could be made customizable? - gtk4_layer_shell.setMargin(window, edge, 20); - gtk4_layer_shell.setAnchor(window, edge, false); + layer_shell.setMargin(window, edge, 20); + layer_shell.setAnchor(window, edge, false); } if (self.apprt_window.isQuickTerminal()) { From dee7c835deaaeb9cbc76077a06efe393e5f6e8db Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Fri, 30 May 2025 14:53:35 +0200 Subject: [PATCH 049/371] gtk(wayland): remove redundant check --- src/apprt/gtk/winproto/wayland.zig | 52 ++++++++++++++---------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index a8eaa5be7..483a09d3c 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -357,14 +357,6 @@ pub const Window = struct { const window = self.apprt_window.window.as(gtk.Window); const config = &self.apprt_window.config; - const anchored_edge: ?layer_shell.ShellEdge = switch (config.quick_terminal_position) { - .left => .left, - .right => .right, - .top => .top, - .bottom => .bottom, - .center => null, - }; - layer_shell.setKeyboardMode( window, switch (config.quick_terminal_keyboard_interactivity) { @@ -380,6 +372,14 @@ pub const Window = struct { }, ); + const anchored_edge: ?layer_shell.ShellEdge = switch (config.quick_terminal_position) { + .left => .left, + .right => .right, + .top => .top, + .bottom => .bottom, + .center => null, + }; + for (std.meta.tags(layer_shell.ShellEdge)) |edge| { if (anchored_edge) |anchored| { if (edge == anchored) { @@ -394,29 +394,27 @@ pub const Window = struct { layer_shell.setAnchor(window, edge, false); } - if (self.apprt_window.isQuickTerminal()) { - if (self.slide) |slide| slide.release(); + if (self.slide) |slide| slide.release(); - self.slide = if (anchored_edge) |anchored| slide: { - const mgr = self.app_context.kde_slide_manager orelse break :slide null; + self.slide = if (anchored_edge) |anchored| slide: { + const mgr = self.app_context.kde_slide_manager orelse break :slide null; - const slide = mgr.create(self.surface) catch |err| { - log.warn("could not create slide object={}", .{err}); - break :slide null; - }; + const slide = mgr.create(self.surface) catch |err| { + log.warn("could not create slide object={}", .{err}); + break :slide null; + }; - const slide_location: org.KdeKwinSlide.Location = switch (anchored) { - .top => .top, - .bottom => .bottom, - .left => .left, - .right => .right, - }; + const slide_location: org.KdeKwinSlide.Location = switch (anchored) { + .top => .top, + .bottom => .bottom, + .left => .left, + .right => .right, + }; - slide.setLocation(@intCast(@intFromEnum(slide_location))); - slide.commit(); - break :slide slide; - } else null; - } + slide.setLocation(@intCast(@intFromEnum(slide_location))); + slide.commit(); + break :slide slide; + } else null; } /// Update the size of the quick terminal based on monitor dimensions. From 6959fa84387397b6cb490acbc0fb1212f51c376a Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Fri, 30 May 2025 15:02:01 +0200 Subject: [PATCH 050/371] gtk(wayland): explicitly set layer name Even though gtk4-layer-shell's documentation claims that "nobody quite knows what it's for", some compositors (like Niri) can define custom rules based on the layer name and it's beneficial in those cases to define a distinct name just for our quick terminals. --- pkg/gtk4-layer-shell/src/main.zig | 4 ++++ src/apprt/gtk/winproto/wayland.zig | 1 + 2 files changed, 5 insertions(+) diff --git a/pkg/gtk4-layer-shell/src/main.zig b/pkg/gtk4-layer-shell/src/main.zig index d7eafa135..06936bba2 100644 --- a/pkg/gtk4-layer-shell/src/main.zig +++ b/pkg/gtk4-layer-shell/src/main.zig @@ -50,3 +50,7 @@ pub fn setMargin(window: *gtk.Window, edge: ShellEdge, margin_size: c_int) void pub fn setKeyboardMode(window: *gtk.Window, mode: KeyboardMode) void { c.gtk_layer_set_keyboard_mode(@ptrCast(window), @intFromEnum(mode)); } + +pub fn setNamespace(window: *gtk.Window, name: [:0]const u8) void { + c.gtk_layer_set_namespace(@ptrCast(window), name.ptr); +} diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index 483a09d3c..b718609e3 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -110,6 +110,7 @@ pub const App = struct { layer_shell.initForWindow(window); layer_shell.setLayer(window, .top); + layer_shell.setNamespace(window, "ghostty-quick-terminal"); } fn registryListener( From 90f431005b877704231ffc1ca437658881e333b6 Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Fri, 30 May 2025 21:23:10 +0200 Subject: [PATCH 051/371] gtk: request user attention on bell I'm not sure if this should be enabled by default like the tab animation, but on KDE at least this is unintrusive enough for me to always enable by default. Alacritty appears to agree with me as well. --- src/apprt/gtk/Surface.zig | 5 +++ src/apprt/gtk/Window.zig | 12 ++++-- src/apprt/gtk/winproto.zig | 6 +++ src/apprt/gtk/winproto/noop.zig | 2 + src/apprt/gtk/winproto/wayland.zig | 61 +++++++++++++++++++++++++++--- src/apprt/gtk/winproto/x11.zig | 29 +++++++------- src/build/SharedDeps.zig | 4 +- 7 files changed, 95 insertions(+), 24 deletions(-) diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 1ee00ff1b..3d16e9fbb 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -2447,6 +2447,11 @@ pub fn ringBell(self: *Surface) !void { // Need attention if we're not the currently selected tab if (page.getSelected() == 0) page.setNeedsAttention(@intFromBool(true)); } + + // Request user attention + window.winproto.setUrgent(true) catch |err| { + log.err("failed to request user attention={}", .{err}); + }; } /// Handle a stream that is in an error state. diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index aa1f0a4b1..41eae3d85 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -814,11 +814,15 @@ fn gtkWindowNotifyIsActive( _: *gobject.ParamSpec, self: *Window, ) callconv(.c) void { - if (!self.isQuickTerminal()) return; + self.winproto.setUrgent(false) catch |err| { + log.err("failed to unrequest user attention={}", .{err}); + }; - // Hide when we're unfocused - if (self.config.quick_terminal_autohide and self.window.as(gtk.Window).isActive() == 0) { - self.toggleVisibility(); + if (self.isQuickTerminal()) { + // Hide when we're unfocused + if (self.config.quick_terminal_autohide and self.window.as(gtk.Window).isActive() == 0) { + self.toggleVisibility(); + } } } diff --git a/src/apprt/gtk/winproto.zig b/src/apprt/gtk/winproto.zig index ff83e6851..2dbe5a7a0 100644 --- a/src/apprt/gtk/winproto.zig +++ b/src/apprt/gtk/winproto.zig @@ -146,4 +146,10 @@ pub const Window = union(Protocol) { inline else => |*v| try v.addSubprocessEnv(env), } } + + pub fn setUrgent(self: *Window, urgent: bool) !void { + switch (self.*) { + inline else => |*v| try v.setUrgent(urgent), + } + } }; diff --git a/src/apprt/gtk/winproto/noop.zig b/src/apprt/gtk/winproto/noop.zig index 5cb5887c9..fb732b756 100644 --- a/src/apprt/gtk/winproto/noop.zig +++ b/src/apprt/gtk/winproto/noop.zig @@ -70,4 +70,6 @@ pub const Window = struct { } pub fn addSubprocessEnv(_: *Window, _: *std.process.EnvMap) !void {} + + pub fn setUrgent(_: *Window, _: bool) !void {} }; diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index 5f5feca6e..98b0ee238 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -16,6 +16,7 @@ const ApprtWindow = @import("../Window.zig"); const wl = wayland.client.wl; const org = wayland.client.org; +const xdg = wayland.client.xdg; const log = std.log.scoped(.winproto_wayland); @@ -34,6 +35,8 @@ pub const App = struct { kde_slide_manager: ?*org.KdeKwinSlideManager = null, default_deco_mode: ?org.KdeKwinServerDecorationManager.Mode = null, + + xdg_activation: ?*xdg.ActivationV1 = null, }; pub fn init( @@ -150,6 +153,15 @@ pub const App = struct { context.kde_slide_manager = slide_manager; return; } + + if (registryBind( + xdg.ActivationV1, + registry, + global, + )) |activation| { + context.xdg_activation = activation; + return; + } }, // We don't handle removal events @@ -207,15 +219,19 @@ pub const Window = struct { app_context: *App.Context, /// A token that, when present, indicates that the window is blurred. - blur_token: ?*org.KdeKwinBlur, + blur_token: ?*org.KdeKwinBlur = null, /// Object that controls the decoration mode (client/server/auto) /// of the window. - decoration: ?*org.KdeKwinServerDecoration, + decoration: ?*org.KdeKwinServerDecoration = null, /// Object that controls the slide-in/slide-out animations of the /// quick terminal. Always null for windows other than the quick terminal. - slide: ?*org.KdeKwinSlide, + slide: ?*org.KdeKwinSlide = null, + + /// Object that, when present, denotes that the window is currently + /// requesting attention from the user. + activation_token: ?*xdg.ActivationTokenV1 = null, pub fn init( alloc: Allocator, @@ -268,9 +284,7 @@ pub const Window = struct { .apprt_window = apprt_window, .surface = wl_surface, .app_context = app.context, - .blur_token = null, .decoration = deco, - .slide = null, }; } @@ -315,6 +329,21 @@ pub const Window = struct { _ = env; } + pub fn setUrgent(self: *Window, urgent: bool) !void { + const activation = self.app_context.xdg_activation orelse return; + + // If there already is a token, destroy and unset it + if (self.activation_token) |token| token.destroy(); + + self.activation_token = if (urgent) token: { + const token = try activation.getActivationToken(); + token.setSurface(self.surface); + token.setListener(*Window, onActivationTokenEvent, self); + token.commit(); + break :token token; + } else null; + } + /// Update the blur state of the window. fn syncBlur(self: *Window) !void { const manager = self.app_context.kde_blur_manager orelse return; @@ -425,4 +454,26 @@ pub const Window = struct { window.setDefaultSize(@intCast(dims.width), @intCast(dims.height)); } + + fn onActivationTokenEvent( + token: *xdg.ActivationTokenV1, + event: xdg.ActivationTokenV1.Event, + self: *Window, + ) void { + const activation = self.app_context.xdg_activation orelse return; + const current_token = self.activation_token orelse return; + + if (token.getId() != current_token.getId()) { + log.warn("received event for unknown activation token; ignoring", .{}); + return; + } + + switch (event) { + .done => |done| { + activation.activate(done.token, self.surface); + token.destroy(); + self.activation_token = null; + }, + } + } }; diff --git a/src/apprt/gtk/winproto/x11.zig b/src/apprt/gtk/winproto/x11.zig index 387905b18..2c4925167 100644 --- a/src/apprt/gtk/winproto/x11.zig +++ b/src/apprt/gtk/winproto/x11.zig @@ -176,8 +176,8 @@ pub const App = struct { pub const Window = struct { app: *App, config: *const ApprtWindow.DerivedConfig, - window: xlib.Window, gtk_window: *adw.ApplicationWindow, + x11_surface: *gdk_x11.X11Surface, blur_region: Region = .{}, @@ -192,13 +192,6 @@ pub const Window = struct { gtk.Native, ).getSurface() orelse return error.NotX11Surface; - // Check if we're actually on X11 - if (gobject.typeCheckInstanceIsA( - surface.as(gobject.TypeInstance), - gdk_x11.X11Surface.getGObjectType(), - ) == 0) - return error.NotX11Surface; - const x11_surface = gobject.ext.cast( gdk_x11.X11Surface, surface, @@ -207,8 +200,8 @@ pub const Window = struct { return .{ .app = app, .config = &apprt_window.config, - .window = x11_surface.getXid(), .gtk_window = apprt_window.window, + .x11_surface = x11_surface, }; } @@ -279,7 +272,7 @@ pub const Window = struct { const blur = self.config.background_blur; log.debug("set blur={}, window xid={}, region={}", .{ blur, - self.window, + self.x11_surface.getXid(), self.blur_region, }); @@ -335,11 +328,19 @@ pub const Window = struct { pub fn addSubprocessEnv(self: *Window, env: *std.process.EnvMap) !void { var buf: [64]u8 = undefined; - const window_id = try std.fmt.bufPrint(&buf, "{}", .{self.window}); + const window_id = try std.fmt.bufPrint( + &buf, + "{}", + .{self.x11_surface.getXid()}, + ); try env.put("WINDOWID", window_id); } + pub fn setUrgent(self: *Window, urgent: bool) !void { + self.x11_surface.setUrgencyHint(@intFromBool(urgent)); + } + fn getWindowProperty( self: *Window, comptime T: type, @@ -363,7 +364,7 @@ pub const Window = struct { const code = c.XGetWindowProperty( @ptrCast(@alignCast(self.app.display)), - self.window, + self.x11_surface.getXid(), name, options.offset, options.length, @@ -401,7 +402,7 @@ pub const Window = struct { const status = c.XChangeProperty( @ptrCast(@alignCast(self.app.display)), - self.window, + self.x11_surface.getXid(), name, typ, @intFromEnum(format), @@ -419,7 +420,7 @@ pub const Window = struct { fn deleteProperty(self: *Window, name: c.Atom) X11Error!void { const status = c.XDeleteProperty( @ptrCast(@alignCast(self.app.display)), - self.window, + self.x11_surface.getXid(), name, ); if (status == 0) return error.RequestFailed; diff --git a/src/build/SharedDeps.zig b/src/build/SharedDeps.zig index d3741a358..5d737cb6f 100644 --- a/src/build/SharedDeps.zig +++ b/src/build/SharedDeps.zig @@ -609,21 +609,23 @@ fn addGTK( .wayland_protocols = wayland_protocols_dep.path(""), }); - // FIXME: replace with `zxdg_decoration_v1` once GTK merges https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/6398 scanner.addCustomProtocol( plasma_wayland_protocols_dep.path("src/protocols/blur.xml"), ); + // FIXME: replace with `zxdg_decoration_v1` once GTK merges https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/6398 scanner.addCustomProtocol( plasma_wayland_protocols_dep.path("src/protocols/server-decoration.xml"), ); scanner.addCustomProtocol( plasma_wayland_protocols_dep.path("src/protocols/slide.xml"), ); + scanner.addSystemProtocol("staging/xdg-activation/xdg-activation-v1.xml"); scanner.generate("wl_compositor", 1); scanner.generate("org_kde_kwin_blur_manager", 1); scanner.generate("org_kde_kwin_server_decoration_manager", 1); scanner.generate("org_kde_kwin_slide_manager", 1); + scanner.generate("xdg_activation_v1", 1); step.root_module.addImport("wayland", b.createModule(.{ .root_source_file = scanner.result, From 8be5a78585a1185e355ed52ee64fa552655f07ec Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 30 May 2025 14:15:20 -0700 Subject: [PATCH 052/371] config: more robust handling of font-family overwrite for CLI args Fixes #7481 We unfortunately don't have a great way to unit test this since our logic relies on argv and I'm too lazy to extract it out right now. The core issue is that we previously detected if font-families changed by comparing lengths. This doesn't work because the CLI args can reset and add families back to a lesser length. This caused an integer overflow. We can fix this by not being clever and introducing the overwrite logic directly into the config type. I unit tested that. --- src/config/Config.zig | 64 +++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/src/config/Config.zig b/src/config/Config.zig index a20719a8f..ce4e46df1 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2722,19 +2722,18 @@ pub fn loadCliArgs(self: *Config, alloc_gpa: Allocator) !void { // can replay if we are discarding the default files. const replay_len_start = self._replay_steps.items.len; - // Keep track of font families because if they are set from the CLI - // then we clear the previously set values. This avoids a UX oddity - // where on the CLI you have to specify `font-family=""` to clear the - // font families before setting a new one. + // font-family settings set via the CLI overwrite any prior values + // rather than append. This avoids a UX oddity where you have to + // specify `font-family=""` to clear the font families. const fields = &[_][]const u8{ "font-family", "font-family-bold", "font-family-italic", "font-family-bold-italic", }; - var counter: [fields.len]usize = undefined; - inline for (fields, 0..) |field, i| { - counter[i] = @field(self, field).list.items.len; + inline for (fields) |field| @field(self, field).overwrite_next = true; + defer { + inline for (fields) |field| @field(self, field).overwrite_next = false; } // Initialize our CLI iterator. @@ -2759,28 +2758,6 @@ pub fn loadCliArgs(self: *Config, alloc_gpa: Allocator) !void { try new_config.loadIter(alloc_gpa, &it); self.deinit(); self.* = new_config; - } else { - // If any of our font family settings were changed, then we - // replace the entire list with the new list. - inline for (fields, 0..) |field, i| { - const v = &@field(self, field); - - // The list can be empty if it was reset, i.e. --font-family="" - if (v.list.items.len > 0) { - const len = v.list.items.len - counter[i]; - if (len > 0) { - // Note: we don't have to worry about freeing the memory - // that we overwrite or cut off here because its all in - // an arena. - v.list.replaceRangeAssumeCapacity( - 0, - len, - v.list.items[counter[i]..], - ); - v.list.items.len = len; - } - } - } } // Any paths referenced from the CLI are relative to the current working @@ -4172,6 +4149,11 @@ pub const RepeatableString = struct { // Allocator for the list is the arena for the parent config. list: std.ArrayListUnmanaged([:0]const u8) = .{}, + // If true, then the next value will clear the list and start over + // rather than append. This is a bit of a hack but is here to make + // the font-family set of configurations work with CLI parsing. + overwrite_next: bool = false, + pub fn parseCLI(self: *Self, alloc: Allocator, input: ?[]const u8) !void { const value = input orelse return error.ValueRequired; @@ -4181,6 +4163,12 @@ pub const RepeatableString = struct { return; } + // If we're overwriting then we clear before appending + if (self.overwrite_next) { + self.list.clearRetainingCapacity(); + self.overwrite_next = false; + } + const copy = try alloc.dupeZ(u8, value); try self.list.append(alloc, copy); } @@ -4247,6 +4235,24 @@ pub const RepeatableString = struct { try testing.expectEqual(@as(usize, 0), list.list.items.len); } + test "parseCLI overwrite" { + const testing = std.testing; + var arena = ArenaAllocator.init(testing.allocator); + defer arena.deinit(); + const alloc = arena.allocator(); + + var list: Self = .{}; + try list.parseCLI(alloc, "A"); + + // Set our overwrite flag + list.overwrite_next = true; + + try list.parseCLI(alloc, "B"); + try testing.expectEqual(@as(usize, 1), list.list.items.len); + try list.parseCLI(alloc, "C"); + try testing.expectEqual(@as(usize, 2), list.list.items.len); + } + test "formatConfig empty" { const testing = std.testing; var buf = std.ArrayList(u8).init(testing.allocator); From 34f08a450e8abd8f5c0331e03befa87eb1276f77 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 30 May 2025 14:59:53 -0600 Subject: [PATCH 053/371] font: rework coretext discovery sorting This should make the sorting more robust to fonts with questionable metadata or atypical style names. I was originally just going to change the scoring slightly to account for fonts whose regular italic style is named "Regular Italic" - which previously resulted in the Bold Italic or Thin Italic style being chosen instead because they're shorter names, but I decided to do some better inspection of the metadata and looser style name matching while I was changing code here anyway. Also adds a unit test to verify the sorting works correctly, though a more comprehensive set of tests may be desirable in the future. --- src/font/discovery.zig | 432 ++++++++++++++++++++++++++++++----------- 1 file changed, 316 insertions(+), 116 deletions(-) diff --git a/src/font/discovery.zig b/src/font/discovery.zig index 384799da5..9284f9486 100644 --- a/src/font/discovery.zig +++ b/src/font/discovery.zig @@ -4,6 +4,7 @@ const Allocator = std.mem.Allocator; const assert = std.debug.assert; const fontconfig = @import("fontconfig"); const macos = @import("macos"); +const opentype = @import("opentype.zig"); const options = @import("main.zig").options; const Collection = @import("main.zig").Collection; const DeferredFace = @import("main.zig").DeferredFace; @@ -562,149 +563,266 @@ pub const CoreText = struct { desc: *const Descriptor, list: []*macos.text.FontDescriptor, ) void { - var desc_mut = desc.*; - if (desc_mut.style == null) { - // If there is no explicit style set, we set a preferred - // based on the style bool attributes. - // - // TODO: doesn't handle i18n font names well, we should have - // another mechanism that uses the weight attribute if it exists. - // Wait for this to be a real problem. - desc_mut.style = if (desc_mut.bold and desc_mut.italic) - "Bold Italic" - else if (desc_mut.bold) - "Bold" - else if (desc_mut.italic) - "Italic" - else - null; - } - - std.mem.sortUnstable(*macos.text.FontDescriptor, list, &desc_mut, struct { + std.mem.sortUnstable(*macos.text.FontDescriptor, list, desc, struct { fn lessThan( desc_inner: *const Descriptor, lhs: *macos.text.FontDescriptor, rhs: *macos.text.FontDescriptor, ) bool { - const lhs_score = score(desc_inner, lhs); - const rhs_score = score(desc_inner, rhs); + const lhs_score: Score = .score(desc_inner, lhs); + const rhs_score: Score = .score(desc_inner, rhs); // Higher score is "less" (earlier) return lhs_score.int() > rhs_score.int(); } }.lessThan); } - /// We represent our sorting score as a packed struct so that we can - /// compare scores numerically but build scores symbolically. + /// We represent our sorting score as a packed struct so that we + /// can compare scores numerically but build scores symbolically. + /// + /// Note that packed structs store their fields from least to most + /// significant, so the fields here are defined in increasing order + /// of precedence. const Score = packed struct { const Backing = @typeInfo(@This()).@"struct".backing_integer.?; - glyph_count: u16 = 0, // clamped if > intmax - traits: Traits = .unmatched, - style: Style = .unmatched, + /// Number of glyphs in the font, if two fonts have identical + /// scores otherwise then we prefer the one with more glyphs. + /// + /// (Number of glyphs clamped at u16 intmax) + glyph_count: u16 = 0, + /// A fuzzy match on the style string, less important than + /// an exact match, and less important than trait matches. + fuzzy_style: u8 = 0, + /// Whether the bold-ness of the font matches the descriptor. + /// This is less important than italic because a font that's italic + /// when it shouldn't be or not italic when it should be is a bigger + /// problem (subjectively) than being the wrong weight. + bold: bool = false, + /// Whether the italic-ness of the font matches the descriptor. + /// This is less important than an exact match on the style string + /// because we want users to be allowed to override trait matching + /// for the bold/italic/bold italic styles if they want. + italic: bool = false, + /// An exact (case-insensitive) match on the style string. + exact_style: bool = false, + /// Whether the font is monospace, this is more important than any of + /// the other fields unless we're looking for a specific codepoint, + /// in which case that is the most important thing. monospace: bool = false, + /// If we're looking for a codepoint, whether this font has it. codepoint: bool = false, - const Traits = enum(u8) { unmatched = 0, _ }; - const Style = enum(u8) { unmatched = 0, match = 0xFF, _ }; - pub fn int(self: Score) Backing { return @bitCast(self); } - }; - fn score(desc: *const Descriptor, ct_desc: *const macos.text.FontDescriptor) Score { - var score_acc: Score = .{}; + fn score(desc: *const Descriptor, ct_desc: *const macos.text.FontDescriptor) Score { + var self: Score = .{}; - // We always load the font if we can since some things can only be - // inspected on the font itself. - const font_: ?*macos.text.Font = macos.text.Font.createWithFontDescriptor( - ct_desc, - 12, - ) catch null; - defer if (font_) |font| font.release(); + // We always load the font if we can since some things can only be + // inspected on the font itself. Fonts that can't be loaded score + // 0 automatically because we don't want a font we can't load. + const font: *macos.text.Font = macos.text.Font.createWithFontDescriptor( + ct_desc, + 12, + ) catch return self; + defer font.release(); - // If we have a font, prefer the font with more glyphs. - if (font_) |font| { - const Type = @TypeOf(score_acc.glyph_count); - score_acc.glyph_count = std.math.cast( - Type, - font.getGlyphCount(), - ) orelse std.math.maxInt(Type); - } - - // If we're searching for a codepoint, prioritize fonts that - // have that codepoint. - if (desc.codepoint > 0) codepoint: { - const font = font_ orelse break :codepoint; - - // Turn UTF-32 into UTF-16 for CT API - var unichars: [2]u16 = undefined; - const pair = macos.foundation.stringGetSurrogatePairForLongCharacter( - desc.codepoint, - &unichars, - ); - const len: usize = if (pair) 2 else 1; - - // Get our glyphs - var glyphs = [2]macos.graphics.Glyph{ 0, 0 }; - score_acc.codepoint = font.getGlyphsForCharacters(unichars[0..len], glyphs[0..len]); - } - - // Get our symbolic traits for the descriptor so we can compare - // boolean attributes like bold, monospace, etc. - const symbolic_traits: macos.text.FontSymbolicTraits = traits: { - const traits = ct_desc.copyAttribute(.traits) orelse break :traits .{}; - defer traits.release(); - - const key = macos.text.FontTraitKey.symbolic.key(); - const symbolic = traits.getValue(macos.foundation.Number, key) orelse - break :traits .{}; - - break :traits macos.text.FontSymbolicTraits.init(symbolic); - }; - - score_acc.monospace = symbolic_traits.monospace; - - score_acc.style = style: { - const style = ct_desc.copyAttribute(.style_name) orelse - break :style .unmatched; - defer style.release(); - - // Get our style string - var buf: [128]u8 = undefined; - const style_str = style.cstring(&buf, .utf8) orelse break :style .unmatched; - - // If we have a specific desired style, attempt to search for that. - if (desc.style) |desired_style| { - // Matching style string gets highest score - if (std.mem.eql(u8, desired_style, style_str)) break :style .match; - } else if (!desc.bold and !desc.italic) { - // If we do not, and we have no symbolic traits, then we try - // to find "regular" (or no style). If we have symbolic traits - // we do nothing but we can improve scoring by taking that into - // account, too. - if (std.mem.eql(u8, "Regular", style_str)) { - break :style .match; - } + // We prefer fonts with more glyphs, all else being equal. + { + const Type = @TypeOf(self.glyph_count); + self.glyph_count = std.math.cast( + Type, + font.getGlyphCount(), + ) orelse std.math.maxInt(Type); } - // Otherwise the score is based on the length of the style string. - // Shorter styles are scored higher. This is a heuristic that - // if we don't have a desired style then shorter tends to be - // more often the "regular" style. - break :style @enumFromInt(100 -| style_str.len); - }; + // If we're searching for a codepoint, then we + // prioritize fonts that have that codepoint. + if (desc.codepoint > 0) { + // Turn UTF-32 into UTF-16 for CT API + var unichars: [2]u16 = undefined; + const pair = macos.foundation.stringGetSurrogatePairForLongCharacter( + desc.codepoint, + &unichars, + ); + const len: usize = if (pair) 2 else 1; - score_acc.traits = traits: { - var count: u8 = 0; - if (desc.bold == symbolic_traits.bold) count += 1; - if (desc.italic == symbolic_traits.italic) count += 1; - break :traits @enumFromInt(count); - }; + // Get our glyphs + var glyphs = [2]macos.graphics.Glyph{ 0, 0 }; + self.codepoint = font.getGlyphsForCharacters( + unichars[0..len], + glyphs[0..len], + ); + } - return score_acc; - } + // Get our symbolic traits for the descriptor so we can + // compare boolean attributes like bold, monospace, etc. + const symbolic_traits: macos.text.FontSymbolicTraits = traits: { + const traits = ct_desc.copyAttribute(.traits) orelse break :traits .{}; + defer traits.release(); + + const key = macos.text.FontTraitKey.symbolic.key(); + const symbolic = traits.getValue(macos.foundation.Number, key) orelse + break :traits .{}; + + break :traits macos.text.FontSymbolicTraits.init(symbolic); + }; + + self.monospace = symbolic_traits.monospace; + + // We try to derived data from the font itself, which is generally + // more reliable than only using the symbolic traits for this. + const is_bold: bool, const is_italic: bool = derived: { + // We start with initial guesses based on the symbolic traits, + // but refine these with more information if we can get it. + var is_italic = symbolic_traits.italic; + var is_bold = symbolic_traits.bold; + + // Read the 'head' table out of the font data if it's available. + if (head: { + const tag = macos.text.FontTableTag.init("head"); + const data = font.copyTable(tag) orelse break :head null; + defer data.release(); + const ptr = data.getPointer(); + const len = data.getLength(); + break :head opentype.Head.init(ptr[0..len]) catch |err| { + log.warn("error parsing head table: {}", .{err}); + break :head null; + }; + }) |head_| { + const head: opentype.Head = head_; + is_bold = is_bold or (head.macStyle & 1 == 1); + is_italic = is_italic or (head.macStyle & 2 == 2); + } + + // Read the 'OS/2' table out of the font data if it's available. + if (os2: { + const tag = macos.text.FontTableTag.init("OS/2"); + const data = font.copyTable(tag) orelse break :os2 null; + defer data.release(); + const ptr = data.getPointer(); + const len = data.getLength(); + break :os2 opentype.OS2.init(ptr[0..len]) catch |err| { + log.warn("error parsing OS/2 table: {}", .{err}); + break :os2 null; + }; + }) |os2| { + is_bold = is_bold or os2.fsSelection.bold; + is_italic = is_italic or os2.fsSelection.italic; + } + + // Check if we have variation axes in our descriptor, if we + // do then we can derive weight italic-ness or both from them. + if (font.copyAttribute(.variation_axes)) |axes| variations: { + defer axes.release(); + + // Copy the variation values for this instance of the font. + // if there are none then we just break out immediately. + const values: *macos.foundation.Dictionary = + font.copyAttribute(.variation) orelse break :variations; + defer values.release(); + + var buf: [1024]u8 = undefined; + + // If we see the 'ital' value then we ignore 'slnt'. + var ital_seen = false; + + const len = axes.getCount(); + for (0..len) |i| { + const dict = axes.getValueAtIndex(macos.foundation.Dictionary, i); + const Key = macos.text.FontVariationAxisKey; + const cf_id = dict.getValue(Key.identifier.Value(), Key.identifier.key()).?; + const cf_name = dict.getValue(Key.name.Value(), Key.name.key()).?; + const cf_def = dict.getValue(Key.default_value.Value(), Key.default_value.key()).?; + + const name_str = cf_name.cstring(&buf, .utf8) orelse ""; + + // Default value + var def: f64 = 0; + _ = cf_def.getValue(.double, &def); + // Value in this font + var val: f64 = def; + if (values.getValue( + macos.foundation.Number, + cf_id, + )) |cf_val| _ = cf_val.getValue(.double, &val); + + if (std.mem.eql(u8, "wght", name_str)) { + // Somewhat subjective threshold, we consider fonts + // bold if they have a 'wght' set greater than 600. + is_bold = val > 600; + continue; + } + if (std.mem.eql(u8, "ital", name_str)) { + is_italic = val > 0.5; + ital_seen = true; + continue; + } + if (!ital_seen and std.mem.eql(u8, "slnt", name_str)) { + // Arbitrary threshold of anything more than a 5 + // degree clockwise slant is considered italic. + is_italic = val <= -5.0; + continue; + } + } + } + + break :derived .{ is_bold, is_italic }; + }; + + self.bold = desc.bold == is_bold; + self.italic = desc.italic == is_italic; + + // Get the style string from the font. + var style_str_buf: [128]u8 = undefined; + const style_str: []const u8 = style_str: { + const style = ct_desc.copyAttribute(.style_name) orelse + break :style_str ""; + defer style.release(); + + break :style_str style.cstring(&style_str_buf, .utf8) orelse ""; + }; + + // The first string in this slice will be used for the exact match, + // and for the fuzzy match, all matching substrings will increase + // the rank. + const desired_styles: []const [:0]const u8 = desired: { + if (desc.style) |s| break :desired &.{s}; + + // If we don't have an explicitly desired style name, we base + // it on the bold and italic properties, this isn't ideal since + // fonts may use style names other than these, but it helps in + // some edge cases. + if (desc.bold) { + if (desc.italic) break :desired &.{ "bold italic", "bold", "italic", "oblique" }; + break :desired &.{ "bold", "upright" }; + } else if (desc.italic) { + break :desired &.{ "italic", "regular", "oblique" }; + } + break :desired &.{ "regular", "upright" }; + }; + + self.exact_style = std.ascii.eqlIgnoreCase( + style_str, + desired_styles[0], + ); + // Our "fuzzy match" score is 0 if the desired style isn't present + // in the string, otherwise we give higher priority for styles that + // have fewer characters not in the desired_styles list. + const fuzzy_type = @TypeOf(self.fuzzy_style); + self.fuzzy_style = @intCast(style_str.len); + for (desired_styles) |s| { + if (std.ascii.indexOfIgnoreCase(style_str, s) != null) { + self.fuzzy_style -|= @intCast(s.len); + } + } + self.fuzzy_style = std.math.maxInt(fuzzy_type) -| self.fuzzy_style; + + return self; + } + }; pub const DiscoverIterator = struct { alloc: Allocator, @@ -837,3 +955,85 @@ test "coretext codepoint" { // Should have other codepoints too try testing.expect(face.hasCodepoint('B', null)); } + +test "coretext sorting" { + if (options.backend != .coretext and options.backend != .coretext_freetype) + return error.SkipZigTest; + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// + // FIXME: Disabled for now because SF Pro is not available in CI + // The solution likely involves directly testing that the + // `sortMatchingDescriptors` function sorts a bundled test + // font correctly, instead of relying on the system fonts. + if (true) return error.SkipZigTest; + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!// + + const testing = std.testing; + const alloc = testing.allocator; + + var ct = CoreText.init(); + defer ct.deinit(); + + // We try to get a Regular, Italic, Bold, & Bold Italic version of SF Pro, + // which should be installed on all Macs, and has many styles which makes + // it a good test, since there will be many results for each discovery. + + // Regular + { + var it = try ct.discover(alloc, .{ + .family = "SF Pro", + .size = 12, + }); + defer it.deinit(); + const res = (try it.next()).?; + var buf: [1024]u8 = undefined; + const name = try res.name(&buf); + try testing.expectEqualStrings("SF Pro Regular", name); + } + + // Regular Italic + // + // NOTE: This makes sure that we don't accidentally prefer "Thin Italic", + // which we previously did, because it has a shorter name. + { + var it = try ct.discover(alloc, .{ + .family = "SF Pro", + .size = 12, + .italic = true, + }); + defer it.deinit(); + const res = (try it.next()).?; + var buf: [1024]u8 = undefined; + const name = try res.name(&buf); + try testing.expectEqualStrings("SF Pro Regular Italic", name); + } + + // Bold + { + var it = try ct.discover(alloc, .{ + .family = "SF Pro", + .size = 12, + .bold = true, + }); + defer it.deinit(); + const res = (try it.next()).?; + var buf: [1024]u8 = undefined; + const name = try res.name(&buf); + try testing.expectEqualStrings("SF Pro Bold", name); + } + + // Bold Italic + { + var it = try ct.discover(alloc, .{ + .family = "SF Pro", + .size = 12, + .bold = true, + .italic = true, + }); + defer it.deinit(); + const res = (try it.next()).?; + var buf: [1024]u8 = undefined; + const name = try res.name(&buf); + try testing.expectEqualStrings("SF Pro Bold Italic", name); + } +} From 9ded668819910ae6f3245f78f17645131cac49fe Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Fri, 30 May 2025 22:56:10 +0200 Subject: [PATCH 054/371] gtk(wayland,x11): remove even more redundant checks --- src/apprt/gtk/winproto/wayland.zig | 114 +++++++++++------------------ src/apprt/gtk/winproto/x11.zig | 7 +- 2 files changed, 45 insertions(+), 76 deletions(-) diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index 594a3382a..08f4858a5 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -76,9 +76,9 @@ pub const App = struct { registry.setListener(*Context, registryListener, context); if (display.roundtrip() != .SUCCESS) return error.RoundtripFailed; - if (context.kde_decoration_manager != null) { - // FIXME: Roundtrip again because we have to wait for the decoration - // manager to respond with the preferred default mode. Ew. + // Do another round-trip to get the default decoration mode + if (context.kde_decoration_manager) |deco_manager| { + deco_manager.setListener(*Context, decoManagerListener, context); if (display.roundtrip() != .SUCCESS) return error.RoundtripFailed; } @@ -121,80 +121,54 @@ pub const App = struct { event: wl.Registry.Event, context: *Context, ) void { - switch (event) { - // https://wayland.app/protocols/wayland#wl_registry:event:global - .global => |global| { - log.debug("wl_registry.global: interface={s}", .{global.interface}); + inline for (@typeInfo(Context).@"struct".fields) |field| { + // Globals should be optional pointers + const T = switch (@typeInfo(field.type)) { + .optional => |o| switch (@typeInfo(o.child)) { + .pointer => |v| v.child, + else => continue, + }, + else => continue, + }; - if (registryBind( - org.KdeKwinBlurManager, - registry, - global, - )) |blur_manager| { - context.kde_blur_manager = blur_manager; - return; - } + // Only process Wayland interfaces + if (!@hasDecl(T, "interface")) continue; - if (registryBind( - org.KdeKwinServerDecorationManager, - registry, - global, - )) |deco_manager| { - context.kde_decoration_manager = deco_manager; - deco_manager.setListener(*Context, decoManagerListener, context); - return; - } + switch (event) { + .global => |v| global: { + if (std.mem.orderZ( + u8, + v.interface, + T.interface.name, + ) != .eq) break :global; - if (registryBind( - org.KdeKwinSlideManager, - registry, - global, - )) |slide_manager| { - context.kde_slide_manager = slide_manager; - return; - } + @field(context, field.name) = registry.bind( + v.name, + T, + T.generated_version, + ) catch |err| { + log.warn( + "error binding interface {s} error={}", + .{ v.interface, err }, + ); + return; + }; + }, - if (registryBind( - xdg.ActivationV1, - registry, - global, - )) |activation| { - context.xdg_activation = activation; - return; - } - }, - - // We don't handle removal events - .global_remove => {}, + // This should be a rare occurrence, but in case a global + // is suddenly no longer available, we destroy and unset it + // as the protocol mandates. + .global_remove => |v| remove: { + const global = @field(context, field.name) orelse break :remove; + if (global.getId() == v.name) { + global.destroy(); + @field(context, field.name) = null; + } + }, + } } } - /// Bind a Wayland interface to a global object. Returns non-null - /// if the binding was successful, otherwise null. - /// - /// The type T is the Wayland interface type that we're requesting. - /// This function will verify that the global object is the correct - /// interface and version before binding. - fn registryBind( - comptime T: type, - registry: *wl.Registry, - global: anytype, - ) ?*T { - if (std.mem.orderZ( - u8, - global.interface, - T.interface.name, - ) != .eq) return null; - - return registry.bind(global.name, T, T.generated_version) catch |err| { - log.warn("error binding interface {s} error={}", .{ - global.interface, - err, - }); - return null; - }; - } - fn decoManagerListener( _: *org.KdeKwinServerDecorationManager, event: org.KdeKwinServerDecorationManager.Event, diff --git a/src/apprt/gtk/winproto/x11.zig b/src/apprt/gtk/winproto/x11.zig index 2c4925167..624de03f8 100644 --- a/src/apprt/gtk/winproto/x11.zig +++ b/src/apprt/gtk/winproto/x11.zig @@ -36,16 +36,11 @@ pub const App = struct { config: *const Config, ) !?App { // If the display isn't X11, then we don't need to do anything. - if (gobject.typeCheckInstanceIsA( - gdk_display.as(gobject.TypeInstance), - gdk_x11.X11Display.getGObjectType(), - ) == 0) return null; - - // Get our X11 display const gdk_x11_display = gobject.ext.cast( gdk_x11.X11Display, gdk_display, ) orelse return null; + const xlib_display = gdk_x11_display.getXdisplay(); const x11_program_name: [:0]const u8 = if (config.@"x11-instance-name") |pn| From f99c988b27e0022dbd48309d1915eeddcee1a51d Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Fri, 30 May 2025 22:56:10 +0200 Subject: [PATCH 055/371] gtk(wayland): automatically bind globals --- src/apprt/gtk/winproto/wayland.zig | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/apprt/gtk/winproto/wayland.zig b/src/apprt/gtk/winproto/wayland.zig index 08f4858a5..cbe8c01a4 100644 --- a/src/apprt/gtk/winproto/wayland.zig +++ b/src/apprt/gtk/winproto/wayland.zig @@ -48,16 +48,11 @@ pub const App = struct { _ = config; _ = app_id; - // Check if we're actually on Wayland - if (gobject.typeCheckInstanceIsA( - gdk_display.as(gobject.TypeInstance), - gdk_wayland.WaylandDisplay.getGObjectType(), - ) == 0) return null; - const gdk_wayland_display = gobject.ext.cast( gdk_wayland.WaylandDisplay, gdk_display, - ) orelse return error.NoWaylandDisplay; + ) orelse return null; + const display: *wl.Display = @ptrCast(@alignCast( gdk_wayland_display.getWlDisplay() orelse return error.NoWaylandDisplay, )); From fd7132db7142515a63251b6522dbb019f6d16f9d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 30 May 2025 15:05:53 -0700 Subject: [PATCH 056/371] macos: quick terminal can equalize splits Fixes #7480 --- .../Terminal/BaseTerminalController.swift | 16 ++++++++++++++++ .../Features/Terminal/TerminalController.swift | 16 ---------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 62384586a..9862e1288 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -124,6 +124,11 @@ class BaseTerminalController: NSWindowController, selector: #selector(ghosttyMaximizeDidToggle(_:)), name: .ghosttyMaximizeDidToggle, object: nil) + center.addObserver( + self, + selector: #selector(ghosttyDidEqualizeSplits(_:)), + name: Ghostty.Notification.didEqualizeSplits, + object: nil) // Listen for local events that we need to know of outside of // single surface handlers. @@ -249,6 +254,17 @@ class BaseTerminalController: NSWindowController, guard surfaceTree?.contains(view: surfaceView) ?? false else { return } window.zoom(nil) } + + @objc private func ghosttyDidEqualizeSplits(_ notification: Notification) { + guard let target = notification.object as? Ghostty.SurfaceView else { return } + + // Check if target surface is in current controller's tree + guard surfaceTree?.contains(view: target) ?? false else { return } + + if case .split(let container) = surfaceTree { + _ = container.equalize() + } + } // MARK: Local Events diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index cf2dd3348..f2868adb0 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -85,12 +85,6 @@ class TerminalController: BaseTerminalController { selector: #selector(onFrameDidChange), name: NSView.frameDidChangeNotification, object: nil) - center.addObserver( - self, - selector: #selector(onEqualizeSplits), - name: Ghostty.Notification.didEqualizeSplits, - object: nil - ) center.addObserver( self, selector: #selector(onCloseWindow), @@ -875,16 +869,6 @@ class TerminalController: BaseTerminalController { toggleFullscreen(mode: fullscreenMode) } - @objc private func onEqualizeSplits(_ notification: Notification) { - guard let target = notification.object as? Ghostty.SurfaceView else { return } - - // Check if target surface is in current controller's tree - guard surfaceTree?.contains(view: target) ?? false else { return } - - if case .split(let container) = surfaceTree { - _ = container.equalize() - } - } struct DerivedConfig { let backgroundColor: Color From dd670f5107ea47cb7d3a76cd0e93955523f092d7 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 30 May 2025 17:52:31 -0600 Subject: [PATCH 057/371] font/sprite: rework `yQuads` and friends for better alignment with `draw_block` This improves "outer edge" alignment of octants and other elements drawn using `yQuads` and friends with blocks drawn with `draw_block` -- this should guarantee alignment along a continuous edge, but may result in a 1px overlap of opposing edges (such as a top half block followed by a bottom half block with an odd cell height, they will both have the center row filled). This is very necessary since several block elements are needed to complete the set of octants, since dedicated octant characters aren't included when they would be redundant. --- src/font/sprite/Box.zig | 90 +++++++++++++++++++------------ src/font/sprite/testdata/Box.ppm | Bin 1048593 -> 1048593 bytes 2 files changed, 55 insertions(+), 35 deletions(-) diff --git a/src/font/sprite/Box.zig b/src/font/sprite/Box.zig index f3942b83d..dd02f701b 100644 --- a/src/font/sprite/Box.zig +++ b/src/font/sprite/Box.zig @@ -2488,10 +2488,10 @@ fn draw_sextant(self: Box, canvas: *font.sprite.Canvas, cp: u32) void { if (sex.tl) self.rect(canvas, 0, 0, x_halfs[0], y_thirds[0]); if (sex.tr) self.rect(canvas, x_halfs[1], 0, self.metrics.cell_width, y_thirds[0]); - if (sex.ml) self.rect(canvas, 0, y_thirds[0], x_halfs[0], y_thirds[1]); - if (sex.mr) self.rect(canvas, x_halfs[1], y_thirds[0], self.metrics.cell_width, y_thirds[1]); - if (sex.bl) self.rect(canvas, 0, y_thirds[1], x_halfs[0], self.metrics.cell_height); - if (sex.br) self.rect(canvas, x_halfs[1], y_thirds[1], self.metrics.cell_width, self.metrics.cell_height); + if (sex.ml) self.rect(canvas, 0, y_thirds[1], x_halfs[0], y_thirds[2]); + if (sex.mr) self.rect(canvas, x_halfs[1], y_thirds[1], self.metrics.cell_width, y_thirds[2]); + if (sex.bl) self.rect(canvas, 0, y_thirds[3], x_halfs[0], self.metrics.cell_height); + if (sex.br) self.rect(canvas, x_halfs[1], y_thirds[3], self.metrics.cell_width, self.metrics.cell_height); } fn draw_octant(self: Box, canvas: *font.sprite.Canvas, cp: u32) void { @@ -2545,42 +2545,58 @@ fn draw_octant(self: Box, canvas: *font.sprite.Canvas, cp: u32) void { const oct = octants[cp - octant_min]; if (oct.@"1") self.rect(canvas, 0, 0, x_halfs[0], y_quads[0]); if (oct.@"2") self.rect(canvas, x_halfs[1], 0, self.metrics.cell_width, y_quads[0]); - if (oct.@"3") self.rect(canvas, 0, y_quads[0], x_halfs[0], y_quads[1]); - if (oct.@"4") self.rect(canvas, x_halfs[1], y_quads[0], self.metrics.cell_width, y_quads[1]); - if (oct.@"5") self.rect(canvas, 0, y_quads[1], x_halfs[0], y_quads[2]); - if (oct.@"6") self.rect(canvas, x_halfs[1], y_quads[1], self.metrics.cell_width, y_quads[2]); - if (oct.@"7") self.rect(canvas, 0, y_quads[2], x_halfs[0], self.metrics.cell_height); - if (oct.@"8") self.rect(canvas, x_halfs[1], y_quads[2], self.metrics.cell_width, self.metrics.cell_height); + if (oct.@"3") self.rect(canvas, 0, y_quads[1], x_halfs[0], y_quads[2]); + if (oct.@"4") self.rect(canvas, x_halfs[1], y_quads[1], self.metrics.cell_width, y_quads[2]); + if (oct.@"5") self.rect(canvas, 0, y_quads[3], x_halfs[0], y_quads[4]); + if (oct.@"6") self.rect(canvas, x_halfs[1], y_quads[3], self.metrics.cell_width, y_quads[4]); + if (oct.@"7") self.rect(canvas, 0, y_quads[5], x_halfs[0], self.metrics.cell_height); + if (oct.@"8") self.rect(canvas, x_halfs[1], y_quads[5], self.metrics.cell_width, self.metrics.cell_height); } +/// xHalfs[0] should be used as the right edge of a left-aligned half. +/// xHalfs[1] should be used as the left edge of a right-aligned half. fn xHalfs(self: Box) [2]u32 { + const float_width: f64 = @floatFromInt(self.metrics.cell_width); + const half_width: u32 = @intFromFloat(@round(0.5 * float_width)); + return .{ half_width, self.metrics.cell_width - half_width }; +} + +/// Use these values as such: +/// yThirds[0] bottom edge of the first third. +/// yThirds[1] top edge of the second third. +/// yThirds[2] bottom edge of the second third. +/// yThirds[3] top edge of the final third. +fn yThirds(self: Box) [4]u32 { + const float_height: f64 = @floatFromInt(self.metrics.cell_height); + const one_third_height: u32 = @intFromFloat(@round(one_third * float_height)); + const two_thirds_height: u32 = @intFromFloat(@round(two_thirds * float_height)); return .{ - @as(u32, @intFromFloat(@round(@as(f64, @floatFromInt(self.metrics.cell_width)) / 2))), - @as(u32, @intFromFloat(@as(f64, @floatFromInt(self.metrics.cell_width)) / 2)), + one_third_height, + self.metrics.cell_height - two_thirds_height, + two_thirds_height, + self.metrics.cell_height - one_third_height, }; } -fn yThirds(self: Box) [2]u32 { - return switch (@mod(self.metrics.cell_height, 3)) { - 0 => .{ self.metrics.cell_height / 3, 2 * self.metrics.cell_height / 3 }, - 1 => .{ self.metrics.cell_height / 3, 2 * self.metrics.cell_height / 3 + 1 }, - 2 => .{ self.metrics.cell_height / 3 + 1, 2 * self.metrics.cell_height / 3 }, - else => unreachable, - }; -} - -// assume octants might be striped across multiple rows of cells. to maximize -// distance between excess pixellines, we want (1) an arbitrary region (there -// will be a pattern of 1'-3-1'-3-1'-3 no matter what), (2) discontiguous -// regions (0 and 2 or 1 and 3), and (3) an arbitrary three regions (there will -// be a pattern of 3-1-3-1-3-1 no matter what). -fn yQuads(self: Box) [3]u32 { - return switch (@mod(self.metrics.cell_height, 4)) { - 0 => .{ self.metrics.cell_height / 4, 2 * self.metrics.cell_height / 4, 3 * self.metrics.cell_height / 4 }, - 1 => .{ self.metrics.cell_height / 4, 2 * self.metrics.cell_height / 4 + 1, 3 * self.metrics.cell_height / 4 }, - 2 => .{ self.metrics.cell_height / 4 + 1, 2 * self.metrics.cell_height / 4, 3 * self.metrics.cell_height / 4 + 1 }, - 3 => .{ self.metrics.cell_height / 4 + 1, 2 * self.metrics.cell_height / 4 + 1, 3 * self.metrics.cell_height / 4 }, - else => unreachable, +/// Use these values as such: +/// yQuads[0] bottom edge of first quarter. +/// yQuads[1] top edge of second quarter. +/// yQuads[2] bottom edge of second quarter. +/// yQuads[3] top edge of third quarter. +/// yQuads[4] bottom edge of third quarter +/// yQuads[5] top edge of fourth quarter. +fn yQuads(self: Box) [6]u32 { + const float_height: f64 = @floatFromInt(self.metrics.cell_height); + const quarter_height: u32 = @intFromFloat(@round(0.25 * float_height)); + const half_height: u32 = @intFromFloat(@round(0.50 * float_height)); + const three_quarters_height: u32 = @intFromFloat(@round(0.75 * float_height)); + return .{ + quarter_height, + self.metrics.cell_height - three_quarters_height, + half_height, + self.metrics.cell_height - half_height, + three_quarters_height, + self.metrics.cell_height - quarter_height, }; } @@ -2591,8 +2607,12 @@ fn draw_smooth_mosaic( ) !void { const y_thirds = self.yThirds(); const top: f64 = 0.0; - const upper: f64 = @floatFromInt(y_thirds[0]); - const lower: f64 = @floatFromInt(y_thirds[1]); + // We average the edge positions for the y_thirds boundaries here + // rather than having to deal with varying alignments depending on + // the surrounding pieces. The most this will be off by is half of + // a pixel, so hopefully it's not noticeable. + const upper: f64 = 0.5 * (@as(f64, @floatFromInt(y_thirds[0])) + @as(f64, @floatFromInt(y_thirds[1]))); + const lower: f64 = 0.5 * (@as(f64, @floatFromInt(y_thirds[2])) + @as(f64, @floatFromInt(y_thirds[3]))); const bottom: f64 = @floatFromInt(self.metrics.cell_height); const left: f64 = 0.0; const center: f64 = @round(@as(f64, @floatFromInt(self.metrics.cell_width)) / 2); diff --git a/src/font/sprite/testdata/Box.ppm b/src/font/sprite/testdata/Box.ppm index 0feb3ebe49e45f69c4e877b1a086a56822f4af20..d5a6cc72906318b235e33bc3ea53be8f88b67193 100644 GIT binary patch delta 1279 zcmdT?Jxd%>6vcJcoy^?3j^;xm?mF%wrdZ5KJ`~KtDnd|PP}0~agMlw z)gVe`&cVr32evZYT(RX_biHk)g6T6lHQ;^cwR?|xFq7n=w{_MJinVx`^_st+K-TYo zC}KZNEy(U`gm8{Ba0IvG=pbpqKBFSM9DT;tJD!SvzEQIkV4ut3T}M`>F&0W+0j@5q znu0}C%Vri~FCVL}F4gej-yryTPOF`))r|RdO2d%H0GvH)3Km8=nSfQ~ejL50IoM0w z9Vralan}1#os=@XMPB}kadKllb@OBRYqy>H-XqzB&V9{PXl5PgmZ|HCG6j2&EI2E? z8u$FHc`YZofVFFM!%LI4vRc(11zHwAUYcKGDUm`M!7=_8g(Z+-L<8IrnHv=u{63_o nag0W&{Qv#B+2Ac*8}@8tE$LF~d^GgKt^(UnWS%{yv(35!Ix4>| delta 1380 zcmeH_%_{_P7{?ns`(o$!Fi{S)_1h#4TgFS2*I6m{pb+Ik%hhE_$w4Ol&e*p0TZ;Cg z9BpW>`yZH#9F*J~?Ma-N8RI2yDHp}%>FMct`97cL$(VY^)J-9YG7%862#Syhi-;%} zQK1~M`x_KvRGHy16kBKjypip~s9-XT1&X+_D%j0z%Jt&l&E$AaK1!>s8g`6A&=;xO zn!aPV(bt_m&F!&ff|P9kpi3>%8jHiOcg!nIam#3>eJM8~g<#LK7&Mb=v!mB4c#!&_ zM=1Gavl_oyo40~h?4_mmO81^;*FigHA@mQ^xMip4P=cDIPLw*>Joq{_Jc1~uXwxl8 zSn3#s!#+Mo_e*?|rkbGFDNk%YB3CG#MH5KhvTYb$RGCv*(=*x;S1H5Eg{=E z^Ic^6C_Tczqso5{zD6UkH)*KAX9KX8Sq;)Mt$2D1eC`_|OFvdlqyP5j1PXj7@Bl-` B_Avke From 2b9e781933834f1123024b275eea1a44afff468d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 30 May 2025 16:08:57 -0700 Subject: [PATCH 058/371] gtk: clean up per-surface cgroup on close Fixes #6766 This ensures that during surface deinit the cgroup is removed. By the time the surface is deinitialized, the subprocess should already be dead so the cgroup can be safely removed. If the cgroup cannot be removed for any reason we log a warning. --- src/apprt/gtk/Surface.zig | 16 +++++++++++++++- src/os/cgroup.zig | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 3d16e9fbb..e51109015 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -746,7 +746,21 @@ pub fn deinit(self: *Surface) void { self.core_surface.deinit(); self.core_surface = undefined; - if (self.cgroup_path) |path| self.app.core_app.alloc.free(path); + // Remove the cgroup if we have one. We do this after deiniting the core + // surface to ensure all processes have exited. + if (self.cgroup_path) |path| { + internal_os.cgroup.remove(path) catch |err| { + // We don't want this to be fatal in any way so we just log + // and continue. A dangling empty cgroup is not a big deal + // and this should be rare. + log.warn( + "failed to remove cgroup for surface path={s} err={}", + .{ path, err }, + ); + }; + + self.app.core_app.alloc.free(path); + } // Free all our GTK stuff // diff --git a/src/os/cgroup.zig b/src/os/cgroup.zig index 5645e337a..4f13921c5 100644 --- a/src/os/cgroup.zig +++ b/src/os/cgroup.zig @@ -56,6 +56,25 @@ pub fn create( } } +/// Remove a cgroup. This will only succeed if the cgroup is empty +/// (has no processes). The cgroup path should be relative to the +/// cgroup root (e.g. "/user.slice/surfaces/abc123.scope"). +pub fn remove(cgroup: []const u8) !void { + assert(cgroup.len > 0); + assert(cgroup[0] == '/'); + + var buf: [std.fs.max_path_bytes]u8 = undefined; + const path = try std.fmt.bufPrint(&buf, "/sys/fs/cgroup{s}", .{cgroup}); + std.fs.cwd().deleteDir(path) catch |err| switch (err) { + // If it doesn't exist, that's fine - maybe it was already cleaned up + error.FileNotFound => {}, + + // Any other error we failed to delete it so we want to notify + // the user. + else => return err, + }; +} + /// Move the given PID into the given cgroup. pub fn moveInto( cgroup: []const u8, From 5306e7cf567ccb37028701a00504bcf28484b155 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 2 Jun 2025 08:34:03 -0700 Subject: [PATCH 059/371] config: add launched-from to specify launch source Related to #7433 This extracts our "launched from desktop" logic into a config option. The default value is detection using the same logic as before, but now this can be overridden by the user. This also adds the systemd and dbus activation sources from #7433. There are a number of reasons why we decided to do this: 1. It automatically gets us caching since the configuration is only loaded once (per reload, a rare occurrence). 2. It allows us to override the logic when testing. Previously, we had to do more complex environment faking to get the same behavior. 3. It forces exhaustive switches in any desktop handling code, which will make it easier to ensure valid behaviors if we introduce new launch sources (as we are in #7433). 4. It lowers code complexity since callsites don't need to have N `launchedFromX()` checks and can use a single value. --- src/apprt/embedded.zig | 5 +++- src/apprt/gtk/App.zig | 5 +++- src/config/Config.zig | 66 +++++++++++++++++++++++++++++++++++++----- src/os/dbus.zig | 21 ++++++++++++++ src/os/locale.zig | 7 ++--- src/os/main.zig | 4 +++ src/os/systemd.zig | 65 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 158 insertions(+), 15 deletions(-) create mode 100644 src/os/dbus.zig create mode 100644 src/os/systemd.zig diff --git a/src/apprt/embedded.zig b/src/apprt/embedded.zig index 97466e9b5..67aeeaf7c 100644 --- a/src/apprt/embedded.zig +++ b/src/apprt/embedded.zig @@ -842,7 +842,10 @@ pub const Surface = struct { // our translation settings for Ghostty. If we aren't from // the desktop then we didn't set our LANGUAGE var so we // don't need to remove it. - if (internal_os.launchedFromDesktop()) env.remove("LANGUAGE"); + switch (self.app.config.@"launched-from".?) { + .desktop => env.remove("LANGUAGE"), + .dbus, .systemd, .cli => {}, + } } return env; diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index d1c8f2c59..d69102bda 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -273,7 +273,10 @@ pub fn init(core_app: *CoreApp, opts: Options) !App { const single_instance = switch (config.@"gtk-single-instance") { .true => true, .false => false, - .desktop => internal_os.launchedFromDesktop(), + .desktop => switch (config.@"launched-from".?) { + .desktop, .systemd, .dbus => true, + .cli => false, + }, }; // Setup the flags for our application. diff --git a/src/config/Config.zig b/src/config/Config.zig index 344c118d7..bf6d26f4b 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2428,6 +2428,23 @@ term: []const u8 = "xterm-ghostty", /// running. Defaults to an empty string if not set. @"enquiry-response": []const u8 = "", +/// The mechanism used to launch Ghostty. This should generally not be +/// set by users, see the warning below. +/// +/// WARNING: This is a low-level configuration that is not intended to be +/// modified by users. All the values will be automatically detected as they +/// are needed by Ghostty. This is only here in case our detection logic is +/// incorrect for your environment or for developers who want to test +/// Ghostty's behavior in different, forced environments. +/// +/// This is set using the standard `no-[value]`, `[value]` syntax separated +/// by commas. Example: "no-desktop,systemd". Specific details about the +/// available values are documented on LaunchProperties in the code. Since +/// this isn't intended to be modified by users, the documentation is +/// lighter than the other configurations and users are expected to +/// refer to the code for details. +@"launched-from": ?LaunchSource = null, + /// Configures the low-level API to use for async IO, eventing, etc. /// /// Most users should leave this set to `auto`. This will automatically detect @@ -3111,6 +3128,11 @@ pub fn finalize(self: *Config) !void { const alloc = self._arena.?.allocator(); + // Ensure our launch source is properly set. + if (self.@"launched-from" == null) { + self.@"launched-from" = .detect(); + } + // If we have a font-family set and don't set the others, default // the others to the font family. This way, if someone does // --font-family=foo, then we try to get the stylized versions of @@ -3135,14 +3157,11 @@ pub fn finalize(self: *Config) !void { } // The default for the working directory depends on the system. - const wd = self.@"working-directory" orelse wd: { + const wd = self.@"working-directory" orelse switch (self.@"launched-from".?) { // If we have no working directory set, our default depends on - // whether we were launched from the desktop or CLI. - if (internal_os.launchedFromDesktop()) { - break :wd "home"; - } - - break :wd "inherit"; + // whether we were launched from the desktop or elsewhere. + .desktop => "home", + .cli, .dbus, .systemd => "inherit", }; // If we are missing either a command or home directory, we need @@ -3165,7 +3184,10 @@ pub fn finalize(self: *Config) !void { // If we were launched from the desktop, our SHELL env var // will represent our SHELL at login time. We want to use the // latest shell from /etc/passwd or directory services. - if (internal_os.launchedFromDesktop()) break :shell_env; + switch (self.@"launched-from".?) { + .desktop, .dbus, .systemd => break :shell_env, + .cli => {}, + } if (std.process.getEnvVarOwned(alloc, "SHELL")) |value| { log.info("default shell source=env value={s}", .{value}); @@ -6595,6 +6617,34 @@ pub const Duration = struct { } }; +pub const LaunchSource = enum { + /// Ghostty was launched via the CLI. This is the default if + /// no other source is detected. + cli, + + /// Ghostty was launched in a desktop environment (not via the CLI). + /// This is used to determine some behaviors such as how to read + /// settings, whether single instance defaults to true, etc. + desktop, + + /// Ghostty was started via dbus activation. + dbus, + + /// Ghostty was started via systemd activation. + systemd, + + pub fn detect() LaunchSource { + return if (internal_os.launchedFromDesktop()) + .desktop + else if (internal_os.launchedByDbusActivation()) + .dbus + else if (internal_os.launchedBySystemd()) + .systemd + else + .cli; + } +}; + pub const WindowPadding = struct { const Self = @This(); diff --git a/src/os/dbus.zig b/src/os/dbus.zig new file mode 100644 index 000000000..99824db71 --- /dev/null +++ b/src/os/dbus.zig @@ -0,0 +1,21 @@ +const std = @import("std"); +const builtin = @import("builtin"); + +/// Returns true if the program was launched by D-Bus activation. +/// +/// On Linux GTK, this returns true if the program was launched using D-Bus +/// activation. It will return false if Ghostty was launched any other way. +/// +/// For other platforms and app runtimes, this returns false. +pub fn launchedByDbusActivation() bool { + return switch (builtin.os.tag) { + // On Linux, D-Bus activation sets `DBUS_STARTER_ADDRESS` and + // `DBUS_STARTER_BUS_TYPE`. If these environment variables are present + // (no matter the value) we were launched by D-Bus activation. + .linux => std.posix.getenv("DBUS_STARTER_ADDRESS") != null and + std.posix.getenv("DBUS_STARTER_BUS_TYPE") != null, + + // No other system supports D-Bus so always return false. + else => false, + }; +} diff --git a/src/os/locale.zig b/src/os/locale.zig index 17e4d163c..b391d690f 100644 --- a/src/os/locale.zig +++ b/src/os/locale.zig @@ -108,11 +108,8 @@ fn setLangFromCocoa() void { } // Get our preferred languages and set that to the LANGUAGE - // env var in case our language differs from our locale. We only - // do this when the app is launched from the desktop because then - // we're in an app bundle and we are expected to read from our - // Bundle's preferred languages. - if (internal_os.launchedFromDesktop()) language: { + // env var in case our language differs from our locale. + language: { var buf: [1024]u8 = undefined; const pref_ = preferredLanguageFromCocoa( &buf, diff --git a/src/os/main.zig b/src/os/main.zig index 36833f427..582ac75cd 100644 --- a/src/os/main.zig +++ b/src/os/main.zig @@ -2,6 +2,7 @@ //! system. These aren't restricted to syscalls or low-level operations, but //! also OS-specific features and conventions. +const dbus = @import("dbus.zig"); const desktop = @import("desktop.zig"); const env = @import("env.zig"); const file = @import("file.zig"); @@ -12,6 +13,7 @@ const mouse = @import("mouse.zig"); const openpkg = @import("open.zig"); const pipepkg = @import("pipe.zig"); const resourcesdir = @import("resourcesdir.zig"); +const systemd = @import("systemd.zig"); // Namespaces pub const args = @import("args.zig"); @@ -35,6 +37,8 @@ pub const getenv = env.getenv; pub const setenv = env.setenv; pub const unsetenv = env.unsetenv; pub const launchedFromDesktop = desktop.launchedFromDesktop; +pub const launchedByDbusActivation = dbus.launchedByDbusActivation; +pub const launchedBySystemd = systemd.launchedBySystemd; pub const desktopEnvironment = desktop.desktopEnvironment; pub const rlimit = file.rlimit; pub const fixMaxFiles = file.fixMaxFiles; diff --git a/src/os/systemd.zig b/src/os/systemd.zig new file mode 100644 index 000000000..9b67296d6 --- /dev/null +++ b/src/os/systemd.zig @@ -0,0 +1,65 @@ +const std = @import("std"); +const builtin = @import("builtin"); + +const log = std.log.scoped(.systemd); + +/// Returns true if the program was launched as a systemd service. +/// +/// On Linux, this returns true if the program was launched as a systemd +/// service. It will return false if Ghostty was launched any other way. +/// +/// For other platforms and app runtimes, this returns false. +pub fn launchedBySystemd() bool { + return switch (builtin.os.tag) { + .linux => linux: { + // On Linux, systemd sets the `INVOCATION_ID` (v232+) and the + // `JOURNAL_STREAM` (v231+) environment variables. If these + // environment variables are not present we were not launched by + // systemd. + if (std.posix.getenv("INVOCATION_ID") == null) break :linux false; + if (std.posix.getenv("JOURNAL_STREAM") == null) break :linux false; + + // If `INVOCATION_ID` and `JOURNAL_STREAM` are present, check to make sure + // that our parent process is actually `systemd`, not some other terminal + // emulator that doesn't clean up those environment variables. + const ppid = std.os.linux.getppid(); + if (ppid == 1) break :linux true; + + // If the parent PID is not 1 we need to check to see if we were launched by + // a user systemd daemon. Do that by checking the `/proc//comm` + // to see if it ends with `systemd`. + var comm_path_buf: [std.fs.max_path_bytes]u8 = undefined; + const comm_path = std.fmt.bufPrint(&comm_path_buf, "/proc/{d}/comm", .{ppid}) catch { + log.err("unable to format comm path for pid {d}", .{ppid}); + break :linux false; + }; + const comm_file = std.fs.openFileAbsolute(comm_path, .{ .mode = .read_only }) catch { + log.err("unable to open '{s}' for reading", .{comm_path}); + break :linux false; + }; + defer comm_file.close(); + + // The maximum length of the command name is defined by + // `TASK_COMM_LEN` in the Linux kernel. This is usually 16 + // bytes at the time of writing (Jun 2025) so its set to that. + // Also, since we only care to compare to "systemd", anything + // longer can be assumed to not be systemd. + const TASK_COMM_LEN = 16; + var comm_data_buf: [TASK_COMM_LEN]u8 = undefined; + const comm_size = comm_file.readAll(&comm_data_buf) catch { + log.err("problems reading from '{s}'", .{comm_path}); + break :linux false; + }; + const comm_data = comm_data_buf[0..comm_size]; + + break :linux std.mem.eql( + u8, + std.mem.trimRight(u8, comm_data, "\n"), + "systemd", + ); + }, + + // No other system supports systemd so always return false. + else => false, + }; +} From 85beda9c49066001df5c5fdbd351c106d6c3c2a7 Mon Sep 17 00:00:00 2001 From: Daniel Wennberg Date: Sun, 1 Jun 2025 14:04:14 -0700 Subject: [PATCH 060/371] Fix reset zoom button visibility in macOS "tabs" mode when no tabs --- .../Features/Terminal/TerminalWindow.swift | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalWindow.swift b/macos/Sources/Features/Terminal/TerminalWindow.swift index 62b8dc5bf..48384a827 100644 --- a/macos/Sources/Features/Terminal/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/TerminalWindow.swift @@ -372,21 +372,10 @@ class TerminalWindow: NSWindow { private func updateResetZoomTitlebarButtonVisibility() { guard let tabGroup, let resetZoomTitlebarAccessoryViewController else { return } - let isHidden = tabGroup.isTabBarVisible ? true : !surfaceIsZoomed - - if titlebarTabs { - resetZoomToolbarButton.isHidden = isHidden - - for (index, vc) in titlebarAccessoryViewControllers.enumerated() { - guard vc == resetZoomTitlebarAccessoryViewController else { return } - removeTitlebarAccessoryViewController(at: index) - } - } else { - if !titlebarAccessoryViewControllers.contains(resetZoomTitlebarAccessoryViewController) { - addTitlebarAccessoryViewController(resetZoomTitlebarAccessoryViewController) - } - resetZoomTitlebarAccessoryViewController.view.isHidden = isHidden - } + if !titlebarAccessoryViewControllers.contains(resetZoomTitlebarAccessoryViewController) { + addTitlebarAccessoryViewController(resetZoomTitlebarAccessoryViewController) + } + resetZoomTitlebarAccessoryViewController.view.isHidden = tabGroup.isTabBarVisible ? true : !surfaceIsZoomed } private func generateResetZoomButton() -> NSButton { From 12a01c046031045b315c8c20146066511fc4cf00 Mon Sep 17 00:00:00 2001 From: Daniel Wennberg Date: Sun, 1 Jun 2025 15:14:04 -0700 Subject: [PATCH 061/371] Hide main title when covered by tabs --- .../Features/Terminal/TerminalToolbar.swift | 10 ++++++++++ .../Features/Terminal/TerminalWindow.swift | 16 +++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalToolbar.swift b/macos/Sources/Features/Terminal/TerminalToolbar.swift index aa4ca31cd..9da14562c 100644 --- a/macos/Sources/Features/Terminal/TerminalToolbar.swift +++ b/macos/Sources/Features/Terminal/TerminalToolbar.swift @@ -25,6 +25,16 @@ class TerminalToolbar: NSToolbar, NSToolbarDelegate { } } + var titleIsHidden: Bool { + get { + titleTextField.isHidden + } + + set { + titleTextField.isHidden = newValue + } + } + override init(identifier: NSToolbar.Identifier) { super.init(identifier: identifier) diff --git a/macos/Sources/Features/Terminal/TerminalWindow.swift b/macos/Sources/Features/Terminal/TerminalWindow.swift index 48384a827..9a2bdc60f 100644 --- a/macos/Sources/Features/Terminal/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/TerminalWindow.swift @@ -153,7 +153,7 @@ class TerminalWindow: NSWindow { // This is required because the removeTitlebarAccessoryViewController hook does not // catch the creation of a new window by "tearing off" a tab from a tabbed window. if let tabGroup = self.tabGroup, tabGroup.windows.count < 2 { - hideCustomTabBarViews() + resetCustomTabBarViews() } super.becomeKey() @@ -538,17 +538,22 @@ class TerminalWindow: NSWindow { let isTabBar = titlebarAccessoryViewControllers[index].identifier == Self.TabBarController super.removeTitlebarAccessoryViewController(at: index) if (isTabBar) { - hideCustomTabBarViews() + resetCustomTabBarViews() } } // To be called immediately after the tab bar is disabled. - private func hideCustomTabBarViews() { + private func resetCustomTabBarViews() { // Hide the window buttons backdrop. windowButtonsBackdrop?.isHidden = true // Hide the window drag handle. windowDragHandle?.isHidden = true + + // Reenable the main toolbar title + if let toolbar = toolbar as? TerminalToolbar { + toolbar.titleIsHidden = false + } } private func pushTabsToTitlebar(_ tabBarController: NSTitlebarAccessoryViewController) { @@ -557,6 +562,11 @@ class TerminalWindow: NSWindow { generateToolbar() } + // The main title conflicts with titlebar tabs, so hide it + if let toolbar = toolbar as? TerminalToolbar { + toolbar.titleIsHidden = true + } + // HACK: wait a tick before doing anything, to avoid edge cases during startup... :/ // If we don't do this then on launch windows with restored state with tabs will end // up with messed up tab bars that don't show all tabs. From 232a46d2dc155c5371b8265d7e66437cb480e65e Mon Sep 17 00:00:00 2001 From: Daniel Wennberg Date: Sun, 1 Jun 2025 14:02:09 -0700 Subject: [PATCH 062/371] Add option to hide macOS traffic lights --- .../Terminal/TerminalController.swift | 19 +++++++++++--- .../Features/Terminal/TerminalWindow.swift | 14 ++++++++++- macos/Sources/Ghostty/Ghostty.Config.swift | 11 ++++++++ macos/Sources/Ghostty/Package.swift | 6 +++++ src/config/Config.zig | 25 +++++++++++++++++++ 5 files changed, 71 insertions(+), 4 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index f2868adb0..78245d5a6 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -377,6 +377,14 @@ class TerminalController: BaseTerminalController { shouldCascadeWindows = false } + fileprivate func hideWindowButtons() { + guard let window else { return } + + window.standardWindowButton(.closeButton)?.isHidden = true + window.standardWindowButton(.miniaturizeButton)?.isHidden = true + window.standardWindowButton(.zoomButton)?.isHidden = true + } + fileprivate func applyHiddenTitlebarStyle() { guard let window else { return } @@ -398,9 +406,7 @@ class TerminalController: BaseTerminalController { window.titlebarAppearsTransparent = true // Hide the traffic lights (window control buttons) - window.standardWindowButton(.closeButton)?.isHidden = true - window.standardWindowButton(.miniaturizeButton)?.isHidden = true - window.standardWindowButton(.zoomButton)?.isHidden = true + hideWindowButtons() // Disallow tabbing if the titlebar is hidden, since that will (should) also hide the tab bar. window.tabbingMode = .disallowed @@ -456,6 +462,10 @@ class TerminalController: BaseTerminalController { y: config.windowPositionY, windowDecorations: config.windowDecorations) + if config.macosWindowButtons == .hidden { + hideWindowButtons() + } + // Make sure our theme is set on the window so styling is correct. if let windowTheme = config.windowTheme { window.windowTheme = .init(rawValue: windowTheme) @@ -872,17 +882,20 @@ class TerminalController: BaseTerminalController { struct DerivedConfig { let backgroundColor: Color + let macosWindowButtons: Ghostty.MacOSWindowButtons let macosTitlebarStyle: String let maximize: Bool init() { self.backgroundColor = Color(NSColor.windowBackgroundColor) + self.macosWindowButtons = .visible self.macosTitlebarStyle = "system" self.maximize = false } init(_ config: Ghostty.Config) { self.backgroundColor = config.backgroundColor + self.macosWindowButtons = config.macosWindowButtons self.macosTitlebarStyle = config.macosTitlebarStyle self.maximize = config.maximize } diff --git a/macos/Sources/Features/Terminal/TerminalWindow.swift b/macos/Sources/Features/Terminal/TerminalWindow.swift index 9a2bdc60f..5e90d0696 100644 --- a/macos/Sources/Features/Terminal/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/TerminalWindow.swift @@ -45,6 +45,18 @@ class TerminalWindow: NSWindow { }, ] + private var hasWindowButtons: Bool { + get { + if let close = standardWindowButton(.closeButton), + let miniaturize = standardWindowButton(.miniaturizeButton), + let zoom = standardWindowButton(.zoomButton) { + return !(close.isHidden && miniaturize.isHidden && zoom.isHidden) + } else { + return false + } + } + } + // Both of these must be true for windows without decorations to be able to // still become key/main and receive events. override var canBecomeKey: Bool { return true } @@ -613,7 +625,7 @@ class TerminalWindow: NSWindow { view.translatesAutoresizingMaskIntoConstraints = false view.leftAnchor.constraint(equalTo: toolbarView.leftAnchor).isActive = true - view.rightAnchor.constraint(equalTo: toolbarView.leftAnchor, constant: 78).isActive = true + view.rightAnchor.constraint(equalTo: toolbarView.leftAnchor, constant: hasWindowButtons ? 78 : 0).isActive = true view.topAnchor.constraint(equalTo: toolbarView.topAnchor).isActive = true view.heightAnchor.constraint(equalTo: toolbarView.heightAnchor).isActive = true diff --git a/macos/Sources/Ghostty/Ghostty.Config.swift b/macos/Sources/Ghostty/Ghostty.Config.swift index d7be4eb5b..cce14ca0f 100644 --- a/macos/Sources/Ghostty/Ghostty.Config.swift +++ b/macos/Sources/Ghostty/Ghostty.Config.swift @@ -250,6 +250,17 @@ extension Ghostty { return String(cString: ptr) } + var macosWindowButtons: MacOSWindowButtons { + let defaultValue = MacOSWindowButtons.visible + guard let config = self.config else { return defaultValue } + var v: UnsafePointer? = nil + let key = "macos-window-buttons" + guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return defaultValue } + guard let ptr = v else { return defaultValue } + let str = String(cString: ptr) + return MacOSWindowButtons(rawValue: str) ?? defaultValue + } + var macosTitlebarStyle: String { let defaultValue = "transparent" guard let config = self.config else { return defaultValue } diff --git a/macos/Sources/Ghostty/Package.swift b/macos/Sources/Ghostty/Package.swift index 30d5573df..82721c17e 100644 --- a/macos/Sources/Ghostty/Package.swift +++ b/macos/Sources/Ghostty/Package.swift @@ -239,6 +239,12 @@ extension Ghostty { case chrome } + /// Enum for the macos-window-buttons config option + enum MacOSWindowButtons: String { + case visible + case hidden + } + /// Enum for the macos-titlebar-proxy-icon config option enum MacOSTitlebarProxyIcon: String { case visible diff --git a/src/config/Config.zig b/src/config/Config.zig index bf6d26f4b..03fc53321 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2053,6 +2053,25 @@ keybind: Keybinds = .{}, /// it will retain the previous setting until fullscreen is exited. @"macos-non-native-fullscreen": NonNativeFullscreen = .false, +/// Whether the window buttons in the macOS titlebar are visible. The window +/// buttons are the colored buttons in the upper left corner of most macOS apps, +/// also known as the traffic lights, that allow you to close, miniaturize, and +/// zoom the window. +/// +/// This setting has no effect when `window-decoration = false` or +/// `macos-titlebar-style = hidden`, as the window buttons are always hidden in +/// these modes. +/// +/// Valid values are: +/// +/// * `visible` - Show the window buttons. +/// * `hidden` - Hide the window buttons. +/// +/// The default value is `visible`. +/// +/// Changing this option at runtime only applies to new windows. +@"macos-window-buttons": MacWindowButtons = .visible, + /// The style of the macOS titlebar. Available values are: "native", /// "transparent", "tabs", and "hidden". /// @@ -5803,6 +5822,12 @@ pub const WindowColorspace = enum { @"display-p3", }; +/// See macos-window-buttons +pub const MacWindowButtons = enum { + visible, + hidden, +}; + /// See macos-titlebar-style pub const MacTitlebarStyle = enum { native, From 5244f8d6ac5161f59457a4aa83d286192e5db7a7 Mon Sep 17 00:00:00 2001 From: Daniel Wennberg Date: Mon, 2 Jun 2025 10:14:52 -0700 Subject: [PATCH 063/371] Follow-up to #7462: var -> let --- macos/Sources/Features/Global Keybinds/GlobalEventTap.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macos/Sources/Features/Global Keybinds/GlobalEventTap.swift b/macos/Sources/Features/Global Keybinds/GlobalEventTap.swift index 644285c9a..ae77535be 100644 --- a/macos/Sources/Features/Global Keybinds/GlobalEventTap.swift +++ b/macos/Sources/Features/Global Keybinds/GlobalEventTap.swift @@ -141,7 +141,7 @@ fileprivate func cgEventFlagsChangedHandler( guard let event: NSEvent = .init(cgEvent: cgEvent) else { return result } // Build our event input and call ghostty - var key_ev = event.ghosttyKeyEvent(GHOSTTY_ACTION_PRESS) + let key_ev = event.ghosttyKeyEvent(GHOSTTY_ACTION_PRESS) if (ghostty_app_key(ghostty, key_ev)) { GlobalEventTap.logger.info("global key event handled event=\(event)") return nil From d1f1be883386fa68763fba512ce2c371afe5ea4d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 2 Jun 2025 13:57:33 -0700 Subject: [PATCH 064/371] macos: fix small memory leak in surface tree when closing splits This fixes a small memory leak I found where the `SplitNode.Leaf` was not being deinitialized properly when closing a split. It would get deinitialized the next time a split was made or the window was closed, so the leak wasn't big. The surface view underneath the split was also properly deinitialized because we forced it, so again, the leak was quite small. But conceptually this is a big problem, because when we change the surface tree we expect the deinit chain to propagate properly through the whole thing, _including_ to the SurfaceView. This fixes that by removing the `id(node)` call. I don't find this to be necessary anymore. I don't know when that happened but we've changed quite a lot in our split system since it was introduced. I'm also not 100% sure why the `id(node)` was causing a strong reference to begin with... which bothers me a bit. AI note: While I manually hunted this down, I started up Claude Code and Codex in separate tabs to also hunt for the memory leak. They both failed to find it and offered solutions that didn't work. --- .../Terminal/BaseTerminalController.swift | 4 +--- macos/Sources/Ghostty/Ghostty.SplitNode.swift | 15 +-------------- .../Sources/Ghostty/Ghostty.TerminalSplit.swift | 5 +---- macos/Sources/Ghostty/SurfaceView_AppKit.swift | 16 ++++------------ 4 files changed, 7 insertions(+), 33 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 9862e1288..fd5ca9ffb 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -149,10 +149,8 @@ class BaseTerminalController: NSWindowController, /// /// Subclasses should call super first. func surfaceTreeDidChange(from: Ghostty.SplitNode?, to: Ghostty.SplitNode?) { - // If our surface tree becomes nil then ensure all surfaces - // in the old tree have closed. + // If our surface tree becomes nil then we have no focused surface. if (to == nil) { - from?.close() focusedSurface = nil } } diff --git a/macos/Sources/Ghostty/Ghostty.SplitNode.swift b/macos/Sources/Ghostty/Ghostty.SplitNode.swift index 95c019b1f..97b20acd3 100644 --- a/macos/Sources/Ghostty/Ghostty.SplitNode.swift +++ b/macos/Sources/Ghostty/Ghostty.SplitNode.swift @@ -102,19 +102,6 @@ extension Ghostty { } } - /// Close the surface associated with this node. This will likely deinitialize the - /// surface. At this point, the surface view in this node tree can never be used again. - func close() { - switch (self) { - case .leaf(let leaf): - leaf.surface.close() - - case .split(let container): - container.topLeft.close() - container.bottomRight.close() - } - } - /// Returns true if any surface in the split stack requires quit confirmation. func needsConfirmQuit() -> Bool { switch (self) { @@ -224,7 +211,7 @@ extension Ghostty { self.app = app self.surface = SurfaceView(app, baseConfig: baseConfig, uuid: uuid) } - + // MARK: - Hashable func hash(into hasher: inout Hasher) { diff --git a/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift b/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift index 3e942d774..92528ace7 100644 --- a/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift +++ b/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift @@ -75,7 +75,6 @@ extension Ghostty { .onReceive(pubZoom) { onZoom(notification: $0) } } } - .id(node) // Needed for change detection on node } else { // On these events we want to reset the split state and call it. let pubSplit = center.publisher(for: Notification.ghosttyNewSplit, object: zoomedSurface!) @@ -289,7 +288,7 @@ extension Ghostty { let neighbors: SplitNode.Neighbors @Binding var node: SplitNode? - @StateObject var container: SplitNode.Container + @ObservedObject var container: SplitNode.Container var body: some View { SplitView( @@ -331,7 +330,6 @@ extension Ghostty { } // Closing - container.topLeft.close() node = container.bottomRight switch (node) { @@ -362,7 +360,6 @@ extension Ghostty { } // Closing - container.bottomRight.close() node = container.topLeft switch (node) { diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 8e8838471..99f901792 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -279,22 +279,14 @@ extension Ghostty { // Remove ourselves from secure input if we have to SecureInput.shared.removeScoped(ObjectIdentifier(self)) - guard let surface = self.surface else { return } - ghostty_surface_free(surface) - } - - /// Close the surface early. This will free the associated Ghostty surface and the view will - /// no longer render. The view can never be used again. This is a way for us to free the - /// Ghostty resources while references may still be held to this view. I've found that SwiftUI - /// tends to hold this view longer than it should so we free the expensive stuff explicitly. - func close() { // Remove any notifications associated with this surface let identifiers = Array(self.notificationIdentifiers) UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: identifiers) - guard let surface = self.surface else { return } - ghostty_surface_free(surface) - self.surface = nil + // Free our core surface resources + if let surface = self.surface { + ghostty_surface_free(surface) + } } func focusDidChange(_ focused: Bool) { From 652f551bec02e7dd5f9856ff24dbf20fa6e088ec Mon Sep 17 00:00:00 2001 From: Jon Parise Date: Mon, 2 Jun 2025 20:03:08 -0400 Subject: [PATCH 065/371] macos: simplify some ServiceProvider code First, remove the always-inlined openTerminalFromPasteboard code and combine it with openTerminal. Now that we're doing a bit of work inside openTerminal, there's little better to having an intermediate, inlined function. Second, combine some type-casting operations (saving a .map() call). Lastly, adjust some variable names because a generic `objs` or `urls` was a little ambiguous now that we're all in one function scope. --- .../Features/Services/ServiceProvider.swift | 37 ++++++++----------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/macos/Sources/Features/Services/ServiceProvider.swift b/macos/Sources/Features/Services/ServiceProvider.swift index a06e7d151..043f5d704 100644 --- a/macos/Sources/Features/Services/ServiceProvider.swift +++ b/macos/Sources/Features/Services/ServiceProvider.swift @@ -5,7 +5,7 @@ class ServiceProvider: NSObject { static private let errorNoString = NSString(string: "Could not load any text from the clipboard.") /// The target for an open operation - enum OpenTarget { + private enum OpenTarget { case tab case window } @@ -15,7 +15,7 @@ class ServiceProvider: NSObject { userData: String?, error: AutoreleasingUnsafeMutablePointer ) { - openTerminalFromPasteboard(pasteboard: pasteboard, target: .tab, error: error) + openTerminal(from: pasteboard, target: .tab, error: error) } @objc func openWindow( @@ -23,40 +23,33 @@ class ServiceProvider: NSObject { userData: String?, error: AutoreleasingUnsafeMutablePointer ) { - openTerminalFromPasteboard(pasteboard: pasteboard, target: .window, error: error) + openTerminal(from: pasteboard, target: .window, error: error) } - @inline(__always) - private func openTerminalFromPasteboard( - pasteboard: NSPasteboard, + private func openTerminal( + from pasteboard: NSPasteboard, target: OpenTarget, error: AutoreleasingUnsafeMutablePointer ) { - guard let objs = pasteboard.readObjects(forClasses: [NSURL.self]) as? [NSURL] else { + guard let delegate = NSApp.delegate as? AppDelegate else { return } + let terminalManager = delegate.terminalManager + + guard let pathURLs = pasteboard.readObjects(forClasses: [NSURL.self]) as? [URL] else { error.pointee = Self.errorNoString return } - let urlObjects = objs.map { $0 as URL } - openTerminal(urlObjects, target: target) - } - - private func openTerminal(_ urls: [URL], target: OpenTarget) { - guard let delegateRaw = NSApp.delegate else { return } - guard let delegate = delegateRaw as? AppDelegate else { return } - let terminalManager = delegate.terminalManager - - let uniqueCwds: Set = Set( - urls.map { url -> URL in - // We only open in directories. + // Build a set of unique directory URLs to open. File paths are truncated + // to their directories because that's the only thing we can open. + let directoryURLs = Set( + pathURLs.map { url -> URL in url.hasDirectoryPath ? url : url.deletingLastPathComponent() } ) - for cwd in uniqueCwds { - // Build our config + for url in directoryURLs { var config = Ghostty.SurfaceConfiguration() - config.workingDirectory = cwd.path(percentEncoded: false) + config.workingDirectory = url.path(percentEncoded: false) switch (target) { case .window: From 58cece07f0e8f0fc4cf5cb42faa8b86d3cfbcf19 Mon Sep 17 00:00:00 2001 From: Leorize Date: Mon, 2 Jun 2025 20:22:41 -0500 Subject: [PATCH 066/371] gtk/GlobalShortcuts: don't request session with no shortcuts There aren't any reason to pay the D-Bus tax if you don't use global shortcuts. --- src/apprt/gtk/GlobalShortcuts.zig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/apprt/gtk/GlobalShortcuts.zig b/src/apprt/gtk/GlobalShortcuts.zig index 7d960d7bf..ac9dbaa8a 100644 --- a/src/apprt/gtk/GlobalShortcuts.zig +++ b/src/apprt/gtk/GlobalShortcuts.zig @@ -117,7 +117,9 @@ pub fn refreshSession(self: *GlobalShortcuts, app: *App) !void { ); } - try self.request(.create_session); + if (self.map.count() > 0) { + try self.request(.create_session); + } } fn shortcutActivated( From 1183ac897236fef95bd56af0778aa7c1c7272bac Mon Sep 17 00:00:00 2001 From: Leorize Date: Mon, 2 Jun 2025 21:02:16 -0500 Subject: [PATCH 067/371] flatpak: rename .Devel variant to .ghostty-debug This is done to match against the default application id when Ghostty is built using debug configuration, done to prepare the Flatpak version for D-Bus activation support. --- ...ellh.ghostty.Devel.yml => com.mitchellh.ghostty-debug.yml} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename flatpak/{com.mitchellh.ghostty.Devel.yml => com.mitchellh.ghostty-debug.yml} (95%) diff --git a/flatpak/com.mitchellh.ghostty.Devel.yml b/flatpak/com.mitchellh.ghostty-debug.yml similarity index 95% rename from flatpak/com.mitchellh.ghostty.Devel.yml rename to flatpak/com.mitchellh.ghostty-debug.yml index fe24a7c56..8a2c0056e 100644 --- a/flatpak/com.mitchellh.ghostty.Devel.yml +++ b/flatpak/com.mitchellh.ghostty-debug.yml @@ -1,4 +1,4 @@ -app-id: com.mitchellh.ghostty.Devel +app-id: com.mitchellh.ghostty-debug runtime: org.gnome.Platform runtime-version: "48" sdk: org.gnome.Sdk @@ -10,7 +10,7 @@ command: ghostty rename-desktop-file: com.mitchellh.ghostty.desktop rename-appdata-file: com.mitchellh.ghostty.metainfo.xml rename-icon: com.mitchellh.ghostty -desktop-file-name-suffix: " (Devel)" +desktop-file-name-suffix: " (Debug)" finish-args: # 3D rendering - --device=dri From 4e39144d39c0dbb88ebc0060dffc3b145556df3c Mon Sep 17 00:00:00 2001 From: Leorize Date: Tue, 3 Jun 2025 01:34:37 -0500 Subject: [PATCH 068/371] gtk/TabView: do not closeTab within close-page signal handler `TabView` assumes to be the sole owner of all `Tab`s within a Window. As such, it could close the managed `Window` once all tabs are removed from its widget. However, during `AdwTabView::close-page` signal triggered by libadwaita, the `Tab` to be closed will gain an another reference for the duration of the signal, breaking `TabView.closeTab` (called via `Tab.closeWithConfirmation`) assumptions that having no tabs meant they are all destroyed. This commit solves the issue by scheduling `Tab.closeWithConfirmation` to be run after `AdwTabView::close-page` signal has finished processing. --- src/apprt/gtk/TabView.zig | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/apprt/gtk/TabView.zig b/src/apprt/gtk/TabView.zig index 29a069a6d..8a4145b5f 100644 --- a/src/apprt/gtk/TabView.zig +++ b/src/apprt/gtk/TabView.zig @@ -7,6 +7,7 @@ const std = @import("std"); const gtk = @import("gtk"); const adw = @import("adw"); const gobject = @import("gobject"); +const glib = @import("glib"); const Window = @import("Window.zig"); const Tab = @import("Tab.zig"); @@ -243,7 +244,14 @@ fn adwClosePage( const child = page.getChild().as(gobject.Object); const tab: *Tab = @ptrCast(@alignCast(child.getData(Tab.GHOSTTY_TAB) orelse return 0)); self.tab_view.closePageFinish(page, @intFromBool(self.forcing_close)); - if (!self.forcing_close) tab.closeWithConfirmation(); + if (!self.forcing_close) { + // We cannot trigger a close directly in here as the page will stay + // alive until this handler returns, breaking the assumption where + // no pages means they are all destroyed. + // + // Schedule the close request to happen in the next event cycle. + _ = glib.idleAddOnce(glibIdleOnceCloseTab, tab); + } return 1; } @@ -269,3 +277,8 @@ fn adwSelectPage(_: *adw.TabView, _: *gobject.ParamSpec, self: *TabView) callcon const title = page.getTitle(); self.window.setTitle(std.mem.span(title)); } + +fn glibIdleOnceCloseTab(data: ?*anyopaque) callconv(.c) void { + const tab: *Tab = @ptrCast(@alignCast(data orelse return)); + tab.closeWithConfirmation(); +} From 037d4732a6f16c3e89b96b059f3bf83e69b82097 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 00:46:01 +0000 Subject: [PATCH 069/371] build(deps): bump namespacelabs/nscloud-cache-action from 1.2.7 to 1.2.8 Bumps [namespacelabs/nscloud-cache-action](https://github.com/namespacelabs/nscloud-cache-action) from 1.2.7 to 1.2.8. - [Release notes](https://github.com/namespacelabs/nscloud-cache-action/releases) - [Commits](https://github.com/namespacelabs/nscloud-cache-action/compare/v1.2.7...v1.2.8) --- updated-dependencies: - dependency-name: namespacelabs/nscloud-cache-action dependency-version: 1.2.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/nix.yml | 2 +- .github/workflows/release-tag.yml | 2 +- .github/workflows/release-tip.yml | 2 +- .github/workflows/test.yml | 38 +++++++++++------------ .github/workflows/update-colorschemes.yml | 2 +- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index 11521c9c6..a905531c2 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -36,7 +36,7 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml index 6190bed16..db8049df7 100644 --- a/.github/workflows/release-tag.yml +++ b/.github/workflows/release-tag.yml @@ -83,7 +83,7 @@ jobs: - uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix diff --git a/.github/workflows/release-tip.yml b/.github/workflows/release-tip.yml index b4a341a5d..42626288c 100644 --- a/.github/workflows/release-tip.yml +++ b/.github/workflows/release-tip.yml @@ -107,7 +107,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1401f8325..e0b0ded6b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -67,7 +67,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -98,7 +98,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -134,7 +134,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -163,7 +163,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -196,7 +196,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -240,7 +240,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -382,7 +382,7 @@ jobs: mkdir dist tar --verbose --extract --strip-components 1 --directory dist --file ghostty-source.tar.gz - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -492,7 +492,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -523,7 +523,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -568,7 +568,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -607,7 +607,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -662,7 +662,7 @@ jobs: steps: - uses: actions/checkout@v4 # Check out repo so we can lint it - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -689,7 +689,7 @@ jobs: steps: - uses: actions/checkout@v4 # Check out repo so we can lint it - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -716,7 +716,7 @@ jobs: steps: - uses: actions/checkout@v4 # Check out repo so we can lint it - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -743,7 +743,7 @@ jobs: steps: - uses: actions/checkout@v4 # Check out repo so we can lint it - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -770,7 +770,7 @@ jobs: steps: - uses: actions/checkout@v4 # Check out repo so we can lint it - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -797,7 +797,7 @@ jobs: steps: - uses: actions/checkout@v4 # Check out repo so we can lint it - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -832,7 +832,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix @@ -890,7 +890,7 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix diff --git a/.github/workflows/update-colorschemes.yml b/.github/workflows/update-colorschemes.yml index 27b35b441..2533285e6 100644 --- a/.github/workflows/update-colorschemes.yml +++ b/.github/workflows/update-colorschemes.yml @@ -22,7 +22,7 @@ jobs: fetch-depth: 0 - name: Setup Cache - uses: namespacelabs/nscloud-cache-action@v1.2.7 + uses: namespacelabs/nscloud-cache-action@v1.2.8 with: path: | /nix From 2c8d6ba944bfb85d32e02ded4af693fa9e8ac911 Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Wed, 4 Jun 2025 15:07:58 +0200 Subject: [PATCH 070/371] core: document keybind actions better The current documentation for actions are very sparse and would leave someone (even including contributors) as to what exactly they do. On top of that there are many stylistic and grammatical problems that are simply no longer in line with our current standards, and certainly not on par with our configuration options reference. Hence, I've taken it upon myself to add, clarify, supplement, edit and even rewrite the documentation for most of these actions, in a wider effort of trying to offer better, clearer documentation for our users. --- src/input/Binding.zig | 427 ++++++++++++++++++++++++++++-------------- src/input/command.zig | 2 +- 2 files changed, 285 insertions(+), 144 deletions(-) diff --git a/src/input/Binding.zig b/src/input/Binding.zig index e5d434265..7818fac1e 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -222,114 +222,191 @@ pub fn lessThan(_: void, lhs: Binding, rhs: Binding) bool { /// The set of actions that a keybinding can take. pub const Action = union(enum) { - /// Ignore this key combination, don't send it to the child process, - /// pretend that it never happened at the Ghostty level. The key - /// combination may still be processed by the OS or other - /// applications. + /// Ignore this key combination. + /// + /// Ghostty will not process this combination nor forward it to the child + /// process within the terminal, but it may still be processed by the OS or + /// other applications. ignore, - /// This action is used to flag that the binding should be removed from - /// the set. This should never exist in an active set and `set.put` has an - /// assertion to verify this. + /// Unbind a previously bound key binding. /// - /// This is only able to unbind bindings that were previously - /// bound to Ghostty. This cannot unbind bindings that were not - /// bound by Ghostty (e.g. bindings set by the OS or some other - /// application). + /// This cannot unbind bindings that were not bound by Ghostty or the user + /// (e.g. bindings set by the OS or some other application). unbind, - /// Send a CSI sequence. The value should be the CSI sequence without the - /// CSI header (`ESC [` or `\x1b[`). + /// Send a CSI sequence. + /// + /// The value should be the CSI sequence without the CSI header (`ESC [` or + /// `\x1b[`). + /// + /// For example, `csi:0m` can be sent to reset all styles of the current text. csi: []const u8, /// Send an `ESC` sequence. esc: []const u8, - /// Send the given text. Uses Zig string literal syntax. This is currently - /// not validated. If the text is invalid (i.e. contains an invalid escape - /// sequence), the error will currently only show up in logs. + /// Send the specified text. + /// + /// Uses Zig string literal syntax. This is currently not validated. + /// If the text is invalid (i.e. contains an invalid escape sequence), + /// the error will currently only show up in logs. text: []const u8, /// Send data to the pty depending on whether cursor key mode is enabled /// (`application`) or disabled (`normal`). cursor_key: CursorKey, - /// Reset the terminal. This can fix a lot of issues when a running - /// program puts the terminal into a broken state. This is equivalent to - /// when you type "reset" and press enter. + /// Reset the terminal. + /// + /// This can fix a lot of issues when a running program puts the terminal + /// into a broken state, equivalent to running the `reset` command. /// /// If you do this while in a TUI program such as vim, this may break /// the program. If you do this while in a shell, you may have to press /// enter after to get a new prompt. reset, - /// Copy and paste. + /// Copy the selected text to the clipboard. copy_to_clipboard, + + /// Paste the contents of the default clipboard. paste_from_clipboard, + + /// Paste the contents of the selection clipboard. paste_from_selection, - /// Copy the URL under the cursor to the clipboard. If there is no - /// URL under the cursor, this does nothing. + /// If there is a URL under the cursor, copy it to the default clipboard. copy_url_to_clipboard, - /// Increase/decrease the font size by a certain amount. + /// Increase the font size by the specified amount in points (pt). + /// + /// For example, `increase_font_size:1.5` will increase the font size + /// by 1.5 points. increase_font_size: f32, + + /// Decrease the font size by the specified amount in points (pt). + /// + /// For example, `decrease_font_size:1.5` will decrease the font size + /// by 1.5 points. decrease_font_size: f32, /// Reset the font size to the original configured size. reset_font_size, - /// Clear the screen. This also clears all scrollback. + /// Clear the screen and all scrollback. clear_screen, /// Select all text on the screen. select_all, - /// Scroll the screen varying amounts. + /// Scroll to the top of the screen. scroll_to_top, + + /// Scroll to the bottom of the screen. scroll_to_bottom, + + /// Scroll to the selected text. scroll_to_selection, + + /// Scroll the screen up by one page. scroll_page_up, + + /// Scroll the screen down by one page. scroll_page_down, + + /// Scroll the screen by the specified fraction of a page. + /// + /// Positive values scroll downwards, and negative values scroll upwards. + /// + /// For example, `scroll_page_fractional:0.5` would scroll the screen + /// downwards by half a page, while `scroll_page_fractional:-1.5` would + /// scroll it upwards by one and a half pages. scroll_page_fractional: f32, + + /// Scroll the screen by the specified amount of lines. + /// + /// Positive values scroll downwards, and negative values scroll upwards. + /// + /// For example, `scroll_page_lines:3` would scroll the screen downwards + /// by 3 lines, while `scroll_page_lines:-10` would scroll it upwards by 10 + /// lines. scroll_page_lines: i16, - /// Adjust the current selection in a given direction. Does nothing if no - /// selection exists. + /// Adjust the current selection in the given direction or position, + /// relative to the cursor. /// - /// Arguments: - /// - left, right, up, down, page_up, page_down, home, end, - /// beginning_of_line, end_of_line + /// WARNING: This does not create a new selection, and does nothing when + /// there currently isn't one. + /// + /// Valid arguments are: + /// + /// - `left`, `right` + /// + /// Adjust the selection one cell to the left or right respectively. + /// + /// - `up`, `down` + /// + /// Adjust the selection one line upwards or downwards respectively. + /// + /// - `page_up`, `page_down` + /// + /// Adjust the selection one page upwards or downwards respectively. + /// + /// - `home`, `end` + /// + /// Adjust the selection to the top-left or the bottom-right corner + /// of the screen respectively. + /// + /// - `beginning_of_line`, `end_of_line` + /// + /// Adjust the selection to the beginning or the end of the line + /// respectively. /// - /// Example: Extend selection to the right - /// keybind = shift+right=adjust_selection:right adjust_selection: AdjustSelection, - /// Jump the viewport forward or back by prompt. Positive number is the - /// number of prompts to jump forward, negative is backwards. + /// Jump the viewport forward or back by the given number of prompts. + /// + /// Requires shell integration. + /// + /// Positive values scroll downwards, and negative values scroll upwards. jump_to_prompt: i16, - /// Write the entire scrollback into a temporary file. The action - /// determines what to do with the filepath. Valid values are: + /// Write the entire scrollback into a temporary file with the specified + /// action. The action determines what to do with the filepath. + /// + /// Valid actions are: + /// + /// - `paste` + /// + /// Paste the file path into the terminal. + /// + /// - `open` + /// + /// Open the file in the default OS editor for text files. /// - /// - "paste": Paste the file path into the terminal. - /// - "open": Open the file in the default OS editor for text files. /// The default OS editor is determined by using `open` on macOS /// and `xdg-open` on Linux. /// write_scrollback_file: WriteScreenAction, - /// Same as write_scrollback_file but writes the full screen contents. - /// See write_scrollback_file for available values. + /// Write the contents of the screen into a temporary file with the + /// specified action. + /// + /// See `write_scrollback_file` for possible actions. write_screen_file: WriteScreenAction, - /// Same as write_scrollback_file but writes the selected text. - /// If there is no selected text this does nothing (it doesn't - /// even create an empty file). See write_scrollback_file for - /// available values. + /// Write the currently selected text into a temporary file with the + /// specified action. + /// + /// See `write_scrollback_file` for possible actions. + /// + /// Does nothing when no text is selected. write_selection_file: WriteScreenAction, - /// Open a new window. If the application isn't currently focused, + /// Open a new window. + /// + /// If the application isn't currently focused, /// this will bring it to the front. new_window, @@ -342,190 +419,246 @@ pub const Action = union(enum) { /// Go to the next tab. next_tab, - /// Go to the last tab (the one with the highest index) + /// Go to the last tab. last_tab, - /// Go to the tab with the specific number, 1-indexed. If the tab number - /// is higher than the number of tabs, this will go to the last tab. + /// Go to the tab with the specific index, starting from 1. + /// + /// If the tab number is higher than the number of tabs, + /// this will go to the last tab. goto_tab: usize, /// Moves a tab by a relative offset. - /// Adjusts the tab position based on `offset`. For example `move_tab:-1` for left, `move_tab:1` for right. - /// If the new position is out of bounds, it wraps around cyclically within the tab range. + /// + /// Positive values move the tab forwards, and negative values move it + /// backwards. If the new position is out of bounds, it is wrapped around + /// cyclically within the tab list. + /// + /// For example, `move_tab:1` moves the tab one position forwards, and if + /// it was already the last tab in the list, it wraps around and becomes + /// the first tab in the list. Likewise, `move_tab:-1` moves the tab one + /// position backwards, and if it was the first tab, then it will become + /// the last tab. move_tab: isize, /// Toggle the tab overview. - /// This only works with libadwaita version 1.4.0 or newer. + /// + /// This is only supported on Linux and when the system's libadwaita + /// version is 1.4 or newer. The current libadwaita version can be + /// found by running `ghostty +version`. toggle_tab_overview, - /// Change the title of the current focused surface via a prompt. + /// Change the title of the current focused surface via a pop-up prompt. + /// + /// This requires libadwaita 1.5 or newer on Linux. The current libadwaita + /// version can be found by running `ghostty +version`. prompt_surface_title, - /// Create a new split in the given direction. + /// Create a new split in the specified direction. /// - /// Arguments: - /// - right, down, left, up, auto (splits along the larger direction) + /// Valid arguments: + /// + /// - `right`, `down`, `left`, `up` + /// + /// Creates a new split in the corresponding direction. + /// + /// - `auto` + /// + /// Creates a new split along the larger direction. + /// For example, if the parent split is currently wider than it is tall, + /// then a left-right split would be created, and vice versa. /// - /// Example: Create split on the right - /// keybind = cmd+shift+d=new_split:right new_split: SplitDirection, - /// Focus on a split in a given direction. For example `goto_split:up`. - /// Valid values are left, right, up, down, previous and next. + /// Focus on a split either in the specified direction (`right`, `down`, + /// `left` and `up`), or in the adjacent split in the order of creation + /// (`previous` and `next`). goto_split: SplitFocusDirection, - /// zoom/unzoom the current split. + /// Zoom in or out of the current split. + /// + /// When a split is zoomed into, it will take up the entire space in + /// the current tab, hiding other splits. The tab or tab bar would also + /// reflect this by displaying an icon indicating the zoomed state. toggle_split_zoom, - /// Resize the current split in a given direction. - /// - /// Arguments: - /// - up, down, left, right - /// - the number of pixels to resize the split by - /// - /// Example: Move divider up 10 pixels - /// keybind = cmd+shift+up=resize_split:up,10 + /// Resize the current split in the specified direction and amount in + /// pixels. The two arguments should be joined with a comma (`,`), + /// like in `resize_split:up,10`. resize_split: SplitResizeParameter, - /// Equalize all splits in the current window + /// Equalize the size of all splits in the current window. equalize_splits, /// Reset the window to the default size. The "default size" is the /// size that a new window would be created with. This has no effect /// if the window is fullscreen. + /// + /// Only implemented on macOS. reset_window_size, - /// Control the terminal inspector visibility. + /// Control the visibility of the terminal inspector. /// - /// Arguments: - /// - toggle, show, hide - /// - /// Example: Toggle inspector visibility - /// keybind = cmd+i=inspector:toggle + /// Valid arguments: `toggle`, `show`, `hide`. inspector: InspectorMode, /// Show the GTK inspector. + /// + /// Has no effect on macOS. show_gtk_inspector, - /// Open the configuration file in the default OS editor. If your default OS - /// editor isn't configured then this will fail. Currently, any failures to - /// open the configuration will show up only in the logs. + /// Open the configuration file in the default OS editor. + /// + /// If your default OS editor isn't configured then this will fail. + /// Currently, any failures to open the configuration will show up only in + /// the logs. open_config, - /// Reload the configuration. The exact meaning depends on the app runtime - /// in use but this usually involves re-reading the configuration file - /// and applying any changes. Note that not all changes can be applied at - /// runtime. + /// Reload the configuration. + /// + /// The exact meaning depends on the app runtime in use, but this usually + /// involves re-reading the configuration file and applying any changes + /// Note that not all changes can be applied at runtime. reload_config, /// Close the current "surface", whether that is a window, tab, split, etc. - /// This only closes ONE surface. This will trigger close confirmation as - /// configured. + /// + /// This might trigger a close confirmation popup, depending on the value + /// of the `confirm-close-surface` configuration setting. close_surface, - /// Close the current tab, regardless of how many splits there may be. - /// This will trigger close confirmation as configured. + /// Close the current tab and all splits therein. + /// + /// This might trigger a close confirmation popup, depending on the value + /// of the `confirm-close-surface` configuration setting. close_tab, - /// Close the window, regardless of how many tabs or splits there may be. - /// This will trigger close confirmation as configured. + /// Close the current window and all tabs and splits therein. + /// + /// This might trigger a close confirmation popup, depending on the value + /// of the `confirm-close-surface` configuration setting. close_window, - /// Close all windows. This will trigger close confirmation as configured. - /// This only works for macOS currently. + /// Close all windows. + /// + /// WARNING: This action has been deprecated and has no effect on either + /// Linux or macOS. Users are instead encouraged to use `all:close_window` + /// instead. close_all_windows, - /// Toggle maximized window state. This only works on Linux. + /// Maximize or unmaximize the current window. + /// + /// This has no effect on macOS as it does not have the concept of + /// maximized windows. toggle_maximize, - /// Toggle fullscreen mode of window. + /// Fullscreen or unfullscreen the current window. toggle_fullscreen, - /// Toggle window decorations on and off. This only works on Linux. + /// Toggle window decorations (titlebar, buttons, etc.) for the current window. + /// + /// Only implemented on Linux. toggle_window_decorations, - /// Toggle whether the terminal window is always on top of other - /// windows even when it is not focused. Terminal windows always start - /// as normal (not always on top) windows. + /// Toggle whether the terminal window should always float on top of other + /// windows even when unfocused. /// - /// This only works on macOS. + /// Terminal windows always start as normal (not float-on-top) windows. + /// + /// Only implemented on macOS. toggle_window_float_on_top, - /// Toggle secure input mode on or off. This is used to prevent apps - /// that monitor input from seeing what you type. This is useful for - /// entering passwords or other sensitive information. + /// Toggle secure input mode. /// - /// This applies to the entire application, not just the focused - /// terminal. You must toggle it off to disable it, or quit Ghostty. + /// This is used to prevent apps from monitoring your keyboard input + /// when entering passwords or other sensitive information. /// - /// This only works on macOS, since this is a system API on macOS. + /// This applies to the entire application, not just the focused terminal. + /// You must manually untoggle it or quit Ghostty entirely to disable it. + /// + /// Only implemented on macOS, as this uses a built-in system API. toggle_secure_input, - /// Toggle the command palette. The command palette is a UI element - /// that lets you see what actions you can perform, their associated - /// keybindings (if any), a search bar to filter the actions, and - /// the ability to then execute the action. + /// Toggle the command palette. + /// + /// The command palette is a popup that lets you see what actions + /// you can perform, their associated keybindings (if any), a search bar + /// to filter the actions, and the ability to then execute the action. + /// + /// This requires libadwaita 1.5 or newer on Linux. The current libadwaita + /// version can be found by running `ghostty +version`. toggle_command_palette, - /// Toggle the "quick" terminal. The quick terminal is a terminal that - /// appears on demand from a keybinding, often sliding in from a screen - /// edge such as the top. This is useful for quick access to a terminal - /// without having to open a new window or tab. + /// Toggle the quick terminal. /// - /// When the quick terminal loses focus, it disappears. The terminal state - /// is preserved between appearances, so you can always press the keybinding - /// to bring it back up. + /// The quick terminal, also known as the "Quake-style" or drop-down + /// terminal, is a terminal window that appears on demand from a keybinding, + /// often sliding in from a screen edge such as the top. This is useful for + /// quick access to a terminal without having to open a new window or tab. /// - /// To enable the quick terminal globally so that Ghostty doesn't - /// have to be focused, prefix your keybind with `global`. Example: + /// The terminal state is preserved between appearances, so showing the + /// quick terminal after it was already hidden would display the same + /// window instead of creating a new one. + /// + /// As quick terminals are often useful when other windows are currently + /// focused, they are best used with *global* keybinds. For example, one + /// can define the following key bind to toggle the quick terminal from + /// anywhere within the system by pressing `` Cmd+` ``: /// /// ```ini - /// keybind = global:cmd+grave_accent=toggle_quick_terminal + /// keybind = global:cmd+backquote=toggle_quick_terminal /// ``` /// /// The quick terminal has some limitations: /// - /// - It is a singleton; only one instance can exist at a time. - /// - It does not support tabs, but it does support splits. - /// - It will not be restored when the application is restarted - /// (for systems that support window restoration). - /// - It supports fullscreen, but fullscreen will always be a non-native - /// fullscreen (macos-non-native-fullscreen = true). This only applies - /// to the quick terminal window. This is a requirement due to how - /// the quick terminal is rendered. + /// - Only one quick terminal instance can exist at a time. + /// + /// - Unlike normal terminal windows, the quick terminal will not be + /// restored when the application is restarted on systems that support + /// window restoration like macOS. + /// + /// - On Linux, the quick terminal is only supported on Wayland and not + /// X11, and only on Wayland compositors that support the `wlr-layer-shell-v1` + /// protocol. In practice, this means that only GNOME users would not be + /// able to use this feature. + /// + /// - On Linux, slide-in animations are only supported on KDE, and when + /// the "Sliding Popups" KWin plugin is enabled. + /// + /// If you do not have this plugin enabled, open System Settings > Apps + /// & Windows > Window Management > Desktop Effects, and enable the + /// plugin in the plugin list. Ghostty would then need to be restarted + /// fully for this to take effect. + /// + /// - Quick terminal tabs are only supported on Linux and not on macOS. + /// This is because tabs on macOS require a title bar. + /// + /// - On macOS, a fullscreened quick terminal will always be in non-native + /// fullscreen mode. This is a requirement due to how the quick terminal + /// is rendered. /// /// See the various configurations for the quick terminal in the /// configuration file to customize its behavior. - /// - /// Supported on macOS and some desktop environments on Linux, namely - /// those that support the `wlr-layer-shell` Wayland protocol - /// (i.e. most desktop environments and window managers except GNOME). - /// - /// Slide-in animations on Linux are only supported on KDE when the - /// "Sliding Popups" KWin plugin is enabled. If you do not have this - /// plugin enabled, open System Settings > Apps & Windows > Window - /// Management > Desktop Effects, and enable the plugin in the plugin list. - /// Ghostty would then need to be restarted for this to take effect. toggle_quick_terminal, - /// Show/hide all windows. If all windows become shown, we also ensure + /// Show or hide all windows. If all windows become shown, we also ensure /// Ghostty becomes focused. When hiding all windows, focus is yielded /// to the next application as determined by the OS. /// /// Note: When the focused surface is fullscreen, this method does nothing. /// - /// This currently only works on macOS. + /// Only implemented on macOS. toggle_visibility, /// Check for updates. /// - /// This currently only works on macOS. + /// Only implemented on macOS. check_for_updates, - /// Quit ghostty. + /// Quit Ghostty. quit, - /// Crash ghostty in the desired thread for the focused surface. + /// Crash Ghostty in the desired thread for the focused surface. /// /// WARNING: This is a hard crash (panic) and data can be lost. /// @@ -535,9 +668,17 @@ pub const Action = union(enum) { /// /// The value determines the crash location: /// - /// - "main" - crash on the main (GUI) thread. - /// - "io" - crash on the IO thread for the focused surface. - /// - "render" - crash on the render thread for the focused surface. + /// - `main` + /// + /// Crash on the main (GUI) thread. + /// + /// - `io` + /// + /// Crash on the IO thread for the focused surface. + /// + /// - `render` + /// + /// Crash on the render thread for the focused surface. /// crash: CrashThread, diff --git a/src/input/command.zig b/src/input/command.zig index 53d1b6b3d..1ce6aa7cb 100644 --- a/src/input/command.zig +++ b/src/input/command.zig @@ -119,7 +119,7 @@ fn actionCommands(action: Action.Key) []const Command { .paste_from_clipboard => comptime &.{.{ .action = .paste_from_clipboard, .title = "Paste from Clipboard", - .description = "Paste the contents of the clipboard.", + .description = "Paste the contents of the main clipboard.", }}, .paste_from_selection => comptime &.{.{ From 77479feee6aefd039254b071613416a4cfd448e8 Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Tue, 3 Jun 2025 12:18:13 +0200 Subject: [PATCH 071/371] gtk: make requesting attention configurable --- src/apprt/gtk/Surface.zig | 12 +++++++----- src/config/Config.zig | 34 ++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index e51109015..1e5b1bfe8 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -2454,6 +2454,13 @@ pub fn ringBell(self: *Surface) !void { media_stream.play(); } + if (features.attention) { + // Request user attention + window.winproto.setUrgent(true) catch |err| { + log.err("failed to request user attention={}", .{err}); + }; + } + // Mark tab as needing attention if (self.container.tab()) |tab| tab: { const page = window.notebook.getTabPage(tab) orelse break :tab; @@ -2461,11 +2468,6 @@ pub fn ringBell(self: *Surface) !void { // Need attention if we're not the currently selected tab if (page.getSelected() == 0) page.setNeedsAttention(@intFromBool(true)); } - - // Request user attention - window.winproto.setUrgent(true) catch |err| { - log.err("failed to request user attention={}", .{err}); - }; } /// Handle a stream that is in an error state. diff --git a/src/config/Config.zig b/src/config/Config.zig index 344c118d7..094058c5d 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -1963,7 +1963,7 @@ keybind: Keybinds = .{}, /// /// * `system` /// -/// Instructs the system to notify the user using built-in system functions. +/// Instruct the system to notify the user using built-in system functions. /// This could result in an audiovisual effect, a notification, or something /// else entirely. Changing these effects require altering system settings: /// for instance under the "Sound > Alert Sound" setting in GNOME, @@ -1973,15 +1973,31 @@ keybind: Keybinds = .{}, /// /// Play a custom sound. (GTK only) /// -/// Example: `audio`, `no-audio`, `system`, `no-system`: +/// * `attention` *(enabled by default)* /// -/// On macOS, if the app is unfocused, it will bounce the app icon in the dock -/// once. Additionally, the title of the window with the alerted terminal -/// surface will contain a bell emoji (🔔) until the terminal is focused -/// or a key is pressed. These are not currently configurable since they're -/// considered unobtrusive. +/// Request the user's attention when Ghostty is unfocused, until it has +/// received focus again. On macOS, this will bounce the app icon in the +/// dock once. On Linux, the behavior depends on the desktop environment +/// and/or the window manager/compositor: /// -/// By default, no bell features are enabled. +/// - On KDE, the background of the desktop icon in the task bar would be +/// highlighted; +/// +/// - On GNOME, you may receive a notification that, when clicked, would +/// bring the Ghostty window into focus; +/// +/// - On Sway, the window may be decorated with a distinctly colored border; +/// +/// - On other systems this may have no effect at all. +/// +/// * `title` *(enabled by default)* +/// +/// Prepend a bell emoji (🔔) to the title of the alerted surface until the +/// terminal is re-focused or interacted with (such as on keyboard input). +/// +/// Only implemented on macOS. +/// +/// Example: `audio`, `no-audio`, `system`, `no-system` @"bell-features": BellFeatures = .{}, /// If `audio` is an enabled bell feature, this is a path to an audio file. If @@ -5857,6 +5873,8 @@ pub const AppNotifications = packed struct { pub const BellFeatures = packed struct { system: bool = false, audio: bool = false, + attention: bool = true, + title: bool = true, }; /// See mouse-shift-capture From 170715944185885ea404ed3dc4c12513f9a4678e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 2 Jun 2025 16:56:57 -0700 Subject: [PATCH 072/371] new SplitTree --- macos/Ghostty.xcodeproj/project.pbxproj | 16 + macos/Sources/Features/Splits/SplitTree.swift | 314 ++++++++++++++++++ .../Splits/TerminalSplitTreeView.swift | 62 ++++ .../Terminal/BaseTerminalController.swift | 70 +++- .../Terminal/TerminalController.swift | 3 + .../Features/Terminal/TerminalView.swift | 10 +- .../Features/Terminal/TerminalWindow.swift | 2 + 7 files changed, 468 insertions(+), 9 deletions(-) create mode 100644 macos/Sources/Features/Splits/SplitTree.swift create mode 100644 macos/Sources/Features/Splits/TerminalSplitTreeView.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index a34c4685f..459b2b994 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -59,6 +59,8 @@ A571AB1D2A206FCF00248498 /* GhosttyKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5D495A1299BEC7E00DD1313 /* GhosttyKit.xcframework */; }; A57D79272C9C879B001D522E /* SecureInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = A57D79262C9C8798001D522E /* SecureInput.swift */; }; A586167C2B7703CC009BDB1D /* fish in Resources */ = {isa = PBXBuildFile; fileRef = A586167B2B7703CC009BDB1D /* fish */; }; + A586365F2DEE6C2300E04A10 /* SplitTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586365E2DEE6C2100E04A10 /* SplitTree.swift */; }; + A58636662DEF964100E04A10 /* TerminalSplitTreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */; }; A5874D992DAD751B00E83852 /* CGS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D982DAD751A00E83852 /* CGS.swift */; }; A5874D9D2DAD786100E83852 /* NSWindow+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */; }; A59444F729A2ED5200725BBA /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59444F629A2ED5200725BBA /* SettingsView.swift */; }; @@ -164,6 +166,8 @@ A571AB1C2A206FC600248498 /* Ghostty-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "Ghostty-Info.plist"; sourceTree = ""; }; A57D79262C9C8798001D522E /* SecureInput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureInput.swift; sourceTree = ""; }; A586167B2B7703CC009BDB1D /* fish */ = {isa = PBXFileReference; lastKnownFileType = folder; name = fish; path = "../zig-out/share/fish"; sourceTree = ""; }; + A586365E2DEE6C2100E04A10 /* SplitTree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitTree.swift; sourceTree = ""; }; + A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalSplitTreeView.swift; sourceTree = ""; }; A5874D982DAD751A00E83852 /* CGS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CGS.swift; sourceTree = ""; }; A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSWindow+Extension.swift"; sourceTree = ""; }; A59444F629A2ED5200725BBA /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; @@ -275,6 +279,7 @@ A5CBD05A2CA0C5910017A1AE /* QuickTerminal */, A5E112912AF73E4D00C6E0C2 /* ClipboardConfirmation */, A57D79252C9C8782001D522E /* Secure Input */, + A58636622DEF955100E04A10 /* Splits */, A53A29742DB2E04900B6E02C /* Command Palette */, A534263E2A7DCC5800EBB7A2 /* Settings */, A51BFC1C2B2FB5AB00E92F16 /* About */, @@ -428,6 +433,15 @@ path = "Secure Input"; sourceTree = ""; }; + A58636622DEF955100E04A10 /* Splits */ = { + isa = PBXGroup; + children = ( + A586365E2DEE6C2100E04A10 /* SplitTree.swift */, + A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */, + ); + path = Splits; + sourceTree = ""; + }; A5874D9B2DAD781100E83852 /* Private */ = { isa = PBXGroup; children = ( @@ -685,6 +699,7 @@ A5CBD05E2CA0C5EC0017A1AE /* QuickTerminalController.swift in Sources */, A5CF66D72D29DDB500139794 /* Ghostty.Event.swift in Sources */, A5A2A3CA2D4445E30033CF96 /* Dock.swift in Sources */, + A586365F2DEE6C2300E04A10 /* SplitTree.swift in Sources */, A51BFC222B2FB6B400E92F16 /* AboutView.swift in Sources */, A5278A9B2AA05B2600CD3039 /* Ghostty.Input.swift in Sources */, A53A29812DB44A6100B6E02C /* KeyboardShortcut+Extension.swift in Sources */, @@ -734,6 +749,7 @@ A5CEAFFF29C2410700646FDA /* Backport.swift in Sources */, A5E112952AF73E8A00C6E0C2 /* ClipboardConfirmationController.swift in Sources */, A596309E2AEE1D6C00D64628 /* TerminalView.swift in Sources */, + A58636662DEF964100E04A10 /* TerminalSplitTreeView.swift in Sources */, A52FFF592CAA4FF3000C6A5B /* Fullscreen.swift in Sources */, AEF9CE242B6AD07A0017E195 /* TerminalToolbar.swift in Sources */, C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */, diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift new file mode 100644 index 000000000..6f98dfefc --- /dev/null +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -0,0 +1,314 @@ +import AppKit + +/// SplitTree represents a tree of views that can be divided. +struct SplitTree { + /// The root of the tree. This can be nil to indicate the tree is empty. + let root: Node? + + /// The node that is currently zoomed. A zoomed split is expected to take up the full + /// size of the view area where the splits are shown. + let zoomed: Node? + + /// A single node in the tree is either a leaf node (a view) or a split (has a + /// left/right or top/bottom). + indirect enum Node { + case leaf(view: NSView) + case split(Split) + + struct Split: Equatable { + let direction: Direction + let ratio: Double + let left: Node + let right: Node + } + } + + enum Direction { + case horizontal // Splits are laid out left and right + case vertical // Splits are laid out top and bottom + } + + /// The path to a specific node in the tree. + struct Path { + let path: [Component] + + var isEmpty: Bool { path.isEmpty } + + enum Component { + case left + case right + } + } + + enum SplitError: Error { + case viewNotFound + } + + enum NewDirection { + case left + case right + case down + case up + } +} + +// MARK: SplitTree + +extension SplitTree { + var isEmpty: Bool { + root == nil + } + + init() { + self.init(root: nil, zoomed: nil) + } + + init(view: NSView) { + self.init(root: .leaf(view: view), zoomed: nil) + } + + /// Insert a new view at the given view point by creating a split in the given direction. + func insert(view: NSView, at: NSView, direction: NewDirection) throws -> Self { + guard let root else { throw SplitError.viewNotFound } + return .init( + root: try root.insert(view: view, at: at, direction: direction), + zoomed: zoomed) + } + + /// Remove a node from the tree. If the node being removed is part of a split, + /// the sibling node takes the place of the parent split. + func remove(_ target: Node) -> Self { + guard let root else { return self } + + // If we're removing the root itself, return an empty tree + if root == target { + return .init(root: nil, zoomed: nil) + } + + // Otherwise, try to remove from the tree + let newRoot = root.remove(target) + + // Update zoomed if it was the removed node + let newZoomed = (zoomed == target) ? nil : zoomed + + return .init(root: newRoot, zoomed: newZoomed) + } +} + +// MARK: SplitTree.Node + +extension SplitTree.Node { + typealias Node = SplitTree.Node + typealias NewDirection = SplitTree.NewDirection + typealias SplitError = SplitTree.SplitError + typealias Path = SplitTree.Path + + /// Returns the node in the tree that contains the given view. + func node(view: NSView) -> Node? { + switch (self) { + case .leaf(view): + return self + + case .split(let split): + if let result = split.left.node(view: view) { + return result + } else if let result = split.right.node(view: view) { + return result + } + + return nil + + default: + return nil + } + } + + /// Returns the path to a given node in the tree. If the returned value is nil then the + /// node doesn't exist. + func path(to node: Self) -> Path? { + var components: [Path.Component] = [] + func search(_ current: Self) -> Bool { + if current == node { + return true + } + + switch current { + case .leaf: + return false + + case .split(let split): + // Try left branch + components.append(.left) + if search(split.left) { + return true + } + components.removeLast() + + // Try right branch + components.append(.right) + if search(split.right) { + return true + } + components.removeLast() + + return false + } + } + + return search(self) ? Path(path: components) : nil + } + + /// Inserts a new view into the split tree by creating a split at the location of an existing view. + /// + /// This method creates a new split node containing both the existing view and the new view, + /// The position of the new view relative to the existing view is determined by the direction parameter. + /// + /// - Parameters: + /// - view: The new view to insert into the tree + /// - at: The existing view at whose location the split should be created + /// - direction: The direction relative to the existing view where the new view should be placed + /// + /// - Note: If the existing view (`at`) is not found in the tree, this method does nothing. We should + /// maybe throw instead but at the moment we just do nothing. + func insert(view: NSView, at: NSView, direction: NewDirection) throws -> Self { + // Get the path to our insertion point. If it doesn't exist we do + // nothing. + guard let path = path(to: .leaf(view: at)) else { + throw SplitError.viewNotFound + } + + // Determine split direction and which side the new view goes on + let splitDirection: SplitTree.Direction + let newViewOnLeft: Bool + switch direction { + case .left: + splitDirection = .horizontal + newViewOnLeft = true + case .right: + splitDirection = .horizontal + newViewOnLeft = false + case .up: + splitDirection = .vertical + newViewOnLeft = true + case .down: + splitDirection = .vertical + newViewOnLeft = false + } + + // Create the new split node + let newNode: Node = .leaf(view: view) + let existingNode: Node = .leaf(view: at) + let newSplit: Node = .split(.init( + direction: splitDirection, + ratio: 0.5, + left: newViewOnLeft ? newNode : existingNode, + right: newViewOnLeft ? existingNode : newNode + )) + + // Replace the node at the path with the new split + return try replaceNode(at: path, with: newSplit) + } + + /// Helper function to replace a node at the given path from the root + private func replaceNode(at path: Path, with newNode: Self) throws -> Self { + // If path is empty, replace the root + if path.isEmpty { + return newNode + } + + // Otherwise, we need to replace the proper left/right all along + // the way since Node is a value type (enum). To do that, we need + // recursion. We can't use a simple iterative approach because we + // can't update in-place. + func replaceInner(current: Node, pathOffset: Int) throws -> Node { + // Base case: if we've consumed the entire path, replace this node + if pathOffset >= path.path.count { + return newNode + } + + // We need to go deeper, so current must be a split for the path + // to be valid. Otherwise, the path is invalid. + guard case .split(let split) = current else { + throw SplitError.viewNotFound + } + + let component = path.path[pathOffset] + switch component { + case .left: + return .split(.init( + direction: split.direction, + ratio: split.ratio, + left: try replaceInner(current: split.left, pathOffset: pathOffset + 1), + right: split.right + )) + case .right: + return .split(.init( + direction: split.direction, + ratio: split.ratio, + left: split.left, + right: try replaceInner(current: split.right, pathOffset: pathOffset + 1) + )) + } + } + + return try replaceInner(current: self, pathOffset: 0) + } + + /// Remove a node from the tree. Returns the modified tree, or nil if removing + /// the node results in an empty tree. + func remove(_ target: Node) -> Node? { + // If we're removing ourselves, return nil + if self == target { + return nil + } + + switch self { + case .leaf: + // A leaf that isn't the target stays as is + return self + + case .split(let split): + // Neither child is directly the target, so we need to recursively + // try to remove from both children + let newLeft = split.left.remove(target) + let newRight = split.right.remove(target) + + // If both are nil then we remove everything. This shouldn't ever + // happen because duplicate nodes shouldn't exist, but we want to + // be robust against it. + if newLeft == nil && newRight == nil { + return nil + } else if newLeft == nil { + return newRight + } else if newRight == nil { + return newLeft + } + + // Both children still exist after removal + return .split(.init( + direction: split.direction, + ratio: split.ratio, + left: newLeft!, + right: newRight! + )) + } + } +} + +// MARK: SplitTree.Node Protocols + +extension SplitTree.Node: Equatable { + static func == (lhs: Self, rhs: Self) -> Bool { + switch (lhs, rhs) { + case let (.leaf(leftView), .leaf(rightView)): + // Compare NSView instances by object identity + return leftView === rightView + + case let (.split(split1), .split(split2)): + return split1 == split2 + + default: + return false + } + } +} diff --git a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift new file mode 100644 index 000000000..c55192e44 --- /dev/null +++ b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift @@ -0,0 +1,62 @@ +import SwiftUI + +struct TerminalSplitTreeView: View { + let tree: SplitTree + + var body: some View { + if let node = tree.root { + TerminalSplitSubtreeView(node: node, isRoot: true) + } + } +} + +struct TerminalSplitSubtreeView: View { + let node: SplitTree.Node + var isRoot: Bool = false + + var body: some View { + switch (node) { + case .leaf(let leafView): + // TODO: Fix the as! + Ghostty.InspectableSurface( + surfaceView: leafView as! Ghostty.SurfaceView, + isSplit: !isRoot) + + case .split(let split): + TerminalSplitSplitView(split: split) + } + } +} + +struct TerminalSplitSplitView: View { + @EnvironmentObject var ghostty: Ghostty.App + + let split: SplitTree.Node.Split + + private var splitViewDirection: SplitViewDirection { + switch (split.direction) { + case .horizontal: .horizontal + case .vertical: .vertical + } + } + + var body: some View { + SplitView( + splitViewDirection, + .init(get: { + CGFloat(split.ratio) + }, set: { _ in + // TODO + }), + dividerColor: ghostty.config.splitDividerColor, + resizeIncrements: .init(width: 1, height: 1), + resizePublisher: .init(), + left: { + TerminalSplitSubtreeView(node: split.left) + }, + right: { + TerminalSplitSubtreeView(node: split.right) + } + ) + } +} diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index fd5ca9ffb..628c0acbf 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -46,6 +46,8 @@ class BaseTerminalController: NSWindowController, didSet { surfaceTreeDidChange(from: oldValue, to: surfaceTree) } } + @Published var surfaceTree2: SplitTree = .init() + /// This can be set to show/hide the command palette. @Published var commandPaletteIsShowing: Bool = false @@ -97,6 +99,9 @@ class BaseTerminalController: NSWindowController, guard let ghostty_app = ghostty.app else { preconditionFailure("app must be loaded") } self.surfaceTree = tree ?? .leaf(.init(ghostty_app, baseConfig: base)) + let firstView = Ghostty.SurfaceView(ghostty_app, baseConfig: base) + self.surfaceTree2 = .init(view: firstView) + // Setup our notifications for behaviors let center = NotificationCenter.default center.addObserver( @@ -124,6 +129,18 @@ class BaseTerminalController: NSWindowController, selector: #selector(ghosttyMaximizeDidToggle(_:)), name: .ghosttyMaximizeDidToggle, object: nil) + + // Splits + center.addObserver( + self, + selector: #selector(ghosttyDidCloseSurface(_:)), + name: Ghostty.Notification.ghosttyCloseSurface, + object: nil) + center.addObserver( + self, + selector: #selector(ghosttyDidNewSplit(_:)), + name: Ghostty.Notification.ghosttyNewSplit, + object: nil) center.addObserver( self, selector: #selector(ghosttyDidEqualizeSplits(_:)), @@ -252,7 +269,58 @@ class BaseTerminalController: NSWindowController, guard surfaceTree?.contains(view: surfaceView) ?? false else { return } window.zoom(nil) } - + + @objc private func ghosttyDidCloseSurface(_ notification: Notification) { + // The target must be within our tree + guard let oldView = notification.object as? Ghostty.SurfaceView else { return } + guard let node = surfaceTree2.root?.node(view: oldView) else { return } + + // Remove it + surfaceTree2 = surfaceTree2.remove(node) + + // TODO: fix focus + } + + @objc private func ghosttyDidNewSplit(_ notification: Notification) { + // The target must be within our tree + guard let oldView = notification.object as? Ghostty.SurfaceView else { return } + guard surfaceTree2.root?.node(view: oldView) != nil else { return } + + // Notification must contain our base config + let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey] + let config = configAny as? Ghostty.SurfaceConfiguration + + // Determine our desired direction + guard let directionAny = notification.userInfo?["direction"] else { return } + guard let direction = directionAny as? ghostty_action_split_direction_e else { return } + let splitDirection: SplitTree.NewDirection + switch (direction) { + case GHOSTTY_SPLIT_DIRECTION_RIGHT: splitDirection = .right + case GHOSTTY_SPLIT_DIRECTION_LEFT: splitDirection = .left + case GHOSTTY_SPLIT_DIRECTION_DOWN: splitDirection = .down + case GHOSTTY_SPLIT_DIRECTION_UP: splitDirection = .up + default: return + } + + // Create a new surface view + guard let ghostty_app = ghostty.app else { return } + let newView = Ghostty.SurfaceView(ghostty_app, baseConfig: config) + + // Do the split + do { + surfaceTree2 = try surfaceTree2.insert(view: newView, at: oldView, direction: splitDirection) + } catch { + // If splitting fails for any reason (it should not), then we just log + // and return. The new view we created will be deinitialized and its + // no big deal. + // TODO: log + return + } + + // Once we've split, we need to move focus to the new split + Ghostty.moveFocus(to: newView, from: oldView) + } + @objc private func ghosttyDidEqualizeSplits(_ notification: Notification) { guard let target = notification.object as? Ghostty.SurfaceView else { return } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index f2868adb0..d8f42bb1a 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -228,6 +228,9 @@ class TerminalController: BaseTerminalController { // Update our window light/darkness based on our updated background color window.isLightTheme = OSColor(surfaceConfig.backgroundColor).isLightColor + // Sync our zoom state for splits + window.surfaceIsZoomed = surfaceTree2.zoomed != nil + // If our window is not visible, then we do nothing. Some things such as blurring // have no effect if the window is not visible. Ultimately, we'll have this called // at some point when a surface becomes focused. diff --git a/macos/Sources/Features/Terminal/TerminalView.swift b/macos/Sources/Features/Terminal/TerminalView.swift index 7caceb071..d2f4d8bdb 100644 --- a/macos/Sources/Features/Terminal/TerminalView.swift +++ b/macos/Sources/Features/Terminal/TerminalView.swift @@ -31,7 +31,7 @@ protocol TerminalViewDelegate: AnyObject { protocol TerminalViewModel: ObservableObject { /// The tree of terminal surfaces (splits) within the view. This is mutated by TerminalView /// and children. This should be @Published. - var surfaceTree: Ghostty.SplitNode? { get set } + var surfaceTree2: SplitTree { get set } /// The command palette state. var commandPaletteIsShowing: Bool { get set } @@ -81,7 +81,7 @@ struct TerminalView: View { DebugBuildWarningView() } - Ghostty.TerminalSplit(node: $viewModel.surfaceTree) + TerminalSplitTreeView(tree: viewModel.surfaceTree2) .environmentObject(ghostty) .focused($focused) .onAppear { self.focused = true } @@ -100,12 +100,6 @@ struct TerminalView: View { guard let size = newValue else { return } self.delegate?.cellSizeDidChange(to: size) } - .onChange(of: viewModel.surfaceTree?.hashValue) { _ in - // This is funky, but its the best way I could think of to detect - // ANY CHANGE within the deeply nested surface tree -- detecting a change - // in the hash value. - self.delegate?.surfaceTreeDidChange() - } .onChange(of: zoomedSplit) { newValue in self.delegate?.zoomStateDidChange(to: newValue ?? false) } diff --git a/macos/Sources/Features/Terminal/TerminalWindow.swift b/macos/Sources/Features/Terminal/TerminalWindow.swift index 9a2bdc60f..f244b95ee 100644 --- a/macos/Sources/Features/Terminal/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/TerminalWindow.swift @@ -30,6 +30,7 @@ class TerminalWindow: NSWindow { observe(\.surfaceIsZoomed, options: [.initial, .new]) { [weak self] window, _ in guard let tabGroup = self?.tabGroup else { return } + Ghostty.logger.warning("WOW \(window.surfaceIsZoomed)") self?.resetZoomTabButton.isHidden = !window.surfaceIsZoomed self?.updateResetZoomTitlebarButtonVisibility() }, @@ -375,6 +376,7 @@ class TerminalWindow: NSWindow { if !titlebarAccessoryViewControllers.contains(resetZoomTitlebarAccessoryViewController) { addTitlebarAccessoryViewController(resetZoomTitlebarAccessoryViewController) } + resetZoomTitlebarAccessoryViewController.view.isHidden = tabGroup.isTabBarVisible ? true : !surfaceIsZoomed } From e3bc3422dce86b58834e83e181b6640451eee4c3 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 3 Jun 2025 15:36:40 -0700 Subject: [PATCH 073/371] macos: handle split resizing --- macos/Sources/Features/Splits/SplitTree.swift | 40 +++++++++++- .../Splits/TerminalSplitTreeView.swift | 62 ++++++++----------- .../Terminal/BaseTerminalController.swift | 15 +++-- .../Terminal/TerminalController.swift | 10 ++- .../Features/Terminal/TerminalView.swift | 11 ++-- .../Features/Terminal/TerminalWindow.swift | 1 - 6 files changed, 86 insertions(+), 53 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index 6f98dfefc..6829a742e 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -93,6 +93,24 @@ extension SplitTree { return .init(root: newRoot, zoomed: newZoomed) } + + /// Replace a node in the tree with a new node. + func replace(node: Node, with newNode: Node) throws -> Self { + guard let root else { throw SplitError.viewNotFound } + + // Get the path to the node we want to replace + guard let path = root.path(to: node) else { + throw SplitError.viewNotFound + } + + // Replace the node + let newRoot = try root.replaceNode(at: path, with: newNode) + + // Update zoomed if it was the replaced node + let newZoomed = (zoomed == node) ? newNode : zoomed + + return .init(root: newRoot, zoomed: newZoomed) + } } // MARK: SplitTree.Node @@ -210,7 +228,7 @@ extension SplitTree.Node { } /// Helper function to replace a node at the given path from the root - private func replaceNode(at path: Path, with newNode: Self) throws -> Self { + func replaceNode(at path: Path, with newNode: Self) throws -> Self { // If path is empty, replace the root if path.isEmpty { return newNode @@ -293,6 +311,26 @@ extension SplitTree.Node { )) } } + + /// Resize a split node to the specified ratio. + /// For leaf nodes, this returns the node unchanged. + /// For split nodes, this creates a new split with the updated ratio. + func resize(to ratio: Double) -> Self { + switch self { + case .leaf: + // Leaf nodes don't have a ratio to resize + return self + + case .split(let split): + // Create a new split with the updated ratio + return .split(.init( + direction: split.direction, + ratio: ratio, + left: split.left, + right: split.right + )) + } + } } // MARK: SplitTree.Node Protocols diff --git a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift index c55192e44..8f78dcbf8 100644 --- a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift +++ b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift @@ -2,17 +2,21 @@ import SwiftUI struct TerminalSplitTreeView: View { let tree: SplitTree + let onResize: (SplitTree.Node, Double) -> Void var body: some View { if let node = tree.root { - TerminalSplitSubtreeView(node: node, isRoot: true) + TerminalSplitSubtreeView(node: node, isRoot: true, onResize: onResize) } } } struct TerminalSplitSubtreeView: View { + @EnvironmentObject var ghostty: Ghostty.App + let node: SplitTree.Node var isRoot: Bool = false + let onResize: (SplitTree.Node, Double) -> Void var body: some View { switch (node) { @@ -23,40 +27,28 @@ struct TerminalSplitSubtreeView: View { isSplit: !isRoot) case .split(let split): - TerminalSplitSplitView(split: split) - } - } -} - -struct TerminalSplitSplitView: View { - @EnvironmentObject var ghostty: Ghostty.App - - let split: SplitTree.Node.Split - - private var splitViewDirection: SplitViewDirection { - switch (split.direction) { - case .horizontal: .horizontal - case .vertical: .vertical - } - } - - var body: some View { - SplitView( - splitViewDirection, - .init(get: { - CGFloat(split.ratio) - }, set: { _ in - // TODO - }), - dividerColor: ghostty.config.splitDividerColor, - resizeIncrements: .init(width: 1, height: 1), - resizePublisher: .init(), - left: { - TerminalSplitSubtreeView(node: split.left) - }, - right: { - TerminalSplitSubtreeView(node: split.right) + let splitViewDirection: SplitViewDirection = switch (split.direction) { + case .horizontal: .horizontal + case .vertical: .vertical } - ) + + SplitView( + splitViewDirection, + .init(get: { + CGFloat(split.ratio) + }, set: { + onResize(node, $0) + }), + dividerColor: ghostty.config.splitDividerColor, + resizeIncrements: .init(width: 1, height: 1), + resizePublisher: .init(), + left: { + TerminalSplitSubtreeView(node: split.left, onResize: onResize) + }, + right: { + TerminalSplitSubtreeView(node: split.right, onResize: onResize) + } + ) + } } } diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 628c0acbf..cb5a15f1b 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -366,11 +366,6 @@ class BaseTerminalController: NSWindowController, // MARK: TerminalViewDelegate - // Note: this is different from surfaceDidTreeChange(from:,to:) because this is called - // when the currently set value changed in place and the from:to: variant is called - // when the variable was set. - func surfaceTreeDidChange() {} - func focusedSurfaceDidChange(to: Ghostty.SurfaceView?) { let lastFocusedSurface = focusedSurface focusedSurface = to @@ -420,6 +415,16 @@ class BaseTerminalController: NSWindowController, func zoomStateDidChange(to: Bool) {} + func splitDidResize(node: SplitTree.Node, to newRatio: Double) { + let resizedNode = node.resize(to: newRatio) + do { + surfaceTree2 = try surfaceTree2.replace(node: node, with: resizedNode) + } catch { + // TODO: log + return + } + } + func performAction(_ action: String, on surfaceView: Ghostty.SurfaceView) { guard let surface = surfaceView.surface else { return } let len = action.utf8CString.count diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index d8f42bb1a..82491e76d 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -107,6 +107,10 @@ class TerminalController: BaseTerminalController { override func surfaceTreeDidChange(from: Ghostty.SplitNode?, to: Ghostty.SplitNode?) { super.surfaceTreeDidChange(from: from, to: to) + + // Whenever our surface tree changes in any way (new split, close split, etc.) + // we want to invalidate our state. + invalidateRestorableState() // If our surface tree is now nil then we close our window. if (to == nil) { @@ -696,12 +700,6 @@ class TerminalController: BaseTerminalController { } } - override func surfaceTreeDidChange() { - // Whenever our surface tree changes in any way (new split, close split, etc.) - // we want to invalidate our state. - invalidateRestorableState() - } - override func zoomStateDidChange(to: Bool) { guard let window = window as? TerminalWindow else { return } window.surfaceIsZoomed = to diff --git a/macos/Sources/Features/Terminal/TerminalView.swift b/macos/Sources/Features/Terminal/TerminalView.swift index d2f4d8bdb..2970f19c6 100644 --- a/macos/Sources/Features/Terminal/TerminalView.swift +++ b/macos/Sources/Features/Terminal/TerminalView.swift @@ -14,15 +14,14 @@ protocol TerminalViewDelegate: AnyObject { /// The cell size changed. func cellSizeDidChange(to: NSSize) - /// The surface tree did change in some way, i.e. a split was added, removed, etc. This is - /// not called initially. - func surfaceTreeDidChange() - /// This is called when a split is zoomed. func zoomStateDidChange(to: Bool) /// Perform an action. At the time of writing this is only triggered by the command palette. func performAction(_ action: String, on: Ghostty.SurfaceView) + + /// A split is resizing to a given value. + func splitDidResize(node: SplitTree.Node, to newRatio: Double) } /// The view model is a required implementation for TerminalView callers. This contains @@ -81,7 +80,9 @@ struct TerminalView: View { DebugBuildWarningView() } - TerminalSplitTreeView(tree: viewModel.surfaceTree2) + TerminalSplitTreeView( + tree: viewModel.surfaceTree2, + onResize: { delegate?.splitDidResize(node: $0, to: $1) }) .environmentObject(ghostty) .focused($focused) .onAppear { self.focused = true } diff --git a/macos/Sources/Features/Terminal/TerminalWindow.swift b/macos/Sources/Features/Terminal/TerminalWindow.swift index f244b95ee..1c440be33 100644 --- a/macos/Sources/Features/Terminal/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/TerminalWindow.swift @@ -30,7 +30,6 @@ class TerminalWindow: NSWindow { observe(\.surfaceIsZoomed, options: [.initial, .new]) { [weak self] window, _ in guard let tabGroup = self?.tabGroup else { return } - Ghostty.logger.warning("WOW \(window.surfaceIsZoomed)") self?.resetZoomTabButton.isHidden = !window.surfaceIsZoomed self?.updateResetZoomTitlebarButtonVisibility() }, From 672d276276931400cc3d1ba46476c66de8ff33ce Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 3 Jun 2025 15:52:50 -0700 Subject: [PATCH 074/371] macos: confirm close on split close --- .../Terminal/BaseTerminalController.swift | 52 +++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index cb5a15f1b..b30cc7afb 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -272,13 +272,55 @@ class BaseTerminalController: NSWindowController, @objc private func ghosttyDidCloseSurface(_ notification: Notification) { // The target must be within our tree - guard let oldView = notification.object as? Ghostty.SurfaceView else { return } - guard let node = surfaceTree2.root?.node(view: oldView) else { return } - - // Remove it - surfaceTree2 = surfaceTree2.remove(node) + guard let target = notification.object as? Ghostty.SurfaceView else { return } + guard let node = surfaceTree2.root?.node(view: target) else { return } // TODO: fix focus + + var processAlive = false + if let valueAny = notification.userInfo?["process_alive"] { + if let value = valueAny as? Bool { + processAlive = value + } + } + + // If the child process is not alive, then we exit immediately + guard processAlive else { + surfaceTree2 = surfaceTree2.remove(node) + return + } + + // If we don't have a window to attach our modal to, we also exit immediately. + // This should NOT happen. + guard let window = target.window else { + surfaceTree2 = surfaceTree2.remove(node) + return + } + + // Confirm close. We use an NSAlert instead of a SwiftUI confirmationDialog + // due to SwiftUI bugs (see Ghostty #560). To repeat from #560, the bug is that + // confirmationDialog allows the user to Cmd-W close the alert, but when doing + // so SwiftUI does not update any of the bindings to note that window is no longer + // being shown, and provides no callback to detect this. + let alert = NSAlert() + alert.messageText = "Close Terminal?" + alert.informativeText = "The terminal still has a running process. If you close the " + + "terminal the process will be killed." + alert.addButton(withTitle: "Close the Terminal") + alert.addButton(withTitle: "Cancel") + alert.alertStyle = .warning + alert.beginSheetModal(for: window, completionHandler: { [weak self] response in + switch (response) { + case .alertFirstButtonReturn: + alert.window.orderOut(nil) + if let self { + self.surfaceTree2 = self.surfaceTree2.remove(node) + } + + default: + break + } + }) } @objc private func ghosttyDidNewSplit(_ notification: Notification) { From 33d94521ea77efb42b39ae8037a23b8dcfec0952 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 3 Jun 2025 15:57:01 -0700 Subject: [PATCH 075/371] macos: setup sequence for SplitTree --- macos/Sources/Features/Splits/SplitTree.swift | 27 ++++++++++ .../Terminal/BaseTerminalController.swift | 52 +++++++++---------- macos/Sources/Ghostty/Ghostty.SplitNode.swift | 2 +- 3 files changed, 53 insertions(+), 28 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index 6829a742e..c3b9afa28 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -350,3 +350,30 @@ extension SplitTree.Node: Equatable { } } } + +// MARK: SplitTree Sequences + +extension SplitTree.Node { + /// Returns all leaf views in this subtree + func leaves() -> [NSView] { + switch self { + case .leaf(let view): + return [view] + + case .split(let split): + return split.left.leaves() + split.right.leaves() + } + } +} + +extension SplitTree: Sequence { + func makeIterator() -> [NSView].Iterator { + return root?.leaves().makeIterator() ?? [].makeIterator() + } +} + +extension SplitTree.Node: Sequence { + func makeIterator() -> [NSView].Iterator { + return leaves().makeIterator() + } +} diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index b30cc7afb..a93896732 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -175,16 +175,16 @@ class BaseTerminalController: NSWindowController, /// Update all surfaces with the focus state. This ensures that libghostty has an accurate view about /// what surface is focused. This must be called whenever a surface OR window changes focus. func syncFocusToSurfaceTree() { - guard let tree = self.surfaceTree else { return } - - for leaf in tree { - // Our focus state requires that this window is key and our currently - // focused surface is the surface in this leaf. - let focused: Bool = (window?.isKeyWindow ?? false) && - !commandPaletteIsShowing && - focusedSurface != nil && - leaf.surface == focusedSurface! - leaf.surface.focusDidChange(focused) + for view in surfaceTree2 { + if let surfaceView = view as? Ghostty.SurfaceView { + // Our focus state requires that this window is key and our currently + // focused surface is the surface in this view. + let focused: Bool = (window?.isKeyWindow ?? false) && + !commandPaletteIsShowing && + focusedSurface != nil && + surfaceView == focusedSurface! + surfaceView.focusDidChange(focused) + } } } @@ -387,20 +387,18 @@ class BaseTerminalController: NSWindowController, } private func localEventFlagsChanged(_ event: NSEvent) -> NSEvent? { - // Go through all our surfaces and notify it that the flags changed. - if let surfaceTree { - var surfaces: [Ghostty.SurfaceView] = surfaceTree.map { $0.surface } - - // If we're the main window receiving key input, then we want to avoid - // calling this on our focused surface because that'll trigger a double - // flagsChanged call. - if NSApp.mainWindow == window { - surfaces = surfaces.filter { $0 != focusedSurface } - } - - for surface in surfaces { - surface.flagsChanged(with: event) - } + // Also update surfaceTree2 + var surfaces2: [Ghostty.SurfaceView] = surfaceTree2.compactMap { $0 as? Ghostty.SurfaceView } + + // If we're the main window receiving key input, then we want to avoid + // calling this on our focused surface because that'll trigger a double + // flagsChanged call. + if NSApp.mainWindow == window { + surfaces2 = surfaces2.filter { $0 != focusedSurface } + } + + for surface in surfaces2 { + surface.flagsChanged(with: event) } return event @@ -675,10 +673,10 @@ class BaseTerminalController: NSWindowController, } func windowDidChangeOcclusionState(_ notification: Notification) { - guard let surfaceTree = self.surfaceTree else { return } let visible = self.window?.occlusionState.contains(.visible) ?? false - for leaf in surfaceTree { - if let surface = leaf.surface.surface { + for view in surfaceTree2 { + if let surfaceView = view as? Ghostty.SurfaceView, + let surface = surfaceView.surface { ghostty_surface_set_occlusion(surface, visible) } } diff --git a/macos/Sources/Ghostty/Ghostty.SplitNode.swift b/macos/Sources/Ghostty/Ghostty.SplitNode.swift index 97b20acd3..ff60e7c56 100644 --- a/macos/Sources/Ghostty/Ghostty.SplitNode.swift +++ b/macos/Sources/Ghostty/Ghostty.SplitNode.swift @@ -11,7 +11,7 @@ extension Ghostty { /// "container" which has a recursive top/left SplitNode and bottom/right SplitNode. These /// values can further be split infinitely. /// - enum SplitNode: Equatable, Hashable, Codable, Sequence { + enum SplitNode: Equatable, Hashable, Codable { case leaf(Leaf) case split(Container) From d1dce1e37213282981738dd9f127a9c78d11c687 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 3 Jun 2025 16:05:23 -0700 Subject: [PATCH 076/371] macos: restoration for new split tree --- macos/Sources/Features/Splits/SplitTree.swift | 64 +++++++++++++++---- .../Splits/TerminalSplitTreeView.swift | 11 ++-- .../Terminal/BaseTerminalController.swift | 42 ++++++------ .../Terminal/TerminalController.swift | 5 +- .../Features/Terminal/TerminalManager.swift | 5 +- .../Terminal/TerminalRestorable.swift | 34 ++++++++-- .../Features/Terminal/TerminalView.swift | 4 +- .../Sources/Ghostty/SurfaceView_AppKit.swift | 31 ++++++++- 8 files changed, 142 insertions(+), 54 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index c3b9afa28..a66d4abe7 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -1,7 +1,7 @@ import AppKit /// SplitTree represents a tree of views that can be divided. -struct SplitTree { +struct SplitTree: Codable { /// The root of the tree. This can be nil to indicate the tree is empty. let root: Node? @@ -11,11 +11,11 @@ struct SplitTree { /// A single node in the tree is either a leaf node (a view) or a split (has a /// left/right or top/bottom). - indirect enum Node { - case leaf(view: NSView) + indirect enum Node: Codable { + case leaf(view: ViewType) case split(Split) - struct Split: Equatable { + struct Split: Equatable, Codable { let direction: Direction let ratio: Double let left: Node @@ -23,7 +23,7 @@ struct SplitTree { } } - enum Direction { + enum Direction: Codable { case horizontal // Splits are laid out left and right case vertical // Splits are laid out top and bottom } @@ -63,12 +63,12 @@ extension SplitTree { self.init(root: nil, zoomed: nil) } - init(view: NSView) { + init(view: ViewType) { self.init(root: .leaf(view: view), zoomed: nil) } /// Insert a new view at the given view point by creating a split in the given direction. - func insert(view: NSView, at: NSView, direction: NewDirection) throws -> Self { + func insert(view: ViewType, at: ViewType, direction: NewDirection) throws -> Self { guard let root else { throw SplitError.viewNotFound } return .init( root: try root.insert(view: view, at: at, direction: direction), @@ -122,7 +122,7 @@ extension SplitTree.Node { typealias Path = SplitTree.Path /// Returns the node in the tree that contains the given view. - func node(view: NSView) -> Node? { + func node(view: ViewType) -> Node? { switch (self) { case .leaf(view): return self @@ -188,7 +188,7 @@ extension SplitTree.Node { /// /// - Note: If the existing view (`at`) is not found in the tree, this method does nothing. We should /// maybe throw instead but at the moment we just do nothing. - func insert(view: NSView, at: NSView, direction: NewDirection) throws -> Self { + func insert(view: ViewType, at: ViewType, direction: NewDirection) throws -> Self { // Get the path to our insertion point. If it doesn't exist we do // nothing. guard let path = path(to: .leaf(view: at)) else { @@ -351,11 +351,51 @@ extension SplitTree.Node: Equatable { } } +// MARK: SplitTree Codable + +extension SplitTree.Node { + enum CodingKeys: String, CodingKey { + case view + case split + } + + init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + + if container.contains(.view) { + let view = try container.decode(ViewType.self, forKey: .view) + self = .leaf(view: view) + } else if container.contains(.split) { + let split = try container.decode(Split.self, forKey: .split) + self = .split(split) + } else { + throw DecodingError.dataCorrupted( + DecodingError.Context( + codingPath: decoder.codingPath, + debugDescription: "No valid node type found" + ) + ) + } + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + + switch self { + case .leaf(let view): + try container.encode(view, forKey: .view) + + case .split(let split): + try container.encode(split, forKey: .split) + } + } +} + // MARK: SplitTree Sequences extension SplitTree.Node { /// Returns all leaf views in this subtree - func leaves() -> [NSView] { + func leaves() -> [ViewType] { switch self { case .leaf(let view): return [view] @@ -367,13 +407,13 @@ extension SplitTree.Node { } extension SplitTree: Sequence { - func makeIterator() -> [NSView].Iterator { + func makeIterator() -> [ViewType].Iterator { return root?.leaves().makeIterator() ?? [].makeIterator() } } extension SplitTree.Node: Sequence { - func makeIterator() -> [NSView].Iterator { + func makeIterator() -> [ViewType].Iterator { return leaves().makeIterator() } } diff --git a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift index 8f78dcbf8..3969b2e74 100644 --- a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift +++ b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift @@ -1,8 +1,8 @@ import SwiftUI struct TerminalSplitTreeView: View { - let tree: SplitTree - let onResize: (SplitTree.Node, Double) -> Void + let tree: SplitTree + let onResize: (SplitTree.Node, Double) -> Void var body: some View { if let node = tree.root { @@ -14,16 +14,15 @@ struct TerminalSplitTreeView: View { struct TerminalSplitSubtreeView: View { @EnvironmentObject var ghostty: Ghostty.App - let node: SplitTree.Node + let node: SplitTree.Node var isRoot: Bool = false - let onResize: (SplitTree.Node, Double) -> Void + let onResize: (SplitTree.Node, Double) -> Void var body: some View { switch (node) { case .leaf(let leafView): - // TODO: Fix the as! Ghostty.InspectableSurface( - surfaceView: leafView as! Ghostty.SurfaceView, + surfaceView: leafView, isSplit: !isRoot) case .split(let split): diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index a93896732..b3409c437 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -46,7 +46,7 @@ class BaseTerminalController: NSWindowController, didSet { surfaceTreeDidChange(from: oldValue, to: surfaceTree) } } - @Published var surfaceTree2: SplitTree = .init() + @Published var surfaceTree2: SplitTree = .init() /// This can be set to show/hide the command palette. @Published var commandPaletteIsShowing: Bool = false @@ -88,7 +88,8 @@ class BaseTerminalController: NSWindowController, init(_ ghostty: Ghostty.App, baseConfig base: Ghostty.SurfaceConfiguration? = nil, - surfaceTree tree: Ghostty.SplitNode? = nil + surfaceTree tree: Ghostty.SplitNode? = nil, + surfaceTree2 tree2: SplitTree? = nil ) { self.ghostty = ghostty self.derivedConfig = DerivedConfig(ghostty.config) @@ -98,9 +99,7 @@ class BaseTerminalController: NSWindowController, // Initialize our initial surface. guard let ghostty_app = ghostty.app else { preconditionFailure("app must be loaded") } self.surfaceTree = tree ?? .leaf(.init(ghostty_app, baseConfig: base)) - - let firstView = Ghostty.SurfaceView(ghostty_app, baseConfig: base) - self.surfaceTree2 = .init(view: firstView) + self.surfaceTree2 = tree2 ?? .init(view: Ghostty.SurfaceView(ghostty_app, baseConfig: base)) // Setup our notifications for behaviors let center = NotificationCenter.default @@ -175,16 +174,14 @@ class BaseTerminalController: NSWindowController, /// Update all surfaces with the focus state. This ensures that libghostty has an accurate view about /// what surface is focused. This must be called whenever a surface OR window changes focus. func syncFocusToSurfaceTree() { - for view in surfaceTree2 { - if let surfaceView = view as? Ghostty.SurfaceView { - // Our focus state requires that this window is key and our currently - // focused surface is the surface in this view. - let focused: Bool = (window?.isKeyWindow ?? false) && - !commandPaletteIsShowing && - focusedSurface != nil && - surfaceView == focusedSurface! - surfaceView.focusDidChange(focused) - } + for surfaceView in surfaceTree2 { + // Our focus state requires that this window is key and our currently + // focused surface is the surface in this view. + let focused: Bool = (window?.isKeyWindow ?? false) && + !commandPaletteIsShowing && + focusedSurface != nil && + surfaceView == focusedSurface! + surfaceView.focusDidChange(focused) } } @@ -335,7 +332,7 @@ class BaseTerminalController: NSWindowController, // Determine our desired direction guard let directionAny = notification.userInfo?["direction"] else { return } guard let direction = directionAny as? ghostty_action_split_direction_e else { return } - let splitDirection: SplitTree.NewDirection + let splitDirection: SplitTree.NewDirection switch (direction) { case GHOSTTY_SPLIT_DIRECTION_RIGHT: splitDirection = .right case GHOSTTY_SPLIT_DIRECTION_LEFT: splitDirection = .left @@ -388,16 +385,16 @@ class BaseTerminalController: NSWindowController, private func localEventFlagsChanged(_ event: NSEvent) -> NSEvent? { // Also update surfaceTree2 - var surfaces2: [Ghostty.SurfaceView] = surfaceTree2.compactMap { $0 as? Ghostty.SurfaceView } - + var surfaces: [Ghostty.SurfaceView] = surfaceTree2.map { $0 } + // If we're the main window receiving key input, then we want to avoid // calling this on our focused surface because that'll trigger a double // flagsChanged call. if NSApp.mainWindow == window { - surfaces2 = surfaces2.filter { $0 != focusedSurface } + surfaces = surfaces.filter { $0 != focusedSurface } } - for surface in surfaces2 { + for surface in surfaces { surface.flagsChanged(with: event) } @@ -455,7 +452,7 @@ class BaseTerminalController: NSWindowController, func zoomStateDidChange(to: Bool) {} - func splitDidResize(node: SplitTree.Node, to newRatio: Double) { + func splitDidResize(node: SplitTree.Node, to newRatio: Double) { let resizedNode = node.resize(to: newRatio) do { surfaceTree2 = try surfaceTree2.replace(node: node, with: resizedNode) @@ -675,8 +672,7 @@ class BaseTerminalController: NSWindowController, func windowDidChangeOcclusionState(_ notification: Notification) { let visible = self.window?.occlusionState.contains(.visible) ?? false for view in surfaceTree2 { - if let surfaceView = view as? Ghostty.SurfaceView, - let surface = surfaceView.surface { + if let surface = view.surface { ghostty_surface_set_occlusion(surface, visible) } } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 82491e76d..5c2f58dab 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -32,7 +32,8 @@ class TerminalController: BaseTerminalController { init(_ ghostty: Ghostty.App, withBaseConfig base: Ghostty.SurfaceConfiguration? = nil, - withSurfaceTree tree: Ghostty.SplitNode? = nil + withSurfaceTree tree: Ghostty.SplitNode? = nil, + withSurfaceTree2 tree2: SplitTree? = nil ) { // The window we manage is not restorable if we've specified a command // to execute. We do this because the restored window is meaningless at the @@ -44,7 +45,7 @@ class TerminalController: BaseTerminalController { // Setup our initial derived config based on the current app config self.derivedConfig = DerivedConfig(ghostty.config) - super.init(ghostty, baseConfig: base, surfaceTree: tree) + super.init(ghostty, baseConfig: base, surfaceTree: tree, surfaceTree2: tree2) // Setup our notifications for behaviors let center = NotificationCenter.default diff --git a/macos/Sources/Features/Terminal/TerminalManager.swift b/macos/Sources/Features/Terminal/TerminalManager.swift index 07735cb58..2968f8abd 100644 --- a/macos/Sources/Features/Terminal/TerminalManager.swift +++ b/macos/Sources/Features/Terminal/TerminalManager.swift @@ -197,9 +197,10 @@ class TerminalManager { /// Creates a window controller, adds it to our managed list, and returns it. func createWindow(withBaseConfig base: Ghostty.SurfaceConfiguration? = nil, - withSurfaceTree tree: Ghostty.SplitNode? = nil) -> TerminalController { + withSurfaceTree tree: Ghostty.SplitNode? = nil, + withSurfaceTree2 tree2: SplitTree? = nil) -> TerminalController { // Initialize our controller to load the window - let c = TerminalController(ghostty, withBaseConfig: base, withSurfaceTree: tree) + let c = TerminalController(ghostty, withBaseConfig: base, withSurfaceTree: tree, withSurfaceTree2: tree2) // Create a listener for when the window is closed so we can remove it. let pubClose = NotificationCenter.default.publisher( diff --git a/macos/Sources/Features/Terminal/TerminalRestorable.swift b/macos/Sources/Features/Terminal/TerminalRestorable.swift index b9d9b0ac0..5531494a5 100644 --- a/macos/Sources/Features/Terminal/TerminalRestorable.swift +++ b/macos/Sources/Features/Terminal/TerminalRestorable.swift @@ -4,14 +4,16 @@ import Cocoa class TerminalRestorableState: Codable { static let selfKey = "state" static let versionKey = "version" - static let version: Int = 2 + static let version: Int = 3 let focusedSurface: String? let surfaceTree: Ghostty.SplitNode? + let surfaceTree2: SplitTree? init(from controller: TerminalController) { self.focusedSurface = controller.focusedSurface?.uuid.uuidString self.surfaceTree = controller.surfaceTree + self.surfaceTree2 = controller.surfaceTree2 } init?(coder aDecoder: NSCoder) { @@ -27,6 +29,7 @@ class TerminalRestorableState: Codable { } self.surfaceTree = v.value.surfaceTree + self.surfaceTree2 = v.value.surfaceTree2 self.focusedSurface = v.value.focusedSurface } @@ -83,18 +86,37 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration { // can be found for events from libghostty. This uses the low-level // createWindow so that AppKit can place the window wherever it should // be. - let c = appDelegate.terminalManager.createWindow(withSurfaceTree: state.surfaceTree) + let c = appDelegate.terminalManager.createWindow( + withSurfaceTree: state.surfaceTree, + withSurfaceTree2: state.surfaceTree2 + ) guard let window = c.window else { completionHandler(nil, TerminalRestoreError.windowDidNotLoad) return } // Setup our restored state on the controller + // First try to find the focused surface in surfaceTree2 if let focusedStr = state.focusedSurface, - let focusedUUID = UUID(uuidString: focusedStr), - let view = c.surfaceTree?.findUUID(uuid: focusedUUID) { - c.focusedSurface = view - restoreFocus(to: view, inWindow: window) + let focusedUUID = UUID(uuidString: focusedStr) { + // Try surfaceTree2 first + var foundView: Ghostty.SurfaceView? + for view in c.surfaceTree2 { + if view.uuid.uuidString == focusedStr { + foundView = view + break + } + } + + // Fall back to surfaceTree if not found + if foundView == nil { + foundView = c.surfaceTree?.findUUID(uuid: focusedUUID) + } + + if let view = foundView { + c.focusedSurface = view + restoreFocus(to: view, inWindow: window) + } } completionHandler(window, nil) diff --git a/macos/Sources/Features/Terminal/TerminalView.swift b/macos/Sources/Features/Terminal/TerminalView.swift index 2970f19c6..d13de4a72 100644 --- a/macos/Sources/Features/Terminal/TerminalView.swift +++ b/macos/Sources/Features/Terminal/TerminalView.swift @@ -21,7 +21,7 @@ protocol TerminalViewDelegate: AnyObject { func performAction(_ action: String, on: Ghostty.SurfaceView) /// A split is resizing to a given value. - func splitDidResize(node: SplitTree.Node, to newRatio: Double) + func splitDidResize(node: SplitTree.Node, to newRatio: Double) } /// The view model is a required implementation for TerminalView callers. This contains @@ -30,7 +30,7 @@ protocol TerminalViewDelegate: AnyObject { protocol TerminalViewModel: ObservableObject { /// The tree of terminal surfaces (splits) within the view. This is mutated by TerminalView /// and children. This should be @Published. - var surfaceTree2: SplitTree { get set } + var surfaceTree2: SplitTree { get set } /// The command palette state. var commandPaletteIsShowing: Bool { get set } diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 99f901792..0aecef6ad 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -6,7 +6,7 @@ import GhosttyKit extension Ghostty { /// The NSView implementation for a terminal surface. - class SurfaceView: OSView, ObservableObject { + class SurfaceView: OSView, ObservableObject, Codable { /// Unique ID per surface let uuid: UUID @@ -1431,6 +1431,35 @@ extension Ghostty { self.windowAppearance = .init(ghosttyConfig: config) } } + + // MARK: - Codable + + enum CodingKeys: String, CodingKey { + case pwd + case uuid + } + + required convenience init(from decoder: Decoder) throws { + // Decoding uses the global Ghostty app + guard let del = NSApplication.shared.delegate, + let appDel = del as? AppDelegate, + let app = appDel.ghostty.app else { + throw TerminalRestoreError.delegateInvalid + } + + let container = try decoder.container(keyedBy: CodingKeys.self) + let uuid = UUID(uuidString: try container.decode(String.self, forKey: .uuid)) + var config = Ghostty.SurfaceConfiguration() + config.workingDirectory = try container.decode(String?.self, forKey: .pwd) + + self.init(app, baseConfig: config, uuid: uuid) + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(pwd, forKey: .pwd) + try container.encode(uuid.uuidString, forKey: .uuid) + } } } From b84b715ddbf6de59c74d969bcb1597c06aaaa945 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 3 Jun 2025 16:43:20 -0700 Subject: [PATCH 077/371] macos: unify confirm close in our terminal controllers --- .../Terminal/BaseTerminalController.swift | 92 ++++++++++--------- .../Terminal/TerminalController.swift | 23 ----- 2 files changed, 47 insertions(+), 68 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index b3409c437..1ffea9b4f 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -194,6 +194,40 @@ class BaseTerminalController: NSWindowController, savedFrame = .init(window: window.frame, screen: screen.visibleFrame) } + func confirmClose( + messageText: String, + informativeText: String, + completion: @escaping () -> Void + ) { + // If we already have an alert, we need to wait for that one. + guard alert == nil else { return } + + // If there is no window to attach the modal then we assume success + // since we'll never be able to show the modal. + guard let window else { + completion() + return + } + + // If we need confirmation by any, show one confirmation for all windows + // in the tab group. + let alert = NSAlert() + alert.messageText = messageText + alert.informativeText = informativeText + alert.addButton(withTitle: "Close") + alert.addButton(withTitle: "Cancel") + alert.alertStyle = .warning + alert.beginSheetModal(for: window) { response in + self.alert = nil + if response == .alertFirstButtonReturn { + completion() + } + } + + // Store our alert so we only ever show one. + self.alert = alert + } + // MARK: Notifications @objc private func didChangeScreenParametersNotification(_ notification: Notification) { @@ -287,37 +321,19 @@ class BaseTerminalController: NSWindowController, return } - // If we don't have a window to attach our modal to, we also exit immediately. - // This should NOT happen. - guard let window = target.window else { - surfaceTree2 = surfaceTree2.remove(node) - return - } - // Confirm close. We use an NSAlert instead of a SwiftUI confirmationDialog // due to SwiftUI bugs (see Ghostty #560). To repeat from #560, the bug is that // confirmationDialog allows the user to Cmd-W close the alert, but when doing // so SwiftUI does not update any of the bindings to note that window is no longer // being shown, and provides no callback to detect this. - let alert = NSAlert() - alert.messageText = "Close Terminal?" - alert.informativeText = "The terminal still has a running process. If you close the " + - "terminal the process will be killed." - alert.addButton(withTitle: "Close the Terminal") - alert.addButton(withTitle: "Cancel") - alert.alertStyle = .warning - alert.beginSheetModal(for: window, completionHandler: { [weak self] response in - switch (response) { - case .alertFirstButtonReturn: - alert.window.orderOut(nil) - if let self { - self.surfaceTree2 = self.surfaceTree2.remove(node) - } - - default: - break + confirmClose( + messageText: "Close Terminal?", + informativeText: "The terminal still has a running process. If you close the terminal the process will be killed." + ) { [weak self] in + if let self { + self.surfaceTree2 = self.surfaceTree2.remove(node) } - }) + } } @objc private func ghosttyDidNewSplit(_ notification: Notification) { @@ -624,26 +640,12 @@ class BaseTerminalController: NSWindowController, if (!node.needsConfirmQuit()) { return true } // We require confirmation, so show an alert as long as we aren't already. - let alert = NSAlert() - alert.messageText = "Close Terminal?" - alert.informativeText = "The terminal still has a running process. If you close the " + - "terminal the process will be killed." - alert.addButton(withTitle: "Close the Terminal") - alert.addButton(withTitle: "Cancel") - alert.alertStyle = .warning - alert.beginSheetModal(for: window, completionHandler: { response in - self.alert = nil - switch (response) { - case .alertFirstButtonReturn: - alert.window.orderOut(nil) - window.close() - - default: - break - } - }) - - self.alert = alert + confirmClose( + messageText: "Close Terminal?", + informativeText: "The terminal still has a running process. If you close the terminal the process will be killed." + ) { + window.close() + } return false } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 5c2f58dab..8e88952f0 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -587,27 +587,6 @@ class TerminalController: BaseTerminalController { ghostty.newTab(surface: surface) } - private func confirmClose( - window: NSWindow, - messageText: String, - informativeText: String, - completion: @escaping () -> Void - ) { - // If we need confirmation by any, show one confirmation for all windows - // in the tab group. - let alert = NSAlert() - alert.messageText = messageText - alert.informativeText = informativeText - alert.addButton(withTitle: "Close") - alert.addButton(withTitle: "Cancel") - alert.alertStyle = .warning - alert.beginSheetModal(for: window) { response in - if response == .alertFirstButtonReturn { - completion() - } - } - } - @IBAction func closeTab(_ sender: Any?) { guard let window = window else { return } guard window.tabGroup != nil else { @@ -618,7 +597,6 @@ class TerminalController: BaseTerminalController { if surfaceTree?.needsConfirmQuit() ?? false { confirmClose( - window: window, messageText: "Close Tab?", informativeText: "The terminal still has a running process. If you close the tab the process will be killed." ) { @@ -664,7 +642,6 @@ class TerminalController: BaseTerminalController { } confirmClose( - window: window, messageText: "Close Window?", informativeText: "All terminal sessions in this window will be terminated." ) { From 0fb58298a78979e75c67717d0587ffc3c94430e9 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 3 Jun 2025 19:41:21 -0700 Subject: [PATCH 078/371] macos: focus split previous/next --- macos/Ghostty.xcodeproj/project.pbxproj | 12 ++++ macos/Sources/Features/Splits/SplitTree.swift | 72 +++++++++++++++++++ .../Terminal/BaseTerminalController.swift | 37 ++++++++++ macos/Sources/Ghostty/Ghostty.App.swift | 3 +- .../Helpers/Extensions/Array+Extension.swift | 19 +++++ 5 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 macos/Sources/Helpers/Extensions/Array+Extension.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 459b2b994..38e29a60e 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -61,6 +61,7 @@ A586167C2B7703CC009BDB1D /* fish in Resources */ = {isa = PBXBuildFile; fileRef = A586167B2B7703CC009BDB1D /* fish */; }; A586365F2DEE6C2300E04A10 /* SplitTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586365E2DEE6C2100E04A10 /* SplitTree.swift */; }; A58636662DEF964100E04A10 /* TerminalSplitTreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */; }; + A586366B2DF0A98C00E04A10 /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366A2DF0A98900E04A10 /* Array+Extension.swift */; }; A5874D992DAD751B00E83852 /* CGS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D982DAD751A00E83852 /* CGS.swift */; }; A5874D9D2DAD786100E83852 /* NSWindow+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */; }; A59444F729A2ED5200725BBA /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59444F629A2ED5200725BBA /* SettingsView.swift */; }; @@ -168,6 +169,7 @@ A586167B2B7703CC009BDB1D /* fish */ = {isa = PBXFileReference; lastKnownFileType = folder; name = fish; path = "../zig-out/share/fish"; sourceTree = ""; }; A586365E2DEE6C2100E04A10 /* SplitTree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitTree.swift; sourceTree = ""; }; A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalSplitTreeView.swift; sourceTree = ""; }; + A586366A2DF0A98900E04A10 /* Array+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Extension.swift"; sourceTree = ""; }; A5874D982DAD751A00E83852 /* CGS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CGS.swift; sourceTree = ""; }; A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSWindow+Extension.swift"; sourceTree = ""; }; A59444F629A2ED5200725BBA /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; @@ -292,6 +294,7 @@ A534263D2A7DCBB000EBB7A2 /* Helpers */ = { isa = PBXGroup; children = ( + A58636692DF0A98100E04A10 /* Extensions */, A5874D9B2DAD781100E83852 /* Private */, A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */, A5A6F7292CC41B8700B232A5 /* Xcode.swift */, @@ -442,6 +445,14 @@ path = Splits; sourceTree = ""; }; + A58636692DF0A98100E04A10 /* Extensions */ = { + isa = PBXGroup; + children = ( + A586366A2DF0A98900E04A10 /* Array+Extension.swift */, + ); + path = Extensions; + sourceTree = ""; + }; A5874D9B2DAD781100E83852 /* Private */ = { isa = PBXGroup; children = ( @@ -721,6 +732,7 @@ A55B7BBC29B6FC330055DE60 /* SurfaceView.swift in Sources */, A5333E1C2B5A1CE3008AEFF7 /* CrossKit.swift in Sources */, A5874D992DAD751B00E83852 /* CGS.swift in Sources */, + A586366B2DF0A98C00E04A10 /* Array+Extension.swift in Sources */, A59444F729A2ED5200725BBA /* SettingsView.swift in Sources */, A56D58862ACDDB4100508D2C /* Ghostty.Shell.swift in Sources */, A5985CD72C320C4500C57AD3 /* String+Extension.swift in Sources */, diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index a66d4abe7..a093934d8 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -50,6 +50,20 @@ struct SplitTree: Codable { case down case up } + + /// The direction that focus can move from a node. + enum FocusDirection { + // Follow a consistent tree-like structure. + case previous + case next + + // Geospatially-aware navigation targets. These take into account the + // dimensions of the view to find the correct node to go to. + case up + case down + case left + case right + } } // MARK: SplitTree @@ -111,6 +125,44 @@ extension SplitTree { return .init(root: newRoot, zoomed: newZoomed) } + + /// Find the next view to focus based on the current focused node and direction + func focusTarget(for direction: FocusDirection, from currentNode: Node) -> ViewType? { + guard let root else { return nil } + + switch direction { + case .previous: + // For previous, we traverse in order and find the previous leaf from our leftmost + let allLeaves = root.leaves() + let currentView = currentNode.leftmostLeaf() + guard let currentIndex = allLeaves.firstIndex(where: { $0 === currentView }) else { + // Shouldn't be possible leftmostLeaf can't return something that doesn't exist! + return nil + } + let index = allLeaves.indexWrapping(before: currentIndex) + return allLeaves[index] + + case .next: + // For previous, we traverse in order and find the next leaf from our rightmost + let allLeaves = root.leaves() + let currentView = currentNode.rightmostLeaf() + guard let currentIndex = allLeaves.firstIndex(where: { $0 === currentView }) else { + return nil + } + let index = allLeaves.indexWrapping(after: currentIndex) + return allLeaves[index] + + case .up, .down, .left, .right: + // For directional movement, we need to traverse the tree structure + return directionalTarget(for: direction, from: currentNode) + } + } + + /// Find focus target in a specific direction by traversing split boundaries + private func directionalTarget(for direction: FocusDirection, from currentNode: Node) -> ViewType? { + // TODO + return nil + } } // MARK: SplitTree.Node @@ -331,6 +383,26 @@ extension SplitTree.Node { )) } } + + /// Get the leftmost leaf in this subtree + func leftmostLeaf() -> ViewType { + switch self { + case .leaf(let view): + return view + case .split(let split): + return split.left.leftmostLeaf() + } + } + + /// Get the rightmost leaf in this subtree + func rightmostLeaf() -> ViewType { + switch self { + case .leaf(let view): + return view + case .split(let split): + return split.right.rightmostLeaf() + } + } } // MARK: SplitTree.Node Protocols diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 1ffea9b4f..b6b745e82 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -145,6 +145,11 @@ class BaseTerminalController: NSWindowController, selector: #selector(ghosttyDidEqualizeSplits(_:)), name: Ghostty.Notification.didEqualizeSplits, object: nil) + center.addObserver( + self, + selector: #selector(ghosttyDidFocusSplit(_:)), + name: Ghostty.Notification.ghosttyFocusSplit, + object: nil) // Listen for local events that we need to know of outside of // single surface handlers. @@ -386,6 +391,38 @@ class BaseTerminalController: NSWindowController, _ = container.equalize() } } + + @objc private func ghosttyDidFocusSplit(_ notification: Notification) { + // The target must be within our tree + guard let target = notification.object as? Ghostty.SurfaceView else { return } + guard surfaceTree2.root?.node(view: target) != nil else { return } + + // Get the direction from the notification + guard let directionAny = notification.userInfo?[Ghostty.Notification.SplitDirectionKey] else { return } + guard let direction = directionAny as? Ghostty.SplitFocusDirection else { return } + + // Convert Ghostty.SplitFocusDirection to our SplitTree.FocusDirection + let focusDirection: SplitTree.FocusDirection + switch direction { + case .previous: focusDirection = .previous + case .next: focusDirection = .next + case .up: focusDirection = .up + case .down: focusDirection = .down + case .left: focusDirection = .left + case .right: focusDirection = .right + } + + // Find the node for the target surface + guard let targetNode = surfaceTree2.root?.node(view: target) else { return } + + // Find the next surface to focus + guard let nextSurface = surfaceTree2.focusTarget(for: focusDirection, from: targetNode) else { + return + } + + // Move focus to the next surface + Ghostty.moveFocus(to: nextSurface, from: target) + } // MARK: Local Events diff --git a/macos/Sources/Ghostty/Ghostty.App.swift b/macos/Sources/Ghostty/Ghostty.App.swift index d8fdaa3ec..95e04fc1e 100644 --- a/macos/Sources/Ghostty/Ghostty.App.swift +++ b/macos/Sources/Ghostty/Ghostty.App.swift @@ -921,7 +921,8 @@ extension Ghostty { // we should only be returning true if we actually performed the action, // but this handles the most common case of caring about goto_split performability // which is the no-split case. - guard controller.surfaceTree?.isSplit ?? false else { return false } + // TODO: fix this + //guard controller.surfaceTree?.isSplit ?? false else { return false } NotificationCenter.default.post( name: Notification.ghosttyFocusSplit, diff --git a/macos/Sources/Helpers/Extensions/Array+Extension.swift b/macos/Sources/Helpers/Extensions/Array+Extension.swift new file mode 100644 index 000000000..6f005a349 --- /dev/null +++ b/macos/Sources/Helpers/Extensions/Array+Extension.swift @@ -0,0 +1,19 @@ +extension Array { + /// Returns the index before i, with wraparound. Assumes i is a valid index. + func indexWrapping(before i: Int) -> Int { + if i == 0 { + return count - 1 + } + + return i - 1 + } + + /// Returns the index after i, with wraparound. Assumes i is a valid index. + func indexWrapping(after i: Int) -> Int { + if i == count - 1 { + return 0 + } + + return i + 1 + } +} From 7dcfebcd5d99fe76c5d861e2c30ba4eb92f16fd5 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 09:28:18 -0700 Subject: [PATCH 079/371] macos: isSplit guarding on focus split directions works --- macos/Sources/Features/Splits/SplitTree.swift | 7 ++++++- macos/Sources/Ghostty/Ghostty.App.swift | 3 +-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index a093934d8..c3a4e3097 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -72,7 +72,12 @@ extension SplitTree { var isEmpty: Bool { root == nil } - + + /// Returns true if this tree is split. + var isSplit: Bool { + if case .split = root { true } else { false } + } + init() { self.init(root: nil, zoomed: nil) } diff --git a/macos/Sources/Ghostty/Ghostty.App.swift b/macos/Sources/Ghostty/Ghostty.App.swift index 95e04fc1e..08c284b04 100644 --- a/macos/Sources/Ghostty/Ghostty.App.swift +++ b/macos/Sources/Ghostty/Ghostty.App.swift @@ -921,8 +921,7 @@ extension Ghostty { // we should only be returning true if we actually performed the action, // but this handles the most common case of caring about goto_split performability // which is the no-split case. - // TODO: fix this - //guard controller.surfaceTree?.isSplit ?? false else { return false } + guard controller.surfaceTree2.isSplit else { return false } NotificationCenter.default.post( name: Notification.ghosttyFocusSplit, From aef61661a01f6e4d08012f775161c0e46358a5f8 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 09:42:12 -0700 Subject: [PATCH 080/371] macos: fix up command palette, focusing --- macos/Ghostty.xcodeproj/project.pbxproj | 2 +- .../Features/Terminal/BaseTerminalController.swift | 6 +++--- .../Features/Terminal/TerminalController.swift | 8 ++++---- .../Helpers/{ => Extensions}/NSView+Extension.swift | 13 +++++++++++++ 4 files changed, 21 insertions(+), 8 deletions(-) rename macos/Sources/Helpers/{ => Extensions}/NSView+Extension.swift (77%) diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 38e29a60e..8c73d55c5 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -314,7 +314,6 @@ A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */, A54B0CEA2D0CFB4A00CBEFF8 /* NSImage+Extension.swift */, A52FFF5C2CAB4D05000C6A5B /* NSScreen+Extension.swift */, - C1F26EA62B738B9900404083 /* NSView+Extension.swift */, AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */, A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */, A5985CD62C320C4500C57AD3 /* String+Extension.swift */, @@ -449,6 +448,7 @@ isa = PBXGroup; children = ( A586366A2DF0A98900E04A10 /* Array+Extension.swift */, + C1F26EA62B738B9900404083 /* NSView+Extension.swift */, ); path = Extensions; sourceTree = ""; diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index b6b745e82..6429f70a3 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -295,14 +295,14 @@ class BaseTerminalController: NSWindowController, @objc private func ghosttyCommandPaletteDidToggle(_ notification: Notification) { guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree?.contains(view: surfaceView) ?? false else { return } + guard surfaceTree2.contains(surfaceView) else { return } toggleCommandPalette(nil) } @objc private func ghosttyMaximizeDidToggle(_ notification: Notification) { guard let window else { return } guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree?.contains(view: surfaceView) ?? false else { return } + guard surfaceTree2.contains(surfaceView) else { return } window.zoom(nil) } @@ -468,7 +468,7 @@ class BaseTerminalController: NSWindowController, // want to care if the surface is in the tree so we don't listen to titles of // closed surfaces. if let titleSurface = focusedSurface ?? lastFocusedSurface, - surfaceTree?.contains(view: titleSurface) ?? false { + surfaceTree2.contains(titleSurface) { // If we have a surface, we want to listen for title changes. titleSurface.$title .sink { [weak self] in self?.titleDidChange(to: $0) } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 8e88952f0..a2687e1fe 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -159,7 +159,7 @@ class TerminalController: BaseTerminalController { // This is a surface-level config update. If we have the surface, we // update our appearance based on it. guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree?.contains(view: surfaceView) ?? false else { return } + guard surfaceTree2.contains(surfaceView) else { return } // We can't use surfaceView.derivedConfig because it may not be updated // yet since it also responds to notifications. @@ -815,19 +815,19 @@ class TerminalController: BaseTerminalController { @objc private func onCloseTab(notification: SwiftUI.Notification) { guard let target = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree?.contains(view: target) ?? false else { return } + guard surfaceTree2.contains(target) else { return } closeTab(self) } @objc private func onCloseWindow(notification: SwiftUI.Notification) { guard let target = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree?.contains(view: target) ?? false else { return } + guard surfaceTree2.contains(target) else { return } closeWindow(self) } @objc private func onResetWindowSize(notification: SwiftUI.Notification) { guard let target = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree?.contains(view: target) ?? false else { return } + guard surfaceTree2.contains(target) else { return } returnToDefaultSize(nil) } diff --git a/macos/Sources/Helpers/NSView+Extension.swift b/macos/Sources/Helpers/Extensions/NSView+Extension.swift similarity index 77% rename from macos/Sources/Helpers/NSView+Extension.swift rename to macos/Sources/Helpers/Extensions/NSView+Extension.swift index b9234a49a..48284df74 100644 --- a/macos/Sources/Helpers/NSView+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSView+Extension.swift @@ -1,6 +1,19 @@ import AppKit extension NSView { + /// Returns true if this view is currently in the responder chain + var isInResponderChain: Bool { + var responder = window?.firstResponder + while let currentResponder = responder { + if currentResponder === self { + return true + } + responder = currentResponder.nextResponder + } + + return false + } + /// Recursively finds and returns the first descendant view that has the given class name. func firstDescendant(withClassName name: String) -> NSView? { for subview in subviews { From a389926ca7345be7da1ee1b4608fe63776e97aac Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 09:47:55 -0700 Subject: [PATCH 081/371] macos: use surfaceTree2 needsConfirmQuit --- macos/Sources/Features/Terminal/BaseTerminalController.swift | 4 ++-- macos/Sources/Features/Terminal/TerminalController.swift | 4 ++-- macos/Sources/Features/Terminal/TerminalManager.swift | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 6429f70a3..6c5718371 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -668,13 +668,13 @@ class BaseTerminalController: NSWindowController, guard let window = self.window else { return true } // If we have no surfaces, close. - guard let node = self.surfaceTree else { return true } + if surfaceTree2.isEmpty { return true } // If we already have an alert, continue with it guard alert == nil else { return false } // If our surfaces don't require confirmation, close. - if (!node.needsConfirmQuit()) { return true } + if !surfaceTree2.contains(where: { $0.needsConfirmQuit }) { return true } // We require confirmation, so show an alert as long as we aren't already. confirmClose( diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index a2687e1fe..78bb58cc8 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -595,7 +595,7 @@ class TerminalController: BaseTerminalController { return } - if surfaceTree?.needsConfirmQuit() ?? false { + if surfaceTree2.contains(where: { $0.needsConfirmQuit }) { confirmClose( messageText: "Close Tab?", informativeText: "The terminal still has a running process. If you close the tab the process will be killed." @@ -632,7 +632,7 @@ class TerminalController: BaseTerminalController { guard let controller = tabWindow.windowController as? TerminalController else { return false } - return controller.surfaceTree?.needsConfirmQuit() ?? false + return controller.surfaceTree2.contains(where: { $0.needsConfirmQuit }) } // If none need confirmation then we can just close all the windows. diff --git a/macos/Sources/Features/Terminal/TerminalManager.swift b/macos/Sources/Features/Terminal/TerminalManager.swift index 2968f8abd..475b70ac9 100644 --- a/macos/Sources/Features/Terminal/TerminalManager.swift +++ b/macos/Sources/Features/Terminal/TerminalManager.swift @@ -269,7 +269,7 @@ class TerminalManager { func closeAllWindows() { var needsConfirm: Bool = false for w in self.windows { - if (w.controller.surfaceTree?.needsConfirmQuit() ?? false) { + if w.controller.surfaceTree2.contains(where: { $0.needsConfirmQuit }) { needsConfirm = true break } From ec7fd94d0ff325e2d7a6ead1ee792911b0e3b136 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 10:00:37 -0700 Subject: [PATCH 082/371] macos: equalize splits works with new tree --- macos/Sources/Features/Splits/SplitTree.swift | 44 +++++++++++++++++++ .../Terminal/BaseTerminalController.swift | 7 ++- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index c3a4e3097..ed4e2dba3 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -168,6 +168,14 @@ extension SplitTree { // TODO return nil } + + /// Equalize all splits in the tree so that each split's ratio is based on the + /// relative weight (number of leaves) of its children. + func equalize() -> Self { + guard let root else { return self } + let newRoot = root.equalize() + return .init(root: newRoot, zoomed: zoomed) + } } // MARK: SplitTree.Node @@ -408,6 +416,42 @@ extension SplitTree.Node { return split.right.rightmostLeaf() } } + + /// Equalize this node and all its children, returning a new node with splits + /// adjusted so that each split's ratio is based on the relative weight + /// (number of leaves) of its children. + func equalize() -> Node { + let (equalizedNode, _) = equalizeWithWeight() + return equalizedNode + } + + /// Internal helper that equalizes and returns both the node and its weight. + private func equalizeWithWeight() -> (node: Node, weight: Int) { + switch self { + case .leaf: + // A leaf has weight 1 and doesn't change + return (self, 1) + + case .split(let split): + // Recursively equalize children + let (leftNode, leftWeight) = split.left.equalizeWithWeight() + let (rightNode, rightWeight) = split.right.equalizeWithWeight() + + // Calculate new ratio based on relative weights + let totalWeight = leftWeight + rightWeight + let newRatio = Double(leftWeight) / Double(totalWeight) + + // Create new split with equalized ratio + let newSplit = Split( + direction: split.direction, + ratio: newRatio, + left: leftNode, + right: rightNode + ) + + return (.split(newSplit), totalWeight) + } + } } // MARK: SplitTree.Node Protocols diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 6c5718371..5558aefe3 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -385,11 +385,10 @@ class BaseTerminalController: NSWindowController, guard let target = notification.object as? Ghostty.SurfaceView else { return } // Check if target surface is in current controller's tree - guard surfaceTree?.contains(view: target) ?? false else { return } + guard surfaceTree2.contains(target) else { return } - if case .split(let container) = surfaceTree { - _ = container.equalize() - } + // Equalize the splits + surfaceTree2 = surfaceTree2.equalize() } @objc private func ghosttyDidFocusSplit(_ notification: Notification) { From b7c01b5b4a6b1bc5a907807d91c9e9e70ab6af83 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 10:04:03 -0700 Subject: [PATCH 083/371] macos: spatial focus navigation --- macos/Sources/Features/Splits/SplitTree.swift | 356 +++++++++++++++++- .../Terminal/BaseTerminalController.swift | 8 +- 2 files changed, 343 insertions(+), 21 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index ed4e2dba3..f458b5dee 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -40,6 +40,29 @@ struct SplitTree: Codable { } } + /// Spatial representation of the split tree. This can be used to better understand + /// its physical representation to perform tasks such as navigation. + struct Spatial { + let slots: [Slot] + + /// A single slot within the spatial mapping of a tree. Note that the bounds are + /// _relative_. They can't be mapped to physical pixels because the SplitTree + /// isn't aware of actual rendering. But relative to each other the bounds are + /// correct. + struct Slot { + let node: Node + let bounds: CGRect + } + + /// Direction for spatial navigation within the split tree. + enum Direction { + case left + case right + case up + case down + } + } + enum SplitError: Error { case viewNotFound } @@ -57,12 +80,10 @@ struct SplitTree: Codable { case previous case next - // Geospatially-aware navigation targets. These take into account the - // dimensions of the view to find the correct node to go to. - case up - case down - case left - case right + // Spatially-aware navigation targets. These take into account the + // layout to find the spatially correct node to move to. Spatial navigation + // is always from the top-left corner for now. + case spatial(Spatial.Direction) } } @@ -134,7 +155,7 @@ extension SplitTree { /// Find the next view to focus based on the current focused node and direction func focusTarget(for direction: FocusDirection, from currentNode: Node) -> ViewType? { guard let root else { return nil } - + switch direction { case .previous: // For previous, we traverse in order and find the previous leaf from our leftmost @@ -157,18 +178,33 @@ extension SplitTree { let index = allLeaves.indexWrapping(after: currentIndex) return allLeaves[index] - case .up, .down, .left, .right: - // For directional movement, we need to traverse the tree structure - return directionalTarget(for: direction, from: currentNode) + case .spatial(let spatialDirection): + // Get spatial representation and find best candidate + let spatial = root.spatial() + let nodes = spatial.slots(in: spatialDirection, from: currentNode) + + // If we have no nodes in the direction specified then we don't do + // anything. + if nodes.isEmpty { + return nil + } + + // Extract the view from the best candidate node + let bestNode = nodes[0].node + switch bestNode { + case .leaf(let view): + return view + case .split: + // If the best candidate is a split node, use its the leaf/rightmost + // depending on our spatial direction. + return switch (spatialDirection) { + case .up, .left: bestNode.leftmostLeaf() + case .down, .right: bestNode.rightmostLeaf() + } + } } } - - /// Find focus target in a specific direction by traversing split boundaries - private func directionalTarget(for direction: FocusDirection, from currentNode: Node) -> ViewType? { - // TODO - return nil - } - + /// Equalize all splits in the tree so that each split's ratio is based on the /// relative weight (number of leaves) of its children. func equalize() -> Self { @@ -452,6 +488,292 @@ extension SplitTree.Node { return (.split(newSplit), totalWeight) } } + + /// Calculate the bounds of all views in this subtree based on split ratios + func calculateViewBounds(in bounds: CGRect) -> [(view: ViewType, bounds: CGRect)] { + switch self { + case .leaf(let view): + return [(view, bounds)] + + case .split(let split): + // Calculate bounds for left and right based on split direction and ratio + let leftBounds: CGRect + let rightBounds: CGRect + + switch split.direction { + case .horizontal: + // Split horizontally: left | right + let splitX = bounds.minX + bounds.width * split.ratio + leftBounds = CGRect( + x: bounds.minX, + y: bounds.minY, + width: bounds.width * split.ratio, + height: bounds.height + ) + rightBounds = CGRect( + x: splitX, + y: bounds.minY, + width: bounds.width * (1 - split.ratio), + height: bounds.height + ) + + case .vertical: + // Split vertically: top / bottom + // Note: In our normalized coordinate system, Y increases upward + let splitY = bounds.minY + bounds.height * split.ratio + leftBounds = CGRect( + x: bounds.minX, + y: splitY, + width: bounds.width, + height: bounds.height * (1 - split.ratio) + ) + rightBounds = CGRect( + x: bounds.minX, + y: bounds.minY, + width: bounds.width, + height: bounds.height * split.ratio + ) + } + + // Recursively calculate bounds for children + return split.left.calculateViewBounds(in: leftBounds) + + split.right.calculateViewBounds(in: rightBounds) + } + } +} + +// MARK: SplitTree.Node Spatial + +extension SplitTree.Node { + /// Returns the spatial representation of this node and its subtree. + /// + /// This method creates a `Spatial` representation that maps the logical split tree structure + /// to 2D coordinate space. The coordinate system uses (0,0) as the top-left corner with + /// positive X extending right and positive Y extending down. + /// + /// The spatial representation provides: + /// - Relative bounds for each node based on split ratios + /// - Grid-like dimensions where each split adds 1 to the column/row count + /// - Accurate positioning that reflects the actual layout structure + /// + /// The bounds are pixel perfect based on assuming that each row and column are 1 pixel + /// tall or wide, respectively. This needs to be scaled up to the proper bounds for a real + /// layout. + /// + /// Example: + /// ``` + /// // For a layout like: + /// // +--------+----+ + /// // | A | B | + /// // +--------+----+ + /// // | C | D | + /// // +--------+----+ + /// // + /// // The spatial representation would have: + /// // - Total dimensions: (width: 2, height: 2) + /// // - Node bounds based on actual split ratios + /// ``` + /// + /// - Returns: A `Spatial` struct containing all slots with their calculated bounds + func spatial() -> SplitTree.Spatial { + // First, calculate the total dimensions needed + let dimensions = dimensions() + + // Calculate slots with relative bounds + let slots = spatialSlots( + in: CGRect(x: 0, y: 0, width: Double(dimensions.width), height: Double(dimensions.height)) + ) + + return SplitTree.Spatial(slots: slots) + } + + /// Calculates the grid dimensions (columns and rows) needed to represent this subtree. + /// + /// This method recursively analyzes the split tree structure to determine how many + /// columns and rows are needed to represent the layout in a 2D grid. Each leaf node + /// occupies one grid cell (1×1), and each split extends the grid in one direction: + /// + /// - **Horizontal splits**: Add columns (increase width) + /// - **Vertical splits**: Add rows (increase height) + /// + /// The calculation rules are: + /// - **Leaf nodes**: Always (1, 1) - one column, one row + /// - **Horizontal splits**: Width = sum of children widths, Height = max of children heights + /// - **Vertical splits**: Width = max of children widths, Height = sum of children heights + /// + /// Example: + /// ``` + /// // Single leaf: (1, 1) + /// // Horizontal split with 2 leaves: (2, 1) + /// // Vertical split with 2 leaves: (1, 2) + /// // Complex layout with both: (2, 2) or larger + /// ``` + /// + /// - Returns: A tuple containing (width: columns, height: rows) as unsigned integers + private func dimensions() -> (width: UInt, height: UInt) { + switch self { + case .leaf: + return (1, 1) + + case .split(let split): + let leftDimensions = split.left.dimensions() + let rightDimensions = split.right.dimensions() + + switch split.direction { + case .horizontal: + // Horizontal split: width is sum, height is max + return ( + width: leftDimensions.width + rightDimensions.width, + height: Swift.max(leftDimensions.height, rightDimensions.height) + ) + + case .vertical: + // Vertical split: height is sum, width is max + return ( + width: Swift.max(leftDimensions.width, rightDimensions.width), + height: leftDimensions.height + rightDimensions.height + ) + } + } + } + + /// Calculates the spatial slots (nodes with bounds) for this subtree within the given bounds. + /// + /// This method recursively traverses the split tree and calculates the precise bounds + /// for each node based on the split ratios and directions. The bounds are calculated + /// relative to the provided bounds rectangle. + /// + /// The calculation process: + /// 1. **Leaf nodes**: Create a single slot with the provided bounds + /// 2. **Split nodes**: + /// - Divide the bounds according to the split ratio and direction + /// - Create a slot for the split node itself + /// - Recursively calculate slots for both children + /// - Return all slots combined + /// + /// Split ratio interpretation: + /// - **Horizontal splits**: Ratio determines left/right width distribution + /// - Left child gets `ratio * width` + /// - Right child gets `(1 - ratio) * width` + /// - **Vertical splits**: Ratio determines top/bottom height distribution + /// - Top (left) child gets `ratio * height` + /// - Bottom (right) child gets `(1 - ratio) * height` + /// + /// Coordinate system: (0,0) is top-left, positive X goes right, positive Y goes down. + /// + /// - Parameter bounds: The bounding rectangle to subdivide for this subtree + /// - Returns: An array of `Spatial.Slot` objects, each containing a node and its bounds + private func spatialSlots(in bounds: CGRect) -> [SplitTree.Spatial.Slot] { + switch self { + case .leaf: + // A leaf takes up our full bounds. + return [.init(node: self, bounds: bounds)] + + case .split(let split): + let leftBounds: CGRect + let rightBounds: CGRect + + switch split.direction { + case .horizontal: + // Split horizontally: left | right using the ratio + let splitX = bounds.minX + bounds.width * split.ratio + leftBounds = CGRect( + x: bounds.minX, + y: bounds.minY, + width: bounds.width * split.ratio, + height: bounds.height + ) + rightBounds = CGRect( + x: splitX, + y: bounds.minY, + width: bounds.width * (1 - split.ratio), + height: bounds.height + ) + + case .vertical: + // Split vertically: top / bottom using the ratio + // Top-left is (0,0), so top (left) gets the upper portion + let splitY = bounds.minY + bounds.height * split.ratio + leftBounds = CGRect( + x: bounds.minX, + y: bounds.minY, + width: bounds.width, + height: bounds.height * split.ratio + ) + rightBounds = CGRect( + x: bounds.minX, + y: splitY, + width: bounds.width, + height: bounds.height * (1 - split.ratio) + ) + } + + // Recursively calculate slots for children and include a slot for this split + var slots: [SplitTree.Spatial.Slot] = [.init(node: self, bounds: bounds)] + slots += split.left.spatialSlots(in: leftBounds) + slots += split.right.spatialSlots(in: rightBounds) + + return slots + } + } +} + +// MARK: SplitTree.Spatial + +extension SplitTree.Spatial { + /// Returns all slots in the specified direction relative to the reference node. + /// + /// This method finds all slots positioned in the given direction from the reference node: + /// - **Left**: Slots with bounds to the left of the reference node + /// - **Right**: Slots with bounds to the right of the reference node + /// - **Up**: Slots with bounds above the reference node (Y=0 is top) + /// - **Down**: Slots with bounds below the reference node + /// + /// Results are sorted by distance from the reference node, with closest slots first. + /// Distance is calculated as the gap between the reference node and the candidate slot + /// in the direction of movement. + /// + /// - Parameters: + /// - direction: The direction to search for slots + /// - referenceNode: The node to use as the reference point + /// - Returns: An array of slots in the specified direction, sorted by distance (closest first) + func slots(in direction: Direction, from referenceNode: SplitTree.Node) -> [Slot] { + guard let refSlot = slots.first(where: { $0.node == referenceNode }) else { return [] } + + return switch direction { + case .left: + // Slots to the left: their right edge is at or left of reference's left edge + slots.filter { + $0.node != referenceNode && $0.bounds.maxX <= refSlot.bounds.minX + }.sorted { + (refSlot.bounds.minX - $0.bounds.maxX) < (refSlot.bounds.minX - $1.bounds.maxX) + } + + case .right: + // Slots to the right: their left edge is at or right of reference's right edge + slots.filter { + $0.node != referenceNode && $0.bounds.minX >= refSlot.bounds.maxX + }.sorted { + ($0.bounds.minX - refSlot.bounds.maxX) < ($1.bounds.minX - refSlot.bounds.maxX) + } + + case .up: + // Slots above: their bottom edge is at or above reference's top edge + slots.filter { + $0.node != referenceNode && $0.bounds.maxY <= refSlot.bounds.minY + }.sorted { + (refSlot.bounds.minY - $0.bounds.maxY) < (refSlot.bounds.minY - $1.bounds.maxY) + } + + case .down: + // Slots below: their top edge is at or below reference's bottom edge + slots.filter { + $0.node != referenceNode && $0.bounds.minY >= refSlot.bounds.maxY + }.sorted { + ($0.bounds.minY - refSlot.bounds.maxY) < ($1.bounds.minY - refSlot.bounds.maxY) + } + } + } } // MARK: SplitTree.Node Protocols diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 5558aefe3..9b65854ab 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -405,10 +405,10 @@ class BaseTerminalController: NSWindowController, switch direction { case .previous: focusDirection = .previous case .next: focusDirection = .next - case .up: focusDirection = .up - case .down: focusDirection = .down - case .left: focusDirection = .left - case .right: focusDirection = .right + case .up: focusDirection = .spatial(.up) + case .down: focusDirection = .spatial(.down) + case .left: focusDirection = .spatial(.left) + case .right: focusDirection = .spatial(.right) } // Find the node for the target surface From ea1ff438f897be634f975adb96f0ae9a7b31789b Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 11:23:55 -0700 Subject: [PATCH 084/371] macos: handle split zooming --- .../Splits/TerminalSplitTreeView.swift | 7 ++++-- .../Terminal/BaseTerminalController.swift | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift index 3969b2e74..4a41afc42 100644 --- a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift +++ b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift @@ -5,8 +5,11 @@ struct TerminalSplitTreeView: View { let onResize: (SplitTree.Node, Double) -> Void var body: some View { - if let node = tree.root { - TerminalSplitSubtreeView(node: node, isRoot: true, onResize: onResize) + if let node = tree.zoomed ?? tree.root { + TerminalSplitSubtreeView( + node: node, + isRoot: node == tree.root, + onResize: onResize) } } } diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 9b65854ab..86522ac9a 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -150,6 +150,11 @@ class BaseTerminalController: NSWindowController, selector: #selector(ghosttyDidFocusSplit(_:)), name: Ghostty.Notification.ghosttyFocusSplit, object: nil) + center.addObserver( + self, + selector: #selector(ghosttyDidToggleSplitZoom(_:)), + name: Ghostty.Notification.didToggleSplitZoom, + object: nil) // Listen for local events that we need to know of outside of // single surface handlers. @@ -422,6 +427,24 @@ class BaseTerminalController: NSWindowController, // Move focus to the next surface Ghostty.moveFocus(to: nextSurface, from: target) } + + @objc private func ghosttyDidToggleSplitZoom(_ notification: Notification) { + // The target must be within our tree + guard let target = notification.object as? Ghostty.SurfaceView else { return } + guard let targetNode = surfaceTree2.root?.node(view: target) else { return } + + // Toggle the zoomed state + if surfaceTree2.zoomed == targetNode { + // Already zoomed, unzoom it + surfaceTree2 = SplitTree(root: surfaceTree2.root, zoomed: nil) + } else { + // Not zoomed or different node zoomed, zoom this node + surfaceTree2 = SplitTree(root: surfaceTree2.root, zoomed: targetNode) + } + + // Ensure focus stays on the target surface + Ghostty.moveFocus(to: target) + } // MARK: Local Events From 8b979d6dceae29d16d9806a171030ffb95cb6382 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 11:28:22 -0700 Subject: [PATCH 085/371] macos: handle surfaceTreeDidChange --- .../QuickTerminalController.swift | 4 ++-- .../Terminal/BaseTerminalController.swift | 21 ++++++++++--------- .../Terminal/TerminalController.swift | 16 +++++++------- .../Features/Terminal/TerminalView.swift | 7 ------- .../Ghostty/Ghostty.TerminalSplit.swift | 1 - macos/Sources/Ghostty/SurfaceView.swift | 9 -------- 6 files changed, 21 insertions(+), 37 deletions(-) diff --git a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift index 1abe30da1..6de33e14f 100644 --- a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift +++ b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift @@ -185,11 +185,11 @@ class QuickTerminalController: BaseTerminalController { // MARK: Base Controller Overrides - override func surfaceTreeDidChange(from: Ghostty.SplitNode?, to: Ghostty.SplitNode?) { + override func surfaceTreeDidChange(from: SplitTree, to: SplitTree) { super.surfaceTreeDidChange(from: from, to: to) // If our surface tree is nil then we animate the window out. - if (to == nil) { + if (to.isEmpty) { animateOut() } } diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 86522ac9a..f039e17ad 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -42,11 +42,11 @@ class BaseTerminalController: NSWindowController, } /// The surface tree for this window. - @Published var surfaceTree: Ghostty.SplitNode? = nil { - didSet { surfaceTreeDidChange(from: oldValue, to: surfaceTree) } - } + @Published var surfaceTree: Ghostty.SplitNode? = nil - @Published var surfaceTree2: SplitTree = .init() + @Published var surfaceTree2: SplitTree = .init() { + didSet { surfaceTreeDidChange(from: oldValue, to: surfaceTree2) } + } /// This can be set to show/hide the command palette. @Published var commandPaletteIsShowing: Bool = false @@ -174,9 +174,9 @@ class BaseTerminalController: NSWindowController, /// Called when the surfaceTree variable changed. /// /// Subclasses should call super first. - func surfaceTreeDidChange(from: Ghostty.SplitNode?, to: Ghostty.SplitNode?) { + func surfaceTreeDidChange(from: SplitTree, to: SplitTree) { // If our surface tree becomes nil then we have no focused surface. - if (to == nil) { + if (to.isEmpty) { focusedSurface = nil } } @@ -442,8 +442,11 @@ class BaseTerminalController: NSWindowController, surfaceTree2 = SplitTree(root: surfaceTree2.root, zoomed: targetNode) } - // Ensure focus stays on the target surface - Ghostty.moveFocus(to: target) + // Ensure focus stays on the target surface. We lose focus when we do + // this so we need to grab it again. + DispatchQueue.main.async { + Ghostty.moveFocus(to: target) + } } // MARK: Local Events @@ -525,8 +528,6 @@ class BaseTerminalController: NSWindowController, self.window?.contentResizeIncrements = to } - func zoomStateDidChange(to: Bool) {} - func splitDidResize(node: SplitTree.Node, to newRatio: Double) { let resizedNode = node.resize(to: newRatio) do { diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 78bb58cc8..120ac6377 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -106,15 +106,20 @@ class TerminalController: BaseTerminalController { // MARK: Base Controller Overrides - override func surfaceTreeDidChange(from: Ghostty.SplitNode?, to: Ghostty.SplitNode?) { + override func surfaceTreeDidChange(from: SplitTree, to: SplitTree) { super.surfaceTreeDidChange(from: from, to: to) // Whenever our surface tree changes in any way (new split, close split, etc.) // we want to invalidate our state. invalidateRestorableState() + // Update our zoom state + if let window = window as? TerminalWindow { + window.surfaceIsZoomed = to.zoomed != nil + } + // If our surface tree is now nil then we close our window. - if (to == nil) { + if (to.isEmpty) { self.window?.close() } } @@ -677,12 +682,7 @@ class TerminalController: BaseTerminalController { toolbar.titleText = to } } - - override func zoomStateDidChange(to: Bool) { - guard let window = window as? TerminalWindow else { return } - window.surfaceIsZoomed = to - } - + override func focusedSurfaceDidChange(to: Ghostty.SurfaceView?) { super.focusedSurfaceDidChange(to: to) diff --git a/macos/Sources/Features/Terminal/TerminalView.swift b/macos/Sources/Features/Terminal/TerminalView.swift index d13de4a72..6c990d496 100644 --- a/macos/Sources/Features/Terminal/TerminalView.swift +++ b/macos/Sources/Features/Terminal/TerminalView.swift @@ -14,9 +14,6 @@ protocol TerminalViewDelegate: AnyObject { /// The cell size changed. func cellSizeDidChange(to: NSSize) - /// This is called when a split is zoomed. - func zoomStateDidChange(to: Bool) - /// Perform an action. At the time of writing this is only triggered by the command palette. func performAction(_ action: String, on: Ghostty.SurfaceView) @@ -56,7 +53,6 @@ struct TerminalView: View { // Various state values sent back up from the currently focused terminals. @FocusedValue(\.ghosttySurfaceView) private var focusedSurface @FocusedValue(\.ghosttySurfacePwd) private var surfacePwd - @FocusedValue(\.ghosttySurfaceZoomed) private var zoomedSplit @FocusedValue(\.ghosttySurfaceCellSize) private var cellSize // The pwd of the focused surface as a URL @@ -101,9 +97,6 @@ struct TerminalView: View { guard let size = newValue else { return } self.delegate?.cellSizeDidChange(to: size) } - .onChange(of: zoomedSplit) { newValue in - self.delegate?.zoomStateDidChange(to: newValue ?? false) - } } // 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/Ghostty/Ghostty.TerminalSplit.swift b/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift index 92528ace7..ccb7cca38 100644 --- a/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift +++ b/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift @@ -30,7 +30,6 @@ extension Ghostty { InspectableSurface(surfaceView: surfaceView) } } - .focusedValue(\.ghosttySurfaceZoomed, zoomedSurface != nil) } } diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index 1e9a4cfef..513e5af46 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -502,15 +502,6 @@ extension FocusedValues { typealias Value = String } - var ghosttySurfaceZoomed: Bool? { - get { self[FocusedGhosttySurfaceZoomed.self] } - set { self[FocusedGhosttySurfaceZoomed.self] = newValue } - } - - struct FocusedGhosttySurfaceZoomed: FocusedValueKey { - typealias Value = Bool - } - var ghosttySurfaceCellSize: OSSize? { get { self[FocusedGhosttySurfaceCellSize.self] } set { self[FocusedGhosttySurfaceCellSize.self] = newValue } From 22819f8a296e799b75904f03ddf1d4204fd9c6be Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 11:40:54 -0700 Subject: [PATCH 086/371] macos: transfer doesBorderTop --- macos/Sources/Features/Splits/SplitTree.swift | 33 +++++++++++++++++++ .../Terminal/TerminalController.swift | 10 ++++-- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index f458b5dee..78bed7120 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -774,6 +774,39 @@ extension SplitTree.Spatial { } } } + + /// Returns whether the given node borders the specified side of the spatial bounds. + /// + /// This method checks if a node's bounds touch the edge of the overall spatial area: + /// - **Up**: Node's top edge touches the top of the spatial area (Y=0) + /// - **Down**: Node's bottom edge touches the bottom of the spatial area (Y=maxY) + /// - **Left**: Node's left edge touches the left of the spatial area (X=0) + /// - **Right**: Node's right edge touches the right of the spatial area (X=maxX) + /// + /// - Parameters: + /// - side: The side of the spatial bounds to check + /// - node: The node to check if it borders the specified side + /// - Returns: True if the node borders the specified side, false otherwise + func doesBorder(side: Direction, from node: SplitTree.Node) -> Bool { + // Find the slot for this node + guard let slot = slots.first(where: { $0.node == node }) else { return false } + + // Calculate the overall bounds of all slots + let overallBounds = slots.reduce(CGRect.null) { result, slot in + result.union(slot.bounds) + } + + return switch side { + case .up: + slot.bounds.minY == overallBounds.minY + case .down: + slot.bounds.maxY == overallBounds.maxY + case .left: + slot.bounds.minX == overallBounds.minX + case .right: + slot.bounds.maxX == overallBounds.maxX + } + } } // MARK: SplitTree.Node Protocols diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 120ac6377..eb140b2a3 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -282,15 +282,19 @@ class TerminalController: BaseTerminalController { // If it does, we match the focused surface. If it doesn't, we use the app // configuration. let backgroundColor: OSColor - if let surfaceTree { - if let focusedSurface, surfaceTree.doesBorderTop(view: focusedSurface) { + if !surfaceTree2.isEmpty { + if let focusedSurface = focusedSurface, + let treeRoot = surfaceTree2.root, + let focusedNode = treeRoot.node(view: focusedSurface), + treeRoot.spatial().doesBorder(side: .up, from: focusedNode) { // Similar to above, an alpha component of "0" causes compositor issues, so // we use 0.001. See: https://github.com/ghostty-org/ghostty/pull/4308 backgroundColor = OSColor(focusedSurface.backgroundColor ?? surfaceConfig.backgroundColor).withAlphaComponent(0.001) } else { // We don't have a focused surface or our surface doesn't border the // top. We choose to match the color of the top-left most surface. - backgroundColor = OSColor(surfaceTree.topLeft().backgroundColor ?? derivedConfig.backgroundColor) + let topLeftSurface = surfaceTree2.root?.leftmostLeaf() + backgroundColor = OSColor(topLeftSurface?.backgroundColor ?? derivedConfig.backgroundColor) } } else { backgroundColor = OSColor(self.derivedConfig.backgroundColor) From f1ed07caf441909871cde91e51a124930fa3f1f6 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 11:51:38 -0700 Subject: [PATCH 087/371] macos: Remove the legacy SurfaceTree --- macos/Sources/App/macOS/AppDelegate.swift | 6 ++++-- .../QuickTerminal/QuickTerminalController.swift | 17 +++++++++-------- .../Terminal/BaseTerminalController.swift | 10 +++------- .../Features/Terminal/TerminalController.swift | 8 ++++---- .../Features/Terminal/TerminalManager.swift | 3 +-- .../Features/Terminal/TerminalRestorable.swift | 17 +++-------------- 6 files changed, 24 insertions(+), 37 deletions(-) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index 38b26f606..b5023370b 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -741,8 +741,10 @@ class AppDelegate: NSObject, func findSurface(forUUID uuid: UUID) -> Ghostty.SurfaceView? { for c in terminalManager.windows { - if let v = c.controller.surfaceTree?.findUUID(uuid: uuid) { - return v + for view in c.controller.surfaceTree2 { + if view.uuid == uuid { + return view + } } } diff --git a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift index 6de33e14f..b338f8b47 100644 --- a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift +++ b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift @@ -30,11 +30,11 @@ class QuickTerminalController: BaseTerminalController { init(_ ghostty: Ghostty.App, position: QuickTerminalPosition = .top, baseConfig base: Ghostty.SurfaceConfiguration? = nil, - surfaceTree tree: Ghostty.SplitNode? = nil + surfaceTree2 tree2: SplitTree? = nil ) { self.position = position self.derivedConfig = DerivedConfig(ghostty.config) - super.init(ghostty, baseConfig: base, surfaceTree: tree) + super.init(ghostty, baseConfig: base, surfaceTree2: tree2) // Setup our notifications for behaviors let center = NotificationCenter.default @@ -233,13 +233,14 @@ class QuickTerminalController: BaseTerminalController { // Animate the window in animateWindowIn(window: window, from: position) - // If our surface tree is nil then we initialize a new terminal. The surface - // tree can be nil if for example we run "eixt" in the terminal and force + // If our surface tree is empty then we initialize a new terminal. The surface + // tree can be empty if for example we run "exit" in the terminal and force // animate out. - if (surfaceTree == nil) { - let leaf: Ghostty.SplitNode.Leaf = .init(ghostty.app!, baseConfig: nil) - surfaceTree = .leaf(leaf) - focusedSurface = leaf.surface + if surfaceTree2.isEmpty, + let ghostty_app = ghostty.app { + let view = Ghostty.SurfaceView(ghostty_app, baseConfig: nil) + surfaceTree2 = SplitTree(view: view) + focusedSurface = view } } diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index f039e17ad..028a4bece 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -41,9 +41,7 @@ class BaseTerminalController: NSWindowController, didSet { syncFocusToSurfaceTree() } } - /// The surface tree for this window. - @Published var surfaceTree: Ghostty.SplitNode? = nil - + /// The tree of splits within this terminal window. @Published var surfaceTree2: SplitTree = .init() { didSet { surfaceTreeDidChange(from: oldValue, to: surfaceTree2) } } @@ -88,7 +86,6 @@ class BaseTerminalController: NSWindowController, init(_ ghostty: Ghostty.App, baseConfig base: Ghostty.SurfaceConfiguration? = nil, - surfaceTree tree: Ghostty.SplitNode? = nil, surfaceTree2 tree2: SplitTree? = nil ) { self.ghostty = ghostty @@ -98,7 +95,6 @@ class BaseTerminalController: NSWindowController, // Initialize our initial surface. guard let ghostty_app = ghostty.app else { preconditionFailure("app must be loaded") } - self.surfaceTree = tree ?? .leaf(.init(ghostty_app, baseConfig: base)) self.surfaceTree2 = tree2 ?? .init(view: Ghostty.SurfaceView(ghostty_app, baseConfig: base)) // Setup our notifications for behaviors @@ -171,11 +167,11 @@ class BaseTerminalController: NSWindowController, } } - /// Called when the surfaceTree variable changed. + /// Called when the surfaceTree2 variable changed. /// /// Subclasses should call super first. func surfaceTreeDidChange(from: SplitTree, to: SplitTree) { - // If our surface tree becomes nil then we have no focused surface. + // If our surface tree becomes empty then we have no focused surface. if (to.isEmpty) { focusedSurface = nil } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index eb140b2a3..29f2710fe 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -45,7 +45,7 @@ class TerminalController: BaseTerminalController { // Setup our initial derived config based on the current app config self.derivedConfig = DerivedConfig(ghostty.config) - super.init(ghostty, baseConfig: base, surfaceTree: tree, surfaceTree2: tree2) + super.init(ghostty, baseConfig: base, surfaceTree2: tree2) // Setup our notifications for behaviors let center = NotificationCenter.default @@ -154,7 +154,7 @@ class TerminalController: BaseTerminalController { // If we have no surfaces in our window (is that possible?) then we update // our window appearance based on the root config. If we have surfaces, we // don't call this because the TODO - if surfaceTree == nil { + if surfaceTree2.isEmpty { syncAppearance(.init(config)) } @@ -456,10 +456,10 @@ class TerminalController: BaseTerminalController { // If we have only a single surface (no splits) and there is a default size then // we should resize to that default size. - if case let .leaf(leaf) = surfaceTree { + if case let .leaf(view) = surfaceTree2.root { // If this is our first surface then our focused surface will be nil // so we force the focused surface to the leaf. - focusedSurface = leaf.surface + focusedSurface = view if let defaultSize { window.setFrame(defaultSize, display: true) diff --git a/macos/Sources/Features/Terminal/TerminalManager.swift b/macos/Sources/Features/Terminal/TerminalManager.swift index 475b70ac9..28b969d36 100644 --- a/macos/Sources/Features/Terminal/TerminalManager.swift +++ b/macos/Sources/Features/Terminal/TerminalManager.swift @@ -197,10 +197,9 @@ class TerminalManager { /// Creates a window controller, adds it to our managed list, and returns it. func createWindow(withBaseConfig base: Ghostty.SurfaceConfiguration? = nil, - withSurfaceTree tree: Ghostty.SplitNode? = nil, withSurfaceTree2 tree2: SplitTree? = nil) -> TerminalController { // Initialize our controller to load the window - let c = TerminalController(ghostty, withBaseConfig: base, withSurfaceTree: tree, withSurfaceTree2: tree2) + let c = TerminalController(ghostty, withBaseConfig: base, withSurfaceTree2: tree2) // Create a listener for when the window is closed so we can remove it. let pubClose = NotificationCenter.default.publisher( diff --git a/macos/Sources/Features/Terminal/TerminalRestorable.swift b/macos/Sources/Features/Terminal/TerminalRestorable.swift index 5531494a5..6d5289955 100644 --- a/macos/Sources/Features/Terminal/TerminalRestorable.swift +++ b/macos/Sources/Features/Terminal/TerminalRestorable.swift @@ -7,12 +7,10 @@ class TerminalRestorableState: Codable { static let version: Int = 3 let focusedSurface: String? - let surfaceTree: Ghostty.SplitNode? - let surfaceTree2: SplitTree? + let surfaceTree2: SplitTree init(from controller: TerminalController) { self.focusedSurface = controller.focusedSurface?.uuid.uuidString - self.surfaceTree = controller.surfaceTree self.surfaceTree2 = controller.surfaceTree2 } @@ -28,7 +26,6 @@ class TerminalRestorableState: Codable { return nil } - self.surfaceTree = v.value.surfaceTree self.surfaceTree2 = v.value.surfaceTree2 self.focusedSurface = v.value.focusedSurface } @@ -87,7 +84,6 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration { // createWindow so that AppKit can place the window wherever it should // be. let c = appDelegate.terminalManager.createWindow( - withSurfaceTree: state.surfaceTree, withSurfaceTree2: state.surfaceTree2 ) guard let window = c.window else { @@ -96,10 +92,8 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration { } // Setup our restored state on the controller - // First try to find the focused surface in surfaceTree2 - if let focusedStr = state.focusedSurface, - let focusedUUID = UUID(uuidString: focusedStr) { - // Try surfaceTree2 first + // Find the focused surface in surfaceTree2 + if let focusedStr = state.focusedSurface { var foundView: Ghostty.SurfaceView? for view in c.surfaceTree2 { if view.uuid.uuidString == focusedStr { @@ -108,11 +102,6 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration { } } - // Fall back to surfaceTree if not found - if foundView == nil { - foundView = c.surfaceTree?.findUUID(uuid: focusedUUID) - } - if let view = foundView { c.focusedSurface = view restoreFocus(to: view, inWindow: window) From 77458ef3089214e8a073671fb6a56de565545033 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 11:53:19 -0700 Subject: [PATCH 088/371] macos: rename surfaceTree2 to surfaceTree --- macos/Sources/App/macOS/AppDelegate.swift | 2 +- .../QuickTerminalController.swift | 8 +-- .../Terminal/BaseTerminalController.swift | 57 +++++++++---------- .../Terminal/TerminalController.swift | 29 +++++----- .../Features/Terminal/TerminalManager.swift | 6 +- .../Terminal/TerminalRestorable.swift | 12 ++-- .../Features/Terminal/TerminalView.swift | 4 +- macos/Sources/Ghostty/Ghostty.App.swift | 2 +- 8 files changed, 59 insertions(+), 61 deletions(-) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index b5023370b..c6816d50c 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -741,7 +741,7 @@ class AppDelegate: NSObject, func findSurface(forUUID uuid: UUID) -> Ghostty.SurfaceView? { for c in terminalManager.windows { - for view in c.controller.surfaceTree2 { + for view in c.controller.surfaceTree { if view.uuid == uuid { return view } diff --git a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift index b338f8b47..0dcfce204 100644 --- a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift +++ b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift @@ -30,11 +30,11 @@ class QuickTerminalController: BaseTerminalController { init(_ ghostty: Ghostty.App, position: QuickTerminalPosition = .top, baseConfig base: Ghostty.SurfaceConfiguration? = nil, - surfaceTree2 tree2: SplitTree? = nil + surfaceTree tree: SplitTree? = nil ) { self.position = position self.derivedConfig = DerivedConfig(ghostty.config) - super.init(ghostty, baseConfig: base, surfaceTree2: tree2) + super.init(ghostty, baseConfig: base, surfaceTree: tree) // Setup our notifications for behaviors let center = NotificationCenter.default @@ -236,10 +236,10 @@ class QuickTerminalController: BaseTerminalController { // If our surface tree is empty then we initialize a new terminal. The surface // tree can be empty if for example we run "exit" in the terminal and force // animate out. - if surfaceTree2.isEmpty, + if surfaceTree.isEmpty, let ghostty_app = ghostty.app { let view = Ghostty.SurfaceView(ghostty_app, baseConfig: nil) - surfaceTree2 = SplitTree(view: view) + surfaceTree = SplitTree(view: view) focusedSurface = view } } diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 028a4bece..3cc5843a5 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -42,8 +42,8 @@ class BaseTerminalController: NSWindowController, } /// The tree of splits within this terminal window. - @Published var surfaceTree2: SplitTree = .init() { - didSet { surfaceTreeDidChange(from: oldValue, to: surfaceTree2) } + @Published var surfaceTree: SplitTree = .init() { + didSet { surfaceTreeDidChange(from: oldValue, to: surfaceTree) } } /// This can be set to show/hide the command palette. @@ -86,7 +86,7 @@ class BaseTerminalController: NSWindowController, init(_ ghostty: Ghostty.App, baseConfig base: Ghostty.SurfaceConfiguration? = nil, - surfaceTree2 tree2: SplitTree? = nil + surfaceTree tree: SplitTree? = nil ) { self.ghostty = ghostty self.derivedConfig = DerivedConfig(ghostty.config) @@ -95,7 +95,7 @@ class BaseTerminalController: NSWindowController, // Initialize our initial surface. guard let ghostty_app = ghostty.app else { preconditionFailure("app must be loaded") } - self.surfaceTree2 = tree2 ?? .init(view: Ghostty.SurfaceView(ghostty_app, baseConfig: base)) + self.surfaceTree = tree ?? .init(view: Ghostty.SurfaceView(ghostty_app, baseConfig: base)) // Setup our notifications for behaviors let center = NotificationCenter.default @@ -167,7 +167,7 @@ class BaseTerminalController: NSWindowController, } } - /// Called when the surfaceTree2 variable changed. + /// Called when the surfaceTree variable changed. /// /// Subclasses should call super first. func surfaceTreeDidChange(from: SplitTree, to: SplitTree) { @@ -180,7 +180,7 @@ class BaseTerminalController: NSWindowController, /// Update all surfaces with the focus state. This ensures that libghostty has an accurate view about /// what surface is focused. This must be called whenever a surface OR window changes focus. func syncFocusToSurfaceTree() { - for surfaceView in surfaceTree2 { + for surfaceView in surfaceTree { // Our focus state requires that this window is key and our currently // focused surface is the surface in this view. let focused: Bool = (window?.isKeyWindow ?? false) && @@ -296,21 +296,21 @@ class BaseTerminalController: NSWindowController, @objc private func ghosttyCommandPaletteDidToggle(_ notification: Notification) { guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree2.contains(surfaceView) else { return } + guard surfaceTree.contains(surfaceView) else { return } toggleCommandPalette(nil) } @objc private func ghosttyMaximizeDidToggle(_ notification: Notification) { guard let window else { return } guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree2.contains(surfaceView) else { return } + guard surfaceTree.contains(surfaceView) else { return } window.zoom(nil) } @objc private func ghosttyDidCloseSurface(_ notification: Notification) { // The target must be within our tree guard let target = notification.object as? Ghostty.SurfaceView else { return } - guard let node = surfaceTree2.root?.node(view: target) else { return } + guard let node = surfaceTree.root?.node(view: target) else { return } // TODO: fix focus @@ -323,7 +323,7 @@ class BaseTerminalController: NSWindowController, // If the child process is not alive, then we exit immediately guard processAlive else { - surfaceTree2 = surfaceTree2.remove(node) + surfaceTree = surfaceTree.remove(node) return } @@ -337,7 +337,7 @@ class BaseTerminalController: NSWindowController, informativeText: "The terminal still has a running process. If you close the terminal the process will be killed." ) { [weak self] in if let self { - self.surfaceTree2 = self.surfaceTree2.remove(node) + self.surfaceTree = self.surfaceTree.remove(node) } } } @@ -345,7 +345,7 @@ class BaseTerminalController: NSWindowController, @objc private func ghosttyDidNewSplit(_ notification: Notification) { // The target must be within our tree guard let oldView = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree2.root?.node(view: oldView) != nil else { return } + guard surfaceTree.root?.node(view: oldView) != nil else { return } // Notification must contain our base config let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey] @@ -369,7 +369,7 @@ class BaseTerminalController: NSWindowController, // Do the split do { - surfaceTree2 = try surfaceTree2.insert(view: newView, at: oldView, direction: splitDirection) + surfaceTree = try surfaceTree.insert(view: newView, at: oldView, direction: splitDirection) } catch { // If splitting fails for any reason (it should not), then we just log // and return. The new view we created will be deinitialized and its @@ -386,16 +386,16 @@ class BaseTerminalController: NSWindowController, guard let target = notification.object as? Ghostty.SurfaceView else { return } // Check if target surface is in current controller's tree - guard surfaceTree2.contains(target) else { return } + guard surfaceTree.contains(target) else { return } // Equalize the splits - surfaceTree2 = surfaceTree2.equalize() + surfaceTree = surfaceTree.equalize() } @objc private func ghosttyDidFocusSplit(_ notification: Notification) { // The target must be within our tree guard let target = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree2.root?.node(view: target) != nil else { return } + guard surfaceTree.root?.node(view: target) != nil else { return } // Get the direction from the notification guard let directionAny = notification.userInfo?[Ghostty.Notification.SplitDirectionKey] else { return } @@ -413,10 +413,10 @@ class BaseTerminalController: NSWindowController, } // Find the node for the target surface - guard let targetNode = surfaceTree2.root?.node(view: target) else { return } + guard let targetNode = surfaceTree.root?.node(view: target) else { return } // Find the next surface to focus - guard let nextSurface = surfaceTree2.focusTarget(for: focusDirection, from: targetNode) else { + guard let nextSurface = surfaceTree.focusTarget(for: focusDirection, from: targetNode) else { return } @@ -427,15 +427,15 @@ class BaseTerminalController: NSWindowController, @objc private func ghosttyDidToggleSplitZoom(_ notification: Notification) { // The target must be within our tree guard let target = notification.object as? Ghostty.SurfaceView else { return } - guard let targetNode = surfaceTree2.root?.node(view: target) else { return } + guard let targetNode = surfaceTree.root?.node(view: target) else { return } // Toggle the zoomed state - if surfaceTree2.zoomed == targetNode { + if surfaceTree.zoomed == targetNode { // Already zoomed, unzoom it - surfaceTree2 = SplitTree(root: surfaceTree2.root, zoomed: nil) + surfaceTree = SplitTree(root: surfaceTree.root, zoomed: nil) } else { // Not zoomed or different node zoomed, zoom this node - surfaceTree2 = SplitTree(root: surfaceTree2.root, zoomed: targetNode) + surfaceTree = SplitTree(root: surfaceTree.root, zoomed: targetNode) } // Ensure focus stays on the target surface. We lose focus when we do @@ -458,8 +458,7 @@ class BaseTerminalController: NSWindowController, } private func localEventFlagsChanged(_ event: NSEvent) -> NSEvent? { - // Also update surfaceTree2 - var surfaces: [Ghostty.SurfaceView] = surfaceTree2.map { $0 } + var surfaces: [Ghostty.SurfaceView] = surfaceTree.map { $0 } // If we're the main window receiving key input, then we want to avoid // calling this on our focused surface because that'll trigger a double @@ -489,7 +488,7 @@ class BaseTerminalController: NSWindowController, // want to care if the surface is in the tree so we don't listen to titles of // closed surfaces. if let titleSurface = focusedSurface ?? lastFocusedSurface, - surfaceTree2.contains(titleSurface) { + surfaceTree.contains(titleSurface) { // If we have a surface, we want to listen for title changes. titleSurface.$title .sink { [weak self] in self?.titleDidChange(to: $0) } @@ -527,7 +526,7 @@ class BaseTerminalController: NSWindowController, func splitDidResize(node: SplitTree.Node, to newRatio: Double) { let resizedNode = node.resize(to: newRatio) do { - surfaceTree2 = try surfaceTree2.replace(node: node, with: resizedNode) + surfaceTree = try surfaceTree.replace(node: node, with: resizedNode) } catch { // TODO: log return @@ -687,13 +686,13 @@ class BaseTerminalController: NSWindowController, guard let window = self.window else { return true } // If we have no surfaces, close. - if surfaceTree2.isEmpty { return true } + if surfaceTree.isEmpty { return true } // If we already have an alert, continue with it guard alert == nil else { return false } // If our surfaces don't require confirmation, close. - if !surfaceTree2.contains(where: { $0.needsConfirmQuit }) { return true } + if !surfaceTree.contains(where: { $0.needsConfirmQuit }) { return true } // We require confirmation, so show an alert as long as we aren't already. confirmClose( @@ -729,7 +728,7 @@ class BaseTerminalController: NSWindowController, func windowDidChangeOcclusionState(_ notification: Notification) { let visible = self.window?.occlusionState.contains(.visible) ?? false - for view in surfaceTree2 { + for view in surfaceTree { if let surface = view.surface { ghostty_surface_set_occlusion(surface, visible) } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 29f2710fe..42eb7eca4 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -32,8 +32,7 @@ class TerminalController: BaseTerminalController { init(_ ghostty: Ghostty.App, withBaseConfig base: Ghostty.SurfaceConfiguration? = nil, - withSurfaceTree tree: Ghostty.SplitNode? = nil, - withSurfaceTree2 tree2: SplitTree? = nil + withSurfaceTree tree: SplitTree? = nil ) { // The window we manage is not restorable if we've specified a command // to execute. We do this because the restored window is meaningless at the @@ -45,7 +44,7 @@ class TerminalController: BaseTerminalController { // Setup our initial derived config based on the current app config self.derivedConfig = DerivedConfig(ghostty.config) - super.init(ghostty, baseConfig: base, surfaceTree2: tree2) + super.init(ghostty, baseConfig: base, surfaceTree: tree) // Setup our notifications for behaviors let center = NotificationCenter.default @@ -154,7 +153,7 @@ class TerminalController: BaseTerminalController { // If we have no surfaces in our window (is that possible?) then we update // our window appearance based on the root config. If we have surfaces, we // don't call this because the TODO - if surfaceTree2.isEmpty { + if surfaceTree.isEmpty { syncAppearance(.init(config)) } @@ -164,7 +163,7 @@ class TerminalController: BaseTerminalController { // This is a surface-level config update. If we have the surface, we // update our appearance based on it. guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree2.contains(surfaceView) else { return } + guard surfaceTree.contains(surfaceView) else { return } // We can't use surfaceView.derivedConfig because it may not be updated // yet since it also responds to notifications. @@ -239,7 +238,7 @@ class TerminalController: BaseTerminalController { window.isLightTheme = OSColor(surfaceConfig.backgroundColor).isLightColor // Sync our zoom state for splits - window.surfaceIsZoomed = surfaceTree2.zoomed != nil + window.surfaceIsZoomed = surfaceTree.zoomed != nil // If our window is not visible, then we do nothing. Some things such as blurring // have no effect if the window is not visible. Ultimately, we'll have this called @@ -282,9 +281,9 @@ class TerminalController: BaseTerminalController { // If it does, we match the focused surface. If it doesn't, we use the app // configuration. let backgroundColor: OSColor - if !surfaceTree2.isEmpty { + if !surfaceTree.isEmpty { if let focusedSurface = focusedSurface, - let treeRoot = surfaceTree2.root, + let treeRoot = surfaceTree.root, let focusedNode = treeRoot.node(view: focusedSurface), treeRoot.spatial().doesBorder(side: .up, from: focusedNode) { // Similar to above, an alpha component of "0" causes compositor issues, so @@ -293,7 +292,7 @@ class TerminalController: BaseTerminalController { } else { // We don't have a focused surface or our surface doesn't border the // top. We choose to match the color of the top-left most surface. - let topLeftSurface = surfaceTree2.root?.leftmostLeaf() + let topLeftSurface = surfaceTree.root?.leftmostLeaf() backgroundColor = OSColor(topLeftSurface?.backgroundColor ?? derivedConfig.backgroundColor) } } else { @@ -456,7 +455,7 @@ class TerminalController: BaseTerminalController { // If we have only a single surface (no splits) and there is a default size then // we should resize to that default size. - if case let .leaf(view) = surfaceTree2.root { + if case let .leaf(view) = surfaceTree.root { // If this is our first surface then our focused surface will be nil // so we force the focused surface to the leaf. focusedSurface = view @@ -604,7 +603,7 @@ class TerminalController: BaseTerminalController { return } - if surfaceTree2.contains(where: { $0.needsConfirmQuit }) { + if surfaceTree.contains(where: { $0.needsConfirmQuit }) { confirmClose( messageText: "Close Tab?", informativeText: "The terminal still has a running process. If you close the tab the process will be killed." @@ -641,7 +640,7 @@ class TerminalController: BaseTerminalController { guard let controller = tabWindow.windowController as? TerminalController else { return false } - return controller.surfaceTree2.contains(where: { $0.needsConfirmQuit }) + return controller.surfaceTree.contains(where: { $0.needsConfirmQuit }) } // If none need confirmation then we can just close all the windows. @@ -819,19 +818,19 @@ class TerminalController: BaseTerminalController { @objc private func onCloseTab(notification: SwiftUI.Notification) { guard let target = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree2.contains(target) else { return } + guard surfaceTree.contains(target) else { return } closeTab(self) } @objc private func onCloseWindow(notification: SwiftUI.Notification) { guard let target = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree2.contains(target) else { return } + guard surfaceTree.contains(target) else { return } closeWindow(self) } @objc private func onResetWindowSize(notification: SwiftUI.Notification) { guard let target = notification.object as? Ghostty.SurfaceView else { return } - guard surfaceTree2.contains(target) else { return } + guard surfaceTree.contains(target) else { return } returnToDefaultSize(nil) } diff --git a/macos/Sources/Features/Terminal/TerminalManager.swift b/macos/Sources/Features/Terminal/TerminalManager.swift index 28b969d36..805ae6e93 100644 --- a/macos/Sources/Features/Terminal/TerminalManager.swift +++ b/macos/Sources/Features/Terminal/TerminalManager.swift @@ -197,9 +197,9 @@ class TerminalManager { /// Creates a window controller, adds it to our managed list, and returns it. func createWindow(withBaseConfig base: Ghostty.SurfaceConfiguration? = nil, - withSurfaceTree2 tree2: SplitTree? = nil) -> TerminalController { + withSurfaceTree tree: SplitTree? = nil) -> TerminalController { // Initialize our controller to load the window - let c = TerminalController(ghostty, withBaseConfig: base, withSurfaceTree2: tree2) + let c = TerminalController(ghostty, withBaseConfig: base, withSurfaceTree: tree) // Create a listener for when the window is closed so we can remove it. let pubClose = NotificationCenter.default.publisher( @@ -268,7 +268,7 @@ class TerminalManager { func closeAllWindows() { var needsConfirm: Bool = false for w in self.windows { - if w.controller.surfaceTree2.contains(where: { $0.needsConfirmQuit }) { + if w.controller.surfaceTree.contains(where: { $0.needsConfirmQuit }) { needsConfirm = true break } diff --git a/macos/Sources/Features/Terminal/TerminalRestorable.swift b/macos/Sources/Features/Terminal/TerminalRestorable.swift index 6d5289955..5229dc46e 100644 --- a/macos/Sources/Features/Terminal/TerminalRestorable.swift +++ b/macos/Sources/Features/Terminal/TerminalRestorable.swift @@ -7,11 +7,11 @@ class TerminalRestorableState: Codable { static let version: Int = 3 let focusedSurface: String? - let surfaceTree2: SplitTree + let surfaceTree: SplitTree init(from controller: TerminalController) { self.focusedSurface = controller.focusedSurface?.uuid.uuidString - self.surfaceTree2 = controller.surfaceTree2 + self.surfaceTree = controller.surfaceTree } init?(coder aDecoder: NSCoder) { @@ -26,7 +26,7 @@ class TerminalRestorableState: Codable { return nil } - self.surfaceTree2 = v.value.surfaceTree2 + self.surfaceTree = v.value.surfaceTree self.focusedSurface = v.value.focusedSurface } @@ -84,7 +84,7 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration { // createWindow so that AppKit can place the window wherever it should // be. let c = appDelegate.terminalManager.createWindow( - withSurfaceTree2: state.surfaceTree2 + withSurfaceTree: state.surfaceTree ) guard let window = c.window else { completionHandler(nil, TerminalRestoreError.windowDidNotLoad) @@ -92,10 +92,10 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration { } // Setup our restored state on the controller - // Find the focused surface in surfaceTree2 + // Find the focused surface in surfaceTree if let focusedStr = state.focusedSurface { var foundView: Ghostty.SurfaceView? - for view in c.surfaceTree2 { + for view in c.surfaceTree { if view.uuid.uuidString == focusedStr { foundView = view break diff --git a/macos/Sources/Features/Terminal/TerminalView.swift b/macos/Sources/Features/Terminal/TerminalView.swift index 6c990d496..cb6f11bce 100644 --- a/macos/Sources/Features/Terminal/TerminalView.swift +++ b/macos/Sources/Features/Terminal/TerminalView.swift @@ -27,7 +27,7 @@ protocol TerminalViewDelegate: AnyObject { protocol TerminalViewModel: ObservableObject { /// The tree of terminal surfaces (splits) within the view. This is mutated by TerminalView /// and children. This should be @Published. - var surfaceTree2: SplitTree { get set } + var surfaceTree: SplitTree { get set } /// The command palette state. var commandPaletteIsShowing: Bool { get set } @@ -77,7 +77,7 @@ struct TerminalView: View { } TerminalSplitTreeView( - tree: viewModel.surfaceTree2, + tree: viewModel.surfaceTree, onResize: { delegate?.splitDidResize(node: $0, to: $1) }) .environmentObject(ghostty) .focused($focused) diff --git a/macos/Sources/Ghostty/Ghostty.App.swift b/macos/Sources/Ghostty/Ghostty.App.swift index 08c284b04..4a9dc0ea6 100644 --- a/macos/Sources/Ghostty/Ghostty.App.swift +++ b/macos/Sources/Ghostty/Ghostty.App.swift @@ -921,7 +921,7 @@ extension Ghostty { // we should only be returning true if we actually performed the action, // but this handles the most common case of caring about goto_split performability // which is the no-split case. - guard controller.surfaceTree2.isSplit else { return false } + guard controller.surfaceTree.isSplit else { return false } NotificationCenter.default.post( name: Notification.ghosttyFocusSplit, From 6c97e4a59a22d8272acaf4147b0b093ef4826ff7 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 12:01:50 -0700 Subject: [PATCH 089/371] macos: fix focus after closing splits --- .../Terminal/BaseTerminalController.swift | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 3cc5843a5..dfc8a2221 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -234,6 +234,39 @@ class BaseTerminalController: NSWindowController, self.alert = alert } + // MARK: Focus Management + + /// Find the next surface to focus when a node is being closed. + /// Goes to previous split unless we're the leftmost leaf, then goes to next. + private func findNextFocusTargetAfterClosing(node: SplitTree.Node) -> Ghostty.SurfaceView? { + guard let root = surfaceTree.root else { return nil } + + // If we're the leftmost, then we move to the next surface after closing. + // Otherwise, we move to the previous. + if root.leftmostLeaf() == node.leftmostLeaf() { + return surfaceTree.focusTarget(for: .next, from: node) + } else { + return surfaceTree.focusTarget(for: .previous, from: node) + } + } + + /// Remove a node from the surface tree and move focus appropriately. + private func removeSurfaceAndMoveFocus(_ node: SplitTree.Node) { + let nextTarget = findNextFocusTargetAfterClosing(node: node) + let oldFocused = focusedSurface + let focused = node.contains { $0 == focusedSurface } + + // Remove the node from the tree + surfaceTree = surfaceTree.remove(node) + + // Move focus if the closed surface was focused and we have a next target + if let nextTarget, focused { + DispatchQueue.main.async { + Ghostty.moveFocus(to: nextTarget, from: oldFocused) + } + } + } + // MARK: Notifications @objc private func didChangeScreenParametersNotification(_ notification: Notification) { @@ -312,8 +345,6 @@ class BaseTerminalController: NSWindowController, guard let target = notification.object as? Ghostty.SurfaceView else { return } guard let node = surfaceTree.root?.node(view: target) else { return } - // TODO: fix focus - var processAlive = false if let valueAny = notification.userInfo?["process_alive"] { if let value = valueAny as? Bool { @@ -323,7 +354,7 @@ class BaseTerminalController: NSWindowController, // If the child process is not alive, then we exit immediately guard processAlive else { - surfaceTree = surfaceTree.remove(node) + removeSurfaceAndMoveFocus(node) return } @@ -337,7 +368,7 @@ class BaseTerminalController: NSWindowController, informativeText: "The terminal still has a running process. If you close the terminal the process will be killed." ) { [weak self] in if let self { - self.surfaceTree = self.surfaceTree.remove(node) + self.removeSurfaceAndMoveFocus(node) } } } From 19a9156ae1d562250b42023d1914f2482805cec4 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 12:11:33 -0700 Subject: [PATCH 090/371] macos: address remaining todos --- macos/Sources/Features/Terminal/BaseTerminalController.swift | 4 ++-- macos/Sources/Features/Terminal/TerminalController.swift | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index dfc8a2221..be4b59e7a 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -405,7 +405,7 @@ class BaseTerminalController: NSWindowController, // If splitting fails for any reason (it should not), then we just log // and return. The new view we created will be deinitialized and its // no big deal. - // TODO: log + Ghostty.logger.warning("failed to insert split: \(error)") return } @@ -559,7 +559,7 @@ class BaseTerminalController: NSWindowController, do { surfaceTree = try surfaceTree.replace(node: node, with: resizedNode) } catch { - // TODO: log + Ghostty.logger.warning("failed to replace node during split resize: \(error)") return } } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 42eb7eca4..9c1e82b69 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -152,7 +152,7 @@ class TerminalController: BaseTerminalController { // If we have no surfaces in our window (is that possible?) then we update // our window appearance based on the root config. If we have surfaces, we - // don't call this because the TODO + // don't call this because focused surface changes will trigger appearance updates. if surfaceTree.isEmpty { syncAppearance(.init(config)) } From 5299f10e13ec73e47d0e67843e9e56bf560bdbd5 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 12:17:50 -0700 Subject: [PATCH 091/371] macos: unzoom on new split and focus change --- macos/Sources/Features/Splits/SplitTree.swift | 3 ++- macos/Sources/Features/Terminal/BaseTerminalController.swift | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index 78bed7120..d47e51bec 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -108,11 +108,12 @@ extension SplitTree { } /// Insert a new view at the given view point by creating a split in the given direction. + /// This will always reset the zoomed state of the tree. func insert(view: ViewType, at: ViewType, direction: NewDirection) throws -> Self { guard let root else { throw SplitError.viewNotFound } return .init( root: try root.insert(view: view, at: at, direction: direction), - zoomed: zoomed) + zoomed: nil) } /// Remove a node from the tree. If the node being removed is part of a split, diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index be4b59e7a..ba57fbf70 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -451,6 +451,11 @@ class BaseTerminalController: NSWindowController, return } + // Remove the zoomed state for this surface tree. + if surfaceTree.zoomed != nil { + surfaceTree = .init(root: surfaceTree.root, zoomed: nil) + } + // Move focus to the next surface Ghostty.moveFocus(to: nextSurface, from: target) } From 69c3c359cb65cf0e09f8a3c8e7013b02f23c6005 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 12:53:31 -0700 Subject: [PATCH 092/371] macos: resize split keybind handling --- macos/Sources/Features/Splits/SplitTree.swift | 176 +++++++++++++++++- .../Terminal/BaseTerminalController.swift | 37 ++++ 2 files changed, 206 insertions(+), 7 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index d47e51bec..ab4b387a4 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -213,6 +213,108 @@ extension SplitTree { let newRoot = root.equalize() return .init(root: newRoot, zoomed: zoomed) } + + /// Resize a node in the tree by the given pixel amount in the specified direction. + /// + /// This method adjusts the split ratios of the tree to accommodate the requested resize + /// operation. For up/down resizing, it finds the nearest parent vertical split and adjusts + /// its ratio. For left/right resizing, it finds the nearest parent horizontal split. + /// The bounds parameter is used to construct the spatial tree representation which is + /// needed to calculate the current pixel dimensions. + /// + /// This will always reset the zoomed state. + /// + /// - Parameters: + /// - node: The node to resize + /// - by: The number of pixels to resize by + /// - direction: The direction to resize in (up, down, left, right) + /// - bounds: The bounds used to construct the spatial tree representation + /// - Returns: A new SplitTree with the adjusted split ratios + /// - Throws: SplitError.viewNotFound if the node is not found in the tree or no suitable parent split exists + func resize(node: Node, by pixels: UInt16, in direction: Spatial.Direction, with bounds: CGRect) throws -> Self { + guard let root else { throw SplitError.viewNotFound } + + // Find the path to the target node + guard let path = root.path(to: node) else { + throw SplitError.viewNotFound + } + + // Determine which type of split we need to find based on resize direction + let targetSplitDirection: Direction = switch direction { + case .up, .down: .vertical + case .left, .right: .horizontal + } + + // Find the nearest parent split of the correct type by walking up the path + var splitPath: Path? + var splitNode: Node? + + for i in stride(from: path.path.count - 1, through: 0, by: -1) { + let parentPath = Path(path: Array(path.path.prefix(i))) + if let parent = root.node(at: parentPath), case .split(let split) = parent { + if split.direction == targetSplitDirection { + splitPath = parentPath + splitNode = parent + break + } + } + } + + guard let splitPath = splitPath, + let splitNode = splitNode, + case .split(let split) = splitNode else { + throw SplitError.viewNotFound + } + + // Get current spatial representation to calculate pixel dimensions + let spatial = root.spatial(within: bounds.size) + guard let splitSlot = spatial.slots.first(where: { $0.node == splitNode }) else { + throw SplitError.viewNotFound + } + + // Calculate the new ratio based on pixel change + let pixelOffset = Double(pixels) + let newRatio: Double + + switch (split.direction, direction) { + case (.horizontal, .left): + // Moving left boundary: decrease left side + newRatio = Swift.max(0.1, Swift.min(0.9, split.ratio - (pixelOffset / splitSlot.bounds.width))) + case (.horizontal, .right): + // Moving right boundary: increase left side + newRatio = Swift.max(0.1, Swift.min(0.9, split.ratio + (pixelOffset / splitSlot.bounds.width))) + case (.vertical, .up): + // Moving top boundary: decrease top side + newRatio = Swift.max(0.1, Swift.min(0.9, split.ratio - (pixelOffset / splitSlot.bounds.height))) + case (.vertical, .down): + // Moving bottom boundary: increase top side + newRatio = Swift.max(0.1, Swift.min(0.9, split.ratio + (pixelOffset / splitSlot.bounds.height))) + default: + // Direction doesn't match split type - shouldn't happen due to earlier logic + throw SplitError.viewNotFound + } + + // Create new split with adjusted ratio + let newSplit = Node.Split( + direction: split.direction, + ratio: newRatio, + left: split.left, + right: split.right + ) + + // Replace the split node with the new one + let newRoot = try root.replaceNode(at: splitPath, with: .split(newSplit)) + return .init(root: newRoot, zoomed: nil) + } + + /// Returns the total bounds of the split hierarchy using NSView bounds. + /// Ignores x/y coordinates and assumes views are laid out in a perfect grid. + /// Also ignores any possible padding between views. + /// - Returns: The total width and height needed to contain all views + func viewBounds() -> CGSize { + guard let root else { return .zero } + return root.viewBounds() + } } // MARK: SplitTree.Node @@ -277,6 +379,27 @@ extension SplitTree.Node { return search(self) ? Path(path: components) : nil } + + /// Returns the node at the given path from this node as root. + func node(at path: Path) -> Node? { + if path.isEmpty { + return self + } + + guard case .split(let split) = self else { + return nil + } + + let component = path.path[0] + let remainingPath = Path(path: Array(path.path.dropFirst())) + + switch component { + case .left: + return split.left.node(at: remainingPath) + case .right: + return split.right.node(at: remainingPath) + } + } /// Inserts a new view into the split tree by creating a split at the location of an existing view. /// @@ -541,6 +664,36 @@ extension SplitTree.Node { split.right.calculateViewBounds(in: rightBounds) } } + + /// Returns the total bounds of this subtree using NSView bounds. + /// Ignores x/y coordinates and assumes views are laid out in a perfect grid. + /// - Returns: The total width and height needed to contain all views in this subtree + func viewBounds() -> CGSize { + switch self { + case .leaf(let view): + return view.bounds.size + + case .split(let split): + let leftBounds = split.left.viewBounds() + let rightBounds = split.right.viewBounds() + + switch split.direction { + case .horizontal: + // Horizontal split: width is sum, height is max + return CGSize( + width: leftBounds.width + rightBounds.width, + height: Swift.max(leftBounds.height, rightBounds.height) + ) + + case .vertical: + // Vertical split: height is sum, width is max + return CGSize( + width: Swift.max(leftBounds.width, rightBounds.width), + height: leftBounds.height + rightBounds.height + ) + } + } + } } // MARK: SplitTree.Node Spatial @@ -575,16 +728,25 @@ extension SplitTree.Node { /// // - Node bounds based on actual split ratios /// ``` /// + /// - Parameter bounds: Optional size constraints for the spatial representation. If nil, uses artificial dimensions based + /// on grid layout /// - Returns: A `Spatial` struct containing all slots with their calculated bounds - func spatial() -> SplitTree.Spatial { - // First, calculate the total dimensions needed - let dimensions = dimensions() + func spatial(within bounds: CGSize? = nil) -> SplitTree.Spatial { + // If we're not given bounds, we use artificial dimensions based on + // the total width/height in columns/rows. + let width: Double + let height: Double + if let bounds { + width = bounds.width + height = bounds.height + } else { + let (w, h) = self.dimensions() + width = Double(w) + height = Double(h) + } // Calculate slots with relative bounds - let slots = spatialSlots( - in: CGRect(x: 0, y: 0, width: Double(dimensions.width), height: Double(dimensions.height)) - ) - + let slots = spatialSlots(in: CGRect(x: 0, y: 0, width: width, height: height)) return SplitTree.Spatial(slots: slots) } diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index ba57fbf70..5e2777195 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -151,6 +151,11 @@ class BaseTerminalController: NSWindowController, selector: #selector(ghosttyDidToggleSplitZoom(_:)), name: Ghostty.Notification.didToggleSplitZoom, object: nil) + center.addObserver( + self, + selector: #selector(ghosttyDidResizeSplit(_:)), + name: Ghostty.Notification.didResizeSplit, + object: nil) // Listen for local events that we need to know of outside of // single surface handlers. @@ -480,6 +485,38 @@ class BaseTerminalController: NSWindowController, Ghostty.moveFocus(to: target) } } + + @objc private func ghosttyDidResizeSplit(_ notification: Notification) { + // The target must be within our tree + guard let target = notification.object as? Ghostty.SurfaceView else { return } + guard let targetNode = surfaceTree.root?.node(view: target) else { return } + + // Extract direction and amount from notification + guard let directionAny = notification.userInfo?[Ghostty.Notification.ResizeSplitDirectionKey] else { return } + guard let direction = directionAny as? Ghostty.SplitResizeDirection else { return } + + guard let amountAny = notification.userInfo?[Ghostty.Notification.ResizeSplitAmountKey] else { return } + guard let amount = amountAny as? UInt16 else { return } + + // Convert Ghostty.SplitResizeDirection to SplitTree.Spatial.Direction + let spatialDirection: SplitTree.Spatial.Direction + switch direction { + case .up: spatialDirection = .up + case .down: spatialDirection = .down + case .left: spatialDirection = .left + case .right: spatialDirection = .right + } + + // Use viewBounds for the spatial calculation bounds + let bounds = CGRect(origin: .zero, size: surfaceTree.viewBounds()) + + // Perform the resize using the new SplitTree resize method + do { + surfaceTree = try surfaceTree.resize(node: targetNode, by: amount, in: spatialDirection, with: bounds) + } catch { + Ghostty.logger.warning("failed to resize split: \(error)") + } + } // MARK: Local Events From 9474092f77164d5e85be395bd1b614a257923399 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 13:20:14 -0700 Subject: [PATCH 093/371] macos: remove the old split implementation --- macos/Ghostty.xcodeproj/project.pbxproj | 8 - macos/Sources/Ghostty/Ghostty.SplitNode.swift | 481 ------------------ .../Ghostty/Ghostty.TerminalSplit.swift | 468 ----------------- macos/Sources/Ghostty/SurfaceView.swift | 54 ++ 4 files changed, 54 insertions(+), 957 deletions(-) delete mode 100644 macos/Sources/Ghostty/Ghostty.SplitNode.swift delete mode 100644 macos/Sources/Ghostty/Ghostty.TerminalSplit.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 8c73d55c5..bb9e860f3 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -70,8 +70,6 @@ A596309C2AEE1C9E00D64628 /* TerminalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A596309B2AEE1C9E00D64628 /* TerminalController.swift */; }; A596309E2AEE1D6C00D64628 /* TerminalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A596309D2AEE1D6C00D64628 /* TerminalView.swift */; }; A59630A02AEF6AEB00D64628 /* TerminalManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A596309F2AEF6AEB00D64628 /* TerminalManager.swift */; }; - A59630A22AF0415000D64628 /* Ghostty.TerminalSplit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59630A12AF0415000D64628 /* Ghostty.TerminalSplit.swift */; }; - A59630A42AF059BB00D64628 /* Ghostty.SplitNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59630A32AF059BB00D64628 /* Ghostty.SplitNode.swift */; }; A5985CD72C320C4500C57AD3 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5985CD62C320C4500C57AD3 /* String+Extension.swift */; }; A5985CD82C320C4500C57AD3 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5985CD62C320C4500C57AD3 /* String+Extension.swift */; }; A5985CE62C33060F00C57AD3 /* man in Resources */ = {isa = PBXBuildFile; fileRef = A5985CE52C33060F00C57AD3 /* man */; }; @@ -178,8 +176,6 @@ A596309B2AEE1C9E00D64628 /* TerminalController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalController.swift; sourceTree = ""; }; A596309D2AEE1D6C00D64628 /* TerminalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalView.swift; sourceTree = ""; }; A596309F2AEF6AEB00D64628 /* TerminalManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalManager.swift; sourceTree = ""; }; - A59630A12AF0415000D64628 /* Ghostty.TerminalSplit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.TerminalSplit.swift; sourceTree = ""; }; - A59630A32AF059BB00D64628 /* Ghostty.SplitNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.SplitNode.swift; sourceTree = ""; }; A5985CD62C320C4500C57AD3 /* String+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; A5985CE52C33060F00C57AD3 /* man */ = {isa = PBXFileReference; lastKnownFileType = folder; name = man; path = "../zig-out/share/man"; sourceTree = ""; }; A599CDAF2CF103F20049FA26 /* NSAppearance+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSAppearance+Extension.swift"; sourceTree = ""; }; @@ -409,8 +405,6 @@ A5CF66D62D29DDB100139794 /* Ghostty.Event.swift */, A5278A9A2AA05B2600CD3039 /* Ghostty.Input.swift */, A56D58852ACDDB4100508D2C /* Ghostty.Shell.swift */, - A59630A32AF059BB00D64628 /* Ghostty.SplitNode.swift */, - A59630A12AF0415000D64628 /* Ghostty.TerminalSplit.swift */, A55685DF29A03A9F004303CE /* AppError.swift */, A52FFF5A2CAA54A8000C6A5B /* FullscreenMode+Extension.swift */, A5CF66D32D289CEA00139794 /* NSEvent+Extension.swift */, @@ -690,7 +684,6 @@ buildActionMask = 2147483647; files = ( A5AEB1652D5BE7D000513529 /* LastWindowPosition.swift in Sources */, - A59630A42AF059BB00D64628 /* Ghostty.SplitNode.swift in Sources */, A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */, A54B0CEB2D0CFB4C00CBEFF8 /* NSImage+Extension.swift in Sources */, A5874D9D2DAD786100E83852 /* NSWindow+Extension.swift in Sources */, @@ -737,7 +730,6 @@ A56D58862ACDDB4100508D2C /* Ghostty.Shell.swift in Sources */, A5985CD72C320C4500C57AD3 /* String+Extension.swift in Sources */, A5A2A3CC2D444ABB0033CF96 /* NSApplication+Extension.swift in Sources */, - A59630A22AF0415000D64628 /* Ghostty.TerminalSplit.swift in Sources */, A5FEB3002ABB69450068369E /* main.swift in Sources */, A53A297F2DB4480F00B6E02C /* EventModifiers+Extension.swift in Sources */, A53A297B2DB2E49700B6E02C /* CommandPalette.swift in Sources */, diff --git a/macos/Sources/Ghostty/Ghostty.SplitNode.swift b/macos/Sources/Ghostty/Ghostty.SplitNode.swift deleted file mode 100644 index ff60e7c56..000000000 --- a/macos/Sources/Ghostty/Ghostty.SplitNode.swift +++ /dev/null @@ -1,481 +0,0 @@ -import SwiftUI -import Combine -import GhosttyKit - -extension Ghostty { - /// This enum represents the possible states that a node in the split tree can be in. It is either: - /// - /// - noSplit - This is an unsplit, single pane. This contains only a "leaf" which has a single - /// terminal surface to render. - /// - horizontal/vertical - This is split into the horizontal or vertical direction. This contains a - /// "container" which has a recursive top/left SplitNode and bottom/right SplitNode. These - /// values can further be split infinitely. - /// - enum SplitNode: Equatable, Hashable, Codable { - case leaf(Leaf) - case split(Container) - - /// The parent of this node. - var parent: Container? { - get { - switch (self) { - case .leaf(let leaf): - return leaf.parent - - case .split(let container): - return container.parent - } - } - - set { - switch (self) { - case .leaf(let leaf): - leaf.parent = newValue - - case .split(let container): - container.parent = newValue - } - } - } - - /// Returns true if the tree is split. - var isSplit: Bool { - return if case .leaf = self { - false - } else { - true - } - } - - func topLeft() -> SurfaceView { - switch (self) { - case .leaf(let leaf): - return leaf.surface - - case .split(let container): - return container.topLeft.topLeft() - } - } - - /// Returns the view that would prefer receiving focus in this tree. This is always the - /// top-left-most view. This is used when creating a split or closing a split to find the - /// next view to send focus to. - func preferredFocus(_ direction: SplitFocusDirection = .up) -> SurfaceView { - let container: Container - switch (self) { - case .leaf(let leaf): - // noSplit is easy because there is only one thing to focus - return leaf.surface - - case .split(let c): - container = c - } - - let node: SplitNode - switch (direction) { - case .previous, .up, .left: - node = container.bottomRight - - case .next, .down, .right: - node = container.topLeft - } - - return node.preferredFocus(direction) - } - - /// When direction is either next or previous, return the first or last - /// leaf. This can be used when the focus needs to move to a leaf even - /// after hitting the bottom-right-most or top-left-most surface. - /// When the direction is not next or previous (such as top, bottom, - /// left, right), it will be ignored and no leaf will be returned. - func firstOrLast(_ direction: SplitFocusDirection) -> Leaf? { - // If there is no parent, simply ignore. - guard let root = self.parent?.rootContainer() else { return nil } - - switch (direction) { - case .next: - return root.firstLeaf() - case .previous: - return root.lastLeaf() - default: - return nil - } - } - - /// Returns true if any surface in the split stack requires quit confirmation. - func needsConfirmQuit() -> Bool { - switch (self) { - case .leaf(let leaf): - return leaf.surface.needsConfirmQuit - - case .split(let container): - return container.topLeft.needsConfirmQuit() || - container.bottomRight.needsConfirmQuit() - } - } - - /// Returns true if the split tree contains the given view. - func contains(view: SurfaceView) -> Bool { - return leaf(for: view) != nil - } - - /// Find a surface view by UUID. - func findUUID(uuid: UUID) -> SurfaceView? { - switch (self) { - case .leaf(let leaf): - if (leaf.surface.uuid == uuid) { - return leaf.surface - } - - return nil - - case .split(let container): - return container.topLeft.findUUID(uuid: uuid) ?? - container.bottomRight.findUUID(uuid: uuid) - } - } - - /// Returns true if the surface borders the top. Assumes the view is in the tree. - func doesBorderTop(view: SurfaceView) -> Bool { - switch (self) { - case .leaf(let leaf): - return leaf.surface == view - - case .split(let container): - switch (container.direction) { - case .vertical: - return container.topLeft.doesBorderTop(view: view) - - case .horizontal: - return container.topLeft.doesBorderTop(view: view) || - container.bottomRight.doesBorderTop(view: view) - } - } - } - - /// Return the node for the given view if its in the tree. - func leaf(for view: SurfaceView) -> Leaf? { - switch (self) { - case .leaf(let leaf): - if leaf.surface == view { - return leaf - } else { - return nil - } - - case .split(let container): - return container.topLeft.leaf(for: view) ?? - container.bottomRight.leaf(for: view) - } - } - - // MARK: - Sequence - - func makeIterator() -> IndexingIterator<[Leaf]> { - return leaves().makeIterator() - } - - /// Return all the leaves in this split node. This isn't very efficient but our split trees are never super - /// deep so its not an issue. - private func leaves() -> [Leaf] { - switch (self) { - case .leaf(let leaf): - return [leaf] - - case .split(let container): - return container.topLeft.leaves() + container.bottomRight.leaves() - } - } - - // MARK: - Equatable - - static func == (lhs: SplitNode, rhs: SplitNode) -> Bool { - switch (lhs, rhs) { - case (.leaf(let lhs_v), .leaf(let rhs_v)): - return lhs_v === rhs_v - case (.split(let lhs_v), .split(let rhs_v)): - return lhs_v === rhs_v - default: - return false - } - } - - class Leaf: ObservableObject, Equatable, Hashable, Codable { - let app: ghostty_app_t - @Published var surface: SurfaceView - - weak var parent: SplitNode.Container? - - /// Initialize a new leaf which creates a new terminal surface. - init(_ app: ghostty_app_t, baseConfig: SurfaceConfiguration? = nil, uuid: UUID? = nil) { - self.app = app - self.surface = SurfaceView(app, baseConfig: baseConfig, uuid: uuid) - } - - // MARK: - Hashable - - func hash(into hasher: inout Hasher) { - hasher.combine(app) - hasher.combine(surface) - } - - // MARK: - Equatable - - static func == (lhs: Leaf, rhs: Leaf) -> Bool { - return lhs.app == rhs.app && lhs.surface === rhs.surface - } - - // MARK: - Codable - - enum CodingKeys: String, CodingKey { - case pwd - case uuid - } - - required convenience init(from decoder: Decoder) throws { - // Decoding uses the global Ghostty app - guard let del = NSApplication.shared.delegate, - let appDel = del as? AppDelegate, - let app = appDel.ghostty.app else { - throw TerminalRestoreError.delegateInvalid - } - - let container = try decoder.container(keyedBy: CodingKeys.self) - let uuid = UUID(uuidString: try container.decode(String.self, forKey: .uuid)) - var config = SurfaceConfiguration() - config.workingDirectory = try container.decode(String?.self, forKey: .pwd) - - self.init(app, baseConfig: config, uuid: uuid) - } - - func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(surface.pwd, forKey: .pwd) - try container.encode(surface.uuid.uuidString, forKey: .uuid) - } - } - - class Container: ObservableObject, Equatable, Hashable, Codable { - let app: ghostty_app_t - let direction: SplitViewDirection - - @Published var topLeft: SplitNode - @Published var bottomRight: SplitNode - @Published var split: CGFloat = 0.5 - - var resizeEvent: PassthroughSubject = .init() - - weak var parent: SplitNode.Container? - - /// A container is always initialized from some prior leaf because a split has to originate - /// from a non-split value. When initializing, we inherit the leaf's surface and then - /// initialize a new surface for the new pane. - init(from: Leaf, direction: SplitViewDirection, baseConfig: SurfaceConfiguration? = nil) { - self.app = from.app - self.direction = direction - self.parent = from.parent - - // Initially, both topLeft and bottomRight are in the "nosplit" - // state since this is a new split. - self.topLeft = .leaf(from) - - let bottomRight: Leaf = .init(app, baseConfig: baseConfig) - self.bottomRight = .leaf(bottomRight) - - from.parent = self - bottomRight.parent = self - } - - // Move the top left node to the bottom right and vice versa, - // preserving the size. - func swap() { - let topLeft: SplitNode = self.topLeft - self.topLeft = bottomRight - self.bottomRight = topLeft - self.split = 1 - self.split - } - - /// Resize the split by moving the split divider in the given - /// direction by the given amount. If this container is not split - /// in the given direction, navigate up the tree until we find a - /// container that is - func resize(direction: SplitResizeDirection, amount: UInt16) { - // We send a resize event to our publisher which will be - // received by the SplitView. - switch (self.direction) { - case .horizontal: - switch (direction) { - case .left: resizeEvent.send(-Double(amount)) - case .right: resizeEvent.send(Double(amount)) - default: parent?.resize(direction: direction, amount: amount) - } - case .vertical: - switch (direction) { - case .up: resizeEvent.send(-Double(amount)) - case .down: resizeEvent.send(Double(amount)) - default: parent?.resize(direction: direction, amount: amount) - } - } - } - - /// Equalize the splits in this container. Each split is equalized - /// based on its weight, i.e. the number of leaves it contains. - /// This function returns the weight of this container. - func equalize() -> UInt { - let topLeftWeight: UInt - switch (topLeft) { - case .leaf: - topLeftWeight = 1 - case .split(let c): - topLeftWeight = c.equalize() - } - - let bottomRightWeight: UInt - switch (bottomRight) { - case .leaf: - bottomRightWeight = 1 - case .split(let c): - bottomRightWeight = c.equalize() - } - - let weight = topLeftWeight + bottomRightWeight - split = Double(topLeftWeight) / Double(weight) - return weight - } - - /// Returns the top most parent, or this container. Because this - /// would fall back to use to self, the return value is guaranteed. - func rootContainer() -> Container { - guard let parent = self.parent else { return self } - return parent.rootContainer() - } - - /// Returns the first leaf from the given container. This is most - /// useful for root container, so that we can find the top-left-most - /// leaf. - func firstLeaf() -> Leaf { - switch (self.topLeft) { - case .leaf(let leaf): - return leaf - case .split(let s): - return s.firstLeaf() - } - } - - /// Returns the last leaf from the given container. This is most - /// useful for root container, so that we can find the bottom-right- - /// most leaf. - func lastLeaf() -> Leaf { - switch (self.bottomRight) { - case .leaf(let leaf): - return leaf - case .split(let s): - return s.lastLeaf() - } - } - - // MARK: - Hashable - - func hash(into hasher: inout Hasher) { - hasher.combine(app) - hasher.combine(direction) - hasher.combine(topLeft) - hasher.combine(bottomRight) - } - - // MARK: - Equatable - - static func == (lhs: Container, rhs: Container) -> Bool { - return lhs.app == rhs.app && - lhs.direction == rhs.direction && - lhs.topLeft == rhs.topLeft && - lhs.bottomRight == rhs.bottomRight - } - - // MARK: - Codable - - enum CodingKeys: String, CodingKey { - case direction - case split - case topLeft - case bottomRight - } - - required init(from decoder: Decoder) throws { - // Decoding uses the global Ghostty app - guard let del = NSApplication.shared.delegate, - let appDel = del as? AppDelegate, - let app = appDel.ghostty.app else { - throw TerminalRestoreError.delegateInvalid - } - - let container = try decoder.container(keyedBy: CodingKeys.self) - self.app = app - self.direction = try container.decode(SplitViewDirection.self, forKey: .direction) - self.split = try container.decode(CGFloat.self, forKey: .split) - self.topLeft = try container.decode(SplitNode.self, forKey: .topLeft) - self.bottomRight = try container.decode(SplitNode.self, forKey: .bottomRight) - - // Fix up the parent references - self.topLeft.parent = self - self.bottomRight.parent = self - } - - func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(direction, forKey: .direction) - try container.encode(split, forKey: .split) - try container.encode(topLeft, forKey: .topLeft) - try container.encode(bottomRight, forKey: .bottomRight) - } - } - - /// This keeps track of the "neighbors" of a split: the immediately above/below/left/right - /// nodes. This is purposely weak so we don't have to worry about memory management - /// with this (although, it should always be correct). - struct Neighbors { - var left: SplitNode? - var right: SplitNode? - var up: SplitNode? - var down: SplitNode? - - /// These are the previous/next nodes. It will certainly be one of the above as well - /// but we keep track of these separately because depending on the split direction - /// of the containing node, previous may be left OR up (same for next). - var previous: SplitNode? - var next: SplitNode? - - /// No neighbors, used by the root node. - static let empty: Self = .init() - - /// Get the node for a given direction. - func get(direction: SplitFocusDirection) -> SplitNode? { - let map: [SplitFocusDirection : KeyPath] = [ - .previous: \.previous, - .next: \.next, - .up: \.up, - .down: \.down, - .left: \.left, - .right: \.right, - ] - - guard let path = map[direction] else { return nil } - return self[keyPath: path] - } - - /// Update multiple keys and return a new copy. - func update(_ attrs: [WritableKeyPath: SplitNode?]) -> Self { - var clone = self - attrs.forEach { (key, value) in - clone[keyPath: key] = value - } - return clone - } - - /// True if there are no neighbors - func isEmpty() -> Bool { - return self.previous == nil && self.next == nil - } - } - } -} diff --git a/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift b/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift deleted file mode 100644 index ccb7cca38..000000000 --- a/macos/Sources/Ghostty/Ghostty.TerminalSplit.swift +++ /dev/null @@ -1,468 +0,0 @@ -import SwiftUI -import GhosttyKit - -extension Ghostty { - /// A spittable terminal view is one where the terminal allows for "splits" (vertical and horizontal) within the - /// view. The terminal starts in the unsplit state (a plain ol' TerminalView) but responds to changes to the - /// split direction by splitting the terminal. - /// - /// This also allows one split to be "zoomed" at any time. - struct TerminalSplit: View { - /// The current state of the root node. This can be set to nil when all surfaces are closed. - @Binding var node: SplitNode? - - /// Non-nil if one of the surfaces in the split tree is currently "zoomed." A zoomed surface - /// becomes "full screen" on the split tree. - @State private var zoomedSurface: SurfaceView? = nil - - var body: some View { - ZStack { - TerminalSplitRoot( - node: $node, - zoomedSurface: $zoomedSurface - ) - - // If we have a zoomed surface, we overlay that on top of our split - // root. Our split root will become clear when there is a zoomed - // surface. We need to keep the split root around so that we don't - // lose all of the surface state so this must be a ZStack. - if let surfaceView = zoomedSurface { - InspectableSurface(surfaceView: surfaceView) - } - } - } - } - - /// The root of a split tree. This sets up the initial SplitNode state and renders. There is only ever - /// one of these in a split tree. - private struct TerminalSplitRoot: View { - /// The root node that we're rendering. This will be set to nil if all the surfaces in this tree close. - @Binding var node: SplitNode? - - /// Keeps track of whether we're in a zoomed split state or not. If one of the splits we own - /// is in the zoomed state, we clear our body since we expect a zoomed split to overlay - /// this one. - @Binding var zoomedSurface: SurfaceView? - - var body: some View { - let center = NotificationCenter.default - let pubZoom = center.publisher(for: Notification.didToggleSplitZoom) - - // If we're zoomed, we don't render anything, we are transparent. This - // ensures that the View stays around so we don't lose our state, but - // also that the zoomed view on top can see through if background transparency - // is enabled. - if (zoomedSurface == nil) { - ZStack { - switch (node) { - case nil: - Color(.clear) - - case .leaf(let leaf): - TerminalSplitLeaf( - leaf: leaf, - neighbors: .empty, - node: $node - ) - - case .split(let container): - TerminalSplitContainer( - neighbors: .empty, - node: $node, - container: container - ) - .onReceive(pubZoom) { onZoom(notification: $0) } - } - } - } else { - // On these events we want to reset the split state and call it. - let pubSplit = center.publisher(for: Notification.ghosttyNewSplit, object: zoomedSurface!) - let pubClose = center.publisher(for: Notification.ghosttyCloseSurface, object: zoomedSurface!) - let pubFocus = center.publisher(for: Notification.ghosttyFocusSplit, object: zoomedSurface!) - - ZStack {} - .onReceive(pubZoom) { onZoomReset(notification: $0) } - .onReceive(pubSplit) { onZoomReset(notification: $0) } - .onReceive(pubClose) { onZoomReset(notification: $0) } - .onReceive(pubFocus) { onZoomReset(notification: $0) } - } - } - - func onZoom(notification: SwiftUI.Notification) { - // Our node must be split to receive zooms. You can't zoom an unsplit terminal. - if case .leaf = node { - preconditionFailure("TerminalSplitRoom must not be zoom-able if no splits exist") - } - - // Make sure the notification has a surface and that this window owns the surface. - guard let surfaceView = notification.object as? SurfaceView else { return } - guard node?.contains(view: surfaceView) ?? false else { return } - - // We are in the zoomed state. - zoomedSurface = surfaceView - - // See onZoomReset, same logic. - DispatchQueue.main.async { Ghostty.moveFocus(to: surfaceView) } - } - - func onZoomReset(notification: SwiftUI.Notification) { - // Make sure the notification has a surface and that this window owns the surface. - guard let surfaceView = notification.object as? SurfaceView else { return } - guard zoomedSurface == surfaceView else { return } - - // We are now unzoomed - zoomedSurface = nil - - // We need to stay focused on this view, but the view is going to change - // superviews. We need to do this async so it happens on the next event loop - // tick. - DispatchQueue.main.async { - Ghostty.moveFocus(to: surfaceView) - - // If the notification is not a toggle zoom notification, we want to re-publish - // it after a short delay so that the split tree has a chance to re-establish - // so the proper view gets this notification. - if (notification.name != Notification.didToggleSplitZoom) { - // We have to wait ANOTHER tick since we just established. - DispatchQueue.main.async { - NotificationCenter.default.post(notification) - } - } - } - } - } - - /// A noSplit leaf node of a split tree. - private struct TerminalSplitLeaf: View { - /// The leaf to draw the surface for. - let leaf: SplitNode.Leaf - - /// The neighbors, used for navigation. - let neighbors: SplitNode.Neighbors - - /// The SplitNode that the leaf belongs to. This will be set to nil when leaf is closed. - @Binding var node: SplitNode? - - var body: some View { - let center = NotificationCenter.default - let pub = center.publisher(for: Notification.ghosttyNewSplit, object: leaf.surface) - let pubClose = center.publisher(for: Notification.ghosttyCloseSurface, object: leaf.surface) - let pubFocus = center.publisher(for: Notification.ghosttyFocusSplit, object: leaf.surface) - let pubResize = center.publisher(for: Notification.didResizeSplit, object: leaf.surface) - - InspectableSurface(surfaceView: leaf.surface, isSplit: !neighbors.isEmpty()) - .onReceive(pub) { onNewSplit(notification: $0) } - .onReceive(pubClose) { onClose(notification: $0) } - .onReceive(pubFocus) { onMoveFocus(notification: $0) } - .onReceive(pubResize) { onResize(notification: $0) } - } - - private func onClose(notification: SwiftUI.Notification) { - var processAlive = false - if let valueAny = notification.userInfo?["process_alive"] { - if let value = valueAny as? Bool { - processAlive = value - } - } - - // If the child process is not alive, then we exit immediately - guard processAlive else { - node = nil - return - } - - // If we don't have a window to attach our modal to, we also exit immediately. - // This should NOT happen. - guard let window = leaf.surface.window else { - node = nil - return - } - - // Confirm close. We use an NSAlert instead of a SwiftUI confirmationDialog - // due to SwiftUI bugs (see Ghostty #560). To repeat from #560, the bug is that - // confirmationDialog allows the user to Cmd-W close the alert, but when doing - // so SwiftUI does not update any of the bindings to note that window is no longer - // being shown, and provides no callback to detect this. - let alert = NSAlert() - alert.messageText = "Close Terminal?" - alert.informativeText = "The terminal still has a running process. If you close the " + - "terminal the process will be killed." - alert.addButton(withTitle: "Close the Terminal") - alert.addButton(withTitle: "Cancel") - alert.alertStyle = .warning - alert.beginSheetModal(for: window, completionHandler: { response in - switch (response) { - case .alertFirstButtonReturn: - alert.window.orderOut(nil) - node = nil - - default: - break - } - }) - } - - private func onNewSplit(notification: SwiftUI.Notification) { - let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey] - let config = configAny as? SurfaceConfiguration - - // Determine our desired direction - guard let directionAny = notification.userInfo?["direction"] else { return } - guard let direction = directionAny as? ghostty_action_split_direction_e else { return } - let splitDirection: SplitViewDirection - let swap: Bool - switch (direction) { - case GHOSTTY_SPLIT_DIRECTION_RIGHT: - splitDirection = .horizontal - swap = false - case GHOSTTY_SPLIT_DIRECTION_LEFT: - splitDirection = .horizontal - swap = true - case GHOSTTY_SPLIT_DIRECTION_DOWN: - splitDirection = .vertical - swap = false - case GHOSTTY_SPLIT_DIRECTION_UP: - splitDirection = .vertical - swap = true - - default: - return - } - - // Setup our new container since we are now split - let container = SplitNode.Container(from: leaf, direction: splitDirection, baseConfig: config) - - // Change the parent node. This will trigger the parent to relayout our views. - node = .split(container) - - // See moveFocus comment, we have to run this whenever split changes. - Ghostty.moveFocus(to: container.bottomRight.preferredFocus(), from: node!.preferredFocus()) - - // If we are swapping, swap now. We do this after our focus event - // so that focus is in the right place. - if swap { - container.swap() - } - } - - /// This handles the event to move the split focus (i.e. previous/next) from a keyboard event. - private func onMoveFocus(notification: SwiftUI.Notification) { - // Determine our desired direction - guard let directionAny = notification.userInfo?[Notification.SplitDirectionKey] else { return } - guard let direction = directionAny as? SplitFocusDirection else { return } - - // Find the next surface to move to. In most cases this should be - // finding the neighbor in provided direction, and focus it. When - // the neighbor cannot be found based on next or previous direction, - // this would instead search for first or last leaf and focus it - // instead, giving the wrap around effect. - // When other directions are provided, this can be nil, and early - // returned. - guard let nextSurface = neighbors.get(direction: direction)?.preferredFocus(direction) - ?? node?.firstOrLast(direction)?.surface else { return } - - Ghostty.moveFocus( - to: nextSurface - ) - } - - /// Handle a resize event. - private func onResize(notification: SwiftUI.Notification) { - // If this leaf is not part of a split then there is nothing to do - guard let parent = leaf.parent else { return } - - guard let directionAny = notification.userInfo?[Ghostty.Notification.ResizeSplitDirectionKey] else { return } - guard let direction = directionAny as? Ghostty.SplitResizeDirection else { return } - - guard let amountAny = notification.userInfo?[Ghostty.Notification.ResizeSplitAmountKey] else { return } - guard let amount = amountAny as? UInt16 else { return } - - parent.resize(direction: direction, amount: amount) - } - } - - /// This represents a split view that is in the horizontal or vertical split state. - private struct TerminalSplitContainer: View { - @EnvironmentObject var ghostty: Ghostty.App - - let neighbors: SplitNode.Neighbors - @Binding var node: SplitNode? - @ObservedObject var container: SplitNode.Container - - var body: some View { - SplitView( - container.direction, - $container.split, - dividerColor: ghostty.config.splitDividerColor, - resizeIncrements: .init(width: 1, height: 1), - resizePublisher: container.resizeEvent, - left: { - let neighborKey: WritableKeyPath = container.direction == .horizontal ? \.right : \.down - - TerminalSplitNested( - node: closeableTopLeft(), - neighbors: neighbors.update([ - neighborKey: container.bottomRight, - \.next: container.bottomRight, - ]) - ) - }, right: { - let neighborKey: WritableKeyPath = container.direction == .horizontal ? \.left : \.up - - TerminalSplitNested( - node: closeableBottomRight(), - neighbors: neighbors.update([ - neighborKey: container.topLeft, - \.previous: container.topLeft, - ]) - ) - }) - } - - private func closeableTopLeft() -> Binding { - return .init(get: { - container.topLeft - }, set: { newValue in - if let newValue { - container.topLeft = newValue - return - } - - // Closing - node = container.bottomRight - - switch (node) { - case .leaf(let l): - l.parent = container.parent - case .split(let c): - c.parent = container.parent - case .none: - break - } - - DispatchQueue.main.async { - Ghostty.moveFocus( - to: container.bottomRight.preferredFocus(), - from: container.topLeft.preferredFocus() - ) - } - }) - } - - private func closeableBottomRight() -> Binding { - return .init(get: { - container.bottomRight - }, set: { newValue in - if let newValue { - container.bottomRight = newValue - return - } - - // Closing - node = container.topLeft - - switch (node) { - case .leaf(let l): - l.parent = container.parent - case .split(let c): - c.parent = container.parent - case .none: - break - } - - DispatchQueue.main.async { - Ghostty.moveFocus( - to: container.topLeft.preferredFocus(), - from: container.bottomRight.preferredFocus() - ) - } - }) - } - } - - - /// This is like TerminalSplitRoot, but... not the root. This renders a SplitNode in any state but - /// requires there be a binding to the parent node. - private struct TerminalSplitNested: View { - @Binding var node: SplitNode? - let neighbors: SplitNode.Neighbors - - var body: some View { - Group { - switch (node) { - case nil: - Color(.clear) - - case .leaf(let leaf): - TerminalSplitLeaf( - leaf: leaf, - neighbors: neighbors, - node: $node - ) - - case .split(let container): - TerminalSplitContainer( - neighbors: neighbors, - node: $node, - container: container - ) - } - } - .id(node) - } - } - - /// When changing the split state, or going full screen (native or non), the terminal view - /// will lose focus. There has to be some nice SwiftUI-native way to fix this but I can't - /// figure it out so we're going to do this hacky thing to bring focus back to the terminal - /// that should have it. - static func moveFocus( - to: SurfaceView, - from: SurfaceView? = nil, - delay: TimeInterval? = nil - ) { - // The whole delay machinery is a bit of a hack to work around a - // situation where the window is destroyed and the surface view - // will never be attached to a window. Realistically, we should - // handle this upstream but we also don't want this function to be - // a source of infinite loops. - - // Our max delay before we give up - let maxDelay: TimeInterval = 0.5 - guard (delay ?? 0) < maxDelay else { return } - - // We start at a 50 millisecond delay and do a doubling backoff - let nextDelay: TimeInterval = if let delay { - delay * 2 - } else { - // 100 milliseconds - 0.05 - } - - let work: DispatchWorkItem = .init { - // If the callback runs before the surface is attached to a view - // then the window will be nil. We just reschedule in that case. - guard let window = to.window else { - moveFocus(to: to, from: from, delay: nextDelay) - return - } - - // If we had a previously focused node and its not where we're sending - // focus, make sure that we explicitly tell it to lose focus. In theory - // we should NOT have to do this but the focus callback isn't getting - // called for some reason. - if let from = from { - _ = from.resignFirstResponder() - } - - window.makeFirstResponder(to) - } - - let queue = DispatchQueue.main - if let delay { - queue.asyncAfter(deadline: .now() + delay, execute: work) - } else { - queue.async(execute: work) - } - } -} diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index 513e5af46..a282c7a88 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -460,6 +460,60 @@ extension Ghostty { return config } } + + /// When changing the split state, or going full screen (native or non), the terminal view + /// will lose focus. There has to be some nice SwiftUI-native way to fix this but I can't + /// figure it out so we're going to do this hacky thing to bring focus back to the terminal + /// that should have it. + static func moveFocus( + to: SurfaceView, + from: SurfaceView? = nil, + delay: TimeInterval? = nil + ) { + // The whole delay machinery is a bit of a hack to work around a + // situation where the window is destroyed and the surface view + // will never be attached to a window. Realistically, we should + // handle this upstream but we also don't want this function to be + // a source of infinite loops. + + // Our max delay before we give up + let maxDelay: TimeInterval = 0.5 + guard (delay ?? 0) < maxDelay else { return } + + // We start at a 50 millisecond delay and do a doubling backoff + let nextDelay: TimeInterval = if let delay { + delay * 2 + } else { + // 100 milliseconds + 0.05 + } + + let work: DispatchWorkItem = .init { + // If the callback runs before the surface is attached to a view + // then the window will be nil. We just reschedule in that case. + guard let window = to.window else { + moveFocus(to: to, from: from, delay: nextDelay) + return + } + + // If we had a previously focused node and its not where we're sending + // focus, make sure that we explicitly tell it to lose focus. In theory + // we should NOT have to do this but the focus callback isn't getting + // called for some reason. + if let from = from { + _ = from.resignFirstResponder() + } + + window.makeFirstResponder(to) + } + + let queue = DispatchQueue.main + if let delay { + queue.asyncAfter(deadline: .now() + delay, execute: work) + } else { + queue.async(execute: work) + } + } } // MARK: Surface Environment Keys From 01fa87f2aba0bfaa122b018ef08ca6baa8740d7c Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 13:37:42 -0700 Subject: [PATCH 094/371] macos: fix iOS builds --- macos/Sources/Ghostty/SurfaceView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index a282c7a88..18a8d2f1c 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -461,6 +461,7 @@ extension Ghostty { } } + #if canImport(AppKit) /// When changing the split state, or going full screen (native or non), the terminal view /// will lose focus. There has to be some nice SwiftUI-native way to fix this but I can't /// figure it out so we're going to do this hacky thing to bring focus back to the terminal @@ -514,6 +515,7 @@ extension Ghostty { queue.async(execute: work) } } + #endif } // MARK: Surface Environment Keys From f8e3539b7db2d6bfe60bb744e67891ea22cc02dd Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 19:43:47 -0700 Subject: [PATCH 095/371] macos: remove the unused resizeEvent code from SplitView --- .../Splits/TerminalSplitTreeView.swift | 1 - .../Sources/Helpers/SplitView/SplitView.swift | 44 +------------------ 2 files changed, 2 insertions(+), 43 deletions(-) diff --git a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift index 4a41afc42..b219e0b31 100644 --- a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift +++ b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift @@ -43,7 +43,6 @@ struct TerminalSplitSubtreeView: View { }), dividerColor: ghostty.config.splitDividerColor, resizeIncrements: .init(width: 1, height: 1), - resizePublisher: .init(), left: { TerminalSplitSubtreeView(node: split.left, onResize: onResize) }, diff --git a/macos/Sources/Helpers/SplitView/SplitView.swift b/macos/Sources/Helpers/SplitView/SplitView.swift index 8ac2bc33f..9747ac99f 100644 --- a/macos/Sources/Helpers/SplitView/SplitView.swift +++ b/macos/Sources/Helpers/SplitView/SplitView.swift @@ -1,5 +1,4 @@ import SwiftUI -import Combine /// A split view shows a left and right (or top and bottom) view with a divider in the middle to do resizing. /// The terminlogy "left" and "right" is always used but for vertical splits "left" is "top" and "right" is "bottom". @@ -13,12 +12,10 @@ struct SplitView: View { /// Divider color let dividerColor: Color - /// If set, the split view supports programmatic resizing via events sent via the publisher. /// Minimum increment (in points) that this split can be resized by, in /// each direction. Both `height` and `width` should be whole numbers /// greater than or equal to 1.0 let resizeIncrements: NSSize - let resizePublisher: PassthroughSubject /// The left and right views to render. let left: L @@ -55,37 +52,15 @@ struct SplitView: View { .position(splitterPoint) .gesture(dragGesture(geo.size, splitterPoint: splitterPoint)) } - .onReceive(resizePublisher) { value in - resize(for: geo.size, amount: value) - } } } - /// Initialize a split view. This view isn't programmatically resizable; it can only be resized - /// by manually dragging the divider. - init(_ direction: SplitViewDirection, - _ split: Binding, - dividerColor: Color, - @ViewBuilder left: (() -> L), - @ViewBuilder right: (() -> R)) { - self.init( - direction, - split, - dividerColor: dividerColor, - resizeIncrements: .init(width: 1, height: 1), - resizePublisher: .init(), - left: left, - right: right - ) - } - - /// Initialize a split view that supports programmatic resizing. + /// Initialize a split view that can be resized by manually dragging the divider. init( _ direction: SplitViewDirection, _ split: Binding, dividerColor: Color, - resizeIncrements: NSSize, - resizePublisher: PassthroughSubject, + resizeIncrements: NSSize = .init(width: 1, height: 1), @ViewBuilder left: (() -> L), @ViewBuilder right: (() -> R) ) { @@ -93,25 +68,10 @@ struct SplitView: View { self._split = split self.dividerColor = dividerColor self.resizeIncrements = resizeIncrements - self.resizePublisher = resizePublisher self.left = left() self.right = right() } - private func resize(for size: CGSize, amount: Double) { - let dim: CGFloat - switch (direction) { - case .horizontal: - dim = size.width - case .vertical: - dim = size.height - } - - let pos = split * dim - let new = min(max(minSize, pos + amount), dim - minSize) - split = new / dim - } - private func dragGesture(_ size: CGSize, splitterPoint: CGPoint) -> some Gesture { return DragGesture() .onChanged { gesture in From 1966dfdef7eb8a8d08bc486a5419f409260715fb Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 4 Jun 2025 19:44:30 -0700 Subject: [PATCH 096/371] macos: moving some files around --- macos/Ghostty.xcodeproj/project.pbxproj | 34 +++++++------------ .../Splits}/SplitView.Divider.swift | 0 .../Splits}/SplitView.swift | 0 .../EventModifiers+Extension.swift | 0 .../KeyboardShortcut+Extension.swift | 0 .../NSAppearance+Extension.swift | 0 .../NSApplication+Extension.swift | 0 .../{ => Extensions}/NSImage+Extension.swift | 0 .../NSPasteboard+Extension.swift | 0 .../{ => Extensions}/NSScreen+Extension.swift | 0 .../{ => Extensions}/NSWindow+Extension.swift | 0 .../{ => Extensions}/OSColor+Extension.swift | 0 .../{ => Extensions}/String+Extension.swift | 0 .../{ => Extensions}/View+Extension.swift | 0 14 files changed, 13 insertions(+), 21 deletions(-) rename macos/Sources/{Helpers/SplitView => Features/Splits}/SplitView.Divider.swift (100%) rename macos/Sources/{Helpers/SplitView => Features/Splits}/SplitView.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/EventModifiers+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/KeyboardShortcut+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/NSAppearance+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/NSApplication+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/NSImage+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/NSPasteboard+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/NSScreen+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/NSWindow+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/OSColor+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/String+Extension.swift (100%) rename macos/Sources/Helpers/{ => Extensions}/View+Extension.swift (100%) diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index bb9e860f3..62cb079bf 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -301,23 +301,11 @@ A52FFF582CAA4FF1000C6A5B /* Fullscreen.swift */, A59630962AEE163600D64628 /* HostingWindow.swift */, A5CA378B2D2A4DE800931030 /* KeyboardLayout.swift */, - A53A29802DB44A5E00B6E02C /* KeyboardShortcut+Extension.swift */, A59FB5D02AE0DEA7009128F3 /* MetalView.swift */, A5CBD0552C9E65A50017A1AE /* DraggableWindowView.swift */, - A53A297E2DB4480A00B6E02C /* EventModifiers+Extension.swift */, - C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */, - A599CDAF2CF103F20049FA26 /* NSAppearance+Extension.swift */, - A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */, - A54B0CEA2D0CFB4A00CBEFF8 /* NSImage+Extension.swift */, - A52FFF5C2CAB4D05000C6A5B /* NSScreen+Extension.swift */, - AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */, - A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */, - A5985CD62C320C4500C57AD3 /* String+Extension.swift */, - A5CC36142C9CDA03004D6760 /* View+Extension.swift */, A5CA378D2D31D6C100931030 /* Weak.swift */, C1F26EE72B76CBFC00404083 /* VibrantLayer.h */, C1F26EE82B76CBFC00404083 /* VibrantLayer.m */, - A5CEAFDA29B8005900646FDA /* SplitView */, ); path = Helpers; sourceTree = ""; @@ -434,6 +422,8 @@ children = ( A586365E2DEE6C2100E04A10 /* SplitTree.swift */, A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */, + A5CEAFDB29B8009000646FDA /* SplitView.swift */, + A5CEAFDD29B8058B00646FDA /* SplitView.Divider.swift */, ); path = Splits; sourceTree = ""; @@ -442,7 +432,18 @@ isa = PBXGroup; children = ( A586366A2DF0A98900E04A10 /* Array+Extension.swift */, + A53A29802DB44A5E00B6E02C /* KeyboardShortcut+Extension.swift */, + A53A297E2DB4480A00B6E02C /* EventModifiers+Extension.swift */, + C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */, + A599CDAF2CF103F20049FA26 /* NSAppearance+Extension.swift */, + A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */, + A54B0CEA2D0CFB4A00CBEFF8 /* NSImage+Extension.swift */, + A52FFF5C2CAB4D05000C6A5B /* NSScreen+Extension.swift */, + AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */, C1F26EA62B738B9900404083 /* NSView+Extension.swift */, + A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */, + A5985CD62C320C4500C57AD3 /* String+Extension.swift */, + A5CC36142C9CDA03004D6760 /* View+Extension.swift */, ); path = Extensions; sourceTree = ""; @@ -534,15 +535,6 @@ path = "Global Keybinds"; sourceTree = ""; }; - A5CEAFDA29B8005900646FDA /* SplitView */ = { - isa = PBXGroup; - children = ( - A5CEAFDB29B8009000646FDA /* SplitView.swift */, - A5CEAFDD29B8058B00646FDA /* SplitView.Divider.swift */, - ); - path = SplitView; - sourceTree = ""; - }; A5D495A3299BECBA00DD1313 /* Frameworks */ = { isa = PBXGroup; children = ( diff --git a/macos/Sources/Helpers/SplitView/SplitView.Divider.swift b/macos/Sources/Features/Splits/SplitView.Divider.swift similarity index 100% rename from macos/Sources/Helpers/SplitView/SplitView.Divider.swift rename to macos/Sources/Features/Splits/SplitView.Divider.swift diff --git a/macos/Sources/Helpers/SplitView/SplitView.swift b/macos/Sources/Features/Splits/SplitView.swift similarity index 100% rename from macos/Sources/Helpers/SplitView/SplitView.swift rename to macos/Sources/Features/Splits/SplitView.swift diff --git a/macos/Sources/Helpers/EventModifiers+Extension.swift b/macos/Sources/Helpers/Extensions/EventModifiers+Extension.swift similarity index 100% rename from macos/Sources/Helpers/EventModifiers+Extension.swift rename to macos/Sources/Helpers/Extensions/EventModifiers+Extension.swift diff --git a/macos/Sources/Helpers/KeyboardShortcut+Extension.swift b/macos/Sources/Helpers/Extensions/KeyboardShortcut+Extension.swift similarity index 100% rename from macos/Sources/Helpers/KeyboardShortcut+Extension.swift rename to macos/Sources/Helpers/Extensions/KeyboardShortcut+Extension.swift diff --git a/macos/Sources/Helpers/NSAppearance+Extension.swift b/macos/Sources/Helpers/Extensions/NSAppearance+Extension.swift similarity index 100% rename from macos/Sources/Helpers/NSAppearance+Extension.swift rename to macos/Sources/Helpers/Extensions/NSAppearance+Extension.swift diff --git a/macos/Sources/Helpers/NSApplication+Extension.swift b/macos/Sources/Helpers/Extensions/NSApplication+Extension.swift similarity index 100% rename from macos/Sources/Helpers/NSApplication+Extension.swift rename to macos/Sources/Helpers/Extensions/NSApplication+Extension.swift diff --git a/macos/Sources/Helpers/NSImage+Extension.swift b/macos/Sources/Helpers/Extensions/NSImage+Extension.swift similarity index 100% rename from macos/Sources/Helpers/NSImage+Extension.swift rename to macos/Sources/Helpers/Extensions/NSImage+Extension.swift diff --git a/macos/Sources/Helpers/NSPasteboard+Extension.swift b/macos/Sources/Helpers/Extensions/NSPasteboard+Extension.swift similarity index 100% rename from macos/Sources/Helpers/NSPasteboard+Extension.swift rename to macos/Sources/Helpers/Extensions/NSPasteboard+Extension.swift diff --git a/macos/Sources/Helpers/NSScreen+Extension.swift b/macos/Sources/Helpers/Extensions/NSScreen+Extension.swift similarity index 100% rename from macos/Sources/Helpers/NSScreen+Extension.swift rename to macos/Sources/Helpers/Extensions/NSScreen+Extension.swift diff --git a/macos/Sources/Helpers/NSWindow+Extension.swift b/macos/Sources/Helpers/Extensions/NSWindow+Extension.swift similarity index 100% rename from macos/Sources/Helpers/NSWindow+Extension.swift rename to macos/Sources/Helpers/Extensions/NSWindow+Extension.swift diff --git a/macos/Sources/Helpers/OSColor+Extension.swift b/macos/Sources/Helpers/Extensions/OSColor+Extension.swift similarity index 100% rename from macos/Sources/Helpers/OSColor+Extension.swift rename to macos/Sources/Helpers/Extensions/OSColor+Extension.swift diff --git a/macos/Sources/Helpers/String+Extension.swift b/macos/Sources/Helpers/Extensions/String+Extension.swift similarity index 100% rename from macos/Sources/Helpers/String+Extension.swift rename to macos/Sources/Helpers/Extensions/String+Extension.swift diff --git a/macos/Sources/Helpers/View+Extension.swift b/macos/Sources/Helpers/Extensions/View+Extension.swift similarity index 100% rename from macos/Sources/Helpers/View+Extension.swift rename to macos/Sources/Helpers/Extensions/View+Extension.swift From c40ac6b785cc7482d7556943b7d26f7fd4897617 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 5 Jun 2025 07:09:46 -0700 Subject: [PATCH 097/371] input: add focus split directional commands to command palette --- .../Terminal/BaseTerminalController.swift | 6 ++-- src/input/command.zig | 34 ++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 5e2777195..ea849bb4a 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -447,7 +447,7 @@ class BaseTerminalController: NSWindowController, case .left: focusDirection = .spatial(.left) case .right: focusDirection = .spatial(.right) } - + // Find the node for the target surface guard let targetNode = surfaceTree.root?.node(view: target) else { return } @@ -462,7 +462,9 @@ class BaseTerminalController: NSWindowController, } // Move focus to the next surface - Ghostty.moveFocus(to: nextSurface, from: target) + DispatchQueue.main.async { + Ghostty.moveFocus(to: nextSurface, from: target) + } } @objc private func ghosttyDidToggleSplitZoom(_ notification: Notification) { diff --git a/src/input/command.zig b/src/input/command.zig index 1ce6aa7cb..4a918cff3 100644 --- a/src/input/command.zig +++ b/src/input/command.zig @@ -274,6 +274,39 @@ fn actionCommands(action: Action.Key) []const Command { }, }, + .goto_split => comptime &.{ + .{ + .action = .{ .goto_split = .previous }, + .title = "Focus Split: Previous", + .description = "Focus the previous split, if any.", + }, + .{ + .action = .{ .goto_split = .next }, + .title = "Focus Split: Next", + .description = "Focus the next split, if any.", + }, + .{ + .action = .{ .goto_split = .left }, + .title = "Focus Split: Left", + .description = "Focus the split to the left, if it exists.", + }, + .{ + .action = .{ .goto_split = .right }, + .title = "Focus Split: Right", + .description = "Focus the split to the right, if it exists.", + }, + .{ + .action = .{ .goto_split = .up }, + .title = "Focus Split: Up", + .description = "Focus the split above, if it exists.", + }, + .{ + .action = .{ .goto_split = .down }, + .title = "Focus Split: Down", + .description = "Focus the split below, if it exists.", + }, + }, + .toggle_split_zoom => comptime &.{.{ .action = .toggle_split_zoom, .title = "Toggle Split Zoom", @@ -396,7 +429,6 @@ fn actionCommands(action: Action.Key) []const Command { .jump_to_prompt, .write_scrollback_file, .goto_tab, - .goto_split, .resize_split, .crash, => comptime &.{}, From 9008e21637f504fe606da37fb30d3ebedb50a3d4 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Sun, 1 Jun 2025 12:06:47 -0300 Subject: [PATCH 098/371] fix: exit non-native fullscreen on close --- macos/Sources/Helpers/Fullscreen.swift | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/macos/Sources/Helpers/Fullscreen.swift b/macos/Sources/Helpers/Fullscreen.swift index 6094bf844..6b10ceb40 100644 --- a/macos/Sources/Helpers/Fullscreen.swift +++ b/macos/Sources/Helpers/Fullscreen.swift @@ -150,6 +150,26 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { private var savedState: SavedState? + required init?(_ window: NSWindow) { + super.init(window) + + NotificationCenter.default.addObserver( + self, + selector: #selector(windowWillCloseNotification), + name: NSWindow.willCloseNotification, + object: window) + } + + deinit { + NotificationCenter.default.removeObserver(self) + } + + @objc private func windowWillCloseNotification(_ notification: Notification) { + // When the window closes we need to explicitly exit non-native fullscreen + // otherwise some state like the menu bar can remain hidden. + exit() + } + func enter() { // If we are in fullscreen we don't do it again. guard !isFullscreen else { return } From 045c84acb71e99e384b63ca658621bce891f8841 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 5 Jun 2025 13:41:33 -0700 Subject: [PATCH 099/371] macos: split directional navigation should use distance to leaf Fixes regression from #7523 I messed two things up around spatial navigation in the split tree that this commit fixes: 1. The distance in the spatial tree only used a single dimension that we were navigating. This commit now uses 2D euclidean distance from the top-left corners of nodes. This handles the case where the nodes are directly above or below each other better. 2. The spatial slots include split containers because they are layout elements. But we should only navigate to leaf nodes. This was causing the wrong navigatin to happen in some scenarios. --- macos/Sources/Features/Splits/SplitTree.swift | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index ab4b387a4..cbd440124 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -190,17 +190,22 @@ extension SplitTree { return nil } - // Extract the view from the best candidate node - let bestNode = nodes[0].node - switch bestNode { + // Extract the view from the best candidate node. The best candidate + // node is the closest leaf node. If we have no leaves (impossible?) + // just use the first node. + let bestNode = nodes.first(where: { + if case .leaf = $0.node { return true } else { return false } + }) ?? nodes[0] + switch bestNode.node { case .leaf(let view): return view + case .split: // If the best candidate is a split node, use its the leaf/rightmost // depending on our spatial direction. return switch (spatialDirection) { - case .up, .left: bestNode.leftmostLeaf() - case .down, .right: bestNode.rightmostLeaf() + case .up, .left: bestNode.node.leftmostLeaf() + case .down, .right: bestNode.node.rightmostLeaf() } } } @@ -892,32 +897,47 @@ extension SplitTree.Spatial { /// - **Up**: Slots with bounds above the reference node (Y=0 is top) /// - **Down**: Slots with bounds below the reference node /// - /// Results are sorted by distance from the reference node, with closest slots first. - /// Distance is calculated as the gap between the reference node and the candidate slot - /// in the direction of movement. + /// Results are sorted by 2D euclidean distance from the reference node, with closest slots first. + /// Distance is calculated from the top-left corners of the bounds, prioritizing nodes that are + /// closer in both dimensions. + /// + /// **Important**: The returned array contains both split nodes and leaf nodes. When using this + /// for navigation or focus management, you typically want to filter for leaf nodes first, as they + /// represent the actual views that can receive focus. Split nodes are included in the results + /// because they have bounds and occupy space in the layout, but they are structural elements + /// that cannot themselves be focused. If no leaf nodes are found in the results, you may need + /// to traverse into a split node to find its appropriate leaf child. /// /// - Parameters: /// - direction: The direction to search for slots /// - referenceNode: The node to use as the reference point - /// - Returns: An array of slots in the specified direction, sorted by distance (closest first) + /// - Returns: An array of slots in the specified direction, sorted by 2D distance (closest first) func slots(in direction: Direction, from referenceNode: SplitTree.Node) -> [Slot] { guard let refSlot = slots.first(where: { $0.node == referenceNode }) else { return [] } + + // Helper function to calculate 2D euclidean distance between top-left corners of two rectangles + func distance(from rect1: CGRect, to rect2: CGRect) -> Double { + // Calculate distance between top-left corners + let dx = rect2.minX - rect1.minX + let dy = rect2.minY - rect1.minY + return sqrt(dx * dx + dy * dy) + } - return switch direction { + let result = switch direction { case .left: // Slots to the left: their right edge is at or left of reference's left edge slots.filter { $0.node != referenceNode && $0.bounds.maxX <= refSlot.bounds.minX }.sorted { - (refSlot.bounds.minX - $0.bounds.maxX) < (refSlot.bounds.minX - $1.bounds.maxX) + distance(from: refSlot.bounds, to: $0.bounds) < distance(from: refSlot.bounds, to: $1.bounds) } - + case .right: // Slots to the right: their left edge is at or right of reference's right edge slots.filter { $0.node != referenceNode && $0.bounds.minX >= refSlot.bounds.maxX }.sorted { - ($0.bounds.minX - refSlot.bounds.maxX) < ($1.bounds.minX - refSlot.bounds.maxX) + distance(from: refSlot.bounds, to: $0.bounds) < distance(from: refSlot.bounds, to: $1.bounds) } case .up: @@ -925,7 +945,7 @@ extension SplitTree.Spatial { slots.filter { $0.node != referenceNode && $0.bounds.maxY <= refSlot.bounds.minY }.sorted { - (refSlot.bounds.minY - $0.bounds.maxY) < (refSlot.bounds.minY - $1.bounds.maxY) + distance(from: refSlot.bounds, to: $0.bounds) < distance(from: refSlot.bounds, to: $1.bounds) } case .down: @@ -933,9 +953,11 @@ extension SplitTree.Spatial { slots.filter { $0.node != referenceNode && $0.bounds.minY >= refSlot.bounds.maxY }.sorted { - ($0.bounds.minY - refSlot.bounds.maxY) < ($1.bounds.minY - refSlot.bounds.maxY) + distance(from: refSlot.bounds, to: $0.bounds) < distance(from: refSlot.bounds, to: $1.bounds) } } + + return result } /// Returns whether the given node borders the specified side of the spatial bounds. From c2c267439be55304ed07181dd35d5a90a5dd7cde Mon Sep 17 00:00:00 2001 From: Daniel Wennberg Date: Thu, 5 Jun 2025 13:14:58 -0700 Subject: [PATCH 100/371] macos: fix hasWindowButtons logic --- .../Features/Terminal/TerminalWindow.swift | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalWindow.swift b/macos/Sources/Features/Terminal/TerminalWindow.swift index 830a73e86..0b43582f3 100644 --- a/macos/Sources/Features/Terminal/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/TerminalWindow.swift @@ -45,15 +45,14 @@ class TerminalWindow: NSWindow { }, ] + // false if all three traffic lights are missing/hidden, otherwise true private var hasWindowButtons: Bool { get { - if let close = standardWindowButton(.closeButton), - let miniaturize = standardWindowButton(.miniaturizeButton), - let zoom = standardWindowButton(.zoomButton) { - return !(close.isHidden && miniaturize.isHidden && zoom.isHidden) - } else { - return false - } + // if standardWindowButton(.theButton) == nil, the button isn't there, so coalesce to true + let closeIsHidden = standardWindowButton(.closeButton)?.isHiddenOrHasHiddenAncestor ?? true + let miniaturizeIsHidden = standardWindowButton(.miniaturizeButton)?.isHiddenOrHasHiddenAncestor ?? true + let zoomIsHidden = standardWindowButton(.zoomButton)?.isHiddenOrHasHiddenAncestor ?? true + return !(closeIsHidden && miniaturizeIsHidden && zoomIsHidden) } } @@ -78,7 +77,7 @@ class TerminalWindow: NSWindow { if titlebarTabs { generateToolbar() } - + level = UserDefaults.standard.value(forKey: Self.defaultLevelKey) as? NSWindow.Level ?? .normal } From 70f030e3c2f09ad7785846b94c40988dcc97266c Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 07:22:37 -0700 Subject: [PATCH 101/371] macos: dismiss notifications on focus, application exit I've only recently been using programs that use user notifications heavily and this commit addresses a number of annoyances I've encountered. 1. Notifications dispatched while the source terminal surface is focused are now only shown for a short time (3 seconds hardcoded) and then automatically dismiss. 2. Notifications are dismissed when the target surface becomes focused from an unfocused state. This dismissal happens immediately (no delay). 3. Notifications are dismissed when the application exits. 4. This fixes a bug where notification callbacks were modifying view state, but the notification center doesn't guarantee that the callback is called on the main thread. We now ensure that the callback is always called on the main thread. --- macos/Sources/App/macOS/AppDelegate.swift | 7 +++++ .../Sources/Ghostty/SurfaceView_AppKit.swift | 26 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index c6816d50c..54454e6bf 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -316,6 +316,13 @@ class AppDelegate: NSObject, } } + func applicationWillTerminate(_ notification: Notification) { + // We have no notifications we want to persist after death, + // so remove them all now. In the future we may want to be + // more selective and only remove surface-targeted notifications. + UNUserNotificationCenter.current().removeAllDeliveredNotifications() + } + /// This is called when the application is already open and someone double-clicks the icon /// or clicks the dock icon. func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 0aecef6ad..682efa947 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -306,6 +306,14 @@ extension Ghostty { // We unset our bell state if we gained focus bell = false + + // Remove any notifications for this surface once we gain focus. + if !notificationIdentifiers.isEmpty { + UNUserNotificationCenter.current() + .removeDeliveredNotifications( + withIdentifiers: Array(notificationIdentifiers)) + self.notificationIdentifiers = [] + } } } @@ -1388,13 +1396,29 @@ extension Ghostty { trigger: nil ) - UNUserNotificationCenter.current().add(request) { error in + // Note the callback may be executed on a background thread as documented + // so we need @MainActor since we're reading/writing view state. + UNUserNotificationCenter.current().add(request) { @MainActor error in if let error = error { AppDelegate.logger.error("Error scheduling user notification: \(error)") return } + // We need to keep track of this notification so we can remove it + // under certain circumstances self.notificationIdentifiers.insert(uuid) + + // If we're focused then we schedule to remove the notification + // after a few seconds. If we gain focus we automatically remove it + // in focusDidChange. + if (self.focused) { + Task { @MainActor [weak self] in + try await Task.sleep(for: .seconds(3)) + self?.notificationIdentifiers.remove(uuid) + UNUserNotificationCenter.current() + .removeDeliveredNotifications(withIdentifiers: [uuid]) + } + } } } From 5f6a15abef20f510d79314c5107f58ff3636682a Mon Sep 17 00:00:00 2001 From: Aaron Ruan Date: Fri, 6 Jun 2025 23:46:06 +0800 Subject: [PATCH 102/371] Add bell feature flags for audio, attention, and title actions on macOS Signed-off-by: Aaron Ruan --- macos/Sources/App/macOS/AppDelegate.swift | 10 ++++++---- macos/Sources/Ghostty/Ghostty.Config.swift | 3 +++ macos/Sources/Ghostty/SurfaceView.swift | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index c6816d50c..bee5826ed 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -530,11 +530,13 @@ class AppDelegate: NSObject, } @objc private func ghosttyBellDidRing(_ notification: Notification) { - // Bounce the dock icon if we're not focused. - NSApp.requestUserAttention(.informationalRequest) + if (ghostty.config.bellFeatures.contains(.attention)) { + // Bounce the dock icon if we're not focused. + NSApp.requestUserAttention(.informationalRequest) - // Handle setting the dock badge based on permissions - ghosttyUpdateBadgeForBell() + // Handle setting the dock badge based on permissions + ghosttyUpdateBadgeForBell() + } } private func ghosttyUpdateBadgeForBell() { diff --git a/macos/Sources/Ghostty/Ghostty.Config.swift b/macos/Sources/Ghostty/Ghostty.Config.swift index cce14ca0f..3acb93c25 100644 --- a/macos/Sources/Ghostty/Ghostty.Config.swift +++ b/macos/Sources/Ghostty/Ghostty.Config.swift @@ -566,6 +566,9 @@ extension Ghostty.Config { let rawValue: CUnsignedInt static let system = BellFeatures(rawValue: 1 << 0) + static let audio = BellFeatures(rawValue: 1 << 1) + static let attention = BellFeatures(rawValue: 1 << 2) + static let title = BellFeatures(rawValue: 1 << 3) } enum MacHidden : String { diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index 18a8d2f1c..46d379b9c 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -59,7 +59,7 @@ extension Ghostty { var title: String { var result = surfaceView.title - if (surfaceView.bell) { + if (surfaceView.bell && ghostty.config.bellFeatures.contains(.title)) { result = "🔔 \(result)" } From aab00da24200d5eceb907d30339b889aec52a757 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 20:36:34 -0700 Subject: [PATCH 103/371] terminal: fix crash when reflowing grapheme with a spacer head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #7536 When we're reflowing a row and we need to insert a spacer head, we must move to the next row to insert it. Previously, we were setting a spacer head and then copying data into that spacer head, which could lead to corrupt data and an eventual crash. In debug builds this triggers assertion failures but in release builds this would lead to silent corruption and a crash later on. The unit test shows the issue clearly but effectively you need a multi-codepoint grapheme such as `👨‍👨‍👦‍👦` to wrap across a row by changing the columns. --- src/terminal/PageList.zig | 149 +++++++++++++++++++++++++++++++++++--- src/terminal/page.zig | 7 +- 2 files changed, 144 insertions(+), 12 deletions(-) diff --git a/src/terminal/PageList.zig b/src/terminal/PageList.zig index a0eb3edd1..9838bfb53 100644 --- a/src/terminal/PageList.zig +++ b/src/terminal/PageList.zig @@ -908,16 +908,6 @@ const ReflowCursor = struct { const cell = &cells[x]; x += 1; - // std.log.warn("\nsrc_y={} src_x={} dst_y={} dst_x={} dst_cols={} cp={} wide={}", .{ - // src_y, - // x, - // self.y, - // self.x, - // self.page.size.cols, - // cell.content.codepoint, - // cell.wide, - // }); - // Copy cell contents. switch (cell.content_tag) { .codepoint, @@ -937,8 +927,15 @@ const ReflowCursor = struct { }; // Decrement the source position so that when we - // loop we'll process this source cell again. + // loop we'll process this source cell again, + // since we can't copy it into a spacer head. x -= 1; + + // Move to the next row (this sets pending wrap + // which will cause us to wrap on the next + // iteration). + self.cursorForward(); + continue; } else { self.page_cell.* = cell.*; } @@ -990,6 +987,17 @@ const ReflowCursor = struct { self.page_cell.hyperlink = false; self.page_cell.style_id = stylepkg.default_id; + // std.log.warn("\nsrc_y={} src_x={} dst_y={} dst_x={} dst_cols={} cp={X} wide={} page_cell_wide={}", .{ + // src_y, + // x, + // self.y, + // self.x, + // self.page.size.cols, + // cell.content.codepoint, + // cell.wide, + // self.page_cell.wide, + // }); + // Copy grapheme data. if (cell.content_tag == .codepoint_grapheme) { // Copy the graphemes @@ -8375,6 +8383,125 @@ test "PageList resize reflow less cols to wrap a wide char" { } } +test "PageList resize reflow less cols to wrap a multi-codepoint grapheme with a spacer head" { + const testing = std.testing; + const alloc = testing.allocator; + + var s = try init(alloc, 4, 2, 0); + defer s.deinit(); + { + try testing.expect(s.pages.first == s.pages.last); + const page = &s.pages.first.?.data; + + // We want to make the screen look like this: + // + // 👨‍👨‍👦‍👦👨‍👨‍👦‍👦 + + // First family emoji at (0, 0) + { + const rac = page.getRowAndCell(0, 0); + rac.cell.* = .{ + .content_tag = .codepoint, + .content = .{ .codepoint = 0x1F468 }, // First codepoint of the grapheme + .wide = .wide, + }; + try page.setGraphemes(rac.row, rac.cell, &.{ + 0x200D, 0x1F468, + 0x200D, 0x1F466, + 0x200D, 0x1F466, + }); + } + { + const rac = page.getRowAndCell(1, 0); + rac.cell.* = .{ + .content_tag = .codepoint, + .content = .{ .codepoint = 0 }, + .wide = .spacer_tail, + }; + } + // Second family emoji at (2, 0) + { + const rac = page.getRowAndCell(2, 0); + rac.cell.* = .{ + .content_tag = .codepoint, + .content = .{ .codepoint = 0x1F468 }, // First codepoint of the grapheme + .wide = .wide, + }; + try page.setGraphemes(rac.row, rac.cell, &.{ + 0x200D, 0x1F468, + 0x200D, 0x1F466, + 0x200D, 0x1F466, + }); + } + { + const rac = page.getRowAndCell(3, 0); + rac.cell.* = .{ + .content_tag = .codepoint, + .content = .{ .codepoint = 0 }, + .wide = .spacer_tail, + }; + } + } + + // Resize + try s.resize(.{ .cols = 3, .reflow = true }); + try testing.expectEqual(@as(usize, 3), s.cols); + try testing.expectEqual(@as(usize, 2), s.totalRows()); + + { + try testing.expect(s.pages.first == s.pages.last); + const page = &s.pages.first.?.data; + + { + const rac = page.getRowAndCell(0, 0); + try testing.expectEqual(@as(u21, 0x1F468), rac.cell.content.codepoint); + try testing.expectEqual(pagepkg.Cell.Wide.wide, rac.cell.wide); + + const cps = page.lookupGrapheme(rac.cell).?; + try testing.expectEqual(@as(usize, 6), cps.len); + try testing.expectEqual(@as(u21, 0x200D), cps[0]); + try testing.expectEqual(@as(u21, 0x1F468), cps[1]); + try testing.expectEqual(@as(u21, 0x200D), cps[2]); + try testing.expectEqual(@as(u21, 0x1F466), cps[3]); + try testing.expectEqual(@as(u21, 0x200D), cps[4]); + try testing.expectEqual(@as(u21, 0x1F466), cps[5]); + + // Row should be wrapped + try testing.expect(rac.row.wrap); + } + { + const rac = page.getRowAndCell(1, 0); + try testing.expectEqual(@as(u21, 0), rac.cell.content.codepoint); + try testing.expectEqual(pagepkg.Cell.Wide.spacer_tail, rac.cell.wide); + } + { + const rac = page.getRowAndCell(2, 0); + try testing.expectEqual(@as(u21, 0), rac.cell.content.codepoint); + try testing.expectEqual(pagepkg.Cell.Wide.spacer_head, rac.cell.wide); + } + + { + const rac = page.getRowAndCell(0, 0); + try testing.expectEqual(@as(u21, 0x1F468), rac.cell.content.codepoint); + try testing.expectEqual(pagepkg.Cell.Wide.wide, rac.cell.wide); + + const cps = page.lookupGrapheme(rac.cell).?; + try testing.expectEqual(@as(usize, 6), cps.len); + try testing.expectEqual(@as(u21, 0x200D), cps[0]); + try testing.expectEqual(@as(u21, 0x1F468), cps[1]); + try testing.expectEqual(@as(u21, 0x200D), cps[2]); + try testing.expectEqual(@as(u21, 0x1F466), cps[3]); + try testing.expectEqual(@as(u21, 0x200D), cps[4]); + try testing.expectEqual(@as(u21, 0x1F466), cps[5]); + } + { + const rac = page.getRowAndCell(1, 1); + try testing.expectEqual(@as(u21, 0), rac.cell.content.codepoint); + try testing.expectEqual(pagepkg.Cell.Wide.spacer_tail, rac.cell.wide); + } + } +} + test "PageList resize reflow less cols copy kitty placeholder" { const testing = std.testing; const alloc = testing.allocator; diff --git a/src/terminal/page.zig b/src/terminal/page.zig index d7f252af1..fea16c28b 100644 --- a/src/terminal/page.zig +++ b/src/terminal/page.zig @@ -1316,7 +1316,12 @@ pub const Page = struct { /// Set the graphemes for the given cell. This asserts that the cell /// has no graphemes set, and only contains a single codepoint. - pub fn setGraphemes(self: *Page, row: *Row, cell: *Cell, cps: []u21) GraphemeError!void { + pub fn setGraphemes( + self: *Page, + row: *Row, + cell: *Cell, + cps: []const u21, + ) GraphemeError!void { defer self.assertIntegrity(); assert(cell.codepoint() > 0); From ea0766e62b4c63e7afacfb6d62cee554862061c6 Mon Sep 17 00:00:00 2001 From: Leorize Date: Sat, 7 Jun 2025 11:57:26 -0500 Subject: [PATCH 104/371] gtk/CommandPalette: prevent leaks on initialization * Deallocate the builder after use * Don't hold a reference to `Command` after appending to `GListStore` --- src/apprt/gtk/CommandPalette.zig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/apprt/gtk/CommandPalette.zig b/src/apprt/gtk/CommandPalette.zig index fda2c5ca8..a99db78d7 100644 --- a/src/apprt/gtk/CommandPalette.zig +++ b/src/apprt/gtk/CommandPalette.zig @@ -43,6 +43,7 @@ pub fn init(self: *CommandPalette, window: *Window) !void { _ = Command.getGObjectType(); var builder = Builder.init("command-palette", 1, 5); + defer builder.deinit(); self.* = .{ .window = window, @@ -120,7 +121,9 @@ pub fn updateConfig(self: *CommandPalette, config: *const configpkg.Config) !voi command, config.keybind.set, ); - self.source.append(cmd.as(gobject.Object)); + const cmd_ref = cmd.as(gobject.Object); + self.source.append(cmd_ref); + cmd_ref.unref(); } } From 42bafe9d599799e47cd11a421282bfb4a40a6af6 Mon Sep 17 00:00:00 2001 From: Leorize Date: Sat, 7 Jun 2025 12:44:21 -0500 Subject: [PATCH 105/371] flatpak: detach process tracking thread after spawn This makes sure the underlying thread implementation know to free resources the moment the thread is no longer necessary, preventing leaks from not manually collecting the thread. --- src/os/flatpak.zig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/os/flatpak.zig b/src/os/flatpak.zig index 7b92a8ba9..eaff529b0 100644 --- a/src/os/flatpak.zig +++ b/src/os/flatpak.zig @@ -112,6 +112,8 @@ pub const FlatpakHostCommand = struct { pub fn spawn(self: *FlatpakHostCommand, alloc: Allocator) !u32 { const thread = try std.Thread.spawn(.{}, threadMain, .{ self, alloc }); thread.setName("flatpak-host-command") catch {}; + // We don't track this thread, it will terminate on its own on command exit + thread.detach(); // Wait for the process to start or error. self.state_mutex.lock(); From 53c2874667f234e7dd054aeca81e8a469b050359 Mon Sep 17 00:00:00 2001 From: Leorize Date: Sat, 7 Jun 2025 13:26:21 -0500 Subject: [PATCH 106/371] flatpak: free GError after use --- src/os/flatpak.zig | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/os/flatpak.zig b/src/os/flatpak.zig index eaff529b0..7bd84bc27 100644 --- a/src/os/flatpak.zig +++ b/src/os/flatpak.zig @@ -234,9 +234,10 @@ pub const FlatpakHostCommand = struct { }; // Get our bus connection. - var g_err: [*c]c.GError = null; + var g_err: ?*c.GError = null; + defer if (g_err) |ptr| c.g_error_free(ptr); const bus = c.g_bus_get_sync(c.G_BUS_TYPE_SESSION, null, &g_err) orelse { - log.warn("signal error getting bus: {s}", .{g_err.*.message}); + log.warn("signal error getting bus: {s}", .{g_err.?.*.message}); return Error.FlatpakSetupFail; }; defer c.g_object_unref(bus); @@ -260,7 +261,7 @@ pub const FlatpakHostCommand = struct { &g_err, ); if (g_err != null) { - log.warn("signal send error: {s}", .{g_err.*.message}); + log.warn("signal send error: {s}", .{g_err.?.*.message}); return; } defer c.g_variant_unref(reply); @@ -280,9 +281,10 @@ pub const FlatpakHostCommand = struct { // Get our bus connection. This has to remain active until we exit // the thread otherwise our signals won't be called. - var g_err: [*c]c.GError = null; + var g_err: ?*c.GError = null; + defer if (g_err) |ptr| c.g_error_free(ptr); const bus = c.g_bus_get_sync(c.G_BUS_TYPE_SESSION, null, &g_err) orelse { - log.warn("spawn error getting bus: {s}", .{g_err.*.message}); + log.warn("spawn error getting bus: {s}", .{g_err.?.*.message}); self.updateState(.{ .err = {} }); return; }; @@ -310,7 +312,8 @@ pub const FlatpakHostCommand = struct { bus: *c.GDBusConnection, loop: *c.GMainLoop, ) !void { - var err: [*c]c.GError = null; + var err: ?*c.GError = null; + defer if (err) |ptr| c.g_error_free(ptr); var arena_allocator = std.heap.ArenaAllocator.init(alloc); defer arena_allocator.deinit(); const arena = arena_allocator.allocator(); @@ -319,15 +322,15 @@ pub const FlatpakHostCommand = struct { const fd_list = c.g_unix_fd_list_new(); defer c.g_object_unref(fd_list); if (c.g_unix_fd_list_append(fd_list, self.stdin, &err) < 0) { - log.warn("error adding fd: {s}", .{err.*.message}); + log.warn("error adding fd: {s}", .{err.?.*.message}); return Error.FlatpakSetupFail; } if (c.g_unix_fd_list_append(fd_list, self.stdout, &err) < 0) { - log.warn("error adding fd: {s}", .{err.*.message}); + log.warn("error adding fd: {s}", .{err.?.*.message}); return Error.FlatpakSetupFail; } if (c.g_unix_fd_list_append(fd_list, self.stderr, &err) < 0) { - log.warn("error adding fd: {s}", .{err.*.message}); + log.warn("error adding fd: {s}", .{err.?.*.message}); return Error.FlatpakSetupFail; } @@ -407,7 +410,7 @@ pub const FlatpakHostCommand = struct { null, &err, ) orelse { - log.warn("Flatpak.HostCommand failed: {s}", .{err.*.message}); + log.warn("Flatpak.HostCommand failed: {s}", .{err.?.*.message}); return Error.FlatpakRPCFail; }; defer c.g_variant_unref(reply); From 41ee578b7a0ed7226a06d5d77fa672b30b502a46 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 7 Jun 2025 12:36:12 -0700 Subject: [PATCH 107/371] macos: quick terminal restores previous size when exiting final surface This fixes a regression from the new split work last week, but it was also probably an issue before that in a slightly different way. With the new split work, the quick terminal was becoming unusable when the final surface explicitly `exit`-ed, because AppKit/SwiftUI would resize the window to a very small size and you couldn't see the new terminal on the next toggle. Prior to this, I think the quick terminal would've reverted to its original size but I'm not sure (even if the user resized it manually). This commit saves the size of the quick terminal at the point all surfaces are exited and restores it when the quick terminal is shown the next time with a new initial surface. --- .../QuickTerminalController.swift | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift index 0dcfce204..8c86c2531 100644 --- a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift +++ b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift @@ -21,6 +21,14 @@ class QuickTerminalController: BaseTerminalController { // The active space when the quick terminal was last shown. private var previousActiveSpace: CGSSpace? = nil + /// The window frame saved when the quick terminal's surface tree becomes empty. + /// + /// This preserves the user's window size and position when all terminal surfaces + /// are closed (e.g., via the `exit` command). When a new surface is created, + /// the window will be restored to this frame, preventing SwiftUI from resetting + /// the window to its default minimum size. + private var lastClosedFrame: NSRect? = nil + /// Non-nil if we have hidden dock state. private var hiddenDock: HiddenDock? = nil @@ -190,6 +198,12 @@ class QuickTerminalController: BaseTerminalController { // If our surface tree is nil then we animate the window out. if (to.isEmpty) { + // Save the current window frame before animating out. This preserves + // the user's preferred window size and position for when the quick + // terminal is reactivated with a new surface. Without this, SwiftUI + // would reset the window to its minimum content size. + lastClosedFrame = window?.frame + animateOut() } } @@ -230,9 +244,6 @@ class QuickTerminalController: BaseTerminalController { // Set previous active space self.previousActiveSpace = CGSSpace.active() - // Animate the window in - animateWindowIn(window: window, from: position) - // If our surface tree is empty then we initialize a new terminal. The surface // tree can be empty if for example we run "exit" in the terminal and force // animate out. @@ -241,7 +252,16 @@ class QuickTerminalController: BaseTerminalController { let view = Ghostty.SurfaceView(ghostty_app, baseConfig: nil) surfaceTree = SplitTree(view: view) focusedSurface = view + + // Restore our previous frame if we have one + if let lastClosedFrame { + window.setFrame(lastClosedFrame, display: false) + self.lastClosedFrame = nil + } } + + // Animate the window in + animateWindowIn(window: window, from: position) } func animateOut() { From 493b1f53506263c11d763ae19a0ca83f1b8bd0e2 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 5 Jun 2025 15:04:11 -0700 Subject: [PATCH 108/371] wip: undo --- macos/Ghostty.xcodeproj/project.pbxproj | 8 ++ macos/Sources/App/macOS/AppDelegate.swift | 10 +++ macos/Sources/App/macOS/MainMenu.xib | 15 ++++ .../Terminal/BaseTerminalController.swift | 74 ++++++++++++++++--- macos/Sources/Helpers/ExpiringTarget.swift | 53 +++++++++++++ .../Extensions/Duration+Extension.swift | 8 ++ 6 files changed, 158 insertions(+), 10 deletions(-) create mode 100644 macos/Sources/Helpers/ExpiringTarget.swift create mode 100644 macos/Sources/Helpers/Extensions/Duration+Extension.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 62cb079bf..153ec8e6f 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -62,6 +62,8 @@ A586365F2DEE6C2300E04A10 /* SplitTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586365E2DEE6C2100E04A10 /* SplitTree.swift */; }; A58636662DEF964100E04A10 /* TerminalSplitTreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */; }; A586366B2DF0A98C00E04A10 /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366A2DF0A98900E04A10 /* Array+Extension.swift */; }; + A586366D2DF25C2500E04A10 /* ExpiringTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366C2DF25C1C00E04A10 /* ExpiringTarget.swift */; }; + A586366F2DF25D8600E04A10 /* Duration+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366E2DF25D8300E04A10 /* Duration+Extension.swift */; }; A5874D992DAD751B00E83852 /* CGS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D982DAD751A00E83852 /* CGS.swift */; }; A5874D9D2DAD786100E83852 /* NSWindow+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */; }; A59444F729A2ED5200725BBA /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59444F629A2ED5200725BBA /* SettingsView.swift */; }; @@ -168,6 +170,8 @@ A586365E2DEE6C2100E04A10 /* SplitTree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitTree.swift; sourceTree = ""; }; A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalSplitTreeView.swift; sourceTree = ""; }; A586366A2DF0A98900E04A10 /* Array+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Extension.swift"; sourceTree = ""; }; + A586366C2DF25C1C00E04A10 /* ExpiringTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpiringTarget.swift; sourceTree = ""; }; + A586366E2DF25D8300E04A10 /* Duration+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Duration+Extension.swift"; sourceTree = ""; }; A5874D982DAD751A00E83852 /* CGS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CGS.swift; sourceTree = ""; }; A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSWindow+Extension.swift"; sourceTree = ""; }; A59444F629A2ED5200725BBA /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; @@ -290,6 +294,7 @@ A534263D2A7DCBB000EBB7A2 /* Helpers */ = { isa = PBXGroup; children = ( + A586366C2DF25C1C00E04A10 /* ExpiringTarget.swift */, A58636692DF0A98100E04A10 /* Extensions */, A5874D9B2DAD781100E83852 /* Private */, A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */, @@ -432,6 +437,7 @@ isa = PBXGroup; children = ( A586366A2DF0A98900E04A10 /* Array+Extension.swift */, + A586366E2DF25D8300E04A10 /* Duration+Extension.swift */, A53A29802DB44A5E00B6E02C /* KeyboardShortcut+Extension.swift */, A53A297E2DB4480A00B6E02C /* EventModifiers+Extension.swift */, C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */, @@ -686,6 +692,7 @@ A5D0AF3D2B37804400D21823 /* CodableBridge.swift in Sources */, A5D0AF3B2B36A1DE00D21823 /* TerminalRestorable.swift in Sources */, C1F26EA72B738B9900404083 /* NSView+Extension.swift in Sources */, + A586366F2DF25D8600E04A10 /* Duration+Extension.swift in Sources */, A5CF66D42D289CEE00139794 /* NSEvent+Extension.swift in Sources */, A5CBD0642CA122E70017A1AE /* QuickTerminalPosition.swift in Sources */, A596309C2AEE1C9E00D64628 /* TerminalController.swift in Sources */, @@ -713,6 +720,7 @@ A52FFF5B2CAA54B1000C6A5B /* FullscreenMode+Extension.swift in Sources */, A5333E222B5A2128008AEFF7 /* SurfaceView_AppKit.swift in Sources */, A5CA378E2D31D6C300931030 /* Weak.swift in Sources */, + A586366D2DF25C2500E04A10 /* ExpiringTarget.swift in Sources */, A5CDF1952AAFA19600513312 /* ConfigurationErrorsView.swift in Sources */, A55B7BBC29B6FC330055DE60 /* SurfaceView.swift in Sources */, A5333E1C2B5A1CE3008AEFF7 /* CrossKit.swift in Sources */, diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index fd25ef358..d12b2efd2 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -36,6 +36,8 @@ class AppDelegate: NSObject, @IBOutlet private var menuCloseWindow: NSMenuItem? @IBOutlet private var menuCloseAllWindows: NSMenuItem? + @IBOutlet private var menuUndo: NSMenuItem? + @IBOutlet private var menuRedo: NSMenuItem? @IBOutlet private var menuCopy: NSMenuItem? @IBOutlet private var menuPaste: NSMenuItem? @IBOutlet private var menuPasteSelection: NSMenuItem? @@ -88,6 +90,9 @@ class AppDelegate: NSObject, /// Manages our terminal windows. let terminalManager: TerminalManager + /// The global undo manager for app-level state such as window restoration. + lazy var undoManager = UndoManager() + /// Our quick terminal. This starts out uninitialized and only initializes if used. private var quickController: QuickTerminalController? = nil @@ -393,6 +398,11 @@ class AppDelegate: NSObject, syncMenuShortcut(config, action: "new_split:down", menuItem: self.menuSplitDown) syncMenuShortcut(config, action: "new_split:up", menuItem: self.menuSplitUp) + // TODO: sync + menuUndo?.keyEquivalent = "z" + menuUndo?.keyEquivalentModifierMask = [.command] + menuRedo?.keyEquivalent = "z" + menuRedo?.keyEquivalentModifierMask = [.command, .shift] syncMenuShortcut(config, action: "copy_to_clipboard", menuItem: self.menuCopy) syncMenuShortcut(config, action: "paste_from_clipboard", menuItem: self.menuPaste) syncMenuShortcut(config, action: "paste_from_selection", menuItem: self.menuPasteSelection) diff --git a/macos/Sources/App/macOS/MainMenu.xib b/macos/Sources/App/macOS/MainMenu.xib index 828e82bd0..7130d544e 100644 --- a/macos/Sources/App/macOS/MainMenu.xib +++ b/macos/Sources/App/macOS/MainMenu.xib @@ -40,6 +40,7 @@ + @@ -57,6 +58,7 @@ + @@ -204,6 +206,19 @@ + + + + + + + + + + + + + diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index ea849bb4a..cd7ceffbb 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -75,6 +75,13 @@ class BaseTerminalController: NSWindowController, /// The cancellables related to our focused surface. private var focusedSurfaceCancellables: Set = [] + /// The undo manager for this controller is the undo manager of the window, + /// which we set via the delegate method. + override var undoManager: UndoManager? { + // This should be set via the delegate method windowWillReturnUndoManager + window?.undoManager + } + struct SavedFrame { let window: NSRect let screen: NSRect @@ -261,6 +268,9 @@ class BaseTerminalController: NSWindowController, let oldFocused = focusedSurface let focused = node.contains { $0 == focusedSurface } + // Keep track of the old tree for undo management. + let oldTree = surfaceTree + // Remove the node from the tree surfaceTree = surfaceTree.remove(node) @@ -270,6 +280,32 @@ class BaseTerminalController: NSWindowController, Ghostty.moveFocus(to: nextTarget, from: oldFocused) } } + + // Setup our undo + if let undoManager { + undoManager.setActionName("Close Terminal") + undoManager.registerUndo(withTarget: ExpiringTarget( + with: .seconds(5), + in: undoManager, + )) { [weak self] v in + guard let self else { return } + self.surfaceTree = oldTree + if let oldFocused { + DispatchQueue.main.async { + Ghostty.moveFocus(to: oldFocused, from: self.focusedSurface) + } + } + + undoManager.registerUndo(withTarget: NSObject()) { [weak self] _ in + self?.closeSurface( + node.leftmostLeaf(), + withConfirmation: node.contains { + $0.needsConfirmQuit + } + ) + } + } + } } // MARK: Notifications @@ -346,19 +382,25 @@ class BaseTerminalController: NSWindowController, } @objc private func ghosttyDidCloseSurface(_ notification: Notification) { - // The target must be within our tree guard let target = notification.object as? Ghostty.SurfaceView else { return } + closeSurface( + target, + withConfirmation: (notification.userInfo?["process_alive"] as? Bool) ?? false, + ) + } + + /// Close a surface view, requesting confirmation if necessary. + /// + /// This will also insert the proper undo stack information in. + private func closeSurface( + _ target: Ghostty.SurfaceView, + withConfirmation: Bool = true, + ) { + // The target must be within our tree guard let node = surfaceTree.root?.node(view: target) else { return } - var processAlive = false - if let valueAny = notification.userInfo?["process_alive"] { - if let value = valueAny as? Bool { - processAlive = value - } - } - // If the child process is not alive, then we exit immediately - guard processAlive else { + guard withConfirmation else { removeSurfaceAndMoveFocus(node) return } @@ -405,7 +447,8 @@ class BaseTerminalController: NSWindowController, // Do the split do { - surfaceTree = try surfaceTree.insert(view: newView, at: oldView, direction: splitDirection) + let newTree = try surfaceTree.insert(view: newView, at: oldView, direction: splitDirection) + surfaceTree = newTree } catch { // If splitting fails for any reason (it should not), then we just log // and return. The new view we created will be deinitialized and its @@ -414,6 +457,7 @@ class BaseTerminalController: NSWindowController, return } + // Once we've split, we need to move focus to the new split Ghostty.moveFocus(to: newView, from: oldView) } @@ -732,6 +776,11 @@ class BaseTerminalController: NSWindowController, // MARK: NSWindowController override func windowDidLoad() { + super.windowDidLoad() + + // Setup our undo manager. + + // Everything beyond here is setting up the window guard let window else { return } // If there is a hardcoded title in the configuration, we set that @@ -818,6 +867,11 @@ class BaseTerminalController: NSWindowController, windowFrameDidChange() } + func windowWillReturnUndoManager(_ window: NSWindow) -> UndoManager? { + guard let appDelegate = NSApplication.shared.delegate as? AppDelegate else { return nil } + return appDelegate.undoManager + } + // MARK: First Responder @IBAction func close(_ sender: Any) { diff --git a/macos/Sources/Helpers/ExpiringTarget.swift b/macos/Sources/Helpers/ExpiringTarget.swift new file mode 100644 index 000000000..d24021495 --- /dev/null +++ b/macos/Sources/Helpers/ExpiringTarget.swift @@ -0,0 +1,53 @@ +import AppKit + +/// A target object for UndoManager that automatically expires after a specified duration. +/// +/// ExpiringTarget holds a reference to a target object and removes all undo actions +/// associated with itself from the UndoManager when the timer expires. This is useful +/// for creating temporary undo operations that should not persist beyond a certain time. +/// +/// The parameter T can be used to retain a reference to some target value +/// that can be used in the undo operation. The target is released when the timer expires. +/// +/// - Parameter T: The type of the target object, constrained to AnyObject +class ExpiringTarget { + private(set) var target: T? + private var timer: Timer? + private weak var undoManager: UndoManager? + + /// Creates an expiring target that will automatically remove undo actions after the specified duration. + /// + /// - Parameters: + /// - target: The target object to hold weakly. Defaults to nil. + /// - duration: The time after which the target should expire + /// - undoManager: The UndoManager from which to remove actions when expired + init(_ target: T? = nil, with duration: Duration, in undoManager: UndoManager) { + self.target = target + self.undoManager = undoManager + self.timer = Timer.scheduledTimer( + withTimeInterval: duration.timeInterval, + repeats: false) { _ in + self.expire() + } + } + + /// Manually expires the target, removing all associated undo actions and invalidating the timer. + /// + /// This method is called automatically when the timer fires, but can also be called manually + /// to expire the target before the timer duration has elapsed. + func expire() { + target = nil + undoManager?.removeAllActions(withTarget: self) + timer?.invalidate() + } + + deinit { + expire() + } +} + +extension ExpiringTarget where T == NSObject { + convenience init(with duration: Duration, in undoManager: UndoManager) { + self.init(nil, with: duration, in: undoManager) + } +} diff --git a/macos/Sources/Helpers/Extensions/Duration+Extension.swift b/macos/Sources/Helpers/Extensions/Duration+Extension.swift new file mode 100644 index 000000000..43eca6b79 --- /dev/null +++ b/macos/Sources/Helpers/Extensions/Duration+Extension.swift @@ -0,0 +1,8 @@ +import Foundation + +extension Duration { + var timeInterval: TimeInterval { + return TimeInterval(self.components.seconds) + + TimeInterval(self.components.attoseconds) / 1_000_000_000_000_000_000 + } +} From 6d32b01c6498a4fab34293cd673dc4437798ede8 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 5 Jun 2025 21:28:49 -0700 Subject: [PATCH 109/371] macos: implement a custom ExpiringUndoManager, setup undo for new/close --- macos/Ghostty.xcodeproj/project.pbxproj | 8 +- macos/Sources/App/macOS/AppDelegate.swift | 2 +- .../Terminal/BaseTerminalController.swift | 79 ++++++++-- .../Sources/Ghostty/SurfaceView_AppKit.swift | 2 + macos/Sources/Helpers/ExpiringTarget.swift | 53 ------- .../Sources/Helpers/ExpiringUndoManager.swift | 137 ++++++++++++++++++ 6 files changed, 207 insertions(+), 74 deletions(-) delete mode 100644 macos/Sources/Helpers/ExpiringTarget.swift create mode 100644 macos/Sources/Helpers/ExpiringUndoManager.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 153ec8e6f..67f1784ac 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -62,8 +62,8 @@ A586365F2DEE6C2300E04A10 /* SplitTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586365E2DEE6C2100E04A10 /* SplitTree.swift */; }; A58636662DEF964100E04A10 /* TerminalSplitTreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */; }; A586366B2DF0A98C00E04A10 /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366A2DF0A98900E04A10 /* Array+Extension.swift */; }; - A586366D2DF25C2500E04A10 /* ExpiringTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366C2DF25C1C00E04A10 /* ExpiringTarget.swift */; }; A586366F2DF25D8600E04A10 /* Duration+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366E2DF25D8300E04A10 /* Duration+Extension.swift */; }; + A58636712DF298FB00E04A10 /* ExpiringUndoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58636702DF298F700E04A10 /* ExpiringUndoManager.swift */; }; A5874D992DAD751B00E83852 /* CGS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D982DAD751A00E83852 /* CGS.swift */; }; A5874D9D2DAD786100E83852 /* NSWindow+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */; }; A59444F729A2ED5200725BBA /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59444F629A2ED5200725BBA /* SettingsView.swift */; }; @@ -170,8 +170,8 @@ A586365E2DEE6C2100E04A10 /* SplitTree.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplitTree.swift; sourceTree = ""; }; A58636652DEF963F00E04A10 /* TerminalSplitTreeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalSplitTreeView.swift; sourceTree = ""; }; A586366A2DF0A98900E04A10 /* Array+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Extension.swift"; sourceTree = ""; }; - A586366C2DF25C1C00E04A10 /* ExpiringTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpiringTarget.swift; sourceTree = ""; }; A586366E2DF25D8300E04A10 /* Duration+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Duration+Extension.swift"; sourceTree = ""; }; + A58636702DF298F700E04A10 /* ExpiringUndoManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpiringUndoManager.swift; sourceTree = ""; }; A5874D982DAD751A00E83852 /* CGS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CGS.swift; sourceTree = ""; }; A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSWindow+Extension.swift"; sourceTree = ""; }; A59444F629A2ED5200725BBA /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; @@ -294,7 +294,6 @@ A534263D2A7DCBB000EBB7A2 /* Helpers */ = { isa = PBXGroup; children = ( - A586366C2DF25C1C00E04A10 /* ExpiringTarget.swift */, A58636692DF0A98100E04A10 /* Extensions */, A5874D9B2DAD781100E83852 /* Private */, A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */, @@ -303,6 +302,7 @@ A5333E1B2B5A1CE3008AEFF7 /* CrossKit.swift */, A5CBD0572C9F30860017A1AE /* Cursor.swift */, A5D0AF3C2B37804400D21823 /* CodableBridge.swift */, + A58636702DF298F700E04A10 /* ExpiringUndoManager.swift */, A52FFF582CAA4FF1000C6A5B /* Fullscreen.swift */, A59630962AEE163600D64628 /* HostingWindow.swift */, A5CA378B2D2A4DE800931030 /* KeyboardLayout.swift */, @@ -708,6 +708,7 @@ A53A29812DB44A6100B6E02C /* KeyboardShortcut+Extension.swift in Sources */, A5CBD0562C9E65B80017A1AE /* DraggableWindowView.swift in Sources */, C1F26EE92B76CBFC00404083 /* VibrantLayer.m in Sources */, + A58636712DF298FB00E04A10 /* ExpiringUndoManager.swift in Sources */, A59630972AEE163600D64628 /* HostingWindow.swift in Sources */, A59630A02AEF6AEB00D64628 /* TerminalManager.swift in Sources */, A51BFC2B2B30F6BE00E92F16 /* UpdateDelegate.swift in Sources */, @@ -720,7 +721,6 @@ A52FFF5B2CAA54B1000C6A5B /* FullscreenMode+Extension.swift in Sources */, A5333E222B5A2128008AEFF7 /* SurfaceView_AppKit.swift in Sources */, A5CA378E2D31D6C300931030 /* Weak.swift in Sources */, - A586366D2DF25C2500E04A10 /* ExpiringTarget.swift in Sources */, A5CDF1952AAFA19600513312 /* ConfigurationErrorsView.swift in Sources */, A55B7BBC29B6FC330055DE60 /* SurfaceView.swift in Sources */, A5333E1C2B5A1CE3008AEFF7 /* CrossKit.swift in Sources */, diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index d12b2efd2..eae8dd121 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -91,7 +91,7 @@ class AppDelegate: NSObject, let terminalManager: TerminalManager /// The global undo manager for app-level state such as window restoration. - lazy var undoManager = UndoManager() + lazy var undoManager = ExpiringUndoManager() /// Our quick terminal. This starts out uninitialized and only initializes if used. private var quickController: QuickTerminalController? = nil diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index cd7ceffbb..6cc6b2ec8 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -75,11 +75,25 @@ class BaseTerminalController: NSWindowController, /// The cancellables related to our focused surface. private var focusedSurfaceCancellables: Set = [] + /// The time that undo/redo operations that contain running ptys are valid for. + private var undoExpiration: Duration { + .seconds(5) + } + /// The undo manager for this controller is the undo manager of the window, /// which we set via the delegate method. - override var undoManager: UndoManager? { + override var undoManager: ExpiringUndoManager? { // This should be set via the delegate method windowWillReturnUndoManager - window?.undoManager + if let result = window?.undoManager as? ExpiringUndoManager { + return result + } + + // If the window one isn't set, we fallback to our global one. + if let appDelegate = NSApplication.shared.delegate as? AppDelegate { + return appDelegate.undoManager + } + + return nil } struct SavedFrame { @@ -173,7 +187,7 @@ class BaseTerminalController: NSWindowController, deinit { NotificationCenter.default.removeObserver(self) - + undoManager?.removeAllActions(withTarget: self) if let eventMonitor { NSEvent.removeMonitor(eventMonitor) } @@ -284,20 +298,20 @@ class BaseTerminalController: NSWindowController, // Setup our undo if let undoManager { undoManager.setActionName("Close Terminal") - undoManager.registerUndo(withTarget: ExpiringTarget( - with: .seconds(5), - in: undoManager, - )) { [weak self] v in - guard let self else { return } - self.surfaceTree = oldTree + undoManager.registerUndo( + withTarget: self, + expiresAfter: undoExpiration) { target in + target.surfaceTree = oldTree if let oldFocused { DispatchQueue.main.async { - Ghostty.moveFocus(to: oldFocused, from: self.focusedSurface) + Ghostty.moveFocus(to: oldFocused, from: target.focusedSurface) } } - undoManager.registerUndo(withTarget: NSObject()) { [weak self] _ in - self?.closeSurface( + undoManager.registerUndo( + withTarget: target, + expiresAfter: target.undoExpiration) { target in + target.closeSurface( node.leftmostLeaf(), withConfirmation: node.contains { $0.needsConfirmQuit @@ -446,9 +460,12 @@ class BaseTerminalController: NSWindowController, let newView = Ghostty.SurfaceView(ghostty_app, baseConfig: config) // Do the split + let newTree: SplitTree do { - let newTree = try surfaceTree.insert(view: newView, at: oldView, direction: splitDirection) - surfaceTree = newTree + newTree = try surfaceTree.insert( + view: newView, + at: oldView, + direction: splitDirection) } catch { // If splitting fails for any reason (it should not), then we just log // and return. The new view we created will be deinitialized and its @@ -457,9 +474,36 @@ class BaseTerminalController: NSWindowController, return } + // Keep track of the old tree for undo + let oldTree = surfaceTree - // Once we've split, we need to move focus to the new split - Ghostty.moveFocus(to: newView, from: oldView) + // Setup our new split tree + surfaceTree = newTree + DispatchQueue.main.async { + Ghostty.moveFocus(to: newView, from: oldView) + } + + // Setup our undo + if let undoManager { + undoManager.setActionName("New Split") + undoManager.registerUndo( + withTarget: self, + expiresAfter: undoExpiration) { target in + target.surfaceTree = oldTree + DispatchQueue.main.async { + Ghostty.moveFocus(to: oldView, from: target.focusedSurface) + } + + undoManager.registerUndo( + withTarget: target, + expiresAfter: target.undoExpiration) { target in + target.surfaceTree = newTree + DispatchQueue.main.async { + Ghostty.moveFocus(to: newView, from: target.focusedSurface) + } + } + } + } } @objc private func ghosttyDidEqualizeSplits(_ notification: Notification) { @@ -836,6 +880,9 @@ class BaseTerminalController: NSWindowController, // the view and the window so we had to nil this out to break it but I think this // may now be resolved. We should verify that no memory leaks and we can remove this. window.contentView = nil + + // Make sure we clean up all our undos + window.undoManager?.removeAllActions(withTarget: self) } func windowDidBecomeKey(_ notification: Notification) { diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 682efa947..6e35f40d1 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -287,6 +287,8 @@ extension Ghostty { if let surface = self.surface { ghostty_surface_free(surface) } + + Ghostty.logger.warning("WOW close") } func focusDidChange(_ focused: Bool) { diff --git a/macos/Sources/Helpers/ExpiringTarget.swift b/macos/Sources/Helpers/ExpiringTarget.swift deleted file mode 100644 index d24021495..000000000 --- a/macos/Sources/Helpers/ExpiringTarget.swift +++ /dev/null @@ -1,53 +0,0 @@ -import AppKit - -/// A target object for UndoManager that automatically expires after a specified duration. -/// -/// ExpiringTarget holds a reference to a target object and removes all undo actions -/// associated with itself from the UndoManager when the timer expires. This is useful -/// for creating temporary undo operations that should not persist beyond a certain time. -/// -/// The parameter T can be used to retain a reference to some target value -/// that can be used in the undo operation. The target is released when the timer expires. -/// -/// - Parameter T: The type of the target object, constrained to AnyObject -class ExpiringTarget { - private(set) var target: T? - private var timer: Timer? - private weak var undoManager: UndoManager? - - /// Creates an expiring target that will automatically remove undo actions after the specified duration. - /// - /// - Parameters: - /// - target: The target object to hold weakly. Defaults to nil. - /// - duration: The time after which the target should expire - /// - undoManager: The UndoManager from which to remove actions when expired - init(_ target: T? = nil, with duration: Duration, in undoManager: UndoManager) { - self.target = target - self.undoManager = undoManager - self.timer = Timer.scheduledTimer( - withTimeInterval: duration.timeInterval, - repeats: false) { _ in - self.expire() - } - } - - /// Manually expires the target, removing all associated undo actions and invalidating the timer. - /// - /// This method is called automatically when the timer fires, but can also be called manually - /// to expire the target before the timer duration has elapsed. - func expire() { - target = nil - undoManager?.removeAllActions(withTarget: self) - timer?.invalidate() - } - - deinit { - expire() - } -} - -extension ExpiringTarget where T == NSObject { - convenience init(with duration: Duration, in undoManager: UndoManager) { - self.init(nil, with: duration, in: undoManager) - } -} diff --git a/macos/Sources/Helpers/ExpiringUndoManager.swift b/macos/Sources/Helpers/ExpiringUndoManager.swift new file mode 100644 index 000000000..3eda56182 --- /dev/null +++ b/macos/Sources/Helpers/ExpiringUndoManager.swift @@ -0,0 +1,137 @@ +/// An UndoManager subclass that supports registering undo operations that automatically expire after a specified duration. +/// +/// This class extends the standard UndoManager to add time-based expiration for undo operations. +/// When an undo operation expires, it is automatically removed from the undo stack and cannot be invoked. +/// +/// Example usage: +/// ```swift +/// let undoManager = ExpiringUndoManager() +/// undoManager.registerUndo(withTarget: myObject, expiresAfter: .seconds(30)) { target in +/// // Undo operation that expires after 30 seconds +/// target.restorePreviousState() +/// } +/// ``` +class ExpiringUndoManager: UndoManager { + /// The set of expiring targets so we can properly clean them up when removeAllActions + /// is called with the real target. + private lazy var expiringTargets: Set = [] + + /// Registers an undo operation that automatically expires after the specified duration. + /// + /// - Parameters: + /// - target: The target object for the undo operation. The undo operation will be removed + /// if this object is deallocated before the operation is invoked. + /// - duration: The duration after which the undo operation should expire and be removed from the undo stack. + /// - handler: The closure to execute when the undo operation is invoked. The closure receives + /// the target object as its parameter. + func registerUndo( + withTarget target: TargetType, + expiresAfter duration: Duration, + handler: @escaping (TargetType) -> Void + ) { + let expiringTarget = ExpiringTarget( + target, + expiresAfter: duration, + in: self) + expiringTargets.insert(expiringTarget) + + super.registerUndo(withTarget: expiringTarget) { [weak self] expiringTarget in + self?.expiringTargets.remove(expiringTarget) + guard let target = expiringTarget.target as? TargetType else { return } + handler(target) + } + } + + /// Removes all undo and redo operations from the undo manager. + /// + /// This override ensures that all expiring targets are also cleared when + /// the undo manager is reset. + override func removeAllActions() { + super.removeAllActions() + expiringTargets = [] + } + + /// Removes all undo and redo operations involving the specified target. + /// + /// This override ensures that when actions are removed for a target, any associated + /// expiring targets are also properly cleaned up. + /// + /// - Parameter target: The target object whose actions should be removed. + override func removeAllActions(withTarget target: Any) { + // Call super to handle standard removal + super.removeAllActions(withTarget: target) + + if !(target is ExpiringTarget) { + // Find and remove any ExpiringTarget instances that wrap this target. + expiringTargets + .filter { $0.target == nil || $0.target === (target as AnyObject) } + .forEach { + // Technically they'll always expire when they get deinitialized + // but we want to make sure it happens right now. + $0.expire() + expiringTargets.remove($0) + } + } + } +} + +/// A target object for ExpiringUndoManager that removes itself from the +/// undo manager after it expires. +/// +/// This class acts as a proxy for the real target object in undo operations. +/// It holds a weak reference to the actual target and automatically removes +/// all associated undo operations when either: +/// - The specified duration expires +/// - The ExpiringTarget instance is deallocated +/// - The expire() method is called manually +private class ExpiringTarget { + /// The actual target object for the undo operation, held weakly to avoid retain cycles. + private(set) weak var target: AnyObject? + + /// Timer that triggers expiration after the specified duration. + private var timer: Timer? + + /// The undo manager from which to remove actions when this target expires. + private weak var undoManager: UndoManager? + + /// Creates an expiring target that will automatically remove undo actions after the specified duration. + /// + /// - Parameters: + /// - target: The target object to hold weakly. + /// - duration: The time after which the target should expire. + /// - undoManager: The UndoManager from which to remove actions when expired. + init(_ target: AnyObject? = nil, expiresAfter duration: Duration, in undoManager: UndoManager) { + self.target = target + self.undoManager = undoManager + self.timer = Timer.scheduledTimer( + withTimeInterval: duration.timeInterval, + repeats: false) { [weak self] _ in + self?.expire() + } + } + + /// Manually expires the target, removing all associated undo actions and invalidating the timer. + /// + /// This method is called automatically when the timer fires, but can also be called manually + /// to expire the target before the timer duration has elapsed. + func expire() { + target = nil + undoManager?.removeAllActions(withTarget: self) + timer?.invalidate() + timer = nil + } + + deinit { + expire() + } +} + +extension ExpiringTarget: Hashable, Equatable { + static func == (lhs: ExpiringTarget, rhs: ExpiringTarget) -> Bool { + return lhs === rhs + } + + func hash(into hasher: inout Hasher) { + hasher.combine(ObjectIdentifier(self)) + } +} From f571519157bc2eaf3dcf7995989c7d8266a8ddc6 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 5 Jun 2025 21:43:41 -0700 Subject: [PATCH 110/371] macos: setup undo responders at the AppDelegate level --- macos/Sources/App/macOS/AppDelegate.swift | 24 +++++++++++++++++++ .../Features/Terminal/TerminalManager.swift | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index eae8dd121..1fce7d665 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -892,6 +892,14 @@ class AppDelegate: NSObject, NSApplication.shared.arrangeInFront(sender) } + @IBAction func undo(_ sender: Any?) { + undoManager.undo() + } + + @IBAction func redo(_ sender: Any?) { + undoManager.redo() + } + private struct DerivedConfig { let initialWindow: Bool let shouldQuitAfterLastWindowClosed: Bool @@ -981,6 +989,22 @@ extension AppDelegate: NSMenuItemValidation { // terminal window (not quick terminal). return NSApp.keyWindow is TerminalWindow + case #selector(undo(_:)): + if undoManager.canUndo { + item.title = "Undo \(undoManager.undoActionName)" + } else { + item.title = "Undo" + } + return undoManager.canUndo + + case #selector(redo(_:)): + if undoManager.canRedo { + item.title = "Redo \(undoManager.redoActionName)" + } else { + item.title = "Redo" + } + return undoManager.canRedo + default: return true } diff --git a/macos/Sources/Features/Terminal/TerminalManager.swift b/macos/Sources/Features/Terminal/TerminalManager.swift index 805ae6e93..050bc5563 100644 --- a/macos/Sources/Features/Terminal/TerminalManager.swift +++ b/macos/Sources/Features/Terminal/TerminalManager.swift @@ -228,7 +228,7 @@ class TerminalManager { // Ensure any publishers we have are cancelled w.closePublisher.cancel() - + // If we remove a window, we reset the cascade point to the key window so that // the next window cascade's from that one. if let focusedWindow = NSApplication.shared.keyWindow { From 104cc2adfee94062c735611b0dbacf7332dff58d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 07:52:31 -0700 Subject: [PATCH 111/371] macos: basic undo close window, not very robust yet --- macos/Sources/Features/Splits/SplitTree.swift | 38 ++++++++ .../Terminal/BaseTerminalController.swift | 31 +++--- .../Terminal/TerminalController.swift | 95 ++++++++++++++++++- 3 files changed, 147 insertions(+), 17 deletions(-) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index cbd440124..394cd1089 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -107,6 +107,18 @@ extension SplitTree { self.init(root: .leaf(view: view), zoomed: nil) } + /// Checks if the tree contains the specified node. + /// + /// Note that SplitTree implements Sequence on views so there's already a `contains` + /// for views too. + /// + /// - Parameter node: The node to search for in the tree + /// - Returns: True if the node exists in the tree, false otherwise + func contains(_ node: Node) -> Bool { + guard let root else { return false } + return root.path(to: node) != nil + } + /// Insert a new view at the given view point by creating a split in the given direction. /// This will always reset the zoomed state of the tree. func insert(view: ViewType, at: ViewType, direction: NewDirection) throws -> Self { @@ -1078,3 +1090,29 @@ extension SplitTree.Node: Sequence { return leaves().makeIterator() } } + +// MARK: SplitTree Collection + +extension SplitTree: Collection { + typealias Index = Int + typealias Element = ViewType + + var startIndex: Int { + return 0 + } + + var endIndex: Int { + return root?.leaves().count ?? 0 + } + + subscript(position: Int) -> ViewType { + precondition(position >= 0 && position < endIndex, "Index out of bounds") + let leaves = root?.leaves() ?? [] + return leaves[position] + } + + func index(after i: Int) -> Int { + precondition(i < endIndex, "Cannot increment index beyond endIndex") + return i + 1 + } +} diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 6cc6b2ec8..e34a44941 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -76,7 +76,7 @@ class BaseTerminalController: NSWindowController, private var focusedSurfaceCancellables: Set = [] /// The time that undo/redo operations that contain running ptys are valid for. - private var undoExpiration: Duration { + var undoExpiration: Duration { .seconds(5) } @@ -277,7 +277,11 @@ class BaseTerminalController: NSWindowController, } /// Remove a node from the surface tree and move focus appropriately. - private func removeSurfaceAndMoveFocus(_ node: SplitTree.Node) { + /// + /// This also updates the undo manager to support restoring this node. + /// + /// This does no confirmation and assumes confirmation is already done. + private func removeSurfaceNode(_ node: SplitTree.Node) { let nextTarget = findNextFocusTargetAfterClosing(node: node) let oldFocused = focusedSurface let focused = node.contains { $0 == focusedSurface } @@ -311,8 +315,8 @@ class BaseTerminalController: NSWindowController, undoManager.registerUndo( withTarget: target, expiresAfter: target.undoExpiration) { target in - target.closeSurface( - node.leftmostLeaf(), + target.closeSurfaceNode( + node, withConfirmation: node.contains { $0.needsConfirmQuit } @@ -397,25 +401,26 @@ class BaseTerminalController: NSWindowController, @objc private func ghosttyDidCloseSurface(_ notification: Notification) { guard let target = notification.object as? Ghostty.SurfaceView else { return } - closeSurface( - target, + guard let node = surfaceTree.root?.node(view: target) else { return } + closeSurfaceNode( + node, withConfirmation: (notification.userInfo?["process_alive"] as? Bool) ?? false, ) } - /// Close a surface view, requesting confirmation if necessary. + /// Close a surface node (which may contain splits), requesting confirmation if necessary. /// /// This will also insert the proper undo stack information in. - private func closeSurface( - _ target: Ghostty.SurfaceView, + func closeSurfaceNode( + _ node: SplitTree.Node, withConfirmation: Bool = true, ) { - // The target must be within our tree - guard let node = surfaceTree.root?.node(view: target) else { return } + // This node must be part of our tree + guard surfaceTree.contains(node) else { return } // If the child process is not alive, then we exit immediately guard withConfirmation else { - removeSurfaceAndMoveFocus(node) + removeSurfaceNode(node) return } @@ -429,7 +434,7 @@ class BaseTerminalController: NSWindowController, informativeText: "The terminal still has a running process. If you close the terminal the process will be killed." ) { [weak self] in if let self { - self.removeSurfaceAndMoveFocus(node) + self.removeSurfaceNode(node) } } } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index baae90068..554f7699b 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -386,6 +386,93 @@ class TerminalController: BaseTerminalController { return frame } + /// This is called anytime a node in the surface tree is being removed. + override func closeSurfaceNode( + _ node: SplitTree.Node, + withConfirmation: Bool = true + ) { + // If this isn't the root then we're dealing with a split closure. + if surfaceTree.root != node { + super.closeSurfaceNode(node, withConfirmation: withConfirmation) + return + } + + // More than 1 window means we have tabs and we're closing a tab + if window?.tabGroup?.windows.count ?? 0 > 1 { + closeTab(nil) + return + } + + // 1 window, closing the window + closeWindow(nil) + } + + /// Closes the current window (including any other tabs) immediately and without + /// confirmation. This will setup proper undo state so the action can be undone. + private func closeWindowImmediately(_ sender: Any?) { + guard let window = window else { return } + + // Regardless of tabs vs no tabs, what we want to do here is keep + // track of the window frame to restore, the surface tree, and the + // the focused surface. We want to restore that with undo even + // if we end up closing. + if let undoManager { + // Capture current state for undo + let currentFrame = window.frame + let currentSurfaceTree = surfaceTree + let currentFocusedSurface = focusedSurface + + // Register undo action to restore the window + undoManager.setActionName("Close Window") + undoManager.registerUndo( + withTarget: ghostty, + expiresAfter: undoExpiration) { ghostty in + + // Create a new window controller with the saved state + let newController = TerminalController( + ghostty, + withSurfaceTree: currentSurfaceTree + ) + + // Show the window and restore its frame + newController.showWindow(nil) + if let newWindow = newController.window { + newWindow.setFrame(currentFrame, display: true) + + // Restore focus to the previously focused surface + if let focusTarget = currentFocusedSurface { + DispatchQueue.main.async { + Ghostty.moveFocus(to: focusTarget, from: nil) + } + } + } + + // Register redo action + undoManager.registerUndo( + withTarget: newController, + expiresAfter: newController.undoExpiration) { target in + // For redo, we close the window again + target.closeWindowImmediately(sender) + } + } + } + + guard let tabGroup = window.tabGroup else { + // No tabs, no tab group, just perform a normal close. + window.close() + return + } + + // If have one window then we just do a normal close + if tabGroup.windows.count == 1 { + window.close() + return + } + + + tabGroup.windows.forEach { $0.close() } + } + //MARK: - NSWindowController override func windowWillLoad() { @@ -635,13 +722,13 @@ class TerminalController: BaseTerminalController { guard let window = window else { return } guard let tabGroup = window.tabGroup else { // No tabs, no tab group, just perform a normal close. - window.performClose(sender) + closeWindowImmediately(sender) return } // If have one window then we just do a normal close if tabGroup.windows.count == 1 { - window.performClose(sender) + closeWindowImmediately(sender) return } @@ -655,7 +742,7 @@ class TerminalController: BaseTerminalController { // If none need confirmation then we can just close all the windows. if !needsConfirm { - tabGroup.windows.forEach { $0.close() } + closeWindowImmediately(sender) return } @@ -663,7 +750,7 @@ class TerminalController: BaseTerminalController { messageText: "Close Window?", informativeText: "All terminal sessions in this window will be terminated." ) { - tabGroup.windows.forEach { $0.close() } + self.closeWindowImmediately(sender) } } From 5f74445b141a14d5a0d8705a38161f242edf1ec6 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 11:05:06 -0700 Subject: [PATCH 112/371] macos: basic undo tab, not quite working --- .../Terminal/TerminalController.swift | 163 ++++++++++++------ 1 file changed, 115 insertions(+), 48 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 554f7699b..b7b2fcd89 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -407,52 +407,82 @@ class TerminalController: BaseTerminalController { closeWindow(nil) } - /// Closes the current window (including any other tabs) immediately and without - /// confirmation. This will setup proper undo state so the action can be undone. - private func closeWindowImmediately(_ sender: Any?) { + private func closeTabImmediately() { guard let window = window else { return } - - // Regardless of tabs vs no tabs, what we want to do here is keep - // track of the window frame to restore, the surface tree, and the - // the focused surface. We want to restore that with undo even - // if we end up closing. - if let undoManager { - // Capture current state for undo - let currentFrame = window.frame - let currentSurfaceTree = surfaceTree - let currentFocusedSurface = focusedSurface - - // Register undo action to restore the window - undoManager.setActionName("Close Window") + guard let tabGroup = window.tabGroup, + tabGroup.windows.count > 1 else { + closeWindowImmediately() + return + } + + // Undo + if let undoManager, let undoState { + // Get the current tab index before closing + let tabIndex = tabGroup.windows.firstIndex(of: window) ?? 0 + + // Register undo action to restore the tab + undoManager.setActionName("Close Tab") undoManager.registerUndo( withTarget: ghostty, expiresAfter: undoExpiration) { ghostty in - - // Create a new window controller with the saved state - let newController = TerminalController( - ghostty, - withSurfaceTree: currentSurfaceTree - ) - // Show the window and restore its frame - newController.showWindow(nil) + // Create a new window controller with the saved state + let newController = TerminalController(ghostty, with: undoState) + if let newWindow = newController.window { - newWindow.setFrame(currentFrame, display: true) - - // Restore focus to the previously focused surface - if let focusTarget = currentFocusedSurface { - DispatchQueue.main.async { - Ghostty.moveFocus(to: focusTarget, from: nil) - } + // Add the window back to the tab group at the correct position + if let targetWindow = tabGroup.windows.dropFirst(tabIndex).first { + // Insert after the target window + targetWindow.addTabbedWindow(newWindow, ordered: .above) + } else if let targetWindow = tabGroup.windows.last { + // Add at the end if the original position is beyond current tabs + targetWindow.addTabbedWindow(newWindow, ordered: .above) + } else if let firstWindow = tabGroup.windows.first { + // Fallback: add to the beginning if needed + firstWindow.addTabbedWindow(newWindow, ordered: .below) } + + // Make it the key window + newWindow.makeKeyAndOrderFront(nil) } + // Register redo action + undoManager.registerUndo( + withTarget: newController, + expiresAfter: newController.undoExpiration) { target in + // For redo, we close the tab again + target.closeTabImmediately() + } + } + } + + window.close() + } + + /// Closes the current window (including any other tabs) immediately and without + /// confirmation. This will setup proper undo state so the action can be undone. + private func closeWindowImmediately() { + guard let window = window else { return } + + // Regardless of tabs vs no tabs, what we want to do here is keep + // track of the window frame to restore, the surface tree, and the + // the focused surface. We want to restore that with undo even + // if we end up closing. + if let undoManager, let undoState { + // Register undo action to restore the window + undoManager.setActionName("Close Window") + undoManager.registerUndo( + withTarget: ghostty, + expiresAfter: undoExpiration) { ghostty in + // Restore the undo state + let newController = TerminalController(ghostty, with: undoState) + // Register redo action undoManager.registerUndo( withTarget: newController, expiresAfter: newController.undoExpiration) { target in // For redo, we close the window again - target.closeWindowImmediately(sender) + target.closeWindowImmediately() } } } @@ -473,6 +503,44 @@ class TerminalController: BaseTerminalController { tabGroup.windows.forEach { $0.close() } } + // MARK: Undo/Redo + + /// The state that we require to recreate a TerminalController from an undo. + struct UndoState { + let frame: NSRect + let surfaceTree: SplitTree + let focusedSurface: UUID? + } + + convenience init(_ ghostty: Ghostty.App, + with undoState: UndoState + ) { + self.init(ghostty, withSurfaceTree: undoState.surfaceTree) + + // Show the window and restore its frame + showWindow(nil) + if let window { + window.setFrame(undoState.frame, display: true) + + // Restore focus to the previously focused surface + if let focusedUUID = undoState.focusedSurface, + let focusTarget = surfaceTree.first(where: { $0.uuid == focusedUUID }) { + DispatchQueue.main.async { + Ghostty.moveFocus(to: focusTarget, from: nil) + } + } + } + } + + /// The current undo state for this controller + var undoState: UndoState? { + guard let window else { return nil } + return .init( + frame: window.frame, + surfaceTree: surfaceTree, + focusedSurface: focusedSurface?.uuid) + } + //MARK: - NSWindowController override func windowWillLoad() { @@ -694,23 +762,22 @@ class TerminalController: BaseTerminalController { @IBAction func closeTab(_ sender: Any?) { guard let window = window else { return } - guard window.tabGroup != nil else { - // No tabs, no tab group, just perform a normal close. - window.performClose(sender) + guard window.tabGroup?.windows.count ?? 0 > 1 else { + closeWindow(sender) return } - if surfaceTree.contains(where: { $0.needsConfirmQuit }) { - confirmClose( - messageText: "Close Tab?", - informativeText: "The terminal still has a running process. If you close the tab the process will be killed." - ) { - window.close() - } + guard surfaceTree.contains(where: { $0.needsConfirmQuit }) else { + closeTabImmediately() return } - window.close() + confirmClose( + messageText: "Close Tab?", + informativeText: "The terminal still has a running process. If you close the tab the process will be killed." + ) { + self.closeTabImmediately() + } } @IBAction func returnToDefaultSize(_ sender: Any?) { @@ -722,13 +789,13 @@ class TerminalController: BaseTerminalController { guard let window = window else { return } guard let tabGroup = window.tabGroup else { // No tabs, no tab group, just perform a normal close. - closeWindowImmediately(sender) + closeWindowImmediately() return } // If have one window then we just do a normal close if tabGroup.windows.count == 1 { - closeWindowImmediately(sender) + closeWindowImmediately() return } @@ -742,7 +809,7 @@ class TerminalController: BaseTerminalController { // If none need confirmation then we can just close all the windows. if !needsConfirm { - closeWindowImmediately(sender) + closeWindowImmediately() return } @@ -750,7 +817,7 @@ class TerminalController: BaseTerminalController { messageText: "Close Window?", informativeText: "All terminal sessions in this window will be terminated." ) { - self.closeWindowImmediately(sender) + self.closeWindowImmediately() } } @@ -948,7 +1015,6 @@ class TerminalController: BaseTerminalController { toggleFullscreen(mode: fullscreenMode) } - struct DerivedConfig { let backgroundColor: Color let macosWindowButtons: Ghostty.MacOSWindowButtons @@ -971,6 +1037,7 @@ class TerminalController: BaseTerminalController { } } +// MARK: NSMenuItemValidation extension TerminalController: NSMenuItemValidation { func validateMenuItem(_ item: NSMenuItem) -> Bool { From e1847da1391b3bc49e3c79a0afcec338a7441c0a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 11:13:47 -0700 Subject: [PATCH 113/371] macos: more robust undo tab that goes back to the same position --- .../Terminal/TerminalController.swift | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index b7b2fcd89..162141d11 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -417,35 +417,13 @@ class TerminalController: BaseTerminalController { // Undo if let undoManager, let undoState { - // Get the current tab index before closing - let tabIndex = tabGroup.windows.firstIndex(of: window) ?? 0 - // Register undo action to restore the tab undoManager.setActionName("Close Tab") undoManager.registerUndo( withTarget: ghostty, expiresAfter: undoExpiration) { ghostty in - - // Create a new window controller with the saved state let newController = TerminalController(ghostty, with: undoState) - if let newWindow = newController.window { - // Add the window back to the tab group at the correct position - if let targetWindow = tabGroup.windows.dropFirst(tabIndex).first { - // Insert after the target window - targetWindow.addTabbedWindow(newWindow, ordered: .above) - } else if let targetWindow = tabGroup.windows.last { - // Add at the end if the original position is beyond current tabs - targetWindow.addTabbedWindow(newWindow, ordered: .above) - } else if let firstWindow = tabGroup.windows.first { - // Fallback: add to the beginning if needed - firstWindow.addTabbedWindow(newWindow, ordered: .below) - } - - // Make it the key window - newWindow.makeKeyAndOrderFront(nil) - } - // Register redo action undoManager.registerUndo( withTarget: newController, @@ -510,6 +488,8 @@ class TerminalController: BaseTerminalController { let frame: NSRect let surfaceTree: SplitTree let focusedSurface: UUID? + let tabIndex: Int? + private(set) weak var tabGroup: NSWindowTabGroup? } convenience init(_ ghostty: Ghostty.App, @@ -522,6 +502,21 @@ class TerminalController: BaseTerminalController { if let window { window.setFrame(undoState.frame, display: true) + // If we have a tab group and index, restore the tab to its original position + if let tabGroup = undoState.tabGroup, + let tabIndex = undoState.tabIndex { + if tabIndex < tabGroup.windows.count { + // Find the window that is currently at that index + let currentWindow = tabGroup.windows[tabIndex] + currentWindow.addTabbedWindow(window, ordered: .below) + } else { + tabGroup.windows.last?.addTabbedWindow(window, ordered: .above) + } + + // Make it the key window + window.makeKeyAndOrderFront(nil) + } + // Restore focus to the previously focused surface if let focusedUUID = undoState.focusedSurface, let focusTarget = surfaceTree.first(where: { $0.uuid == focusedUUID }) { @@ -538,7 +533,9 @@ class TerminalController: BaseTerminalController { return .init( frame: window.frame, surfaceTree: surfaceTree, - focusedSurface: focusedSurface?.uuid) + focusedSurface: focusedSurface?.uuid, + tabIndex: window.tabGroup?.windows.firstIndex(of: window), + tabGroup: window.tabGroup) } //MARK: - NSWindowController From b044f4864ae4ad8ab06e3e631a23eb2e5748c0ba Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 11:34:33 -0700 Subject: [PATCH 114/371] add undo/redo keybindings, default them on macOS --- include/ghostty.h | 2 + macos/Sources/App/macOS/AppDelegate.swift | 7 +-- .../Terminal/TerminalController.swift | 6 +-- macos/Sources/Ghostty/Ghostty.App.swift | 48 +++++++++++++++++++ src/Surface.zig | 12 +++++ src/apprt/action.zig | 9 ++++ src/build/mdgen/mdgen.zig | 3 +- src/config/Config.zig | 12 +++++ src/input/Binding.zig | 31 ++++++++++++ src/input/command.zig | 12 +++++ 10 files changed, 132 insertions(+), 10 deletions(-) diff --git a/include/ghostty.h b/include/ghostty.h index 6b1625a30..95bd58cd7 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -673,6 +673,8 @@ typedef enum { GHOSTTY_ACTION_CONFIG_CHANGE, GHOSTTY_ACTION_CLOSE_WINDOW, GHOSTTY_ACTION_RING_BELL, + GHOSTTY_ACTION_UNDO, + GHOSTTY_ACTION_REDO, GHOSTTY_ACTION_CHECK_FOR_UPDATES } ghostty_action_tag_e; diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index 1fce7d665..db332813f 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -398,11 +398,8 @@ class AppDelegate: NSObject, syncMenuShortcut(config, action: "new_split:down", menuItem: self.menuSplitDown) syncMenuShortcut(config, action: "new_split:up", menuItem: self.menuSplitUp) - // TODO: sync - menuUndo?.keyEquivalent = "z" - menuUndo?.keyEquivalentModifierMask = [.command] - menuRedo?.keyEquivalent = "z" - menuRedo?.keyEquivalentModifierMask = [.command, .shift] + syncMenuShortcut(config, action: "undo", menuItem: self.menuUndo) + syncMenuShortcut(config, action: "redo", menuItem: self.menuRedo) syncMenuShortcut(config, action: "copy_to_clipboard", menuItem: self.menuCopy) syncMenuShortcut(config, action: "paste_from_clipboard", menuItem: self.menuPaste) syncMenuShortcut(config, action: "paste_from_selection", menuItem: self.menuPasteSelection) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 162141d11..ddeb3dada 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -428,8 +428,7 @@ class TerminalController: BaseTerminalController { undoManager.registerUndo( withTarget: newController, expiresAfter: newController.undoExpiration) { target in - // For redo, we close the tab again - target.closeTabImmediately() + target.closeTab(nil) } } } @@ -459,8 +458,7 @@ class TerminalController: BaseTerminalController { undoManager.registerUndo( withTarget: newController, expiresAfter: newController.undoExpiration) { target in - // For redo, we close the window again - target.closeWindowImmediately() + target.closeWindow(nil) } } } diff --git a/macos/Sources/Ghostty/Ghostty.App.swift b/macos/Sources/Ghostty/Ghostty.App.swift index 4a9dc0ea6..ba0b95212 100644 --- a/macos/Sources/Ghostty/Ghostty.App.swift +++ b/macos/Sources/Ghostty/Ghostty.App.swift @@ -553,6 +553,12 @@ extension Ghostty { case GHOSTTY_ACTION_CHECK_FOR_UPDATES: checkForUpdates(app) + case GHOSTTY_ACTION_UNDO: + return undo(app, target: target) + + case GHOSTTY_ACTION_REDO: + return redo(app, target: target) + case GHOSTTY_ACTION_CLOSE_ALL_WINDOWS: fallthrough case GHOSTTY_ACTION_TOGGLE_TAB_OVERVIEW: @@ -599,6 +605,48 @@ extension Ghostty { } } + private static func undo(_ app: ghostty_app_t, target: ghostty_target_s) -> Bool { + let undoManager: UndoManager? + switch (target.tag) { + case GHOSTTY_TARGET_APP: + undoManager = (NSApp.delegate as? AppDelegate)?.undoManager + + case GHOSTTY_TARGET_SURFACE: + guard let surface = target.target.surface else { return false } + guard let surfaceView = self.surfaceView(from: surface) else { return false } + undoManager = surfaceView.undoManager + + default: + assertionFailure() + return false + } + + guard let undoManager, undoManager.canUndo else { return false } + undoManager.undo() + return true + } + + private static func redo(_ app: ghostty_app_t, target: ghostty_target_s) -> Bool { + let undoManager: UndoManager? + switch (target.tag) { + case GHOSTTY_TARGET_APP: + undoManager = (NSApp.delegate as? AppDelegate)?.undoManager + + case GHOSTTY_TARGET_SURFACE: + guard let surface = target.target.surface else { return false } + guard let surfaceView = self.surfaceView(from: surface) else { return false } + undoManager = surfaceView.undoManager + + default: + assertionFailure() + return false + } + + guard let undoManager, undoManager.canRedo else { return false } + undoManager.redo() + return true + } + private static func newWindow(_ app: ghostty_app_t, target: ghostty_target_s) { switch (target.tag) { case GHOSTTY_TARGET_APP: diff --git a/src/Surface.zig b/src/Surface.zig index 62a0ce549..e53613ac0 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -4337,6 +4337,18 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool {}, ), + .undo => return try self.rt_app.performAction( + .{ .surface = self }, + .undo, + {}, + ), + + .redo => return try self.rt_app.performAction( + .{ .surface = self }, + .redo, + {}, + ), + .select_all => { const sel = self.io.terminal.screen.selectAll(); if (sel) |s| { diff --git a/src/apprt/action.zig b/src/apprt/action.zig index 7866db182..b4c5164c2 100644 --- a/src/apprt/action.zig +++ b/src/apprt/action.zig @@ -258,6 +258,13 @@ pub const Action = union(Key) { /// it needs to ring the bell. This is usually a sound or visual effect. ring_bell, + /// Undo the last action. See the "undo" keybinding for more + /// details on what can and cannot be undone. + undo, + + /// Redo the last undone action. + redo, + check_for_updates, /// Sync with: ghostty_action_tag_e @@ -307,6 +314,8 @@ pub const Action = union(Key) { config_change, close_window, ring_bell, + undo, + redo, check_for_updates, }; diff --git a/src/build/mdgen/mdgen.zig b/src/build/mdgen/mdgen.zig index aca230aa5..e7d966323 100644 --- a/src/build/mdgen/mdgen.zig +++ b/src/build/mdgen/mdgen.zig @@ -26,7 +26,7 @@ pub fn genConfig(writer: anytype, cli: bool) !void { \\ ); - @setEvalBranchQuota(3000); + @setEvalBranchQuota(5000); inline for (@typeInfo(Config).@"struct".fields) |field| { if (field.name[0] == '_') continue; @@ -94,6 +94,7 @@ pub fn genKeybindActions(writer: anytype) !void { const info = @typeInfo(KeybindAction); std.debug.assert(info == .@"union"); + @setEvalBranchQuota(5000); inline for (info.@"union".fields) |field| { if (field.name[0] == '_') continue; diff --git a/src/config/Config.zig b/src/config/Config.zig index 14f394559..fdbde692d 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -4898,6 +4898,18 @@ pub const Keybinds = struct { .{ .key = .{ .unicode = 'q' }, .mods = .{ .super = true } }, .{ .quit = {} }, ); + try self.set.putFlags( + alloc, + .{ .key = .{ .unicode = 'z' }, .mods = .{ .super = true } }, + .{ .undo = {} }, + .{ .performable = true }, + ); + try self.set.putFlags( + alloc, + .{ .key = .{ .unicode = 'z' }, .mods = .{ .super = true, .shift = true } }, + .{ .redo = {} }, + .{ .performable = true }, + ); try self.set.putFlags( alloc, .{ .key = .{ .unicode = 'k' }, .mods = .{ .super = true } }, diff --git a/src/input/Binding.zig b/src/input/Binding.zig index 7818fac1e..52d36c004 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -655,6 +655,35 @@ pub const Action = union(enum) { /// Only implemented on macOS. check_for_updates, + /// Undo the last undoable action for the focused surface or terminal, + /// if possible. This can undo actions such as closing tabs or + /// windows. + /// + /// Not every action in Ghostty can be undone or redone. The list + /// of actions support undo/redo is currently limited to: + /// + /// - New window, close window + /// - New tab, close tab + /// - New split, close split + /// + /// All actions are only undoable/redoable for a limited time. + /// For example, restoring a closed split can only be done for + /// some number of seconds since the split was closed. The exact + /// amount is configured with `TODO`. + /// + /// The undo/redo actions being limited ensures that there is + /// bounded memory usage over time, closed surfaces don't continue running + /// in the background indefinitely, and the keybinds become available + /// for terminal applications to use. + /// + /// Only implemented on macOS. + undo, + + /// Redo the last undoable action for the focused surface or terminal, + /// if possible. See "undo" for more details on what can and cannot + /// be undone or redone. + redo, + /// Quit Ghostty. quit, @@ -991,6 +1020,8 @@ pub const Action = union(enum) { .toggle_secure_input, .toggle_command_palette, .reset_window_size, + .undo, + .redo, .crash, => .surface, diff --git a/src/input/command.zig b/src/input/command.zig index 4a918cff3..94fbf56a5 100644 --- a/src/input/command.zig +++ b/src/input/command.zig @@ -409,6 +409,18 @@ fn actionCommands(action: Action.Key) []const Command { .description = "Check for updates to the application.", }}, + .undo => comptime &.{.{ + .action = .undo, + .title = "Undo", + .description = "Undo the last action.", + }}, + + .redo => comptime &.{.{ + .action = .redo, + .title = "Redo", + .description = "Redo the last undone action.", + }}, + .quit => comptime &.{.{ .action = .quit, .title = "Quit", From 3e02c0cbd5edc1fbbf842a5a603ecf907ad5a187 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 12:12:14 -0700 Subject: [PATCH 115/371] macos: fix an incorrect bindable write during view update --- macos/Sources/Ghostty/SurfaceView.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index 46d379b9c..f830da4ef 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -301,8 +301,12 @@ extension Ghostty { if let instant = focusInstant { let d = instant.duration(to: ContinuousClock.now) if (d < .milliseconds(500)) { - // Avoid this size completely. - lastSize = geoSize + // Avoid this size completely. We can't set values during + // view updates so we have to defer this to another tick. + DispatchQueue.main.async { + lastSize = geoSize + } + return true; } } From 49cc88f0d335e4f52c69bbf38e9099c000d26c7d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 12:21:05 -0700 Subject: [PATCH 116/371] macos: configurable undo timeout --- .../Terminal/BaseTerminalController.swift | 2 +- macos/Sources/Ghostty/Ghostty.Config.swift | 8 +++ .../Sources/Helpers/ExpiringUndoManager.swift | 3 + src/config/Config.zig | 66 ++++++++++++++++++- 4 files changed, 75 insertions(+), 4 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index e34a44941..6ea56f693 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -77,7 +77,7 @@ class BaseTerminalController: NSWindowController, /// The time that undo/redo operations that contain running ptys are valid for. var undoExpiration: Duration { - .seconds(5) + ghostty.config.undoTimeout } /// The undo manager for this controller is the undo manager of the window, diff --git a/macos/Sources/Ghostty/Ghostty.Config.swift b/macos/Sources/Ghostty/Ghostty.Config.swift index 3acb93c25..fcbea2a12 100644 --- a/macos/Sources/Ghostty/Ghostty.Config.swift +++ b/macos/Sources/Ghostty/Ghostty.Config.swift @@ -506,6 +506,14 @@ extension Ghostty { return v; } + var undoTimeout: Duration { + guard let config = self.config else { return .seconds(5) } + var v: UInt = 0 + let key = "undo-timeout" + _ = ghostty_config_get(config, &v, key, UInt(key.count)) + return .milliseconds(v) + } + var autoUpdate: AutoUpdate? { guard let config = self.config else { return nil } var v: UnsafePointer? = nil diff --git a/macos/Sources/Helpers/ExpiringUndoManager.swift b/macos/Sources/Helpers/ExpiringUndoManager.swift index 3eda56182..9a9349cf3 100644 --- a/macos/Sources/Helpers/ExpiringUndoManager.swift +++ b/macos/Sources/Helpers/ExpiringUndoManager.swift @@ -29,6 +29,9 @@ class ExpiringUndoManager: UndoManager { expiresAfter duration: Duration, handler: @escaping (TargetType) -> Void ) { + // Ignore instantly expiring undos + guard duration.timeInterval > 0 else { return } + let expiringTarget = ExpiringTarget( target, expiresAfter: duration, diff --git a/src/config/Config.zig b/src/config/Config.zig index fdbde692d..e1d5b548e 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -1705,6 +1705,52 @@ keybind: Keybinds = .{}, /// window is ever created. Only implemented on Linux and macOS. @"initial-window": bool = true, +/// The duration that undo operations remain available. After this +/// time, the operation will be removed from the undo stack and +/// cannot be undone. +/// +/// The default value is 5 seconds. +/// +/// This timeout applies per operation, meaning that if you perform +/// multiple operations, each operation will have its own timeout. +/// New operations do not reset the timeout of previous operations. +/// +/// A timeout of zero will effectively disable undo operations. It is +/// not possible to set an infinite timeout, but you can set a very +/// large timeout to effectively disable the timeout (on the order of years). +/// This is highly discouraged, as it will cause the undo stack to grow +/// indefinitely, memory usage to grow unbounded, and terminal sessions +/// to never actually quit. +/// +/// The duration is specified as a series of numbers followed by time units. +/// Whitespace is allowed between numbers and units. Each number and unit will +/// be added together to form the total duration. +/// +/// The allowed time units are as follows: +/// +/// * `y` - 365 SI days, or 8760 hours, or 31536000 seconds. No adjustments +/// are made for leap years or leap seconds. +/// * `d` - one SI day, or 86400 seconds. +/// * `h` - one hour, or 3600 seconds. +/// * `m` - one minute, or 60 seconds. +/// * `s` - one second. +/// * `ms` - one millisecond, or 0.001 second. +/// * `us` or `µs` - one microsecond, or 0.000001 second. +/// * `ns` - one nanosecond, or 0.000000001 second. +/// +/// Examples: +/// * `1h30m` +/// * `45s` +/// +/// Units can be repeated and will be added together. This means that +/// `1h1h` is equivalent to `2h`. This is confusing and should be avoided. +/// A future update may disallow this. +/// +/// This configuration is only supported on macOS. Linux doesn't +/// support undo operations at all so this configuration has no +/// effect. +@"undo-timeout": Duration = .{ .duration = 5 * std.time.ns_per_s }, + /// The position of the "quick" terminal window. To learn more about the /// quick terminal, see the documentation for the `toggle_quick_terminal` /// binding action. @@ -6583,7 +6629,7 @@ pub const Duration = struct { if (remaining.len == 0) break; // Find the longest number - const number = number: { + const number: u64 = number: { var prev_number: ?u64 = null; var prev_remaining: ?[]const u8 = null; for (1..remaining.len + 1) |index| { @@ -6597,8 +6643,17 @@ pub const Duration = struct { break :number prev_number; } orelse return error.InvalidValue; - // A number without a unit is invalid - if (remaining.len == 0) return error.InvalidValue; + // A number without a unit is invalid unless the number is + // exactly zero. In that case, the unit is unambiguous since + // its all the same. + if (remaining.len == 0) { + if (number == 0) { + value = 0; + break; + } + + return error.InvalidValue; + } // Find the longest matching unit. Needs to be the longest matching // to distinguish 'm' from 'ms'. @@ -6808,6 +6863,11 @@ test "parse duration" { try std.testing.expectEqual(unit.factor, d.duration); } + { + const d = try Duration.parseCLI("0"); + try std.testing.expectEqual(@as(u64, 0), d.duration); + } + { const d = try Duration.parseCLI("100ns"); try std.testing.expectEqual(@as(u64, 100), d.duration); From d2d38520261c1ba9dc51ec7a787b3518077f4890 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 12:28:48 -0700 Subject: [PATCH 117/371] macos: remove debug log --- macos/Sources/Ghostty/SurfaceView_AppKit.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 6e35f40d1..682efa947 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -287,8 +287,6 @@ extension Ghostty { if let surface = self.surface { ghostty_surface_free(surface) } - - Ghostty.logger.warning("WOW close") } func focusDidChange(_ focused: Bool) { From 966c4f98c7da9bb286342c385d8e28796f376d4e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 12:39:02 -0700 Subject: [PATCH 118/371] apprt/glfw,gtk: noop undo/redo actions --- src/apprt/glfw.zig | 2 ++ src/apprt/gtk/App.zig | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/apprt/glfw.zig b/src/apprt/glfw.zig index d67567aee..924737074 100644 --- a/src/apprt/glfw.zig +++ b/src/apprt/glfw.zig @@ -250,6 +250,8 @@ pub const App = struct { .reset_window_size, .ring_bell, .check_for_updates, + .undo, + .redo, .show_gtk_inspector, => { log.info("unimplemented action={}", .{action}); diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index d69102bda..099a051a4 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -515,6 +515,8 @@ pub fn performAction( .color_change, .reset_window_size, .check_for_updates, + .undo, + .redo, => { log.warn("unimplemented action={}", .{action}); return false; From 5507ec0fc0199d3442065a54e8c737759eb5d084 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 12:48:23 -0700 Subject: [PATCH 119/371] macos: compile errors in CI --- macos/Sources/Features/Terminal/BaseTerminalController.swift | 5 ++--- .../Sources/Helpers/Extensions/NSApplication+Extension.swift | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 6ea56f693..129aeb1e2 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -404,8 +404,7 @@ class BaseTerminalController: NSWindowController, guard let node = surfaceTree.root?.node(view: target) else { return } closeSurfaceNode( node, - withConfirmation: (notification.userInfo?["process_alive"] as? Bool) ?? false, - ) + withConfirmation: (notification.userInfo?["process_alive"] as? Bool) ?? false) } /// Close a surface node (which may contain splits), requesting confirmation if necessary. @@ -413,7 +412,7 @@ class BaseTerminalController: NSWindowController, /// This will also insert the proper undo stack information in. func closeSurfaceNode( _ node: SplitTree.Node, - withConfirmation: Bool = true, + withConfirmation: Bool = true ) { // This node must be part of our tree guard surfaceTree.contains(node) else { return } diff --git a/macos/Sources/Helpers/Extensions/NSApplication+Extension.swift b/macos/Sources/Helpers/Extensions/NSApplication+Extension.swift index d8e41523a..0bc79fb6a 100644 --- a/macos/Sources/Helpers/Extensions/NSApplication+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSApplication+Extension.swift @@ -1,3 +1,4 @@ +import AppKit import Cocoa // MARK: Presentation Options From 3b77a16b63448eb1a1764ba82c0e945969c2d819 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 13:35:31 -0700 Subject: [PATCH 120/371] Make undo/redo app-targeted so it works with no windows --- src/App.zig | 3 +++ src/Surface.zig | 27 +++++++++++++++------------ src/input/Binding.zig | 4 ++-- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/App.zig b/src/App.zig index 39db2e2f9..3bbeff2c8 100644 --- a/src/App.zig +++ b/src/App.zig @@ -446,6 +446,9 @@ pub fn performAction( .toggle_visibility => _ = try rt_app.performAction(.app, .toggle_visibility, {}), .check_for_updates => _ = try rt_app.performAction(.app, .check_for_updates, {}), .show_gtk_inspector => _ = try rt_app.performAction(.app, .show_gtk_inspector, {}), + .undo => _ = try rt_app.performAction(.app, .undo, {}), + + .redo => _ = try rt_app.performAction(.app, .redo, {}), } } diff --git a/src/Surface.zig b/src/Surface.zig index e53613ac0..9ab7234d6 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -3923,6 +3923,21 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool .{ .parent = self }, ), + // Undo and redo both support both surface and app targeting. + // If we are triggering on a surface then we perform the + // action with the surface target. + .undo => return try self.rt_app.performAction( + .{ .surface = self }, + .undo, + {}, + ), + + .redo => return try self.rt_app.performAction( + .{ .surface = self }, + .redo, + {}, + ), + else => try self.app.performAction( self.rt_app, action.scoped(.app).?, @@ -4337,18 +4352,6 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool {}, ), - .undo => return try self.rt_app.performAction( - .{ .surface = self }, - .undo, - {}, - ), - - .redo => return try self.rt_app.performAction( - .{ .surface = self }, - .redo, - {}, - ), - .select_all => { const sel = self.io.terminal.screen.selectAll(); if (sel) |s| { diff --git a/src/input/Binding.zig b/src/input/Binding.zig index 52d36c004..ca3fd9790 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -980,6 +980,8 @@ pub const Action = union(enum) { // These are app but can be special-cased in a surface context. .new_window, + .undo, + .redo, => .app, // Obviously surface actions. @@ -1020,8 +1022,6 @@ pub const Action = union(enum) { .toggle_secure_input, .toggle_command_palette, .reset_window_size, - .undo, - .redo, .crash, => .surface, From 33d128bcff2ee529359a844bde50c3aa9dfed460 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 15:19:05 -0700 Subject: [PATCH 121/371] macos: remove TerminalManager All logic related to TerminalController is now in TerminalController. --- macos/Ghostty.xcodeproj/project.pbxproj | 4 - macos/Sources/App/macOS/AppDelegate.swift | 61 ++- .../Features/Services/ServiceProvider.swift | 5 +- .../Terminal/BaseTerminalController.swift | 2 +- .../Terminal/TerminalController.swift | 223 ++++++++++- .../Features/Terminal/TerminalManager.swift | 372 ------------------ .../Terminal/TerminalRestorable.swift | 6 +- 7 files changed, 268 insertions(+), 405 deletions(-) delete mode 100644 macos/Sources/Features/Terminal/TerminalManager.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 67f1784ac..7da727fbb 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -71,7 +71,6 @@ A596309A2AEE1C6400D64628 /* Terminal.xib in Resources */ = {isa = PBXBuildFile; fileRef = A59630992AEE1C6400D64628 /* Terminal.xib */; }; A596309C2AEE1C9E00D64628 /* TerminalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A596309B2AEE1C9E00D64628 /* TerminalController.swift */; }; A596309E2AEE1D6C00D64628 /* TerminalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A596309D2AEE1D6C00D64628 /* TerminalView.swift */; }; - A59630A02AEF6AEB00D64628 /* TerminalManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A596309F2AEF6AEB00D64628 /* TerminalManager.swift */; }; A5985CD72C320C4500C57AD3 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5985CD62C320C4500C57AD3 /* String+Extension.swift */; }; A5985CD82C320C4500C57AD3 /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5985CD62C320C4500C57AD3 /* String+Extension.swift */; }; A5985CE62C33060F00C57AD3 /* man in Resources */ = {isa = PBXBuildFile; fileRef = A5985CE52C33060F00C57AD3 /* man */; }; @@ -179,7 +178,6 @@ A59630992AEE1C6400D64628 /* Terminal.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Terminal.xib; sourceTree = ""; }; A596309B2AEE1C9E00D64628 /* TerminalController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalController.swift; sourceTree = ""; }; A596309D2AEE1D6C00D64628 /* TerminalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalView.swift; sourceTree = ""; }; - A596309F2AEF6AEB00D64628 /* TerminalManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalManager.swift; sourceTree = ""; }; A5985CD62C320C4500C57AD3 /* String+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; A5985CE52C33060F00C57AD3 /* man */ = {isa = PBXFileReference; lastKnownFileType = folder; name = man; path = "../zig-out/share/man"; sourceTree = ""; }; A599CDAF2CF103F20049FA26 /* NSAppearance+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSAppearance+Extension.swift"; sourceTree = ""; }; @@ -467,7 +465,6 @@ isa = PBXGroup; children = ( A59630992AEE1C6400D64628 /* Terminal.xib */, - A596309F2AEF6AEB00D64628 /* TerminalManager.swift */, A596309B2AEE1C9E00D64628 /* TerminalController.swift */, A5D0AF3A2B36A1DE00D21823 /* TerminalRestorable.swift */, A596309D2AEE1D6C00D64628 /* TerminalView.swift */, @@ -710,7 +707,6 @@ C1F26EE92B76CBFC00404083 /* VibrantLayer.m in Sources */, A58636712DF298FB00E04A10 /* ExpiringUndoManager.swift in Sources */, A59630972AEE163600D64628 /* HostingWindow.swift in Sources */, - A59630A02AEF6AEB00D64628 /* TerminalManager.swift in Sources */, A51BFC2B2B30F6BE00E92F16 /* UpdateDelegate.swift in Sources */, A5CBD06B2CA322430017A1AE /* GlobalEventTap.swift in Sources */, AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */, diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index db332813f..aacf8f651 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -87,9 +87,6 @@ class AppDelegate: NSObject, /// The ghostty global state. Only one per process. let ghostty: Ghostty.App = Ghostty.App() - /// Manages our terminal windows. - let terminalManager: TerminalManager - /// The global undo manager for app-level state such as window restoration. lazy var undoManager = ExpiringUndoManager() @@ -119,7 +116,6 @@ class AppDelegate: NSObject, } override init() { - terminalManager = TerminalManager(ghostty) updaterController = SPUStandardUpdaterController( // Important: we must not start the updater here because we need to read our configuration // first to determine whether we're automatically checking, downloading, etc. The updater @@ -202,6 +198,16 @@ class AppDelegate: NSObject, name: .ghosttyBellDidRing, object: nil ) + NotificationCenter.default.addObserver( + self, + selector: #selector(ghosttyNewWindow(_:)), + name: Ghostty.Notification.ghosttyNewWindow, + object: nil) + NotificationCenter.default.addObserver( + self, + selector: #selector(ghosttyNewTab(_:)), + name: Ghostty.Notification.ghosttyNewTab, + object: nil) // Configure user notifications let actions = [ @@ -253,8 +259,8 @@ class AppDelegate: NSObject, // is possible to have other windows in a few scenarios: // - if we're opening a URL since `application(_:openFile:)` is called before this. // - if we're restoring from persisted state - if terminalManager.windows.count == 0 && derivedConfig.initialWindow { - terminalManager.newWindow() + if TerminalController.all.isEmpty && derivedConfig.initialWindow { + _ = TerminalController.newWindow(ghostty) } } } @@ -339,10 +345,10 @@ class AppDelegate: NSObject, // This is possible with flag set to false if there a race where the // window is still initializing and is not visible but the user clicked // the dock icon. - guard terminalManager.windows.count == 0 else { return true } + guard TerminalController.all.isEmpty else { return true } // No visible windows, open a new one. - terminalManager.newWindow() + _ = TerminalController.newWindow(ghostty) return false } @@ -358,16 +364,17 @@ class AppDelegate: NSObject, var config = Ghostty.SurfaceConfiguration() if (isDirectory.boolValue) { - // When opening a directory, create a new tab in the main window with that as the working directory. + // When opening a directory, create a new tab in the main + // window with that as the working directory. // If no windows exist, a new one will be created. config.workingDirectory = filename - terminalManager.newTab(withBaseConfig: config) + _ = TerminalController.newTab(ghostty, withBaseConfig: config) } else { // When opening a file, open a new window with that file as the command, // and its parent directory as the working directory. config.command = filename config.workingDirectory = (filename as NSString).deletingLastPathComponent - terminalManager.newWindow(withBaseConfig: config) + _ = TerminalController.newWindow(ghostty, withBaseConfig: config) } return true @@ -456,10 +463,6 @@ class AppDelegate: NSObject, menu.keyEquivalentModifierMask = .init(swiftUIFlags: shortcut.modifiers) } - private func focusedSurface() -> ghostty_surface_t? { - return terminalManager.focusedSurface?.surface - } - // MARK: Notifications and Events /// This handles events from the NSEvent.addLocalEventMonitor. We use this so we can get @@ -592,6 +595,22 @@ class AppDelegate: NSObject, } } + @objc private func ghosttyNewWindow(_ notification: Notification) { + let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey] + let config = configAny as? Ghostty.SurfaceConfiguration + _ = TerminalController.newWindow(ghostty, withBaseConfig: config) + } + + @objc private func ghosttyNewTab(_ notification: Notification) { + guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return } + guard let window = surfaceView.window else { return } + + let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey] + let config = configAny as? Ghostty.SurfaceConfiguration + + _ = TerminalController.newTab(ghostty, from: window, withBaseConfig: config) + } + private func setDockBadge(_ label: String? = "•") { NSApp.dockTile.badgeLabel = label NSApp.dockTile.display() @@ -627,7 +646,7 @@ class AppDelegate: NSObject, // Config could change keybindings, so update everything that depends on that syncMenuShortcuts(config) - terminalManager.relabelAllTabs() + TerminalController.all.forEach { $0.relabelTabs() } // Config could change window appearance. We wrap this in an async queue because when // this is called as part of application launch it can deadlock with an internal @@ -756,8 +775,8 @@ class AppDelegate: NSObject, //MARK: - GhosttyAppDelegate func findSurface(forUUID uuid: UUID) -> Ghostty.SurfaceView? { - for c in terminalManager.windows { - for view in c.controller.surfaceTree { + for c in TerminalController.all { + for view in c.surfaceTree { if view.uuid == uuid { return view } @@ -811,7 +830,7 @@ class AppDelegate: NSObject, } @IBAction func newWindow(_ sender: Any?) { - terminalManager.newWindow() + _ = TerminalController.newWindow(ghostty) // We also activate our app so that it becomes front. This may be // necessary for the dock menu. @@ -819,7 +838,7 @@ class AppDelegate: NSObject, } @IBAction func newTab(_ sender: Any?) { - terminalManager.newTab() + _ = TerminalController.newTab(ghostty) // We also activate our app so that it becomes front. This may be // necessary for the dock menu. @@ -827,7 +846,7 @@ class AppDelegate: NSObject, } @IBAction func closeAllWindows(_ sender: Any?) { - terminalManager.closeAllWindows() + TerminalController.closeAllWindows() AboutController.shared.hide() } diff --git a/macos/Sources/Features/Services/ServiceProvider.swift b/macos/Sources/Features/Services/ServiceProvider.swift index 043f5d704..f60f94211 100644 --- a/macos/Sources/Features/Services/ServiceProvider.swift +++ b/macos/Sources/Features/Services/ServiceProvider.swift @@ -32,7 +32,6 @@ class ServiceProvider: NSObject { error: AutoreleasingUnsafeMutablePointer ) { guard let delegate = NSApp.delegate as? AppDelegate else { return } - let terminalManager = delegate.terminalManager guard let pathURLs = pasteboard.readObjects(forClasses: [NSURL.self]) as? [URL] else { error.pointee = Self.errorNoString @@ -53,10 +52,10 @@ class ServiceProvider: NSObject { switch (target) { case .window: - terminalManager.newWindow(withBaseConfig: config) + _ = TerminalController.newWindow(delegate.ghostty, withBaseConfig: config) case .tab: - terminalManager.newTab(withBaseConfig: config) + _ = TerminalController.newTab(delegate.ghostty, withBaseConfig: config) } } diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 129aeb1e2..e4b42c3a1 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -412,7 +412,7 @@ class BaseTerminalController: NSWindowController, /// This will also insert the proper undo stack information in. func closeSurfaceNode( _ node: SplitTree.Node, - withConfirmation: Bool = true + withConfirmation: Bool = true, ) { // This node must be part of our tree guard surfaceTree.contains(node) else { return } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index ddeb3dada..3210eda0c 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -32,7 +32,8 @@ class TerminalController: BaseTerminalController { init(_ ghostty: Ghostty.App, withBaseConfig base: Ghostty.SurfaceConfiguration? = nil, - withSurfaceTree tree: SplitTree? = nil + withSurfaceTree tree: SplitTree? = nil, + parent: NSWindow? = nil ) { // The window we manage is not restorable if we've specified a command // to execute. We do this because the restored window is meaningless at the @@ -137,6 +138,159 @@ class TerminalController: BaseTerminalController { syncAppearance(focusedSurface.derivedConfig) } + // MARK: Terminal Creation + + /// Returns all the available terminal controllers present in the app currently. + static var all: [TerminalController] { + return NSApplication.shared.windows.compactMap { + $0.windowController as? TerminalController + } + } + + // Keep track of the last point that our window was launched at so that new + // windows "cascade" over each other and don't just launch directly on top + // of each other. + private static var lastCascadePoint = NSPoint(x: 0, y: 0) + + // The preferred parent terminal controller. + private static var preferredParent: TerminalController? { + all.first { + $0.window?.isMainWindow ?? false + } ?? all.last + } + + /// The "new window" action. + static func newWindow( + _ ghostty: Ghostty.App, + withBaseConfig baseConfig: Ghostty.SurfaceConfiguration? = nil, + withParent explicitParent: NSWindow? = nil + ) -> TerminalController { + let c = TerminalController.init(ghostty, withBaseConfig: baseConfig) + + // Get our parent. Our parent is the one explicitly given to us, + // otherwise the focused terminal, otherwise an arbitrary one. + let parent: NSWindow? = explicitParent ?? preferredParent?.window + + if let parent { + if parent.styleMask.contains(.fullScreen) { + parent.toggleFullScreen(nil) + } else if ghostty.config.windowFullscreen { + switch (ghostty.config.windowFullscreenMode) { + case .native: + // Native has to be done immediately so that our stylemask contains + // fullscreen for the logic later in this method. + c.toggleFullscreen(mode: .native) + + case .nonNative, .nonNativeVisibleMenu, .nonNativePaddedNotch: + // If we're non-native then we have to do it on a later loop + // so that the content view is setup. + DispatchQueue.main.async { + c.toggleFullscreen(mode: ghostty.config.windowFullscreenMode) + } + } + } + } + + // We're dispatching this async because otherwise the lastCascadePoint doesn't + // take effect. Our best theory is there is some next-event-loop-tick logic + // that Cocoa is doing that we need to be after. + DispatchQueue.main.async { + // Only cascade if we aren't fullscreen. + if let window = c.window { + if (!window.styleMask.contains(.fullScreen)) { + Self.lastCascadePoint = window.cascadeTopLeft(from: Self.lastCascadePoint) + } + } + + c.showWindow(self) + } + + return c + } + + static func newTab( + _ ghostty: Ghostty.App, + from parent: NSWindow? = nil, + withBaseConfig baseConfig: Ghostty.SurfaceConfiguration? = nil + ) -> TerminalController? { + // Making sure that we're dealing with a TerminalController. If not, + // then we just create a new window. + guard let parent, + let parentController = parent.windowController as? TerminalController else { + return newWindow(ghostty, withBaseConfig: baseConfig, withParent: parent) + } + + // If our parent is in non-native fullscreen, then new tabs do not work. + // See: https://github.com/mitchellh/ghostty/issues/392 + if let fullscreenStyle = parentController.fullscreenStyle, + fullscreenStyle.isFullscreen && !fullscreenStyle.supportsTabs { + let alert = NSAlert() + alert.messageText = "Cannot Create New Tab" + alert.informativeText = "New tabs are unsupported while in non-native fullscreen. Exit fullscreen and try again." + alert.addButton(withTitle: "OK") + alert.alertStyle = .warning + alert.beginSheetModal(for: parent) + return nil + } + + // Create a new window and add it to the parent + let controller = TerminalController.init(ghostty, withBaseConfig: baseConfig) + guard let window = controller.window else { return controller } + + // If the parent is miniaturized, then macOS exhibits really strange behaviors + // so we have to bring it back out. + if (parent.isMiniaturized) { parent.deminiaturize(self) } + + // If our parent tab group already has this window, macOS added it and + // we need to remove it so we can set the correct order in the next line. + // If we don't do this, macOS gets really confused and the tabbedWindows + // state becomes incorrect. + // + // At the time of writing this code, the only known case this happens + // is when the "+" button is clicked in the tab bar. + if let tg = parent.tabGroup, + tg.windows.firstIndex(of: window) != nil { + tg.removeWindow(window) + } + + // Our windows start out invisible. We need to make it visible. If we + // don't do this then various features such as window blur won't work because + // the macOS APIs only work on a visible window. + controller.showWindow(self) + + // If we have the "hidden" titlebar style we want to create new + // tabs as windows instead, so just skip adding it to the parent. + if (ghostty.config.macosTitlebarStyle != "hidden") { + // Add the window to the tab group and show it. + switch ghostty.config.windowNewTabPosition { + case "end": + // If we already have a tab group and we want the new tab to open at the end, + // then we use the last window in the tab group as the parent. + if let last = parent.tabGroup?.windows.last { + last.addTabbedWindow(window, ordered: .above) + } else { + fallthrough + } + + case "current": fallthrough + default: + parent.addTabbedWindow(window, ordered: .above) + } + } + + window.makeKeyAndOrderFront(self) + + // It takes an event loop cycle until the macOS tabGroup state becomes + // consistent which causes our tab labeling to be off when the "+" button + // is used in the tab bar. This fixes that. If we can find a more robust + // solution we should do that. + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + controller.relabelTabs() + } + + return controller + } + //MARK: - Methods @objc private func ghosttyConfigDidChange(_ notification: Notification) { @@ -479,6 +633,44 @@ class TerminalController: BaseTerminalController { tabGroup.windows.forEach { $0.close() } } + /// Close all windows, asking for confirmation if necessary. + static func closeAllWindows() { + let needsConfirm: Bool = all.contains { + $0.surfaceTree.contains { $0.needsConfirmQuit } + } + + if (!needsConfirm) { + closeAllWindowsImmediately() + return + } + + // If we don't have a main window, we just close all windows because + // we have no window to show the modal on top of. I'm sure there's a way + // to do an app-level alert but I don't know how and this case should never + // really happen. + guard let alertWindow = preferredParent?.window else { + closeAllWindowsImmediately() + return + } + + // If we need confirmation by any, show one confirmation for all windows + let alert = NSAlert() + alert.messageText = "Close All Windows?" + alert.informativeText = "All terminal sessions will be terminated." + alert.addButton(withTitle: "Close All Windows") + alert.addButton(withTitle: "Cancel") + alert.alertStyle = .warning + alert.beginSheetModal(for: alertWindow, completionHandler: { response in + if (response == .alertFirstButtonReturn) { + closeAllWindowsImmediately() + } + }) + } + + static private func closeAllWindowsImmediately() { + all.forEach { $0.close() } + } + // MARK: Undo/Redo /// The state that we require to recreate a TerminalController from an undo. @@ -709,6 +901,35 @@ class TerminalController: BaseTerminalController { override func windowWillClose(_ notification: Notification) { super.windowWillClose(notification) self.relabelTabs() + + // If we remove a window, we reset the cascade point to the key window so that + // the next window cascade's from that one. + if let focusedWindow = NSApplication.shared.keyWindow { + // If we are NOT the focused window, then we are a tabbed window. If we + // are closing a tabbed window, we want to set the cascade point to be + // the next cascade point from this window. + if focusedWindow != window { + // The cascadeTopLeft call below should NOT move the window. Starting with + // macOS 15, we found that specifically when used with the new window snapping + // features of macOS 15, this WOULD move the frame. So we keep track of the + // old frame and restore it if necessary. Issue: + // https://github.com/ghostty-org/ghostty/issues/2565 + let oldFrame = focusedWindow.frame + + Self.lastCascadePoint = focusedWindow.cascadeTopLeft(from: NSZeroPoint) + + if focusedWindow.frame != oldFrame { + focusedWindow.setFrame(oldFrame, display: true) + } + + return + } + + // If we are the focused window, then we set the last cascade point to + // our own frame so that it shows up in the same spot. + let frame = focusedWindow.frame + Self.lastCascadePoint = NSPoint(x: frame.minX, y: frame.maxY) + } } override func windowDidBecomeKey(_ notification: Notification) { diff --git a/macos/Sources/Features/Terminal/TerminalManager.swift b/macos/Sources/Features/Terminal/TerminalManager.swift deleted file mode 100644 index 050bc5563..000000000 --- a/macos/Sources/Features/Terminal/TerminalManager.swift +++ /dev/null @@ -1,372 +0,0 @@ -import Cocoa -import SwiftUI -import GhosttyKit -import Combine - -/// Manages a set of terminal windows. This is effectively an array of TerminalControllers. -/// This abstraction helps manage tabs and multi-window scenarios. -class TerminalManager { - struct Window { - let controller: TerminalController - let closePublisher: AnyCancellable - } - - let ghostty: Ghostty.App - - /// The currently focused surface of the main window. - var focusedSurface: Ghostty.SurfaceView? { mainWindow?.controller.focusedSurface } - - /// The set of windows we currently have. - var windows: [Window] = [] - - // Keep track of the last point that our window was launched at so that new - // windows "cascade" over each other and don't just launch directly on top - // of each other. - private static var lastCascadePoint = NSPoint(x: 0, y: 0) - - /// Returns the main window of the managed window stack. If there is no window - /// then an arbitrary window will be chosen. - private var mainWindow: Window? { - for window in windows { - if (window.controller.window?.isMainWindow ?? false) { - return window - } - } - - // If we have no main window, just use the last window. - return windows.last - } - - /// The configuration derived from the Ghostty config so we don't need to rely on references. - private var derivedConfig: DerivedConfig - - init(_ ghostty: Ghostty.App) { - self.ghostty = ghostty - self.derivedConfig = DerivedConfig(ghostty.config) - - let center = NotificationCenter.default - center.addObserver( - self, - selector: #selector(onNewTab), - name: Ghostty.Notification.ghosttyNewTab, - object: nil) - center.addObserver( - self, - selector: #selector(onNewWindow), - name: Ghostty.Notification.ghosttyNewWindow, - object: nil) - center.addObserver( - self, - selector: #selector(ghosttyConfigDidChange(_:)), - name: .ghosttyConfigDidChange, - object: nil) - } - - deinit { - let center = NotificationCenter.default - center.removeObserver(self) - } - - // MARK: - Window Management - - /// Create a new terminal window. - func newWindow(withBaseConfig base: Ghostty.SurfaceConfiguration? = nil) { - let c = createWindow(withBaseConfig: base) - let window = c.window! - - // If the previous focused window was native fullscreen, the new window also - // becomes native fullscreen. - if let parent = focusedSurface?.window, - parent.styleMask.contains(.fullScreen) { - window.toggleFullScreen(nil) - } else if derivedConfig.windowFullscreen { - switch (derivedConfig.windowFullscreenMode) { - case .native: - // Native has to be done immediately so that our stylemask contains - // fullscreen for the logic later in this method. - c.toggleFullscreen(mode: .native) - - case .nonNative, .nonNativeVisibleMenu, .nonNativePaddedNotch: - // If we're non-native then we have to do it on a later loop - // so that the content view is setup. - DispatchQueue.main.async { - c.toggleFullscreen(mode: self.derivedConfig.windowFullscreenMode) - } - } - } - - // All new_window actions force our app to be active. - NSApp.activate(ignoringOtherApps: true) - - // We're dispatching this async because otherwise the lastCascadePoint doesn't - // take effect. Our best theory is there is some next-event-loop-tick logic - // that Cocoa is doing that we need to be after. - DispatchQueue.main.async { - // Only cascade if we aren't fullscreen. - if (!window.styleMask.contains(.fullScreen)) { - Self.lastCascadePoint = window.cascadeTopLeft(from: Self.lastCascadePoint) - } - - c.showWindow(self) - } - } - - /// Creates a new tab in the current main window. If there are no windows, a window - /// is created. - func newTab(withBaseConfig base: Ghostty.SurfaceConfiguration? = nil) { - // If there is no main window, just create a new window - guard let parent = mainWindow?.controller.window else { - newWindow(withBaseConfig: base) - return - } - - // Create a new window and add it to the parent - newTab(to: parent, withBaseConfig: base) - } - - private func newTab(to parent: NSWindow, withBaseConfig base: Ghostty.SurfaceConfiguration?) { - // Making sure that we're dealing with a TerminalController - guard parent.windowController is TerminalController else { return } - - // If our parent is in non-native fullscreen, then new tabs do not work. - // See: https://github.com/mitchellh/ghostty/issues/392 - if let controller = parent.windowController as? TerminalController, - let fullscreenStyle = controller.fullscreenStyle, - fullscreenStyle.isFullscreen && !fullscreenStyle.supportsTabs { - let alert = NSAlert() - alert.messageText = "Cannot Create New Tab" - alert.informativeText = "New tabs are unsupported while in non-native fullscreen. Exit fullscreen and try again." - alert.addButton(withTitle: "OK") - alert.alertStyle = .warning - alert.beginSheetModal(for: parent) - return - } - - // Create a new window and add it to the parent - let controller = createWindow(withBaseConfig: base) - let window = controller.window! - - // If the parent is miniaturized, then macOS exhibits really strange behaviors - // so we have to bring it back out. - if (parent.isMiniaturized) { parent.deminiaturize(self) } - - // If our parent tab group already has this window, macOS added it and - // we need to remove it so we can set the correct order in the next line. - // If we don't do this, macOS gets really confused and the tabbedWindows - // state becomes incorrect. - // - // At the time of writing this code, the only known case this happens - // is when the "+" button is clicked in the tab bar. - if let tg = parent.tabGroup, tg.windows.firstIndex(of: window) != nil { - tg.removeWindow(window) - } - - // Our windows start out invisible. We need to make it visible. If we - // don't do this then various features such as window blur won't work because - // the macOS APIs only work on a visible window. - controller.showWindow(self) - - // If we have the "hidden" titlebar style we want to create new - // tabs as windows instead, so just skip adding it to the parent. - if (derivedConfig.macosTitlebarStyle != "hidden") { - // Add the window to the tab group and show it. - switch derivedConfig.windowNewTabPosition { - case "end": - // If we already have a tab group and we want the new tab to open at the end, - // then we use the last window in the tab group as the parent. - if let last = parent.tabGroup?.windows.last { - last.addTabbedWindow(window, ordered: .above) - } else { - fallthrough - } - case "current": fallthrough - default: - parent.addTabbedWindow(window, ordered: .above) - - } - } - - window.makeKeyAndOrderFront(self) - - // It takes an event loop cycle until the macOS tabGroup state becomes - // consistent which causes our tab labeling to be off when the "+" button - // is used in the tab bar. This fixes that. If we can find a more robust - // solution we should do that. - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { controller.relabelTabs() } - } - - /// Creates a window controller, adds it to our managed list, and returns it. - func createWindow(withBaseConfig base: Ghostty.SurfaceConfiguration? = nil, - withSurfaceTree tree: SplitTree? = nil) -> TerminalController { - // Initialize our controller to load the window - let c = TerminalController(ghostty, withBaseConfig: base, withSurfaceTree: tree) - - // Create a listener for when the window is closed so we can remove it. - let pubClose = NotificationCenter.default.publisher( - for: NSWindow.willCloseNotification, - object: c.window! - ).sink { notification in - guard let window = notification.object as? NSWindow else { return } - guard let c = window.windowController as? TerminalController else { return } - self.removeWindow(c) - } - - // Keep track of every window we manage - windows.append(Window( - controller: c, - closePublisher: pubClose - )) - - return c - } - - func removeWindow(_ controller: TerminalController) { - // Remove it from our managed set - guard let idx = self.windows.firstIndex(where: { $0.controller == controller }) else { return } - let w = self.windows[idx] - self.windows.remove(at: idx) - - // Ensure any publishers we have are cancelled - w.closePublisher.cancel() - - // If we remove a window, we reset the cascade point to the key window so that - // the next window cascade's from that one. - if let focusedWindow = NSApplication.shared.keyWindow { - // If we are NOT the focused window, then we are a tabbed window. If we - // are closing a tabbed window, we want to set the cascade point to be - // the next cascade point from this window. - if focusedWindow != controller.window { - // The cascadeTopLeft call below should NOT move the window. Starting with - // macOS 15, we found that specifically when used with the new window snapping - // features of macOS 15, this WOULD move the frame. So we keep track of the - // old frame and restore it if necessary. Issue: - // https://github.com/ghostty-org/ghostty/issues/2565 - let oldFrame = focusedWindow.frame - - Self.lastCascadePoint = focusedWindow.cascadeTopLeft(from: NSZeroPoint) - - if focusedWindow.frame != oldFrame { - focusedWindow.setFrame(oldFrame, display: true) - } - - return - } - - // If we are the focused window, then we set the last cascade point to - // our own frame so that it shows up in the same spot. - let frame = focusedWindow.frame - Self.lastCascadePoint = NSPoint(x: frame.minX, y: frame.maxY) - } - - // I don't think we strictly have to do this but if a window is - // closed I want to make sure that the app state is invalided so - // we don't reopen closed windows. - NSApplication.shared.invalidateRestorableState() - } - - /// Close all windows, asking for confirmation if necessary. - func closeAllWindows() { - var needsConfirm: Bool = false - for w in self.windows { - if w.controller.surfaceTree.contains(where: { $0.needsConfirmQuit }) { - needsConfirm = true - break - } - } - - if (!needsConfirm) { - for w in self.windows { - w.controller.close() - } - - return - } - - // If we don't have a main window, we just close all windows because - // we have no window to show the modal on top of. I'm sure there's a way - // to do an app-level alert but I don't know how and this case should never - // really happen. - guard let alertWindow = mainWindow?.controller.window else { - for w in self.windows { - w.controller.close() - } - - return - } - - // If we need confirmation by any, show one confirmation for all windows - let alert = NSAlert() - alert.messageText = "Close All Windows?" - alert.informativeText = "All terminal sessions will be terminated." - alert.addButton(withTitle: "Close All Windows") - alert.addButton(withTitle: "Cancel") - alert.alertStyle = .warning - alert.beginSheetModal(for: alertWindow, completionHandler: { response in - if (response == .alertFirstButtonReturn) { - for w in self.windows { - w.controller.close() - } - } - }) - } - - /// Relabels all the tabs with the proper keyboard shortcut. - func relabelAllTabs() { - for w in windows { - w.controller.relabelTabs() - } - } - - // MARK: - Notifications - - @objc private func onNewWindow(notification: SwiftUI.Notification) { - let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey] - let config = configAny as? Ghostty.SurfaceConfiguration - self.newWindow(withBaseConfig: config) - } - - @objc private func onNewTab(notification: SwiftUI.Notification) { - guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return } - guard let window = surfaceView.window else { return } - - let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey] - let config = configAny as? Ghostty.SurfaceConfiguration - - self.newTab(to: window, withBaseConfig: config) - } - - @objc private func ghosttyConfigDidChange(_ notification: Notification) { - // We only care if the configuration is a global configuration, not a - // surface-specific one. - guard notification.object == nil else { return } - - // Get our managed configuration object out - guard let config = notification.userInfo?[ - Notification.Name.GhosttyConfigChangeKey - ] as? Ghostty.Config else { return } - - // Update our derived config - self.derivedConfig = DerivedConfig(config) - } - - private struct DerivedConfig { - let windowFullscreen: Bool - let windowFullscreenMode: FullscreenMode - let macosTitlebarStyle: String - let windowNewTabPosition: String - - init() { - self.windowFullscreen = false - self.windowFullscreenMode = .native - self.macosTitlebarStyle = "transparent" - self.windowNewTabPosition = "" - } - - init(_ config: Ghostty.Config) { - self.windowFullscreen = config.windowFullscreen - self.windowFullscreenMode = config.windowFullscreenMode - self.macosTitlebarStyle = config.macosTitlebarStyle - self.windowNewTabPosition = config.windowNewTabPosition - } - } -} diff --git a/macos/Sources/Features/Terminal/TerminalRestorable.swift b/macos/Sources/Features/Terminal/TerminalRestorable.swift index 5229dc46e..9d9b7ffb1 100644 --- a/macos/Sources/Features/Terminal/TerminalRestorable.swift +++ b/macos/Sources/Features/Terminal/TerminalRestorable.swift @@ -83,9 +83,9 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration { // can be found for events from libghostty. This uses the low-level // createWindow so that AppKit can place the window wherever it should // be. - let c = appDelegate.terminalManager.createWindow( - withSurfaceTree: state.surfaceTree - ) + let c = TerminalController.init( + appDelegate.ghostty, + withSurfaceTree: state.surfaceTree) guard let window = c.window else { completionHandler(nil, TerminalRestoreError.windowDidNotLoad) return From 797c10af37aa71c0e36c569d6d47faa761f1614b Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 15:50:30 -0700 Subject: [PATCH 122/371] macos: undo new window --- .../Terminal/TerminalController.swift | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 3210eda0c..f90490c3f 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -205,6 +205,27 @@ class TerminalController: BaseTerminalController { c.showWindow(self) } + // Setup our undo + if let undoManager = c.undoManager { + undoManager.setActionName("New Window") + undoManager.registerUndo( + withTarget: c, + expiresAfter: c.undoExpiration) { target in + // Close the window when undoing + target.closeWindow(nil) + + // Register redo action + undoManager.registerUndo( + withTarget: ghostty, + expiresAfter: target.undoExpiration) { ghostty in + _ = TerminalController.newWindow( + ghostty, + withBaseConfig: baseConfig, + withParent: explicitParent) + } + } + } + return c } From 636b1fff8a4d0ca43ef1794791ff582dc6a6e111 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 15:56:17 -0700 Subject: [PATCH 123/371] macos: initial window shouldn't support undo --- macos/Sources/App/macOS/AppDelegate.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index aacf8f651..013e89f58 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -260,7 +260,9 @@ class AppDelegate: NSObject, // - if we're opening a URL since `application(_:openFile:)` is called before this. // - if we're restoring from persisted state if TerminalController.all.isEmpty && derivedConfig.initialWindow { + undoManager.disableUndoRegistration() _ = TerminalController.newWindow(ghostty) + undoManager.enableUndoRegistration() } } } From d92db73f25110bd5de145ce50cb99a9925cbc8f0 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 15:59:22 -0700 Subject: [PATCH 124/371] macos: undo new tab --- .../Terminal/TerminalController.swift | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index f90490c3f..7aa8d5285 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -309,6 +309,27 @@ class TerminalController: BaseTerminalController { controller.relabelTabs() } + // Setup our undo + if let undoManager = parentController.undoManager { + undoManager.setActionName("New Tab") + undoManager.registerUndo( + withTarget: controller, + expiresAfter: controller.undoExpiration) { target in + // Close the tab when undoing + target.closeTab(nil) + + // Register redo action + undoManager.registerUndo( + withTarget: ghostty, + expiresAfter: target.undoExpiration) { ghostty in + _ = TerminalController.newTab( + ghostty, + from: parent, + withBaseConfig: baseConfig) + } + } + } + return controller } From aeede903f50ce6224c94efe1cdc338b6b8ac9f56 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 6 Jun 2025 16:03:20 -0700 Subject: [PATCH 125/371] macos: undo close all windows --- macos/Sources/Features/Terminal/TerminalController.swift | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 7aa8d5285..907109e1c 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -710,7 +710,11 @@ class TerminalController: BaseTerminalController { } static private func closeAllWindowsImmediately() { - all.forEach { $0.close() } + let undoManager = (NSApp.delegate as? AppDelegate)?.undoManager + undoManager?.beginUndoGrouping() + all.forEach { $0.closeWindowImmediately() } + undoManager?.setActionName("Close All Windows") + undoManager?.endUndoGrouping() } // MARK: Undo/Redo From 396e53244d998a7b6097f256a0af1daccf9e62d3 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 7 Jun 2025 06:57:11 -0700 Subject: [PATCH 126/371] config: add super+shift+t as a default undo too to mimic browsers --- src/config/Config.zig | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/config/Config.zig b/src/config/Config.zig index e1d5b548e..2df66ba45 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -4944,6 +4944,25 @@ pub const Keybinds = struct { .{ .key = .{ .unicode = 'q' }, .mods = .{ .super = true } }, .{ .quit = {} }, ); + try self.set.putFlags( + alloc, + .{ .key = .{ .unicode = 'k' }, .mods = .{ .super = true } }, + .{ .clear_screen = {} }, + .{ .performable = true }, + ); + try self.set.put( + alloc, + .{ .key = .{ .unicode = 'a' }, .mods = .{ .super = true } }, + .{ .select_all = {} }, + ); + + // Undo/redo + try self.set.putFlags( + alloc, + .{ .key = .{ .unicode = 't' }, .mods = .{ .super = true, .shift = true } }, + .{ .undo = {} }, + .{ .performable = true }, + ); try self.set.putFlags( alloc, .{ .key = .{ .unicode = 'z' }, .mods = .{ .super = true } }, @@ -4956,17 +4975,6 @@ pub const Keybinds = struct { .{ .redo = {} }, .{ .performable = true }, ); - try self.set.putFlags( - alloc, - .{ .key = .{ .unicode = 'k' }, .mods = .{ .super = true } }, - .{ .clear_screen = {} }, - .{ .performable = true }, - ); - try self.set.put( - alloc, - .{ .key = .{ .unicode = 'a' }, .mods = .{ .super = true } }, - .{ .select_all = {} }, - ); // Viewport scrolling try self.set.put( From b234cb20140fc2287799496fe7b4ad13d5deb94a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 7 Jun 2025 07:01:08 -0700 Subject: [PATCH 127/371] macos: only process reopen if already activated --- macos/Sources/App/macOS/AppDelegate.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index 013e89f58..e5b35037e 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -349,6 +349,11 @@ class AppDelegate: NSObject, // the dock icon. guard TerminalController.all.isEmpty else { return true } + // If the application isn't active yet then we don't want to process + // this because we're not ready. This happens sometimes in Xcode runs + // but I haven't seen it happen in releases. I'm unsure why. + guard applicationHasBecomeActive else { return true } + // No visible windows, open a new one. _ = TerminalController.newWindow(ghostty) return false From 973a2afdde103c302c690f2e41e16ab53a4a86fa Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 7 Jun 2025 07:11:30 -0700 Subject: [PATCH 128/371] macos: make sure we're not registering unnecessary undos --- macos/Ghostty.xcodeproj/project.pbxproj | 4 + .../Terminal/BaseTerminalController.swift | 103 ++++++++---------- .../Terminal/TerminalController.swift | 32 ++++-- .../Sources/Helpers/ExpiringUndoManager.swift | 10 +- .../Extensions/UndoManager+Extension.swift | 20 ++++ 5 files changed, 102 insertions(+), 67 deletions(-) create mode 100644 macos/Sources/Helpers/Extensions/UndoManager+Extension.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 7da727fbb..9686dcbd1 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -64,6 +64,7 @@ A586366B2DF0A98C00E04A10 /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366A2DF0A98900E04A10 /* Array+Extension.swift */; }; A586366F2DF25D8600E04A10 /* Duration+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366E2DF25D8300E04A10 /* Duration+Extension.swift */; }; A58636712DF298FB00E04A10 /* ExpiringUndoManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58636702DF298F700E04A10 /* ExpiringUndoManager.swift */; }; + A58636732DF4813400E04A10 /* UndoManager+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58636722DF4813000E04A10 /* UndoManager+Extension.swift */; }; A5874D992DAD751B00E83852 /* CGS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D982DAD751A00E83852 /* CGS.swift */; }; A5874D9D2DAD786100E83852 /* NSWindow+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */; }; A59444F729A2ED5200725BBA /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A59444F629A2ED5200725BBA /* SettingsView.swift */; }; @@ -171,6 +172,7 @@ A586366A2DF0A98900E04A10 /* Array+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Extension.swift"; sourceTree = ""; }; A586366E2DF25D8300E04A10 /* Duration+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Duration+Extension.swift"; sourceTree = ""; }; A58636702DF298F700E04A10 /* ExpiringUndoManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpiringUndoManager.swift; sourceTree = ""; }; + A58636722DF4813000E04A10 /* UndoManager+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UndoManager+Extension.swift"; sourceTree = ""; }; A5874D982DAD751A00E83852 /* CGS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CGS.swift; sourceTree = ""; }; A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSWindow+Extension.swift"; sourceTree = ""; }; A59444F629A2ED5200725BBA /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; @@ -447,6 +449,7 @@ C1F26EA62B738B9900404083 /* NSView+Extension.swift */, A5874D9C2DAD785F00E83852 /* NSWindow+Extension.swift */, A5985CD62C320C4500C57AD3 /* String+Extension.swift */, + A58636722DF4813000E04A10 /* UndoManager+Extension.swift */, A5CC36142C9CDA03004D6760 /* View+Extension.swift */, ); path = Extensions; @@ -683,6 +686,7 @@ A54B0CEB2D0CFB4C00CBEFF8 /* NSImage+Extension.swift in Sources */, A5874D9D2DAD786100E83852 /* NSWindow+Extension.swift in Sources */, A54D786C2CA7978E001B19B1 /* BaseTerminalController.swift in Sources */, + A58636732DF4813400E04A10 /* UndoManager+Extension.swift in Sources */, A59FB5CF2AE0DB50009128F3 /* InspectorView.swift in Sources */, CFBB5FEA2D231E5000FD62EE /* QuickTerminalSpaceBehavior.swift in Sources */, A54B0CE92D0CECD100CBEFF8 /* ColorizedGhosttyIconView.swift in Sources */, diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index e4b42c3a1..06cecf651 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -260,8 +260,8 @@ class BaseTerminalController: NSWindowController, self.alert = alert } - // MARK: Focus Management - + // MARK: Split Tree Management + /// Find the next surface to focus when a node is being closed. /// Goes to previous split unless we're the leftmost leaf, then goes to next. private func findNextFocusTargetAfterClosing(node: SplitTree.Node) -> Ghostty.SurfaceView? { @@ -282,45 +282,63 @@ class BaseTerminalController: NSWindowController, /// /// This does no confirmation and assumes confirmation is already done. private func removeSurfaceNode(_ node: SplitTree.Node) { - let nextTarget = findNextFocusTargetAfterClosing(node: node) - let oldFocused = focusedSurface - let focused = node.contains { $0 == focusedSurface } - - // Keep track of the old tree for undo management. - let oldTree = surfaceTree - - // Remove the node from the tree - surfaceTree = surfaceTree.remove(node) - // Move focus if the closed surface was focused and we have a next target - if let nextTarget, focused { + let nextFocus: Ghostty.SurfaceView? = if node.contains( + where: { $0 == focusedSurface } + ) { + findNextFocusTargetAfterClosing(node: node) + } else { + nil + } + + replaceSurfaceTree( + surfaceTree.remove(node), + moveFocusTo: nextFocus, + moveFocusFrom: focusedSurface, + undoAction: "Close Terminal" + ) + } + + private func replaceSurfaceTree( + _ newTree: SplitTree, + moveFocusTo newView: Ghostty.SurfaceView? = nil, + moveFocusFrom oldView: Ghostty.SurfaceView? = nil, + undoAction: String? = nil + ) { + // Setup our new split tree + let oldTree = surfaceTree + surfaceTree = newTree + if let newView { DispatchQueue.main.async { - Ghostty.moveFocus(to: nextTarget, from: oldFocused) + Ghostty.moveFocus(to: newView, from: oldView) } } // Setup our undo if let undoManager { - undoManager.setActionName("Close Terminal") + if let undoAction { + undoManager.setActionName(undoAction) + } undoManager.registerUndo( withTarget: self, - expiresAfter: undoExpiration) { target in + expiresAfter: undoExpiration + ) { target in target.surfaceTree = oldTree - if let oldFocused { + if let oldView { DispatchQueue.main.async { - Ghostty.moveFocus(to: oldFocused, from: target.focusedSurface) + Ghostty.moveFocus(to: oldView, from: target.focusedSurface) } } undoManager.registerUndo( withTarget: target, - expiresAfter: target.undoExpiration) { target in - target.closeSurfaceNode( - node, - withConfirmation: node.contains { - $0.needsConfirmQuit - } - ) + expiresAfter: target.undoExpiration + ) { target in + target.replaceSurfaceTree( + newTree, + moveFocusTo: newView, + moveFocusFrom: target.focusedSurface, + undoAction: undoAction) } } } @@ -478,36 +496,11 @@ class BaseTerminalController: NSWindowController, return } - // Keep track of the old tree for undo - let oldTree = surfaceTree - - // Setup our new split tree - surfaceTree = newTree - DispatchQueue.main.async { - Ghostty.moveFocus(to: newView, from: oldView) - } - - // Setup our undo - if let undoManager { - undoManager.setActionName("New Split") - undoManager.registerUndo( - withTarget: self, - expiresAfter: undoExpiration) { target in - target.surfaceTree = oldTree - DispatchQueue.main.async { - Ghostty.moveFocus(to: oldView, from: target.focusedSurface) - } - - undoManager.registerUndo( - withTarget: target, - expiresAfter: target.undoExpiration) { target in - target.surfaceTree = newTree - DispatchQueue.main.async { - Ghostty.moveFocus(to: newView, from: target.focusedSurface) - } - } - } - } + replaceSurfaceTree( + newTree, + moveFocusTo: newView, + moveFocusFrom: oldView, + undoAction: "New Split") } @objc private func ghosttyDidEqualizeSplits(_ notification: Notification) { diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 907109e1c..244f8720d 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -210,14 +210,18 @@ class TerminalController: BaseTerminalController { undoManager.setActionName("New Window") undoManager.registerUndo( withTarget: c, - expiresAfter: c.undoExpiration) { target in + expiresAfter: c.undoExpiration + ) { target in // Close the window when undoing - target.closeWindow(nil) + undoManager.disableUndoRegistration { + target.closeWindow(nil) + } // Register redo action undoManager.registerUndo( withTarget: ghostty, - expiresAfter: target.undoExpiration) { ghostty in + expiresAfter: target.undoExpiration + ) { ghostty in _ = TerminalController.newWindow( ghostty, withBaseConfig: baseConfig, @@ -314,14 +318,18 @@ class TerminalController: BaseTerminalController { undoManager.setActionName("New Tab") undoManager.registerUndo( withTarget: controller, - expiresAfter: controller.undoExpiration) { target in + expiresAfter: controller.undoExpiration + ) { target in // Close the tab when undoing - target.closeTab(nil) - + undoManager.disableUndoRegistration { + target.closeTab(nil) + } + // Register redo action undoManager.registerUndo( withTarget: ghostty, - expiresAfter: target.undoExpiration) { ghostty in + expiresAfter: target.undoExpiration + ) { ghostty in _ = TerminalController.newTab( ghostty, from: parent, @@ -617,14 +625,16 @@ class TerminalController: BaseTerminalController { undoManager.setActionName("Close Tab") undoManager.registerUndo( withTarget: ghostty, - expiresAfter: undoExpiration) { ghostty in + expiresAfter: undoExpiration + ) { ghostty in let newController = TerminalController(ghostty, with: undoState) // Register redo action undoManager.registerUndo( withTarget: newController, - expiresAfter: newController.undoExpiration) { target in - target.closeTab(nil) + expiresAfter: newController.undoExpiration + ) { target in + target.closeTabImmediately() } } } @@ -654,7 +664,7 @@ class TerminalController: BaseTerminalController { undoManager.registerUndo( withTarget: newController, expiresAfter: newController.undoExpiration) { target in - target.closeWindow(nil) + target.closeWindowImmediately() } } } diff --git a/macos/Sources/Helpers/ExpiringUndoManager.swift b/macos/Sources/Helpers/ExpiringUndoManager.swift index 9a9349cf3..5fde0e870 100644 --- a/macos/Sources/Helpers/ExpiringUndoManager.swift +++ b/macos/Sources/Helpers/ExpiringUndoManager.swift @@ -32,6 +32,11 @@ class ExpiringUndoManager: UndoManager { // Ignore instantly expiring undos guard duration.timeInterval > 0 else { return } + // Ignore when undo registration is disabled. UndoManager still lets + // registration happen then cancels later but I was seeing some + // weird behavior with this so let's just guard on it. + guard self.isUndoRegistrationEnabled else { return } + let expiringTarget = ExpiringTarget( target, expiresAfter: duration, @@ -64,7 +69,10 @@ class ExpiringUndoManager: UndoManager { // Call super to handle standard removal super.removeAllActions(withTarget: target) - if !(target is ExpiringTarget) { + // If the target is an expiring target, remove it. + if let expiring = target as? ExpiringTarget { + expiringTargets.remove(expiring) + } else { // Find and remove any ExpiringTarget instances that wrap this target. expiringTargets .filter { $0.target == nil || $0.target === (target as AnyObject) } diff --git a/macos/Sources/Helpers/Extensions/UndoManager+Extension.swift b/macos/Sources/Helpers/Extensions/UndoManager+Extension.swift new file mode 100644 index 000000000..6c7c1e9f1 --- /dev/null +++ b/macos/Sources/Helpers/Extensions/UndoManager+Extension.swift @@ -0,0 +1,20 @@ +import Foundation + +extension UndoManager { + /// A Boolean value that indicates whether the undo manager is currently performing + /// either an undo or redo operation. + var isUndoingOrRedoing: Bool { + isUndoing || isRedoing + } + + /// Temporarily disables undo registration while executing the provided handler. + /// + /// This method provides a convenient way to perform operations without recording them + /// in the undo stack. It ensures that undo registration is properly re-enabled even + /// if the handler throws an error. + func disableUndoRegistration(handler: () -> Void) { + disableUndoRegistration() + handler() + enableUndoRegistration() + } +} From 20744f0482e1369039b3b565bd782a4bad786e8d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 7 Jun 2025 12:22:37 -0700 Subject: [PATCH 129/371] macos: fix some CI build issues --- macos/Sources/Features/Terminal/BaseTerminalController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 06cecf651..594a58056 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -430,7 +430,7 @@ class BaseTerminalController: NSWindowController, /// This will also insert the proper undo stack information in. func closeSurfaceNode( _ node: SplitTree.Node, - withConfirmation: Bool = true, + withConfirmation: Bool = true ) { // This node must be part of our tree guard surfaceTree.contains(node) else { return } From 6e77a5a6ca05c1416a1c19c5c61b76566574ea71 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 7 Jun 2025 13:07:05 -0700 Subject: [PATCH 130/371] macos: address quick terminal basic functionality with new API --- include/ghostty.h | 1 + macos/Sources/App/macOS/AppDelegate.swift | 4 ++ .../QuickTerminalController.swift | 58 +++++++++++++++---- .../Sources/Ghostty/SurfaceView_AppKit.swift | 6 ++ src/apprt/embedded.zig | 5 ++ 5 files changed, 62 insertions(+), 12 deletions(-) diff --git a/include/ghostty.h b/include/ghostty.h index 95bd58cd7..9f17d0b97 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -786,6 +786,7 @@ ghostty_app_t ghostty_surface_app(ghostty_surface_t); ghostty_surface_config_s ghostty_surface_inherited_config(ghostty_surface_t); void ghostty_surface_update_config(ghostty_surface_t, ghostty_config_t); bool ghostty_surface_needs_confirm_quit(ghostty_surface_t); +bool ghostty_surface_process_exited(ghostty_surface_t); void ghostty_surface_refresh(ghostty_surface_t); void ghostty_surface_draw(ghostty_surface_t); void ghostty_surface_set_content_scale(ghostty_surface_t, double, double); diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index e5b35037e..7fb52a025 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -612,6 +612,10 @@ class AppDelegate: NSObject, guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return } guard let window = surfaceView.window else { return } + // We only want to listen to new tabs if the focused parent is + // a regular terminal controller. + guard window.windowController is TerminalController else { return } + let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey] let config = configAny as? Ghostty.SurfaceConfiguration diff --git a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift index 8c86c2531..ce5f07616 100644 --- a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift +++ b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift @@ -61,6 +61,12 @@ class QuickTerminalController: BaseTerminalController { selector: #selector(ghosttyConfigDidChange(_:)), name: .ghosttyConfigDidChange, object: nil) + center.addObserver( + self, + selector: #selector(closeWindow(_:)), + name: .ghosttyCloseWindow, + object: nil + ) center.addObserver( self, selector: #selector(onNewTab), @@ -198,16 +204,38 @@ class QuickTerminalController: BaseTerminalController { // If our surface tree is nil then we animate the window out. if (to.isEmpty) { - // Save the current window frame before animating out. This preserves - // the user's preferred window size and position for when the quick - // terminal is reactivated with a new surface. Without this, SwiftUI - // would reset the window to its minimum content size. - lastClosedFrame = window?.frame - animateOut() } } + override func closeSurfaceNode( + _ node: SplitTree.Node, + withConfirmation: Bool = true + ) { + // If this isn't the root then we're dealing with a split closure. + if surfaceTree.root != node { + super.closeSurfaceNode(node, withConfirmation: withConfirmation) + return + } + + // If this isn't a final leaf then we're dealing with a split closure + guard case .leaf(let surface) = node else { + super.closeSurfaceNode(node, withConfirmation: withConfirmation) + return + } + + // If its the root, we check if the process exited. If it did, + // then we do empty the tree. + if surface.processExited { + surfaceTree = .init() + return + } + + // If its the root then we just animate out. We never actually allow + // the surface to fully close. + animateOut() + } + // MARK: Methods func toggle() { @@ -252,12 +280,6 @@ class QuickTerminalController: BaseTerminalController { let view = Ghostty.SurfaceView(ghostty_app, baseConfig: nil) surfaceTree = SplitTree(view: view) focusedSurface = view - - // Restore our previous frame if we have one - if let lastClosedFrame { - window.setFrame(lastClosedFrame, display: false) - self.lastClosedFrame = nil - } } // Animate the window in @@ -283,6 +305,12 @@ class QuickTerminalController: BaseTerminalController { private func animateWindowIn(window: NSWindow, from position: QuickTerminalPosition) { guard let screen = derivedConfig.quickTerminalScreen.screen else { return } + // Restore our previous frame if we have one + if let lastClosedFrame { + window.setFrame(lastClosedFrame, display: false) + self.lastClosedFrame = nil + } + // Move our window off screen to the top position.setInitial(in: window, on: screen) @@ -393,6 +421,12 @@ class QuickTerminalController: BaseTerminalController { } private func animateWindowOut(window: NSWindow, to position: QuickTerminalPosition) { + // Save the current window frame before animating out. This preserves + // the user's preferred window size and position for when the quick + // terminal is reactivated with a new surface. Without this, SwiftUI + // would reset the window to its minimum content size. + lastClosedFrame = window.frame + // If we hid the dock then we unhide it. hiddenDock = nil diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 682efa947..ea9a8c61b 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -92,6 +92,12 @@ extension Ghostty { return ghostty_surface_needs_confirm_quit(surface) } + // Retruns true if the process in this surface has exited. + var processExited: Bool { + guard let surface = self.surface else { return true } + return ghostty_surface_process_exited(surface) + } + // Returns the inspector instance for this surface, or nil if the // surface has been closed. var inspector: ghostty_inspector_t? { diff --git a/src/apprt/embedded.zig b/src/apprt/embedded.zig index 67aeeaf7c..5334c8ecd 100644 --- a/src/apprt/embedded.zig +++ b/src/apprt/embedded.zig @@ -1359,6 +1359,11 @@ pub const CAPI = struct { return surface.core_surface.needsConfirmQuit(); } + /// Returns true if the surface process has exited. + export fn ghostty_surface_process_exited(surface: *Surface) bool { + return surface.core_surface.child_exited; + } + /// Returns true if the surface has a selection. export fn ghostty_surface_has_selection(surface: *Surface) bool { return surface.core_surface.hasSelection(); From 6f6d493763f9fb77c9105578e6a748d014390b73 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 7 Jun 2025 13:13:57 -0700 Subject: [PATCH 131/371] macos: show quick terminal on undo/redo --- .../QuickTerminal/QuickTerminalController.swift | 14 ++++++++++++-- macos/Sources/Ghostty/SurfaceView_AppKit.swift | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift index ce5f07616..28dea9579 100644 --- a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift +++ b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift @@ -202,9 +202,19 @@ class QuickTerminalController: BaseTerminalController { override func surfaceTreeDidChange(from: SplitTree, to: SplitTree) { super.surfaceTreeDidChange(from: from, to: to) - // If our surface tree is nil then we animate the window out. - if (to.isEmpty) { + // If our surface tree is nil then we animate the window out. We + // defer reinitializing the tree to save some memory here. + if to.isEmpty { animateOut() + return + } + + // If we're not empty (e.g. this isn't the first set) and we're + // not visible, then we animate in. This allows us to show the quick + // terminal when things such as undo/redo are done. + if !from.isEmpty && !visible { + animateIn() + return } } diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index ea9a8c61b..e4f6f507c 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -92,7 +92,7 @@ extension Ghostty { return ghostty_surface_needs_confirm_quit(surface) } - // Retruns true if the process in this surface has exited. + // Returns true if the process in this surface has exited. var processExited: Bool { guard let surface = self.surface else { return true } return ghostty_surface_process_exited(surface) From ba15da47229ff5859b1be939b40b28f4cd218ace Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Sun, 8 Jun 2025 01:03:12 +0200 Subject: [PATCH 132/371] input: parse binds containing equal signs correctly Since the W3C rewrite we're able to specify codepoints like `+` directly in the config format who otherwise have special meanings. Turns out we forgot to do the same for `=`. --- src/input/Binding.zig | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/input/Binding.zig b/src/input/Binding.zig index e5d434265..757c4ff24 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -63,9 +63,11 @@ pub const Parser = struct { const flags, const start_idx = try parseFlags(raw_input); const input = raw_input[start_idx..]; - // Find the first = which splits are mapping into the trigger + // Find the last = which splits are mapping into the trigger // and action, respectively. - const eql_idx = std.mem.indexOf(u8, input, "=") orelse return Error.InvalidFormat; + // We use the last = because the keybind itself could contain + // raw equal signs (for the = codepoint) + const eql_idx = std.mem.lastIndexOf(u8, input, "=") orelse return Error.InvalidFormat; // Sequence iterator goes up to the equal, action is after. We can // parse the action now. @@ -2050,6 +2052,32 @@ test "parse: plus sign" { try testing.expectError(Error.InvalidFormat, parseSingle("++=ignore")); } +test "parse: equals sign" { + const testing = std.testing; + + try testing.expectEqual( + Binding{ + .trigger = .{ .key = .{ .unicode = '=' } }, + .action = .ignore, + }, + try parseSingle("==ignore"), + ); + + // Modifier + try testing.expectEqual( + Binding{ + .trigger = .{ + .key = .{ .unicode = '=' }, + .mods = .{ .ctrl = true }, + }, + .action = .ignore, + }, + try parseSingle("ctrl+==ignore"), + ); + + try testing.expectError(Error.InvalidFormat, parseSingle("=ignore")); +} + // For Ghostty 1.2+ we changed our key names to match the W3C and removed // `physical:`. This tests the backwards compatibility with the old format. // Note that our backwards compatibility isn't 100% perfect since triggers From 3b33813071650a4a0ce0a7c9e5e3275d1767bfc5 Mon Sep 17 00:00:00 2001 From: mitchellh <1299+mitchellh@users.noreply.github.com> Date: Sun, 8 Jun 2025 00:14:39 +0000 Subject: [PATCH 133/371] deps: Update iTerm2 color schemes --- build.zig.zon | 4 ++-- build.zig.zon.json | 6 +++--- build.zig.zon.nix | 6 +++--- build.zig.zon.txt | 2 +- flatpak/zig-packages.json | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index 3c6ed95ed..fa071dbfe 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -103,8 +103,8 @@ // Other .apple_sdk = .{ .path = "./pkg/apple-sdk" }, .iterm2_themes = .{ - .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz", - .hash = "N-V-__8AAIgLXgT76kRaZJzBE-1ZTXqaSx2jjIvPpIsnL2Gj", + .url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/10f216f54a32cee6f1f2e3aa01812650a209c16b.tar.gz", + .hash = "N-V-__8AAMJWXQSVe0xzU_4UVRTDVERqnNpQU4wfS0FRGRRj", .lazy = true, }, }, diff --git a/build.zig.zon.json b/build.zig.zon.json index b1d919f3a..ee2f14508 100644 --- a/build.zig.zon.json +++ b/build.zig.zon.json @@ -54,10 +54,10 @@ "url": "https://deps.files.ghostty.org/imgui-1220bc6b9daceaf7c8c60f3c3998058045ba0c5c5f48ae255ff97776d9cd8bfc6402.tar.gz", "hash": "sha256-oF/QHgTPEat4Hig4fGIdLkIPHmBEyOJ6JeYD6pnveGA=" }, - "N-V-__8AAIgLXgT76kRaZJzBE-1ZTXqaSx2jjIvPpIsnL2Gj": { + "N-V-__8AAMJWXQSVe0xzU_4UVRTDVERqnNpQU4wfS0FRGRRj": { "name": "iterm2_themes", - "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz", - "hash": "sha256-2AsOCV9RymfDbhFFRdNVE+GYCAmE713tM27TBPKxAW0=" + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/10f216f54a32cee6f1f2e3aa01812650a209c16b.tar.gz", + "hash": "sha256-TcrTZUCVetvAFGX0fBqg3zlG90flljScNr/OYR/MJ5Y=" }, "N-V-__8AAJrvXQCqAT8Mg9o_tk6m0yf5Fz-gCNEOKLyTSerD": { "name": "libpng", diff --git a/build.zig.zon.nix b/build.zig.zon.nix index ce4a656c7..e28a2a0dd 100644 --- a/build.zig.zon.nix +++ b/build.zig.zon.nix @@ -170,11 +170,11 @@ in }; } { - name = "N-V-__8AAIgLXgT76kRaZJzBE-1ZTXqaSx2jjIvPpIsnL2Gj"; + name = "N-V-__8AAMJWXQSVe0xzU_4UVRTDVERqnNpQU4wfS0FRGRRj"; path = fetchZigArtifact { name = "iterm2_themes"; - url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz"; - hash = "sha256-2AsOCV9RymfDbhFFRdNVE+GYCAmE713tM27TBPKxAW0="; + url = "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/10f216f54a32cee6f1f2e3aa01812650a209c16b.tar.gz"; + hash = "sha256-TcrTZUCVetvAFGX0fBqg3zlG90flljScNr/OYR/MJ5Y="; }; } { diff --git a/build.zig.zon.txt b/build.zig.zon.txt index cb8195752..3335b9574 100644 --- a/build.zig.zon.txt +++ b/build.zig.zon.txt @@ -27,7 +27,7 @@ https://deps.files.ghostty.org/ziglyph-b89d43d1e3fb01b6074bc1f7fc980324b04d26a5. https://deps.files.ghostty.org/zlib-1220fed0c74e1019b3ee29edae2051788b080cd96e90d56836eea857b0b966742efb.tar.gz https://github.com/glfw/glfw/archive/e7ea71be039836da3a98cea55ae5569cb5eb885c.tar.gz https://github.com/jcollie/ghostty-gobject/releases/download/0.14.0-2025-03-18-21-1/ghostty-gobject-0.14.0-2025-03-18-21-1.tar.zst -https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz +https://github.com/mbadolato/iTerm2-Color-Schemes/archive/10f216f54a32cee6f1f2e3aa01812650a209c16b.tar.gz https://github.com/mitchellh/libxev/archive/3df9337a9e84450a58a2c4af434ec1a036f7b494.tar.gz https://github.com/mitchellh/zig-objc/archive/3ab0d37c7d6b933d6ded1b3a35b6b60f05590a98.tar.gz https://github.com/natecraddock/zf/archive/7aacbe6d155d64d15937ca95ca6c014905eb531f.tar.gz diff --git a/flatpak/zig-packages.json b/flatpak/zig-packages.json index d56e6d121..fb032fe82 100644 --- a/flatpak/zig-packages.json +++ b/flatpak/zig-packages.json @@ -67,9 +67,9 @@ }, { "type": "archive", - "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/273a780bcd7e8a514d49ff42612b6856601cc052.tar.gz", - "dest": "vendor/p/N-V-__8AAIgLXgT76kRaZJzBE-1ZTXqaSx2jjIvPpIsnL2Gj", - "sha256": "d80b0e095f51ca67c36e114545d35513e198080984ef5ded336ed304f2b1016d" + "url": "https://github.com/mbadolato/iTerm2-Color-Schemes/archive/10f216f54a32cee6f1f2e3aa01812650a209c16b.tar.gz", + "dest": "vendor/p/N-V-__8AAMJWXQSVe0xzU_4UVRTDVERqnNpQU4wfS0FRGRRj", + "sha256": "4dcad36540957adbc01465f47c1aa0df3946f747e596349c36bfce611fcc2796" }, { "type": "archive", From 0e74b8027aef60e9b8bf600ee1f88b03463661f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Mon, 7 Apr 2025 23:43:11 -0400 Subject: [PATCH 134/371] pwd: fix hostname resolution on macos When macOS's "Private WiFi address" feature is enabled it'll change the hostname to a mac address. Mac addresses look like URIs with a hostname and port component, e.g. 12:34:56:78:90:12 where `:12` looks like port 12. However, mac addresses can also contain letters a through f, so a valid mac address like ab:cd:ef:ab:cd:ef is valid, but will not be parsed as a URI, because `:ef` is not a valid port. This commit attempts to fix that by checking if the hostname is a valid mac address when `std.Uri.parse()` fails and constructing a new std.Uri struct using that information. It's not perfect, but is equally compliant with the URI spec as std.Uri currently is. --- src/termio/stream_handler.zig | 66 +++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 3 deletions(-) diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index b3aa82d20..5327d8b36 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1041,6 +1041,13 @@ pub const StreamHandler = struct { self.terminal.markSemanticPrompt(.command); } + fn isUriPathSeparator(c: u8) bool { + return switch (c) { + '?', '#' => true, + else => false, + }; + } + pub fn reportPwd(self: *StreamHandler, url: []const u8) !void { // Special handling for the empty URL. We treat the empty URL // as resetting the pwd as if we never saw a pwd. I can't find any @@ -1069,9 +1076,62 @@ pub const StreamHandler = struct { return; } - const uri = std.Uri.parse(url) catch |e| { - log.warn("invalid url in OSC 7: {}", .{e}); - return; + const uri: std.Uri = uri: { + const uri = std.Uri.parse(url) catch |e| { + // It's possible this is a mac address on macOS where the last 2 characters in the + // address are non-digits, e.g. 'ff', and thus an invalid port. + // + // Example: file://12:34:56:78:90:12/path/to/file + + // Insufficient length to have a mac address in the hostname. + if (url.len < 24) { + log.warn("invalid url in OSC 7: {}", .{e}); + return; + } + + // The first '/' after the scheme marks the end of the hostname. If the hostname is + // not 17 characters, it's not a mac address. + if (std.mem.indexOfScalarPos(u8, url, 7, '/') != 24) { + log.warn("invalid url in OSC 7: {}", .{e}); + return; + } + + // At this point we have a potential mac address as the hostname. + const mac_address = url[7..24]; + + for (0..mac_address.len) |i| { + const c = mac_address[i]; + + if (i + 1 % 3 == 0) { + if (c != ':') { + log.warn("invalid url in OSC 7: {}", .{e}); + return; + } + } else { + if (!std.mem.containsAtLeastScalar(u8, "0123456789abcdef", 1, mac_address[i])) { + log.warn("invalid url in OSC 7: {}", .{e}); + return; + } + } + } + + // At this point we have what looks like a valid mac address. + + var uri_path_end_idx: usize = 24; + while (uri_path_end_idx < url.len and !isUriPathSeparator(url[uri_path_end_idx])) { + uri_path_end_idx += 1; + } + + // Same compliance factor as std.Uri.parse(), i.e. not at all compliant with the URI + // spec. + break :uri .{ + .scheme = "file://", + .host = .{ .percent_encoded = mac_address }, + .path = .{ .percent_encoded = url[24..uri_path_end_idx] }, + }; + }; + + break :uri uri; }; if (!std.mem.eql(u8, "file", uri.scheme) and From 19ca1bfb1ca950bd7ddcb58718903bafc7777944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Wed, 30 Apr 2025 23:54:42 -0400 Subject: [PATCH 135/371] Fix modulo operation and custom Uri struct init --- src/termio/stream_handler.zig | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 5327d8b36..6668b17cd 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1082,17 +1082,18 @@ pub const StreamHandler = struct { // address are non-digits, e.g. 'ff', and thus an invalid port. // // Example: file://12:34:56:78:90:12/path/to/file + if (e != error.InvalidPort) return; // Insufficient length to have a mac address in the hostname. if (url.len < 24) { - log.warn("invalid url in OSC 7: {}", .{e}); + log.warn("invalid MAC address in OSC 7: insufficient length", .{}); return; } // The first '/' after the scheme marks the end of the hostname. If the hostname is // not 17 characters, it's not a mac address. if (std.mem.indexOfScalarPos(u8, url, 7, '/') != 24) { - log.warn("invalid url in OSC 7: {}", .{e}); + log.warn("invalid MAC address in OSC 7: invalid scheme", .{}); return; } @@ -1102,14 +1103,14 @@ pub const StreamHandler = struct { for (0..mac_address.len) |i| { const c = mac_address[i]; - if (i + 1 % 3 == 0) { + if ((i + 1) % 3 == 0) { if (c != ':') { - log.warn("invalid url in OSC 7: {}", .{e}); + log.warn("invalid MAC address in OSC 7: missing colon", .{}); return; } } else { - if (!std.mem.containsAtLeastScalar(u8, "0123456789abcdef", 1, mac_address[i])) { - log.warn("invalid url in OSC 7: {}", .{e}); + if (!std.mem.containsAtLeastScalar(u8, "0123456789ABCDEFabcdef", 1, mac_address[i])) { + log.warn("invalid MAC address in OSC 7: invalid character '{c}' at position '{d}'", .{ mac_address[i], i }); return; } } @@ -1125,7 +1126,7 @@ pub const StreamHandler = struct { // Same compliance factor as std.Uri.parse(), i.e. not at all compliant with the URI // spec. break :uri .{ - .scheme = "file://", + .scheme = "file", .host = .{ .percent_encoded = mac_address }, .path = .{ .percent_encoded = url[24..uri_path_end_idx] }, }; From b66368b4d6e5e7eb3cc26a97574b09d6bfdbb49b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Thu, 1 May 2025 00:09:34 -0400 Subject: [PATCH 136/371] extract mac address validity check to function --- src/termio/stream_handler.zig | 57 +++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 6668b17cd..ba04ee6b1 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1048,6 +1048,29 @@ pub const StreamHandler = struct { }; } + fn isValidMacAddress(mac_address: []const u8) bool { + // A valid mac address has 6 two-character components with 5 colons, e.g. 12:34:56:ab:cd:ef. + if (mac_address.len != 17) { + return false; + } + + for (0..mac_address.len) |i| { + const c = mac_address[i]; + + if ((i + 1) % 3 == 0) { + if (c != ':') { + return false; + } + } else { + if (!std.mem.containsAtLeastScalar(u8, "0123456789ABCDEFabcdef", 1, c)) { + return false; + } + } + } + + return true; + } + pub fn reportPwd(self: *StreamHandler, url: []const u8) !void { // Special handling for the empty URL. We treat the empty URL // as resetting the pwd as if we never saw a pwd. I can't find any @@ -1084,40 +1107,22 @@ pub const StreamHandler = struct { // Example: file://12:34:56:78:90:12/path/to/file if (e != error.InvalidPort) return; - // Insufficient length to have a mac address in the hostname. - if (url.len < 24) { - log.warn("invalid MAC address in OSC 7: insufficient length", .{}); - return; - } - - // The first '/' after the scheme marks the end of the hostname. If the hostname is - // not 17 characters, it's not a mac address. + // The first '/' after the scheme marks the end of the hostname. If the first '/' + // following the end of the `file://` scheme is not at position 24 this is not a + // valid mac address. if (std.mem.indexOfScalarPos(u8, url, 7, '/') != 24) { - log.warn("invalid MAC address in OSC 7: invalid scheme", .{}); + log.warn("invalid url in OSC 7: {}", .{e}); return; } - // At this point we have a potential mac address as the hostname. + // At this point we may have a mac address as the hostname. const mac_address = url[7..24]; - for (0..mac_address.len) |i| { - const c = mac_address[i]; - - if ((i + 1) % 3 == 0) { - if (c != ':') { - log.warn("invalid MAC address in OSC 7: missing colon", .{}); - return; - } - } else { - if (!std.mem.containsAtLeastScalar(u8, "0123456789ABCDEFabcdef", 1, mac_address[i])) { - log.warn("invalid MAC address in OSC 7: invalid character '{c}' at position '{d}'", .{ mac_address[i], i }); - return; - } - } + if (!isValidMacAddress(mac_address)) { + log.warn("ivalid url in OSC 7: {}", .{e}); + return; } - // At this point we have what looks like a valid mac address. - var uri_path_end_idx: usize = 24; while (uri_path_end_idx < url.len and !isUriPathSeparator(url[uri_path_end_idx])) { uri_path_end_idx += 1; From 64bfaf23f92fe92d1799088425d3e1c587f63231 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Thu, 1 May 2025 00:18:42 -0400 Subject: [PATCH 137/371] take kitty-shell-cwd scheme into account --- src/termio/stream_handler.zig | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index ba04ee6b1..7bb604936 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1107,24 +1107,34 @@ pub const StreamHandler = struct { // Example: file://12:34:56:78:90:12/path/to/file if (e != error.InvalidPort) return; + const url_without_scheme = url: { + if (std.mem.startsWith(u8, url, "file://")) break :url url[7..]; + if (std.mem.startsWith(u8, url, "kitty-shell-cwd://")) break :url url[18..]; + + log.warn("invalid url in OSC 7: invalid scheme", .{}); + return; + }; + // The first '/' after the scheme marks the end of the hostname. If the first '/' - // following the end of the `file://` scheme is not at position 24 this is not a + // following the end of the scheme is not at the right position this is not a // valid mac address. - if (std.mem.indexOfScalarPos(u8, url, 7, '/') != 24) { + if (std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != 17) { log.warn("invalid url in OSC 7: {}", .{e}); return; } // At this point we may have a mac address as the hostname. - const mac_address = url[7..24]; + const mac_address = url_without_scheme[0..17]; if (!isValidMacAddress(mac_address)) { log.warn("ivalid url in OSC 7: {}", .{e}); return; } - var uri_path_end_idx: usize = 24; - while (uri_path_end_idx < url.len and !isUriPathSeparator(url[uri_path_end_idx])) { + var uri_path_end_idx: usize = 17; + while (uri_path_end_idx < url_without_scheme.len and + !isUriPathSeparator(url_without_scheme[uri_path_end_idx])) + { uri_path_end_idx += 1; } @@ -1133,7 +1143,7 @@ pub const StreamHandler = struct { break :uri .{ .scheme = "file", .host = .{ .percent_encoded = mac_address }, - .path = .{ .percent_encoded = url[24..uri_path_end_idx] }, + .path = .{ .percent_encoded = url_without_scheme[17..uri_path_end_idx] }, }; }; From ffe7f0d8bfc385fe9e1afed21e3973fdabb27283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Thu, 1 May 2025 00:24:37 -0400 Subject: [PATCH 138/371] extract url parsing into its own function --- src/termio/stream_handler.zig | 98 +++++++++++++++++------------------ 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index 7bb604936..d57bdb1ac 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1071,6 +1071,52 @@ pub const StreamHandler = struct { return true; } + fn parseUrl(url: []const u8) !std.Uri { + return std.Uri.parse(url) catch |e| { + // It's possible this is a mac address on macOS where the last 2 characters in the + // address are non-digits, e.g. 'ff', and thus an invalid port. + // + // Example: file://12:34:56:78:90:12/path/to/file + if (e != error.InvalidPort) return e; + + const url_without_scheme = url: { + if (std.mem.startsWith(u8, url, "file://")) break :url url[7..]; + if (std.mem.startsWith(u8, url, "kitty-shell-cwd://")) break :url url[18..]; + + return error.UnsupportedScheme; + }; + + // The first '/' after the scheme marks the end of the hostname. If the first '/' + // following the end of the scheme is not at the right position this is not a + // valid mac address. + if (std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != 17) { + return error.HostnameIsNotMacAddress; + } + + // At this point we may have a mac address as the hostname. + const mac_address = url_without_scheme[0..17]; + + if (!isValidMacAddress(mac_address)) { + return error.HostnameIsNotMacAddress; + } + + var uri_path_end_idx: usize = 17; + while (uri_path_end_idx < url_without_scheme.len and + !isUriPathSeparator(url_without_scheme[uri_path_end_idx])) + { + uri_path_end_idx += 1; + } + + // Same compliance factor as std.Uri.parse(), i.e. not at all compliant with the URI + // spec. + return .{ + .scheme = "file", + .host = .{ .percent_encoded = mac_address }, + .path = .{ .percent_encoded = url_without_scheme[17..uri_path_end_idx] }, + }; + }; + } + pub fn reportPwd(self: *StreamHandler, url: []const u8) !void { // Special handling for the empty URL. We treat the empty URL // as resetting the pwd as if we never saw a pwd. I can't find any @@ -1099,55 +1145,9 @@ pub const StreamHandler = struct { return; } - const uri: std.Uri = uri: { - const uri = std.Uri.parse(url) catch |e| { - // It's possible this is a mac address on macOS where the last 2 characters in the - // address are non-digits, e.g. 'ff', and thus an invalid port. - // - // Example: file://12:34:56:78:90:12/path/to/file - if (e != error.InvalidPort) return; - - const url_without_scheme = url: { - if (std.mem.startsWith(u8, url, "file://")) break :url url[7..]; - if (std.mem.startsWith(u8, url, "kitty-shell-cwd://")) break :url url[18..]; - - log.warn("invalid url in OSC 7: invalid scheme", .{}); - return; - }; - - // The first '/' after the scheme marks the end of the hostname. If the first '/' - // following the end of the scheme is not at the right position this is not a - // valid mac address. - if (std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != 17) { - log.warn("invalid url in OSC 7: {}", .{e}); - return; - } - - // At this point we may have a mac address as the hostname. - const mac_address = url_without_scheme[0..17]; - - if (!isValidMacAddress(mac_address)) { - log.warn("ivalid url in OSC 7: {}", .{e}); - return; - } - - var uri_path_end_idx: usize = 17; - while (uri_path_end_idx < url_without_scheme.len and - !isUriPathSeparator(url_without_scheme[uri_path_end_idx])) - { - uri_path_end_idx += 1; - } - - // Same compliance factor as std.Uri.parse(), i.e. not at all compliant with the URI - // spec. - break :uri .{ - .scheme = "file", - .host = .{ .percent_encoded = mac_address }, - .path = .{ .percent_encoded = url_without_scheme[17..uri_path_end_idx] }, - }; - }; - - break :uri uri; + const uri: std.Uri = parseUrl(url) catch |e| { + log.warn("invalid url in OSC 7: {}", .{e}); + return; }; if (!std.mem.eql(u8, "file", uri.scheme) and From e0655a7f75973dbc9013458587dac0c4e12ce66b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Thu, 8 May 2025 22:36:37 -0400 Subject: [PATCH 139/371] Move url parsing helper to os/hostname Also adds a test to verify that the function is working as intended. --- src/os/hostname.zig | 154 ++++++++++++++++++++++++++++++++++ src/termio/stream_handler.zig | 78 +---------------- 2 files changed, 155 insertions(+), 77 deletions(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index 22f29ceff..eb6c7052c 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -6,6 +6,91 @@ pub const HostnameParsingError = error{ NoSpaceLeft, }; +fn isUriPathSeparator(c: u8) bool { + return switch (c) { + '?', '#' => true, + else => false, + }; +} + +fn isValidMacAddress(mac_address: []const u8) bool { + // A valid mac address has 6 two-character components with 5 colons, e.g. 12:34:56:ab:cd:ef. + if (mac_address.len != 17) { + return false; + } + + for (0..mac_address.len) |i| { + const c = mac_address[i]; + + if ((i + 1) % 3 == 0) { + if (c != ':') { + return false; + } + } else { + if (!std.mem.containsAtLeastScalar(u8, "0123456789ABCDEFabcdef", 1, c)) { + return false; + } + } + } + + return true; +} + +/// Parses the provided url to a `std.Uri` struct. This is very specific to getting hostname and +/// path information for Ghostty's PWD reporting functionality. Takes into account that on macOS +/// the url passed to this function might have a mac address as its hostname and parses it +/// correctly. +pub fn parseUrl(url: []const u8) !std.Uri { + return std.Uri.parse(url) catch |e| { + // It's possible this is a mac address on macOS where the last 2 characters in the + // address are non-digits, e.g. 'ff', and thus an invalid port. + // + // Example: file://12:34:56:78:90:12/path/to/file + if (e != error.InvalidPort) return e; + + const scheme, const url_without_scheme = url: { + if (std.mem.startsWith(u8, url, "file://")) break :url .{ "file", url[7..] }; + if (std.mem.startsWith(u8, url, "kitty-shell-cwd://")) break :url .{ + "kitty-shell-cwd", + url[18..], + }; + + return error.UnsupportedScheme; + }; + + // The first '/' after the scheme marks the end of the hostname. If the first '/' + // following the end of the scheme is not at the right position this is not a + // valid mac address. + if (std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != 17 and + url_without_scheme.len != 17) + { + return error.HostnameIsNotMacAddress; + } + + // At this point we may have a mac address as the hostname. + const mac_address = url_without_scheme[0..17]; + + if (!isValidMacAddress(mac_address)) { + return error.HostnameIsNotMacAddress; + } + + var uri_path_end_idx: usize = 17; + while (uri_path_end_idx < url_without_scheme.len and + !isUriPathSeparator(url_without_scheme[uri_path_end_idx])) + { + uri_path_end_idx += 1; + } + + // Same compliance factor as std.Uri.parse(), i.e. not at all compliant with the URI + // spec. + return .{ + .scheme = scheme, + .host = .{ .percent_encoded = mac_address }, + .path = .{ .percent_encoded = url_without_scheme[17..uri_path_end_idx] }, + }; + }; +} + /// Print the hostname from a file URI into a buffer. pub fn bufPrintHostnameFromFileUri( buf: []u8, @@ -70,6 +155,67 @@ pub fn isLocalHostname(hostname: []const u8) LocalHostnameValidationError!bool { return std.mem.eql(u8, hostname, ourHostname); } +test parseUrl { + // 1. Typical hostnames. + + var uri = try parseUrl("file://personal.computer/home/test/"); + + try std.testing.expectEqualStrings("file", uri.scheme); + try std.testing.expectEqualStrings("personal.computer", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("/home/test/", uri.path.percent_encoded); + try std.testing.expect(uri.port == null); + + uri = try parseUrl("kitty-shell-cwd://personal.computer/home/test/"); + + try std.testing.expectEqualStrings("kitty-shell-cwd", uri.scheme); + try std.testing.expectEqualStrings("personal.computer", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("/home/test/", uri.path.percent_encoded); + try std.testing.expect(uri.port == null); + + // 2. Hostnames that are mac addresses. + + // Numerical mac addresses. + + uri = try parseUrl("file://12:34:56:78:90:12/home/test/"); + + try std.testing.expectEqualStrings("file", uri.scheme); + try std.testing.expectEqualStrings("12:34:56:78:90", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("/home/test/", uri.path.percent_encoded); + try std.testing.expect(uri.port == 12); + + uri = try parseUrl("kitty-shell-cwd://12:34:56:78:90:12/home/test/"); + + try std.testing.expectEqualStrings("kitty-shell-cwd", uri.scheme); + try std.testing.expectEqualStrings("12:34:56:78:90", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("/home/test/", uri.path.percent_encoded); + try std.testing.expect(uri.port == 12); + + // Alphabetical mac addresses. + + uri = try parseUrl("file://ab:cd:ef:ab:cd:ef/home/test/"); + + try std.testing.expectEqualStrings("file", uri.scheme); + try std.testing.expectEqualStrings("ab:cd:ef:ab:cd:ef", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("/home/test/", uri.path.percent_encoded); + try std.testing.expect(uri.port == null); + + uri = try parseUrl("kitty-shell-cwd://ab:cd:ef:ab:cd:ef/home/test/"); + + try std.testing.expectEqualStrings("kitty-shell-cwd", uri.scheme); + try std.testing.expectEqualStrings("ab:cd:ef:ab:cd:ef", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("/home/test/", uri.path.percent_encoded); + try std.testing.expect(uri.port == null); +} + +test "parseUrl succeeds even if path component is missing" { + const uri = try parseUrl("file://12:34:56:78:90:ab"); + + try std.testing.expectEqualStrings("file", uri.scheme); + try std.testing.expectEqualStrings("12:34:56:78:90:ab", uri.host.?.percent_encoded); + try std.testing.expect(uri.path.isEmpty()); + try std.testing.expect(uri.port == null); +} + test "bufPrintHostnameFromFileUri succeeds with ascii hostname" { const uri = try std.Uri.parse("file://localhost/"); @@ -86,6 +232,14 @@ test "bufPrintHostnameFromFileUri succeeds with hostname as mac address" { try std.testing.expectEqualStrings("12:34:56:78:90:12", actual); } +test "bufPrintHostnameFromFileUri succeeds with hostname as mac address with the last component as ascii" { + const uri = try parseUrl("file://12:34:56:78:90:ab"); + + var buf: [posix.HOST_NAME_MAX]u8 = undefined; + const actual = try bufPrintHostnameFromFileUri(&buf, uri); + try std.testing.expectEqualStrings("12:34:56:78:90:ab", actual); +} + test "bufPrintHostnameFromFileUri succeeds with hostname as a mac address and the last section is < 10" { const uri = try std.Uri.parse("file://12:34:56:78:90:05"); diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index d57bdb1ac..a238c2a59 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -1041,82 +1041,6 @@ pub const StreamHandler = struct { self.terminal.markSemanticPrompt(.command); } - fn isUriPathSeparator(c: u8) bool { - return switch (c) { - '?', '#' => true, - else => false, - }; - } - - fn isValidMacAddress(mac_address: []const u8) bool { - // A valid mac address has 6 two-character components with 5 colons, e.g. 12:34:56:ab:cd:ef. - if (mac_address.len != 17) { - return false; - } - - for (0..mac_address.len) |i| { - const c = mac_address[i]; - - if ((i + 1) % 3 == 0) { - if (c != ':') { - return false; - } - } else { - if (!std.mem.containsAtLeastScalar(u8, "0123456789ABCDEFabcdef", 1, c)) { - return false; - } - } - } - - return true; - } - - fn parseUrl(url: []const u8) !std.Uri { - return std.Uri.parse(url) catch |e| { - // It's possible this is a mac address on macOS where the last 2 characters in the - // address are non-digits, e.g. 'ff', and thus an invalid port. - // - // Example: file://12:34:56:78:90:12/path/to/file - if (e != error.InvalidPort) return e; - - const url_without_scheme = url: { - if (std.mem.startsWith(u8, url, "file://")) break :url url[7..]; - if (std.mem.startsWith(u8, url, "kitty-shell-cwd://")) break :url url[18..]; - - return error.UnsupportedScheme; - }; - - // The first '/' after the scheme marks the end of the hostname. If the first '/' - // following the end of the scheme is not at the right position this is not a - // valid mac address. - if (std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != 17) { - return error.HostnameIsNotMacAddress; - } - - // At this point we may have a mac address as the hostname. - const mac_address = url_without_scheme[0..17]; - - if (!isValidMacAddress(mac_address)) { - return error.HostnameIsNotMacAddress; - } - - var uri_path_end_idx: usize = 17; - while (uri_path_end_idx < url_without_scheme.len and - !isUriPathSeparator(url_without_scheme[uri_path_end_idx])) - { - uri_path_end_idx += 1; - } - - // Same compliance factor as std.Uri.parse(), i.e. not at all compliant with the URI - // spec. - return .{ - .scheme = "file", - .host = .{ .percent_encoded = mac_address }, - .path = .{ .percent_encoded = url_without_scheme[17..uri_path_end_idx] }, - }; - }; - } - pub fn reportPwd(self: *StreamHandler, url: []const u8) !void { // Special handling for the empty URL. We treat the empty URL // as resetting the pwd as if we never saw a pwd. I can't find any @@ -1145,7 +1069,7 @@ pub const StreamHandler = struct { return; } - const uri: std.Uri = parseUrl(url) catch |e| { + const uri: std.Uri = internal_os.hostname.parseUrl(url) catch |e| { log.warn("invalid url in OSC 7: {}", .{e}); return; }; From 7a639a71197204254f869f50bde9cfb316acf40c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Tue, 13 May 2025 23:00:16 -0400 Subject: [PATCH 140/371] use iterator syntax in for loop --- src/os/hostname.zig | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index eb6c7052c..ef5ecbcf7 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -19,9 +19,7 @@ fn isValidMacAddress(mac_address: []const u8) bool { return false; } - for (0..mac_address.len) |i| { - const c = mac_address[i]; - + for (mac_address, 0..) |c, i| { if ((i + 1) % 3 == 0) { if (c != ':') { return false; From bb07e9c0261e229a99502871aa359e983bf81b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Tue, 13 May 2025 23:06:53 -0400 Subject: [PATCH 141/371] don't rely on hard-coded schemes --- src/os/hostname.zig | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index ef5ecbcf7..747c145d4 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -46,15 +46,11 @@ pub fn parseUrl(url: []const u8) !std.Uri { // Example: file://12:34:56:78:90:12/path/to/file if (e != error.InvalidPort) return e; - const scheme, const url_without_scheme = url: { - if (std.mem.startsWith(u8, url, "file://")) break :url .{ "file", url[7..] }; - if (std.mem.startsWith(u8, url, "kitty-shell-cwd://")) break :url .{ - "kitty-shell-cwd", - url[18..], - }; - - return error.UnsupportedScheme; + const url_without_scheme_start = std.mem.indexOf(u8, url, "://") orelse { + return error.InvalidScheme; }; + const scheme = url[0..url_without_scheme_start]; + const url_without_scheme = url[url_without_scheme_start + 3 ..]; // The first '/' after the scheme marks the end of the hostname. If the first '/' // following the end of the scheme is not at the right position this is not a From a24d0c9faf83ebe486fc4dfd660a9ee4bc78c52c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Tue, 13 May 2025 23:15:23 -0400 Subject: [PATCH 142/371] re-order end-of-hostname validity check --- src/os/hostname.zig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index 747c145d4..998b80fac 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -55,8 +55,8 @@ pub fn parseUrl(url: []const u8) !std.Uri { // The first '/' after the scheme marks the end of the hostname. If the first '/' // following the end of the scheme is not at the right position this is not a // valid mac address. - if (std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != 17 and - url_without_scheme.len != 17) + if (url_without_scheme.len != 17 and + std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != 17) { return error.HostnameIsNotMacAddress; } From dfdb588f581d1fca3230ca1d2437c5e0cee53833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Tue, 13 May 2025 23:15:53 -0400 Subject: [PATCH 143/371] add tests for hostnames without a path component --- src/os/hostname.zig | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index 998b80fac..a04f9d4ab 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -199,6 +199,40 @@ test parseUrl { try std.testing.expectEqualStrings("ab:cd:ef:ab:cd:ef", uri.host.?.percent_encoded); try std.testing.expectEqualStrings("/home/test/", uri.path.percent_encoded); try std.testing.expect(uri.port == null); + + // 3. Hostnames that are mac addresses with no path. + + // Numerical mac addresses. + + uri = try parseUrl("file://12:34:56:78:90:12"); + + try std.testing.expectEqualStrings("file", uri.scheme); + try std.testing.expectEqualStrings("12:34:56:78:90", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("", uri.path.percent_encoded); + try std.testing.expect(uri.port == 12); + + uri = try parseUrl("kitty-shell-cwd://12:34:56:78:90:12"); + + try std.testing.expectEqualStrings("kitty-shell-cwd", uri.scheme); + try std.testing.expectEqualStrings("12:34:56:78:90", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("", uri.path.percent_encoded); + try std.testing.expect(uri.port == 12); + + // Alphabetical mac addresses. + + uri = try parseUrl("file://ab:cd:ef:ab:cd:ef"); + + try std.testing.expectEqualStrings("file", uri.scheme); + try std.testing.expectEqualStrings("ab:cd:ef:ab:cd:ef", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("", uri.path.percent_encoded); + try std.testing.expect(uri.port == null); + + uri = try parseUrl("kitty-shell-cwd://ab:cd:ef:ab:cd:ef"); + + try std.testing.expectEqualStrings("kitty-shell-cwd", uri.scheme); + try std.testing.expectEqualStrings("ab:cd:ef:ab:cd:ef", uri.host.?.percent_encoded); + try std.testing.expectEqualStrings("", uri.path.percent_encoded); + try std.testing.expect(uri.port == null); } test "parseUrl succeeds even if path component is missing" { From 68f48b9911983cf60b258503e29900ffb928738f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Tue, 13 May 2025 23:18:35 -0400 Subject: [PATCH 144/371] name the 17 magic constant `mac_address_length` --- src/os/hostname.zig | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index a04f9d4ab..4a2c5c841 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -55,20 +55,21 @@ pub fn parseUrl(url: []const u8) !std.Uri { // The first '/' after the scheme marks the end of the hostname. If the first '/' // following the end of the scheme is not at the right position this is not a // valid mac address. - if (url_without_scheme.len != 17 and - std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != 17) + const mac_address_length = 17; + if (url_without_scheme.len != mac_address_length and + std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != mac_address_length) { return error.HostnameIsNotMacAddress; } // At this point we may have a mac address as the hostname. - const mac_address = url_without_scheme[0..17]; + const mac_address = url_without_scheme[0..mac_address_length]; if (!isValidMacAddress(mac_address)) { return error.HostnameIsNotMacAddress; } - var uri_path_end_idx: usize = 17; + var uri_path_end_idx: usize = mac_address_length; while (uri_path_end_idx < url_without_scheme.len and !isUriPathSeparator(url_without_scheme[uri_path_end_idx])) { @@ -80,7 +81,9 @@ pub fn parseUrl(url: []const u8) !std.Uri { return .{ .scheme = scheme, .host = .{ .percent_encoded = mac_address }, - .path = .{ .percent_encoded = url_without_scheme[17..uri_path_end_idx] }, + .path = .{ + .percent_encoded = url_without_scheme[mac_address_length..uri_path_end_idx], + }, }; }; } From 7760389ab8933c7dce52c22658f988f383e00295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Tue, 13 May 2025 23:29:46 -0400 Subject: [PATCH 145/371] add comptime check for platform we only need the mac-address-as-hostname workaround on macos, so we now have a comptime check to see if we're on macos. --- src/os/hostname.zig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index 4a2c5c841..fdbe822e3 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const builtin = @import("builtin"); const posix = std.posix; pub const HostnameParsingError = error{ @@ -40,6 +41,10 @@ fn isValidMacAddress(mac_address: []const u8) bool { /// correctly. pub fn parseUrl(url: []const u8) !std.Uri { return std.Uri.parse(url) catch |e| { + // The mac-address-as-hostname issue is specific to macOS so we just return an error if we + // hit it on other platforms. + comptime if (builtin.os.tag != .macos) return e; + // It's possible this is a mac address on macOS where the last 2 characters in the // address are non-digits, e.g. 'ff', and thus an invalid port. // From e4a175d24a7ecb219ec20f92502bec2b86a29709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Tue, 13 May 2025 23:41:18 -0400 Subject: [PATCH 146/371] use explicit error set --- src/os/hostname.zig | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index fdbe822e3..2cdba5763 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -7,6 +7,14 @@ pub const HostnameParsingError = error{ NoSpaceLeft, }; +pub const UrlParsingError = error{ + HostnameIsNotMacAddress, + InvalidFormat, + InvalidPort, + NoSchemeProvided, + UnexpectedCharacter, +}; + fn isUriPathSeparator(c: u8) bool { return switch (c) { '?', '#' => true, @@ -39,7 +47,7 @@ fn isValidMacAddress(mac_address: []const u8) bool { /// path information for Ghostty's PWD reporting functionality. Takes into account that on macOS /// the url passed to this function might have a mac address as its hostname and parses it /// correctly. -pub fn parseUrl(url: []const u8) !std.Uri { +pub fn parseUrl(url: []const u8) UrlParsingError!std.Uri { return std.Uri.parse(url) catch |e| { // The mac-address-as-hostname issue is specific to macOS so we just return an error if we // hit it on other platforms. @@ -52,7 +60,7 @@ pub fn parseUrl(url: []const u8) !std.Uri { if (e != error.InvalidPort) return e; const url_without_scheme_start = std.mem.indexOf(u8, url, "://") orelse { - return error.InvalidScheme; + return error.NoSchemeProvided; }; const scheme = url[0..url_without_scheme_start]; const url_without_scheme = url[url_without_scheme_start + 3 ..]; From 73e5f7e5d6d0ce3bfe27a1d791585764cb17c536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Sat, 7 Jun 2025 22:12:26 -0400 Subject: [PATCH 147/371] merge std.Uri.ParseError and os/hostname error sets --- src/os/hostname.zig | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index 2cdba5763..05f857b82 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -7,12 +7,9 @@ pub const HostnameParsingError = error{ NoSpaceLeft, }; -pub const UrlParsingError = error{ +pub const UrlParsingError = std.Uri.ParseError || error{ HostnameIsNotMacAddress, - InvalidFormat, - InvalidPort, NoSchemeProvided, - UnexpectedCharacter, }; fn isUriPathSeparator(c: u8) bool { From 6ed94b00346a402d85ac83a9585de17ced93f351 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Sat, 7 Jun 2025 22:17:01 -0400 Subject: [PATCH 148/371] move mac address length constant to file-level scope --- src/os/hostname.zig | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index 05f857b82..3f2c53b50 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -12,6 +12,8 @@ pub const UrlParsingError = std.Uri.ParseError || error{ NoSchemeProvided, }; +const mac_address_length = 17; + fn isUriPathSeparator(c: u8) bool { return switch (c) { '?', '#' => true, @@ -65,7 +67,6 @@ pub fn parseUrl(url: []const u8) UrlParsingError!std.Uri { // The first '/' after the scheme marks the end of the hostname. If the first '/' // following the end of the scheme is not at the right position this is not a // valid mac address. - const mac_address_length = 17; if (url_without_scheme.len != mac_address_length and std.mem.indexOfScalarPos(u8, url_without_scheme, 0, '/') != mac_address_length) { From ec043e13866cef34d1835930a0512e1a42de5736 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 8 Jun 2025 07:00:49 -0700 Subject: [PATCH 149/371] macos: red traffic light should be undoable --- macos/Sources/Features/Terminal/TerminalController.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 244f8720d..7a241d866 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -681,7 +681,6 @@ class TerminalController: BaseTerminalController { return } - tabGroup.windows.forEach { $0.close() } } @@ -954,6 +953,13 @@ class TerminalController: BaseTerminalController { //MARK: - NSWindowDelegate + override func windowShouldClose(_ sender: NSWindow) -> Bool { + closeWindow(sender) + + // We will always explicitly close the window using the above + return false + } + override func windowWillClose(_ notification: Notification) { super.windowWillClose(notification) self.relabelTabs() From 3de3f48faf830fe1326f44b08fb9f27fa65cefcd Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 8 Jun 2025 07:29:19 -0700 Subject: [PATCH 150/371] macos: fix undo/redo for closing windows with multiple tabs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When closing a window that contains multiple tabs, the undo operation now properly restores all tabs as a single tabbed window rather than just restoring the active tab. The implementation: - Collects undo states from all windows in the tab group before closing - Sorts them by their original tab index to preserve order - Clears tab group references to avoid referencing garbage collected objects - Restores all windows and re-adds them as tabs to the first window - Tracks and restores which tab was focused (or focuses the last tab if none were) AI prompts that generated this commit are below. Each separate prompt is separated by a blank line, so this session was made up with many prompts in a back-and-forth conversation. > We need to update the undo/redo implementation in > @macos/Sources/Features/Terminal/TerminalController.swift `closeWindowImmediately` > to handle the case that multiple windows in a tab group are closed all at once, > and to restore them as a tabbed window. To do this, I think we should collect > all the `undoStates`, sort them by `tabIndex` (null at the end), and then on j > restore, restore them one at a time but add them back to the same tabGroup. We > can't use the tab group in the `undoState` because it will be garbage collected > by then. To be sure, we should just set it to nil. I should note at this point that the feature already worked, but the code quality and organization wasn't up to my standards. If someone using AI were just trying to make something work, they might be done at this point. I do think this is the biggest gap I worry about with AI-assisted development: bridging between the "it works" stage at a junior quality and the "it works and is maintainable" stage at a senior quality. I suspect this will be a balance of LLMs getting better but also senior code reviewers remaining highly involved in the process. > Let's extract all the work you just did into a dedicated private method > called `registerUndoForCloseWindow` Manual: made some tweaks to comments, moved some lines around, didn’t change any logic. > I think we can pull the tabIndex directly from the undoState instead of > storing it in a tuple. > Instead of `var undoStates`, I think we can create a `let undoStates` and > build and filter and sort them all in a chain of functional mappings. > Okay, looking at your logic for restoration, the `var firstController` and > conditionals are littly messy. Can you make your own pass at cleaning those > up and I'll review and provide more specific guidance after. > Excellent. Perfect. The last thing we're missing is restoring the proper > focused window of the tab group. We should store that and make sure the > proper window is made key. If no windows were key, then we should make the > last one key. > Excellent. Any more cleanups or comments you'd recommend in the places you > changed? Notes on the last one: it gave me a bunch of suggestions, I rejected most but did accept some. > Can you write me a commit message summarizing the changes? It wrote me a part of the commit message you're reading now, but I always manually tweak the commit message and add my own flair. --- .../Terminal/TerminalController.swift | 140 ++++++++++++++---- 1 file changed, 112 insertions(+), 28 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 7a241d866..fc262686b 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -647,41 +647,125 @@ class TerminalController: BaseTerminalController { private func closeWindowImmediately() { guard let window = window else { return } - // Regardless of tabs vs no tabs, what we want to do here is keep - // track of the window frame to restore, the surface tree, and the - // the focused surface. We want to restore that with undo even - // if we end up closing. - if let undoManager, let undoState { - // Register undo action to restore the window - undoManager.setActionName("Close Window") - undoManager.registerUndo( - withTarget: ghostty, - expiresAfter: undoExpiration) { ghostty in - // Restore the undo state - let newController = TerminalController(ghostty, with: undoState) + // Register undo for this close operation + registerUndoForCloseWindow() - // Register redo action + // Close the window(s) + if let tabGroup = window.tabGroup, tabGroup.windows.count > 1 { + tabGroup.windows.forEach { $0.close() } + } else { + window.close() + } + } + + /// Registers undo for closing window(s), handling both single windows and tab groups. + private func registerUndoForCloseWindow() { + guard let undoManager else { return } + guard let window else { return } + + // If we don't have a tab group or we don't have multiple tabs, then + // do a normal single window close. + guard let tabGroup = window.tabGroup, + tabGroup.windows.count > 1 else { + // No tabs, just save this window's state + if let undoState { + // Register undo action to restore the window + undoManager.setActionName("Close Window") undoManager.registerUndo( - withTarget: newController, - expiresAfter: newController.undoExpiration) { target in - target.closeWindowImmediately() + withTarget: ghostty, + expiresAfter: undoExpiration) { ghostty in + // Restore the undo state + let newController = TerminalController(ghostty, with: undoState) + + // Register redo action + undoManager.registerUndo( + withTarget: newController, + expiresAfter: newController.undoExpiration) { target in + target.closeWindowImmediately() + } + } + } + + return + } + + // Multiple windows in tab group - collect all undo states in sorted order + // by tab ordering. Also track which window was key. + let undoStates = tabGroup.windows + .compactMap { tabWindow -> UndoState? in + guard let controller = tabWindow.windowController as? TerminalController, + var undoState = controller.undoState else { return nil } + // Clear the tab group reference since it is unneeded. It should be + // garbage collected but we want to be extra sure we don't try to + // restore into it because we're going to recreate it. + undoState.tabGroup = nil + return undoState + } + .sorted { (lhs, rhs) in + switch (lhs.tabIndex, rhs.tabIndex) { + case let (l?, r?): return l < r + case (_?, nil): return true + case (nil, _?): return false + case (nil, nil): return true } } + + // Find the index of the key window in our sorted states. This is a bit verbose + // but we only need this for this style of undo so we don't want to add it to + // UndoState. + let keyWindowIndex: Int? + if let keyWindow = tabGroup.windows.first(where: { $0.isKeyWindow }), + let keyController = keyWindow.windowController as? TerminalController, + let keyUndoState = keyController.undoState { + keyWindowIndex = undoStates.firstIndex { + $0.tabIndex == keyUndoState.tabIndex } + } else { + keyWindowIndex = nil } - guard let tabGroup = window.tabGroup else { - // No tabs, no tab group, just perform a normal close. - window.close() - return - } + // Register undo action to restore all windows + guard !undoStates.isEmpty else { return } - // If have one window then we just do a normal close - if tabGroup.windows.count == 1 { - window.close() - return - } + undoManager.setActionName("Close Window") + undoManager.registerUndo( + withTarget: ghostty, + expiresAfter: undoExpiration + ) { ghostty in + // Restore all windows in the tab group + let controllers = undoStates.map { undoState in + TerminalController(ghostty, with: undoState) + } + + // The first controller becomes the parent window for all tabs. + // If we don't have a first controller (shouldn't be possible?) + // then we can't restore tabs. + guard let firstController = controllers.first else { return } + + // Add all subsequent controllers as tabs to the first window + for controller in controllers.dropFirst() { + controller.showWindow(nil) + if let firstWindow = firstController.window, + let newWindow = controller.window { + firstWindow.addTabbedWindow(newWindow, ordered: .above) + } + } + + // Make the appropriate window key. If we had a key window, restore it. + // Otherwise, make the last window key. + if let keyWindowIndex, keyWindowIndex < controllers.count { + controllers[keyWindowIndex].window?.makeKeyAndOrderFront(nil) + } else { + controllers.last?.window?.makeKeyAndOrderFront(nil) + } - tabGroup.windows.forEach { $0.close() } + // Register redo action on the first controller + undoManager.registerUndo( + withTarget: firstController, + expiresAfter: firstController.undoExpiration + ) { target in + target.closeWindowImmediately() + } + } } /// Close all windows, asking for confirmation if necessary. @@ -734,7 +818,7 @@ class TerminalController: BaseTerminalController { let surfaceTree: SplitTree let focusedSurface: UUID? let tabIndex: Int? - private(set) weak var tabGroup: NSWindowTabGroup? + weak var tabGroup: NSWindowTabGroup? } convenience init(_ ghostty: Ghostty.App, From 26e1dd8f8e876bfc0b797c5968becf7fd565c319 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 8 Jun 2025 12:23:08 -0700 Subject: [PATCH 151/371] macos: clear out the surface trees to prevent repeat undo see the comment --- .../Features/Terminal/TerminalController.swift | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index fc262686b..c9f8ef216 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -647,12 +647,19 @@ class TerminalController: BaseTerminalController { private func closeWindowImmediately() { guard let window = window else { return } - // Register undo for this close operation registerUndoForCloseWindow() - // Close the window(s) if let tabGroup = window.tabGroup, tabGroup.windows.count > 1 { - tabGroup.windows.forEach { $0.close() } + tabGroup.windows.forEach { window in + // Clear out the surfacetree to ensure there is no undo state. + // This prevents unnecessary undos registered since AppKit may + // process them on later ticks so we can't just disable undo registration. + if let controller = window.windowController as? TerminalController { + controller.surfaceTree = .init() + } + + window.close() + } } else { window.close() } @@ -660,7 +667,7 @@ class TerminalController: BaseTerminalController { /// Registers undo for closing window(s), handling both single windows and tab groups. private func registerUndoForCloseWindow() { - guard let undoManager else { return } + guard let undoManager, undoManager.isUndoRegistrationEnabled else { return } guard let window else { return } // If we don't have a tab group or we don't have multiple tabs, then @@ -859,6 +866,7 @@ class TerminalController: BaseTerminalController { /// The current undo state for this controller var undoState: UndoState? { guard let window else { return nil } + guard !surfaceTree.isEmpty else { return nil } return .init( frame: window.frame, surfaceTree: surfaceTree, From e4cd90b8a0cee2b704a8466e8f9b915c2ef30514 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 8 Jun 2025 19:57:38 -0700 Subject: [PATCH 152/371] macos: set explicit identity for split tree view based on structure Fixes #7546 SwiftUI uses type and structure to identify views, which can lead to issues with tree like structures where the shape and type is the same but the content changes. This was causing #7546. To fix this, we need to add explicit identity to the split tree view so that SwiftUI can differentiate when it needs to redraw the view. We don't want to blindly add Hashable to SplitTree because we don't want to take into account all the fields. Instead, we add an explicit "structural identity" to the SplitTreeView that can be used by SwiftUI. --- macos/Sources/Features/Splits/SplitTree.swift | 145 ++++++++++++++++++ .../Splits/TerminalSplitTreeView.swift | 5 + 2 files changed, 150 insertions(+) diff --git a/macos/Sources/Features/Splits/SplitTree.swift b/macos/Sources/Features/Splits/SplitTree.swift index 394cd1089..1c4be7dd6 100644 --- a/macos/Sources/Features/Splits/SplitTree.swift +++ b/macos/Sources/Features/Splits/SplitTree.swift @@ -1116,3 +1116,148 @@ extension SplitTree: Collection { return i + 1 } } + +// MARK: Structural Identity + +extension SplitTree.Node { + /// Returns a hashable representation that captures this node's structural identity. + var structuralIdentity: StructuralIdentity { + StructuralIdentity(self) + } + + /// A hashable representation of a node that captures its structural identity. + /// + /// This type provides a way to track changes to a node's structure in SwiftUI + /// by implementing `Hashable` based on: + /// - The node's hierarchical structure (splits and their directions) + /// - The identity of view instances in leaf nodes (using object identity) + /// - The split directions (but not ratios, as those may change slightly) + /// + /// This is useful for SwiftUI's `id()` modifier to detect when a node's structure + /// has changed, triggering appropriate view updates while preserving view identity + /// for unchanged portions of the tree. + struct StructuralIdentity: Hashable { + private let node: SplitTree.Node + + init(_ node: SplitTree.Node) { + self.node = node + } + + static func == (lhs: Self, rhs: Self) -> Bool { + lhs.node.isStructurallyEqual(to: rhs.node) + } + + func hash(into hasher: inout Hasher) { + node.hashStructure(into: &hasher) + } + } + + /// Checks if this node is structurally equal to another node. + /// Two nodes are structurally equal if they have the same tree structure + /// and the same views (by identity) in the same positions. + fileprivate func isStructurallyEqual(to other: Node) -> Bool { + switch (self, other) { + case let (.leaf(view1), .leaf(view2)): + // Views must be the same instance + return view1 === view2 + + case let (.split(split1), .split(split2)): + // Splits must have same direction and structurally equal children + // Note: We intentionally don't compare ratios as they may change slightly + return split1.direction == split2.direction && + split1.left.isStructurallyEqual(to: split2.left) && + split1.right.isStructurallyEqual(to: split2.right) + + default: + // Different node types + return false + } + } + + /// Hash keys for structural identity + private enum HashKey: UInt8 { + case leaf = 0 + case split = 1 + } + + /// Hashes the structural identity of this node. + /// Includes the tree structure and view identities in the hash. + fileprivate func hashStructure(into hasher: inout Hasher) { + switch self { + case .leaf(let view): + hasher.combine(HashKey.leaf) + hasher.combine(ObjectIdentifier(view)) + + case .split(let split): + hasher.combine(HashKey.split) + hasher.combine(split.direction) + // Note: We intentionally don't hash the ratio + split.left.hashStructure(into: &hasher) + split.right.hashStructure(into: &hasher) + } + } +} + +extension SplitTree { + /// Returns a hashable representation that captures this tree's structural identity. + var structuralIdentity: StructuralIdentity { + StructuralIdentity(self) + } + + /// A hashable representation of a SplitTree that captures its structural identity. + /// + /// This type provides a way to track changes to a SplitTree's structure in SwiftUI + /// by implementing `Hashable` based on: + /// - The tree's hierarchical structure (splits and their directions) + /// - The identity of view instances in leaf nodes (using object identity) + /// - The zoomed node state (if any) + /// + /// This is useful for SwiftUI's `id()` modifier to detect when a tree's structure + /// has changed, triggering appropriate view updates while preserving view identity + /// for unchanged portions of the tree. + /// + /// Example usage: + /// ```swift + /// var body: some View { + /// SplitTreeView(tree: splitTree) + /// .id(splitTree.structuralIdentity) + /// } + /// ``` + struct StructuralIdentity: Hashable { + private let root: Node? + private let zoomed: Node? + + init(_ tree: SplitTree) { + self.root = tree.root + self.zoomed = tree.zoomed + } + + static func == (lhs: Self, rhs: Self) -> Bool { + areNodesStructurallyEqual(lhs.root, rhs.root) && + areNodesStructurallyEqual(lhs.zoomed, rhs.zoomed) + } + + func hash(into hasher: inout Hasher) { + hasher.combine(0) // Tree marker + if let root = root { + root.hashStructure(into: &hasher) + } + hasher.combine(1) // Zoomed marker + if let zoomed = zoomed { + zoomed.hashStructure(into: &hasher) + } + } + + /// Helper to compare optional nodes for structural equality + private static func areNodesStructurallyEqual(_ lhs: Node?, _ rhs: Node?) -> Bool { + switch (lhs, rhs) { + case (nil, nil): + return true + case let (node1?, node2?): + return node1.isStructurallyEqual(to: node2) + default: + return false + } + } + } +} diff --git a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift index b219e0b31..2810fc2b4 100644 --- a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift +++ b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift @@ -10,6 +10,11 @@ struct TerminalSplitTreeView: View { node: node, isRoot: node == tree.root, onResize: onResize) + // This is necessary because we can't rely on SwiftUI's implicit + // structural identity to detect changes to this view. Due to + // the tree structure of splits it could result in bad beaviors. + // See: https://github.com/ghostty-org/ghostty/issues/7546 + .id(node.structuralIdentity) } } } From a87c68d49aa1f3a08c8173dbd7744e68f8af4d30 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 9 Jun 2025 06:51:14 -0700 Subject: [PATCH 153/371] termio: unconditionally show "process exited" message We previously only showed this message if the user had `wait-after-command` set to true, since if its false the surface would close anyways. With the latest undo feature on macOS, this is no longer the case; a exited process can be undone and reopened. I considered disallowing undoing an exited surface, but I think there is value in being able to go back and recapture output in scrollback if you wanted to. --- src/termio/Exec.zig | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig index 23c626879..317ad13b4 100644 --- a/src/termio/Exec.zig +++ b/src/termio/Exec.zig @@ -418,25 +418,27 @@ fn processExitCommon(td: *termio.Termio.ThreadData, exit_code: u32) void { return; } + // We output a message so that the user knows whats going on and + // doesn't think their terminal just froze. We show this unconditionally + // on close even if `wait_after_command` is false and the surface closes + // immediately because if a user does an `undo` to restore a closed + // surface then they will see this message and know the process has + // completed. + terminal: { + td.renderer_state.mutex.lock(); + defer td.renderer_state.mutex.unlock(); + const t = td.renderer_state.terminal; + t.carriageReturn(); + t.linefeed() catch break :terminal; + t.printString("Process exited. Press any key to close the terminal.") catch + break :terminal; + t.modes.set(.cursor_visible, false); + } + // If we're purposely waiting then we just return since the process // exited flag is set to true. This allows the terminal window to remain // open. - if (execdata.wait_after_command) { - // We output a message so that the user knows whats going on and - // doesn't think their terminal just froze. - terminal: { - td.renderer_state.mutex.lock(); - defer td.renderer_state.mutex.unlock(); - const t = td.renderer_state.terminal; - t.carriageReturn(); - t.linefeed() catch break :terminal; - t.printString("Process exited. Press any key to close the terminal.") catch - break :terminal; - t.modes.set(.cursor_visible, false); - } - - return; - } + if (execdata.wait_after_command) return; // Notify our surface we want to close _ = td.surface_mailbox.push(.{ From 59bc980250e7b448a8e8693484a9fb5d625fc198 Mon Sep 17 00:00:00 2001 From: Alex Straight Date: Sun, 8 Jun 2025 23:22:04 -0700 Subject: [PATCH 154/371] feat: implement mode 1048 for saving/restoring cursor position --- src/terminal/modes.zig | 1 + src/termio/stream_handler.zig | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/terminal/modes.zig b/src/terminal/modes.zig index b36266b32..9a74db73c 100644 --- a/src/terminal/modes.zig +++ b/src/terminal/modes.zig @@ -223,6 +223,7 @@ const entries: []const ModeEntry = &.{ .{ .name = "alt_sends_escape", .value = 1039 }, .{ .name = "reverse_wrap_extended", .value = 1045 }, .{ .name = "alt_screen", .value = 1047 }, + .{ .name = "save_cursor", .value = 1048 }, .{ .name = "alt_screen_save_cursor_clear_enter", .value = 1049 }, .{ .name = "bracketed_paste", .value = 2004 }, .{ .name = "synchronized_output", .value = 2026 }, diff --git a/src/termio/stream_handler.zig b/src/termio/stream_handler.zig index b3aa82d20..2069a8ff2 100644 --- a/src/termio/stream_handler.zig +++ b/src/termio/stream_handler.zig @@ -597,6 +597,18 @@ pub const StreamHandler = struct { try self.queueRender(); }, + // Mode 1048 is xterm's conditional save cursor depending + // on if alt screen is enabled or not (at the terminal emulator + // level). Alt screen is always enabled for us so this just + // does a save/restore cursor. + .save_cursor => { + if (enabled) { + self.terminal.saveCursor(); + } else { + try self.terminal.restoreCursor(); + } + }, + // Force resize back to the window size .enable_mode_3 => { const grid_size = self.size.grid(); From b0e0aadaf3583d59574e69a3f8199d48ad967591 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 9 Jun 2025 20:44:23 -0700 Subject: [PATCH 155/371] build: Xcode 26, macOS Tahoe support (build tooling only) This updates our build script and CI to support Xcode 26 and macOS Tahoe. **This doesn't update the Ghostty app to resolve any Tahoe issues.** For CI, we've added a new build job that runs on macOS Tahoe with Xcode 26. I've stopped short of updating our tip release job, since I think I want to wait until I verify a bit more about Tahoe before we flip that bit. Also, ideally, we'd run Xcode 26 on Sequoia (macOS 15) for stability reasons and Namespace doesn't have Xcode 26 on 15 yet. For builds, this updates our build script to find Metal binaries using `xcodebuild -find-executable` instead of `xcrun`. The latter doesn't work with Xcode 26, but the former does and also still works with older Xcodes. I'm not sure if this is a bug but I did report it: FB17874042. --- .github/workflows/test.yml | 60 +++++++++++++++++++++++++++++++++++--- src/build/MetallibStep.zig | 35 +++++++++++++++++----- 2 files changed, 83 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e0b0ded6b..8a98584a2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,6 +18,7 @@ jobs: - build-nix - build-snap - build-macos + - build-macos-tahoe - build-macos-matrix - build-windows - build-windows-cross @@ -284,7 +285,7 @@ jobs: name: ghostty authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - - name: XCode Select + - name: Xcode Select run: sudo xcode-select -s /Applications/Xcode_16.0.app - name: get the Zig deps @@ -296,7 +297,58 @@ jobs: - name: Build GhosttyKit run: nix develop -c zig build --system ${{ steps.deps.outputs.deps }} - # The native app is built with native XCode tooling. This also does + # The native app is built with native Xcode tooling. This also does + # codesigning. IMPORTANT: this must NOT run in a Nix environment. + # Nix breaks xcodebuild so this has to be run outside. + - name: Build Ghostty.app + run: cd macos && xcodebuild -target Ghostty + + # Build the iOS target without code signing just to verify it works. + - name: Build Ghostty iOS + run: | + cd macos + xcodebuild -target Ghostty-iOS "CODE_SIGNING_ALLOWED=NO" + + build-macos-tahoe: + runs-on: namespace-profile-ghostty-macos-tahoe + needs: test + steps: + - name: Checkout code + uses: actions/checkout@v4 + + # TODO(tahoe): https://github.com/NixOS/nix/issues/13342 + - uses: DeterminateSystems/nix-installer-action@main + with: + determinate: true + - uses: cachix/cachix-action@v16 + with: + name: ghostty + authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" + + - name: Xcode Select + run: sudo xcode-select -s /Applications/Xcode_26.0.app + + # TODO(tahoe): + # https://developer.apple.com/documentation/xcode-release-notes/xcode-26-release-notes#Interface-Builder + # We allow this step to fail because if our image already has + # the workaround in place this will fail. + - name: Xcode 26 Beta 17A5241e Metal Workaround + continue-on-error: true + run: | + xcodebuild -downloadComponent metalToolchain -exportPath /tmp/MyMetalExport/ + sed -i '' -e 's/17A5241c/17A5241e/g' /tmp/MyMetalExport/MetalToolchain-17A5241c.exportedBundle/ExportMetadata.plist + xcodebuild -importComponent metalToolchain -importPath /tmp/MyMetalExport/MetalToolchain-17A5241c.exportedBundle + + - name: get the Zig deps + id: deps + run: nix build -L .#deps && echo "deps=$(readlink ./result)" >> $GITHUB_OUTPUT + + # GhosttyKit is the framework that is built from Zig for our native + # Mac app to access. + - name: Build GhosttyKit + run: nix develop -c zig build --system ${{ steps.deps.outputs.deps }} + + # The native app is built with native Xcode tooling. This also does # codesigning. IMPORTANT: this must NOT run in a Nix environment. # Nix breaks xcodebuild so this has to be run outside. - name: Build Ghostty.app @@ -324,7 +376,7 @@ jobs: name: ghostty authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - - name: XCode Select + - name: Xcode Select run: sudo xcode-select -s /Applications/Xcode_16.0.app - name: get the Zig deps @@ -642,7 +694,7 @@ jobs: name: ghostty authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - - name: XCode Select + - name: Xcode Select run: sudo xcode-select -s /Applications/Xcode_16.0.app - name: get the Zig deps diff --git a/src/build/MetallibStep.zig b/src/build/MetallibStep.zig index 12adf3edb..bac3a72c5 100644 --- a/src/build/MetallibStep.zig +++ b/src/build/MetallibStep.zig @@ -22,13 +22,12 @@ step: *Step, output: LazyPath, pub fn create(b: *std.Build, opts: Options) ?*MetallibStep { - const self = b.allocator.create(MetallibStep) catch @panic("OOM"); + switch (opts.target.result.os.tag) { + .macos, .ios => {}, + else => return null, // Only macOS and iOS are supported. + } - const sdk = switch (opts.target.result.os.tag) { - .macos => "macosx", - .ios => "iphoneos", - else => return null, - }; + const self = b.allocator.create(MetallibStep) catch @panic("OOM"); const min_version = if (opts.target.query.os_version_min) |v| b.fmt("{}", .{v.semver}) @@ -38,11 +37,31 @@ pub fn create(b: *std.Build, opts: Options) ?*MetallibStep { else => unreachable, }; + // Find the metal and metallib executables. The Apple docs + // at the time of writing (June 2025) say to use + // `xcrun --sdk metal` but this doesn't work with Xcode 26. + // + // I don't know if this is a bug but the xcodebuild approach also + // works with Xcode 15 so it seems safe to use this instead. + // + // Reported bug: FB17874042. + var code: u8 = undefined; + const metal_exe = std.mem.trim(u8, b.runAllowFail( + &.{ "xcodebuild", "-find-executable", "metal" }, + &code, + .Ignore, + ) catch return null, "\r\n "); + const metallib_exe = std.mem.trim(u8, b.runAllowFail( + &.{ "xcodebuild", "-find-executable", "metallib" }, + &code, + .Ignore, + ) catch return null, "\r\n "); + const run_ir = RunStep.create( b, b.fmt("metal {s}", .{opts.name}), ); - run_ir.addArgs(&.{ "/usr/bin/xcrun", "-sdk", sdk, "metal", "-o" }); + run_ir.addArgs(&.{ metal_exe, "-o" }); const output_ir = run_ir.addOutputFileArg(b.fmt("{s}.ir", .{opts.name})); run_ir.addArgs(&.{"-c"}); for (opts.sources) |source| run_ir.addFileArg(source); @@ -62,7 +81,7 @@ pub fn create(b: *std.Build, opts: Options) ?*MetallibStep { b, b.fmt("metallib {s}", .{opts.name}), ); - run_lib.addArgs(&.{ "/usr/bin/xcrun", "-sdk", sdk, "metallib", "-o" }); + run_lib.addArgs(&.{ metallib_exe, "-o" }); const output_lib = run_lib.addOutputFileArg(b.fmt("{s}.metallib", .{opts.name})); run_lib.addFileArg(output_ir); run_lib.step.dependOn(&run_ir.step); From 3d692e46f435ec5488e9570d1fc65b8778437480 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Tue, 10 Jun 2025 10:20:26 -0600 Subject: [PATCH 156/371] license: update copyright notices to include contributors Updates all copyright notices to include "Ghostty contributors" to reflect the fact that Mitchell is not the sole copyright owner. Also adds "Ghostty contributors" to the author section in the manpages, linking https://github.com/ghostty-org/ghostty/graphs/contributors for proper credit. --- LICENSE | 2 +- pkg/README.md | 2 +- pkg/glfw/LICENSE | 2 +- po/ca_ES.UTF-8.po | 2 +- po/com.mitchellh.ghostty.pot | 2 +- po/de_DE.UTF-8.po | 2 +- po/es_BO.UTF-8.po | 2 +- po/fr_FR.UTF-8.po | 2 +- po/id_ID.UTF-8.po | 2 +- po/ja_JP.UTF-8.po | 2 +- po/mk_MK.UTF-8.po | 2 +- po/nb_NO.UTF-8.po | 2 +- po/nl_NL.UTF-8.po | 2 +- po/pl_PL.UTF-8.po | 2 +- po/pt_BR.UTF-8.po | 2 +- po/ru_RU.UTF-8.po | 2 +- po/tr_TR.UTF-8.po | 2 +- po/uk_UA.UTF-8.po | 2 +- po/zh_CN.UTF-8.po | 2 +- src/build/GhosttyI18n.zig | 2 +- src/build/mdgen/ghostty_1_footer.md | 1 + src/build/mdgen/ghostty_5_footer.md | 1 + 22 files changed, 22 insertions(+), 20 deletions(-) diff --git a/LICENSE b/LICENSE index 14e132f55..0a07a66cd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Mitchell Hashimoto +Copyright (c) 2024 Mitchell Hashimoto, Ghostty contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/pkg/README.md b/pkg/README.md index 1d6f9f6eb..fddc4b3db 100644 --- a/pkg/README.md +++ b/pkg/README.md @@ -12,7 +12,7 @@ paste them into your project. the Ghostty project. This license does not apply to the rest of the Ghostty project.** -Copyright © 2024 Mitchell Hashimoto +Copyright © 2024 Mitchell Hashimoto, Ghostty contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in diff --git a/pkg/glfw/LICENSE b/pkg/glfw/LICENSE index eeeb852fe..8c422bd23 100644 --- a/pkg/glfw/LICENSE +++ b/pkg/glfw/LICENSE @@ -1,5 +1,5 @@ Copyright (c) 2021 Hexops Contributors (given via the Git commit history). -Copyright (c) 2025 Mitchell Hashimoto +Copyright (c) 2025 Mitchell Hashimoto, Ghostty contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated diff --git a/po/ca_ES.UTF-8.po b/po/ca_ES.UTF-8.po index 712f0d5af..653439fa2 100644 --- a/po/ca_ES.UTF-8.po +++ b/po/ca_ES.UTF-8.po @@ -1,5 +1,5 @@ # Catalan translations for com.mitchellh.ghostty package. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Francesc Arpi , 2025. # diff --git a/po/com.mitchellh.ghostty.pot b/po/com.mitchellh.ghostty.pot index d6a99d01d..da0efbbee 100644 --- a/po/com.mitchellh.ghostty.pot +++ b/po/com.mitchellh.ghostty.pot @@ -1,5 +1,5 @@ # SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Mitchell Hashimoto +# Copyright (C) YEAR Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # FIRST AUTHOR , YEAR. # diff --git a/po/de_DE.UTF-8.po b/po/de_DE.UTF-8.po index 44f3bae39..2d3b96d81 100644 --- a/po/de_DE.UTF-8.po +++ b/po/de_DE.UTF-8.po @@ -1,6 +1,6 @@ # German translations for com.mitchellh.ghostty package # German translation for com.mitchellh.ghostty. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Robin Pfäffle , 2025. # diff --git a/po/es_BO.UTF-8.po b/po/es_BO.UTF-8.po index f3a62748a..077b7dfa1 100644 --- a/po/es_BO.UTF-8.po +++ b/po/es_BO.UTF-8.po @@ -1,5 +1,5 @@ # Spanish translations for com.mitchellh.ghostty package. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Miguel Peredo , 2025. # diff --git a/po/fr_FR.UTF-8.po b/po/fr_FR.UTF-8.po index 4db72a23e..aef0d96ac 100644 --- a/po/fr_FR.UTF-8.po +++ b/po/fr_FR.UTF-8.po @@ -1,5 +1,5 @@ # French translations for com.mitchellh.ghostty package. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Kirwiisp , 2025. # diff --git a/po/id_ID.UTF-8.po b/po/id_ID.UTF-8.po index d5204d420..f82ec6197 100644 --- a/po/id_ID.UTF-8.po +++ b/po/id_ID.UTF-8.po @@ -1,5 +1,5 @@ # Indonesian translations for com.mitchellh.ghostty package. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Satrio Bayu Aji , 2025. # diff --git a/po/ja_JP.UTF-8.po b/po/ja_JP.UTF-8.po index e6e015f8a..73ddd9f5a 100644 --- a/po/ja_JP.UTF-8.po +++ b/po/ja_JP.UTF-8.po @@ -1,6 +1,6 @@ # Japanese translations for com.mitchellh.ghostty package # com.mitchellh.ghostty パッケージに対する和訳. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Lon Sagisawa , 2025. # diff --git a/po/mk_MK.UTF-8.po b/po/mk_MK.UTF-8.po index 39bb72b91..20a43572e 100644 --- a/po/mk_MK.UTF-8.po +++ b/po/mk_MK.UTF-8.po @@ -1,5 +1,5 @@ # Macedonian translations for com.mitchellh.ghostty package. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Andrej Daskalov , 2025. # diff --git a/po/nb_NO.UTF-8.po b/po/nb_NO.UTF-8.po index 2685d67bb..045d47a80 100644 --- a/po/nb_NO.UTF-8.po +++ b/po/nb_NO.UTF-8.po @@ -1,5 +1,5 @@ # Norwegian Bokmal translations for com.mitchellh.ghostty package. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Hanna Rose , 2025. # Uzair Aftab , 2025. diff --git a/po/nl_NL.UTF-8.po b/po/nl_NL.UTF-8.po index 466116352..355bc4a57 100644 --- a/po/nl_NL.UTF-8.po +++ b/po/nl_NL.UTF-8.po @@ -1,5 +1,5 @@ # Dutch translations for com.mitchellh.ghostty package. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Nico Geesink , 2025. # diff --git a/po/pl_PL.UTF-8.po b/po/pl_PL.UTF-8.po index 22d2cd975..a68d56818 100644 --- a/po/pl_PL.UTF-8.po +++ b/po/pl_PL.UTF-8.po @@ -1,6 +1,6 @@ # Polish translations for com.mitchellh.ghostty package # Polskie tłumaczenia dla pakietu com.mitchellh.ghostty. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Bartosz Sokorski , 2025. # diff --git a/po/pt_BR.UTF-8.po b/po/pt_BR.UTF-8.po index f6d2f26a2..d2ba0e693 100644 --- a/po/pt_BR.UTF-8.po +++ b/po/pt_BR.UTF-8.po @@ -1,6 +1,6 @@ # Portuguese translations for com.mitchellh.ghostty package # Traduções em português brasileiro para o pacote com.mitchellh.ghostty. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Gustavo Peres , 2025. # diff --git a/po/ru_RU.UTF-8.po b/po/ru_RU.UTF-8.po index 9e9cf8077..0cb533de7 100644 --- a/po/ru_RU.UTF-8.po +++ b/po/ru_RU.UTF-8.po @@ -1,6 +1,6 @@ # Russian translations for com.mitchellh.ghostty package # Русские переводы для пакета com.mitchellh.ghostty. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # blackzeshi , 2025. # diff --git a/po/tr_TR.UTF-8.po b/po/tr_TR.UTF-8.po index 3de70d61c..5d761f6a4 100644 --- a/po/tr_TR.UTF-8.po +++ b/po/tr_TR.UTF-8.po @@ -1,5 +1,5 @@ # Turkish translations for com.mitchellh.ghostty package. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Emir SARI , 2025. # diff --git a/po/uk_UA.UTF-8.po b/po/uk_UA.UTF-8.po index 5a264b537..bde975fc4 100644 --- a/po/uk_UA.UTF-8.po +++ b/po/uk_UA.UTF-8.po @@ -1,5 +1,5 @@ # Ukrainian translations for com.mitchellh.ghostty package. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Danylo Zalizchuk , 2025. # diff --git a/po/zh_CN.UTF-8.po b/po/zh_CN.UTF-8.po index ee2c51362..77be8a351 100644 --- a/po/zh_CN.UTF-8.po +++ b/po/zh_CN.UTF-8.po @@ -1,6 +1,6 @@ # Chinese translations for com.mitchellh.ghostty package # com.mitchellh.ghostty 软件包的简体中文翻译. -# Copyright (C) 2025 Mitchell Hashimoto +# Copyright (C) 2025 Mitchell Hashimoto, Ghostty contributors # This file is distributed under the same license as the com.mitchellh.ghostty package. # Leah , 2025. # diff --git a/src/build/GhosttyI18n.zig b/src/build/GhosttyI18n.zig index daf523938..a1852bb96 100644 --- a/src/build/GhosttyI18n.zig +++ b/src/build/GhosttyI18n.zig @@ -54,7 +54,7 @@ fn createUpdateStep(b: *std.Build) !*std.Build.Step { "--keyword=C_:1c,2", "--package-name=" ++ domain, "--msgid-bugs-address=m@mitchellh.com", - "--copyright-holder=Mitchell Hashimoto", + "--copyright-holder=\"Mitchell Hashimoto, Ghostty contributors\"", "-o", "-", }); diff --git a/src/build/mdgen/ghostty_1_footer.md b/src/build/mdgen/ghostty_1_footer.md index 7ace64cd8..f8e502b45 100644 --- a/src/build/mdgen/ghostty_1_footer.md +++ b/src/build/mdgen/ghostty_1_footer.md @@ -44,6 +44,7 @@ See GitHub issues: # AUTHOR Mitchell Hashimoto +Ghostty contributors # SEE ALSO diff --git a/src/build/mdgen/ghostty_5_footer.md b/src/build/mdgen/ghostty_5_footer.md index c5077ab97..380d83a53 100644 --- a/src/build/mdgen/ghostty_5_footer.md +++ b/src/build/mdgen/ghostty_5_footer.md @@ -36,6 +36,7 @@ See GitHub issues: # AUTHOR Mitchell Hashimoto +Ghostty contributors # SEE ALSO From 12ad0fa4b68c0748fbbbbf3ba89ceecad3567d0c Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Tue, 10 Jun 2025 12:11:59 -0600 Subject: [PATCH 157/371] font/sprite: add corner pieces from Geometric Shapes block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ◢ ◣ ◤ ◥ ◸ ◹ ◺ ◿ --- src/font/sprite/Box.zig | 123 +++++++++++++++++++++++++++++++ src/font/sprite/Face.zig | 5 ++ src/font/sprite/testdata/Box.ppm | Bin 1048593 -> 1048593 bytes 3 files changed, 128 insertions(+) diff --git a/src/font/sprite/Box.zig b/src/font/sprite/Box.zig index dd02f701b..f5140091d 100644 --- a/src/font/sprite/Box.zig +++ b/src/font/sprite/Box.zig @@ -581,6 +581,120 @@ fn draw(self: Box, alloc: Allocator, canvas: *font.sprite.Canvas, cp: u32) !void // '▟' 0x259f => self.draw_quadrant(canvas, .{ .tr = true, .bl = true, .br = true }), + // '◢' + 0x25e2 => self.draw_corner_triangle_shade(canvas, .br, .on), + // '◣' + 0x25e3 => self.draw_corner_triangle_shade(canvas, .bl, .on), + // '◤' + 0x25e4 => self.draw_corner_triangle_shade(canvas, .tl, .on), + // '◥' + 0x25e5 => self.draw_corner_triangle_shade(canvas, .tr, .on), + + // '◸' + 0x25f8 => { + const thickness_px = Thickness.light.height(self.metrics.box_thickness); + // top edge + self.rect( + canvas, + 0, + 0, + self.metrics.cell_width, + thickness_px, + ); + // left edge + self.rect( + canvas, + 0, + 0, + thickness_px, + self.metrics.cell_height -| 1, + ); + // diagonal + self.draw_cell_diagonal( + canvas, + .lower_left, + .upper_right, + ); + }, + // '◹' + 0x25f9 => { + const thickness_px = Thickness.light.height(self.metrics.box_thickness); + // top edge + self.rect( + canvas, + 0, + 0, + self.metrics.cell_width, + thickness_px, + ); + // right edge + self.rect( + canvas, + self.metrics.cell_width -| thickness_px, + 0, + self.metrics.cell_width, + self.metrics.cell_height -| 1, + ); + // diagonal + self.draw_cell_diagonal( + canvas, + .upper_left, + .lower_right, + ); + }, + // '◺' + 0x25fa => { + const thickness_px = Thickness.light.height(self.metrics.box_thickness); + // bottom edge + self.rect( + canvas, + 0, + self.metrics.cell_height -| thickness_px, + self.metrics.cell_width, + self.metrics.cell_height, + ); + // left edge + self.rect( + canvas, + 0, + 1, + thickness_px, + self.metrics.cell_height, + ); + // diagonal + self.draw_cell_diagonal( + canvas, + .upper_left, + .lower_right, + ); + }, + // '◿' + 0x25ff => { + const thickness_px = Thickness.light.height(self.metrics.box_thickness); + // bottom edge + self.rect( + canvas, + 0, + self.metrics.cell_height -| thickness_px, + self.metrics.cell_width, + self.metrics.cell_height, + ); + // right edge + self.rect( + canvas, + self.metrics.cell_width -| thickness_px, + 1, + self.metrics.cell_width, + self.metrics.cell_height, + ); + // diagonal + self.draw_cell_diagonal( + canvas, + .lower_left, + .upper_right, + ); + }, + 0x2800...0x28ff => self.draw_braille(canvas, cp), 0x1fb00...0x1fb3b => self.draw_sextant(canvas, cp), @@ -3197,6 +3311,15 @@ fn testRenderAll(self: Box, alloc: Allocator, atlas: *font.Atlas) !void { else => {}, } } + + // Geometric Shapes: filled and outlined corners + for ([_]u21{ '◢', '◣', '◤', '◥', '◸', '◹', '◺', '◿' }) |char| { + _ = try self.renderGlyph( + alloc, + atlas, + char, + ); + } } test "render all sprites" { diff --git a/src/font/sprite/Face.zig b/src/font/sprite/Face.zig index f15423ada..af0c0af6a 100644 --- a/src/font/sprite/Face.zig +++ b/src/font/sprite/Face.zig @@ -190,6 +190,11 @@ const Kind = enum { // ▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏ ▐ ░ ▒ ▓ ▔ ▕ ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟ 0x2580...0x259F, + // "Geometric Shapes" block + 0x25e2...0x25e5, // ◢◣◤◥ + 0x25f8...0x25fa, // ◸◹◺ + 0x25ff, // ◿ + // "Braille" block 0x2800...0x28FF, diff --git a/src/font/sprite/testdata/Box.ppm b/src/font/sprite/testdata/Box.ppm index d5a6cc72906318b235e33bc3ea53be8f88b67193..6082475af7d3e2264cf04061e9f63d7c6e6fdc9e 100644 GIT binary patch delta 12462 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 bu?Ieub0j3F(nnbDZT|oFbSw}x7N-3-Q{9$h delta 10213 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 From 2b9a6a482017b7bd3a1856e976ff8c2a3b13cecf Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 10 Jun 2025 12:11:17 -0700 Subject: [PATCH 158/371] macos: unsplit window shouldn't allow split zooming This was always the case, and is a recent regression from the SplitTree rework. This brings it back to the previous behavior. --- macos/Sources/Features/Terminal/BaseTerminalController.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 594a58056..e91199358 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -556,12 +556,15 @@ class BaseTerminalController: NSWindowController, // The target must be within our tree guard let target = notification.object as? Ghostty.SurfaceView else { return } guard let targetNode = surfaceTree.root?.node(view: target) else { return } - + // Toggle the zoomed state if surfaceTree.zoomed == targetNode { // Already zoomed, unzoom it surfaceTree = SplitTree(root: surfaceTree.root, zoomed: nil) } else { + // We require that the split tree have splits + guard surfaceTree.isSplit else { return } + // Not zoomed or different node zoomed, zoom this node surfaceTree = SplitTree(root: surfaceTree.root, zoomed: targetNode) } From 8b5cceed3ecb916f6a5be4d384dcd964402abc3c Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 10 Jun 2025 12:30:15 -0700 Subject: [PATCH 159/371] ci: pin gh-action-release to 2.2.2 to workaround issue https://github.com/softprops/action-gh-release/issues/628 --- .github/workflows/release-tip.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release-tip.yml b/.github/workflows/release-tip.yml index 42626288c..b6a6c5f6c 100644 --- a/.github/workflows/release-tip.yml +++ b/.github/workflows/release-tip.yml @@ -132,7 +132,7 @@ jobs: nix develop -c minisign -S -m ghostty-source.tar.gz -s minisign.key < minisign.password - name: Update Release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v2.2.2 with: name: 'Ghostty Tip ("Nightly")' prerelease: true @@ -299,7 +299,7 @@ jobs: # Update Release - name: Release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v2.2.2 with: name: 'Ghostty Tip ("Nightly")' prerelease: true @@ -507,7 +507,7 @@ jobs: # Update Release - name: Release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v2.2.2 with: name: 'Ghostty Tip ("Nightly")' prerelease: true @@ -682,7 +682,7 @@ jobs: # Update Release - name: Release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v2.2.2 with: name: 'Ghostty Tip ("Nightly")' prerelease: true From 1f340b4b2dc8e2f9752bee8702a555e8bd367b51 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 10 Jun 2025 12:39:09 -0700 Subject: [PATCH 160/371] macos: for windowShouldClose, only close the tab if we have multiple Fixes a regression from our undo/redo rework. We were accidentally closing the entire window when the "X" button in the tab bar was clicked. --- macos/Sources/Features/Terminal/TerminalController.swift | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index c9f8ef216..a984952f9 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -1046,7 +1046,12 @@ class TerminalController: BaseTerminalController { //MARK: - NSWindowDelegate override func windowShouldClose(_ sender: NSWindow) -> Bool { - closeWindow(sender) + // If we have tabs, then this should only close the tab. + if window?.tabGroup?.windows.count ?? 0 > 1 { + closeTab(sender) + } else { + closeWindow(sender) + } // We will always explicitly close the window using the above return false From 3db5b3da752b07d3877ab9682f660c76320e82a6 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 10 Jun 2025 14:31:41 -0700 Subject: [PATCH 161/371] macos: hidden titlebar windows should cascade on new tab Windows with `macos-titlebar-style = hidden` create new windows when the new tab binding is pressed. This behavior has existed for a long time. However, these windows did not cascade, meaning they'd appear overlapped directly on top of the previous window, which is kind of nasty. This commit changes it so that new windows created via new tab from a hidden titlebar window will cascade. --- .../Terminal/TerminalController.swift | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index a984952f9..5916c5921 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -278,11 +278,6 @@ class TerminalController: BaseTerminalController { tg.removeWindow(window) } - // Our windows start out invisible. We need to make it visible. If we - // don't do this then various features such as window blur won't work because - // the macOS APIs only work on a visible window. - controller.showWindow(self) - // If we have the "hidden" titlebar style we want to create new // tabs as windows instead, so just skip adding it to the parent. if (ghostty.config.macosTitlebarStyle != "hidden") { @@ -303,7 +298,19 @@ class TerminalController: BaseTerminalController { } } - window.makeKeyAndOrderFront(self) + // We're dispatching this async because otherwise the lastCascadePoint doesn't + // take effect. Our best theory is there is some next-event-loop-tick logic + // that Cocoa is doing that we need to be after. + DispatchQueue.main.async { + // Only cascade if we aren't fullscreen and are alone in the tab group. + if !window.styleMask.contains(.fullScreen) && + window.tabGroup?.windows.count ?? 1 == 1 { + Self.lastCascadePoint = window.cascadeTopLeft(from: Self.lastCascadePoint) + } + + controller.showWindow(self) + window.makeKeyAndOrderFront(self) + } // It takes an event loop cycle until the macOS tabGroup state becomes // consistent which causes our tab labeling to be off when the "+" button From 990b6a6b0808f3eef1549bdeaf6b5413384141db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 00:31:07 +0000 Subject: [PATCH 162/371] build(deps): bump softprops/action-gh-release from 2.2.2 to 2.3.2 Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2.2.2 to 2.3.2. - [Release notes](https://github.com/softprops/action-gh-release/releases) - [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md) - [Commits](https://github.com/softprops/action-gh-release/compare/v2.2.2...v2.3.2) --- updated-dependencies: - dependency-name: softprops/action-gh-release dependency-version: 2.3.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/release-tip.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release-tip.yml b/.github/workflows/release-tip.yml index b6a6c5f6c..73a1ddeeb 100644 --- a/.github/workflows/release-tip.yml +++ b/.github/workflows/release-tip.yml @@ -132,7 +132,7 @@ jobs: nix develop -c minisign -S -m ghostty-source.tar.gz -s minisign.key < minisign.password - name: Update Release - uses: softprops/action-gh-release@v2.2.2 + uses: softprops/action-gh-release@v2.3.2 with: name: 'Ghostty Tip ("Nightly")' prerelease: true @@ -299,7 +299,7 @@ jobs: # Update Release - name: Release - uses: softprops/action-gh-release@v2.2.2 + uses: softprops/action-gh-release@v2.3.2 with: name: 'Ghostty Tip ("Nightly")' prerelease: true @@ -507,7 +507,7 @@ jobs: # Update Release - name: Release - uses: softprops/action-gh-release@v2.2.2 + uses: softprops/action-gh-release@v2.3.2 with: name: 'Ghostty Tip ("Nightly")' prerelease: true @@ -682,7 +682,7 @@ jobs: # Update Release - name: Release - uses: softprops/action-gh-release@v2.2.2 + uses: softprops/action-gh-release@v2.3.2 with: name: 'Ghostty Tip ("Nightly")' prerelease: true From 31e386afa6e4874be266ea083c773ffac9e6168e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Tue, 10 Jun 2025 22:03:33 -0400 Subject: [PATCH 163/371] use else if instead of else { if } --- src/os/hostname.zig | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index 3f2c53b50..ddcdeb59e 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -32,10 +32,8 @@ fn isValidMacAddress(mac_address: []const u8) bool { if (c != ':') { return false; } - } else { - if (!std.mem.containsAtLeastScalar(u8, "0123456789ABCDEFabcdef", 1, c)) { - return false; - } + } else if (!std.mem.containsAtLeastScalar(u8, "0123456789ABCDEFabcdef", 1, c)) { + return false; } } From 4d33a73fc4640b19cb6160942c5bdcd2a8102fb9 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 10 Jun 2025 13:03:30 -0700 Subject: [PATCH 164/371] wip: redo terminal window styling --- macos/Ghostty.xcodeproj/project.pbxproj | 42 ++++- .../Terminal/TerminalController.swift | 170 +++++------------- .../HiddenTitlebarTerminalWindow.swift | 78 ++++++++ .../LegacyTerminalWindow.swift} | 44 +---- .../Terminal/{ => Window Styles}/Terminal.xib | 8 +- .../Window Styles/TerminalHiddenTitlebar.xib | 31 ++++ .../Terminal/Window Styles/TerminalLegacy.xib | 31 ++++ .../TerminalTransparentTitlebar.xib | 31 ++++ .../Window Styles/TerminalWindow.swift | 75 ++++++++ .../TransparentTitlebarTerminalWindow.swift | 72 ++++++++ .../Helpers/Extensions/NSView+Extension.swift | 27 +++ macos/Sources/Helpers/Fullscreen.swift | 11 +- 12 files changed, 448 insertions(+), 172 deletions(-) create mode 100644 macos/Sources/Features/Terminal/Window Styles/HiddenTitlebarTerminalWindow.swift rename macos/Sources/Features/Terminal/{TerminalWindow.swift => Window Styles/LegacyTerminalWindow.swift} (95%) rename macos/Sources/Features/Terminal/{ => Window Styles}/Terminal.xib (86%) create mode 100644 macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib create mode 100644 macos/Sources/Features/Terminal/Window Styles/TerminalLegacy.xib create mode 100644 macos/Sources/Features/Terminal/Window Styles/TerminalTransparentTitlebar.xib create mode 100644 macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift create mode 100644 macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 9686dcbd1..594579744 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -15,7 +15,7 @@ A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D72B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D82B54DC6800493A16 /* Ghostty.App.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */; }; - A51B78472AF4B58B00F3EDB9 /* TerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51B78462AF4B58B00F3EDB9 /* TerminalWindow.swift */; }; + A51B78472AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */; }; A51BFC1E2B2FB5CE00E92F16 /* About.xib in Resources */ = {isa = PBXBuildFile; fileRef = A51BFC1D2B2FB5CE00E92F16 /* About.xib */; }; A51BFC202B2FB64F00E92F16 /* AboutController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51BFC1F2B2FB64F00E92F16 /* AboutController.swift */; }; A51BFC222B2FB6B400E92F16 /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51BFC212B2FB6B400E92F16 /* AboutView.swift */; }; @@ -51,6 +51,12 @@ A54B0CEF2D0D2E2800CBEFF8 /* ColorizedGhosttyIconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54B0CEE2D0D2E2400CBEFF8 /* ColorizedGhosttyIconImage.swift */; }; A54D786C2CA7978E001B19B1 /* BaseTerminalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54D786B2CA79788001B19B1 /* BaseTerminalController.swift */; }; A55685E029A03A9F004303CE /* AppError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55685DF29A03A9F004303CE /* AppError.swift */; }; + A5593FDF2DF8D57C00B47B10 /* TerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */; }; + A5593FE12DF8D74000B47B10 /* HiddenTitlebarTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */; }; + A5593FE32DF8D78600B47B10 /* TerminalHiddenTitlebar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */; }; + A5593FE52DF8DE3000B47B10 /* TerminalLegacy.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5593FE42DF8DE3000B47B10 /* TerminalLegacy.xib */; }; + A5593FE72DF927D200B47B10 /* TransparentTitlebarTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FE62DF927CC00B47B10 /* TransparentTitlebarTerminalWindow.swift */; }; + A5593FE92DF927DF00B47B10 /* TerminalTransparentTitlebar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5593FE82DF927DF00B47B10 /* TerminalTransparentTitlebar.xib */; }; A55B7BB829B6F53A0055DE60 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55B7BB729B6F53A0055DE60 /* Package.swift */; }; A55B7BBC29B6FC330055DE60 /* SurfaceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55B7BBB29B6FC330055DE60 /* SurfaceView.swift */; }; A56B880B2A840447007A0E29 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A56B880A2A840447007A0E29 /* Carbon.framework */; }; @@ -129,7 +135,7 @@ 857F63802A5E64F200CA4815 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = ""; }; 9351BE8E2D22937F003B3499 /* nvim */ = {isa = PBXFileReference; lastKnownFileType = folder; name = nvim; path = "../zig-out/share/nvim"; sourceTree = ""; }; A514C8D52B54A16400493A16 /* Ghostty.Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Config.swift; sourceTree = ""; }; - A51B78462AF4B58B00F3EDB9 /* TerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalWindow.swift; sourceTree = ""; }; + A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyTerminalWindow.swift; sourceTree = ""; }; A51BFC1D2B2FB5CE00E92F16 /* About.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = About.xib; sourceTree = ""; }; A51BFC1F2B2FB64F00E92F16 /* AboutController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutController.swift; sourceTree = ""; }; A51BFC212B2FB6B400E92F16 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; }; @@ -159,6 +165,12 @@ A54B0CEE2D0D2E2400CBEFF8 /* ColorizedGhosttyIconImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorizedGhosttyIconImage.swift; sourceTree = ""; }; A54D786B2CA79788001B19B1 /* BaseTerminalController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTerminalController.swift; sourceTree = ""; }; A55685DF29A03A9F004303CE /* AppError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppError.swift; sourceTree = ""; }; + A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalWindow.swift; sourceTree = ""; }; + A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HiddenTitlebarTerminalWindow.swift; sourceTree = ""; }; + A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalHiddenTitlebar.xib; sourceTree = ""; }; + A5593FE42DF8DE3000B47B10 /* TerminalLegacy.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalLegacy.xib; sourceTree = ""; }; + A5593FE62DF927CC00B47B10 /* TransparentTitlebarTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransparentTitlebarTerminalWindow.swift; sourceTree = ""; }; + A5593FE82DF927DF00B47B10 /* TerminalTransparentTitlebar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTransparentTitlebar.xib; sourceTree = ""; }; A55B7BB729B6F53A0055DE60 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; A55B7BBB29B6FC330055DE60 /* SurfaceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceView.swift; sourceTree = ""; }; A56B880A2A840447007A0E29 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; }; @@ -384,6 +396,21 @@ path = Sources; sourceTree = ""; }; + A5593FDD2DF8D56000B47B10 /* Window Styles */ = { + isa = PBXGroup; + children = ( + A59630992AEE1C6400D64628 /* Terminal.xib */, + A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */, + A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */, + A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */, + A5593FE42DF8DE3000B47B10 /* TerminalLegacy.xib */, + A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */, + A5593FE82DF927DF00B47B10 /* TerminalTransparentTitlebar.xib */, + A5593FE62DF927CC00B47B10 /* TransparentTitlebarTerminalWindow.swift */, + ); + path = "Window Styles"; + sourceTree = ""; + }; A55B7BB429B6F4410055DE60 /* Ghostty */ = { isa = PBXGroup; children = ( @@ -467,11 +494,10 @@ A59630982AEE1C4400D64628 /* Terminal */ = { isa = PBXGroup; children = ( - A59630992AEE1C6400D64628 /* Terminal.xib */, + A5593FDD2DF8D56000B47B10 /* Window Styles */, A596309B2AEE1C9E00D64628 /* TerminalController.swift */, A5D0AF3A2B36A1DE00D21823 /* TerminalRestorable.swift */, A596309D2AEE1D6C00D64628 /* TerminalView.swift */, - A51B78462AF4B58B00F3EDB9 /* TerminalWindow.swift */, AEF9CE232B6AD07A0017E195 /* TerminalToolbar.swift */, A535B9D9299C569B0017E2E4 /* ErrorView.swift */, A54D786B2CA79788001B19B1 /* BaseTerminalController.swift */, @@ -647,9 +673,11 @@ buildActionMask = 2147483647; files = ( FC9ABA9C2D0F53F80020D4C8 /* bash-completion in Resources */, + A5593FE52DF8DE3000B47B10 /* TerminalLegacy.xib in Resources */, 29C15B1D2CDC3B2900520DD4 /* bat in Resources */, A586167C2B7703CC009BDB1D /* fish in Resources */, 55154BE02B33911F001622DC /* ghostty in Resources */, + A5593FE32DF8D78600B47B10 /* TerminalHiddenTitlebar.xib in Resources */, A546F1142D7B68D7003B11A0 /* locale in Resources */, A5985CE62C33060F00C57AD3 /* man in Resources */, 9351BE8E3D22937F003B3499 /* nvim in Resources */, @@ -658,6 +686,7 @@ FC5218FA2D10FFCE004C93E0 /* zsh in Resources */, A5B30539299BEAAB0047F10C /* Assets.xcassets in Resources */, A51BFC1E2B2FB5CE00E92F16 /* About.xib in Resources */, + A5593FE92DF927DF00B47B10 /* TerminalTransparentTitlebar.xib in Resources */, A5E112932AF73E6E00C6E0C2 /* ClipboardConfirmation.xib in Resources */, A5CDF1912AAF9A5800513312 /* ConfigurationErrors.xib in Resources */, 857F63812A5E64F200CA4815 /* MainMenu.xib in Resources */, @@ -702,6 +731,7 @@ A5CBD0602CA0C90A0017A1AE /* QuickTerminalWindow.swift in Sources */, A5CBD05E2CA0C5EC0017A1AE /* QuickTerminalController.swift in Sources */, A5CF66D72D29DDB500139794 /* Ghostty.Event.swift in Sources */, + A5593FE72DF927D200B47B10 /* TransparentTitlebarTerminalWindow.swift in Sources */, A5A2A3CA2D4445E30033CF96 /* Dock.swift in Sources */, A586365F2DEE6C2300E04A10 /* SplitTree.swift in Sources */, A51BFC222B2FB6B400E92F16 /* AboutView.swift in Sources */, @@ -709,6 +739,7 @@ A53A29812DB44A6100B6E02C /* KeyboardShortcut+Extension.swift in Sources */, A5CBD0562C9E65B80017A1AE /* DraggableWindowView.swift in Sources */, C1F26EE92B76CBFC00404083 /* VibrantLayer.m in Sources */, + A5593FDF2DF8D57C00B47B10 /* TerminalWindow.swift in Sources */, A58636712DF298FB00E04A10 /* ExpiringUndoManager.swift in Sources */, A59630972AEE163600D64628 /* HostingWindow.swift in Sources */, A51BFC2B2B30F6BE00E92F16 /* UpdateDelegate.swift in Sources */, @@ -734,9 +765,10 @@ A53A297F2DB4480F00B6E02C /* EventModifiers+Extension.swift in Sources */, A53A297B2DB2E49700B6E02C /* CommandPalette.swift in Sources */, A55B7BB829B6F53A0055DE60 /* Package.swift in Sources */, - A51B78472AF4B58B00F3EDB9 /* TerminalWindow.swift in Sources */, + A51B78472AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift in Sources */, A57D79272C9C879B001D522E /* SecureInput.swift in Sources */, A5CEAFDC29B8009000646FDA /* SplitView.swift in Sources */, + A5593FE12DF8D74000B47B10 /* HiddenTitlebarTerminalWindow.swift in Sources */, A5CDF1932AAF9E0800513312 /* ConfigurationErrorsController.swift in Sources */, A53A6C032CCC1B7F00943E98 /* Ghostty.Action.swift in Sources */, A54B0CED2D0CFB7700CBEFF8 /* ColorizedGhosttyIcon.swift in Sources */, diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 5916c5921..7fb8f9a07 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -6,7 +6,22 @@ import GhosttyKit /// A classic, tabbed terminal experience. class TerminalController: BaseTerminalController { - override var windowNibName: NSNib.Name? { "Terminal" } + override var windowNibName: NSNib.Name? { + //NOTE(mitchellh): switch to this when we've transitioned all legacy logic out + //let defaultValue = "Terminal" + let defaultValue = "TerminalLegacy" + + guard let appDelegate = NSApp.delegate as? AppDelegate else { return defaultValue } + let config = appDelegate.ghostty.config + let nib = switch config.macosTitlebarStyle { + case "tabs": defaultValue + case "hidden": "TerminalHiddenTitlebar" + case "transparent": "TerminalTransparentTitlebar" + default: defaultValue + } + + return nib + } /// This is set to true when we care about frame changes. This is a small optimization since /// this controller registers a listener for ALL frame change notifications and this lets us bail @@ -114,7 +129,7 @@ class TerminalController: BaseTerminalController { invalidateRestorableState() // Update our zoom state - if let window = window as? TerminalWindow { + if let window = window as? LegacyTerminalWindow { window.surfaceIsZoomed = to.zoomed != nil } @@ -129,11 +144,6 @@ class TerminalController: BaseTerminalController { // When our fullscreen state changes, we resync our appearance because some // properties change when fullscreen or not. guard let focusedSurface else { return } - if (!(fullscreenStyle?.isFullscreen ?? false) && - ghostty.config.macosTitlebarStyle == "hidden") - { - applyHiddenTitlebarStyle() - } syncAppearance(focusedSurface.derivedConfig) } @@ -278,9 +288,8 @@ class TerminalController: BaseTerminalController { tg.removeWindow(window) } - // If we have the "hidden" titlebar style we want to create new - // tabs as windows instead, so just skip adding it to the parent. - if (ghostty.config.macosTitlebarStyle != "hidden") { + // If we don't allow tabs then we create a new window instead. + if (window.tabbingMode != .disallowed) { // Add the window to the tab group and show it. switch ghostty.config.windowNewTabPosition { case "end": @@ -389,7 +398,7 @@ class TerminalController: BaseTerminalController { // Reset this to false. It'll be set back to true later. tabListenForFrame = false - guard let windows = self.window?.tabbedWindows as? [TerminalWindow] else { return } + guard let windows = self.window?.tabbedWindows as? [LegacyTerminalWindow] else { return } // We only listen for frame changes if we have more than 1 window, // otherwise the accessory view doesn't matter. @@ -440,7 +449,11 @@ class TerminalController: BaseTerminalController { } private func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { - guard let window = self.window as? TerminalWindow else { return } + if let window = window as? TerminalWindow { + window.syncAppearance(surfaceConfig) + } + + guard let window = self.window as? LegacyTerminalWindow else { return } // Set our explicit appearance if we need to based on the configuration. window.appearance = surfaceConfig.windowAppearance @@ -523,31 +536,6 @@ class TerminalController: BaseTerminalController { } } - private func setInitialWindowPosition(x: Int16?, y: Int16?, windowDecorations: Bool) { - guard let window else { return } - - // If we don't have an X/Y then we try to use the previously saved window pos. - guard let x, let y else { - if (!LastWindowPosition.shared.restore(window)) { - window.center() - } - - return - } - - // Prefer the screen our window is being placed on otherwise our primary screen. - guard let screen = window.screen ?? NSScreen.screens.first else { - window.center() - return - } - - // Orient based on the top left of the primary monitor - let frame = screen.visibleFrame - window.setFrameOrigin(.init( - x: frame.minX + CGFloat(x), - y: frame.maxY - (CGFloat(y) + window.frame.height))) - } - /// 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? { @@ -889,52 +877,9 @@ class TerminalController: BaseTerminalController { shouldCascadeWindows = false } - fileprivate func hideWindowButtons() { - guard let window else { return } - - window.standardWindowButton(.closeButton)?.isHidden = true - window.standardWindowButton(.miniaturizeButton)?.isHidden = true - window.standardWindowButton(.zoomButton)?.isHidden = true - } - - fileprivate func applyHiddenTitlebarStyle() { - guard let window else { return } - - window.styleMask = [ - // We need `titled` in the mask to get the normal window frame - .titled, - - // Full size content view so we can extend - // content in to the hidden titlebar's area - .fullSizeContentView, - - .resizable, - .closable, - .miniaturizable, - ] - - // Hide the title - window.titleVisibility = .hidden - window.titlebarAppearsTransparent = true - - // Hide the traffic lights (window control buttons) - hideWindowButtons() - - // Disallow tabbing if the titlebar is hidden, since that will (should) also hide the tab bar. - window.tabbingMode = .disallowed - - // Nuke it from orbit -- hide the titlebar container entirely, just in case. There are - // some operations that appear to bring back the titlebar visibility so this ensures - // it is gone forever. - if let themeFrame = window.contentView?.superview, - let titleBarContainer = themeFrame.firstDescendant(withClassName: "NSTitlebarContainerView") { - titleBarContainer.isHidden = true - } - } - override func windowDidLoad() { super.windowDidLoad() - guard let window = window as? TerminalWindow else { return } + guard let window else { return } // Store our initial frame so we can know our default later. initialFrame = window.frame @@ -952,9 +897,6 @@ class TerminalController: BaseTerminalController { window.identifier = .init(String(describing: TerminalWindowRestoration.self)) } - // If window decorations are disabled, remove our title - if (!config.windowDecorations) { window.styleMask.remove(.titled) } - // If we have only a single surface (no splits) and there is a default size then // we should resize to that default size. if case let .leaf(view) = surfaceTree.root { @@ -967,42 +909,29 @@ class TerminalController: BaseTerminalController { } } - // Set our window positioning to coordinates if config value exists, otherwise - // fallback to original centering behavior - setInitialWindowPosition( - x: config.windowPositionX, - y: config.windowPositionY, - windowDecorations: config.windowDecorations) - - if config.macosWindowButtons == .hidden { - hideWindowButtons() - } - - // Make sure our theme is set on the window so styling is correct. - if let windowTheme = config.windowTheme { - window.windowTheme = .init(rawValue: windowTheme) - } - - // Handle titlebar tabs config option. Something about what we do while setting up the - // titlebar tabs interferes with the window restore process unless window.tabbingMode - // is set to .preferred, so we set it, and switch back to automatic as soon as we can. - if (config.macosTitlebarStyle == "tabs") { - window.tabbingMode = .preferred - window.titlebarTabs = true - DispatchQueue.main.async { - window.tabbingMode = .automatic + // TODO: remove + if let window = window as? LegacyTerminalWindow { + // Handle titlebar tabs config option. Something about what we do while setting up the + // titlebar tabs interferes with the window restore process unless window.tabbingMode + // is set to .preferred, so we set it, and switch back to automatic as soon as we can. + if (config.macosTitlebarStyle == "tabs") { + window.tabbingMode = .preferred + window.titlebarTabs = true + DispatchQueue.main.async { + window.tabbingMode = .automatic + } + } else if (config.macosTitlebarStyle == "transparent") { + window.transparentTabs = true } - } else if (config.macosTitlebarStyle == "transparent") { - window.transparentTabs = true - } - if window.hasStyledTabs { - // Set the background color of the window - let backgroundColor = NSColor(config.backgroundColor) - window.backgroundColor = backgroundColor + if window.hasStyledTabs { + // Set the background color of the window + let backgroundColor = NSColor(config.backgroundColor) + window.backgroundColor = backgroundColor - // This makes sure our titlebar renders correctly when there is a transparent background - window.titlebarColor = backgroundColor.withAlphaComponent(config.backgroundOpacity) + // This makes sure our titlebar renders correctly when there is a transparent background + window.titlebarColor = backgroundColor.withAlphaComponent(config.backgroundOpacity) + } } // Initialize our content view to the SwiftUI root @@ -1012,11 +941,6 @@ class TerminalController: BaseTerminalController { delegate: self )) - // If our titlebar style is "hidden" we adjust the style appropriately - if (config.macosTitlebarStyle == "hidden") { - applyHiddenTitlebarStyle() - } - // 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. @@ -1218,7 +1142,7 @@ class TerminalController: BaseTerminalController { override func titleDidChange(to: String) { super.titleDidChange(to: to) - guard let window = window as? TerminalWindow else { return } + guard let window = window as? LegacyTerminalWindow else { return } // Custom toolbar-based title used when titlebar tabs are enabled. if let toolbar = window.toolbar as? TerminalToolbar { diff --git a/macos/Sources/Features/Terminal/Window Styles/HiddenTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/HiddenTitlebarTerminalWindow.swift new file mode 100644 index 000000000..f2d3b9b85 --- /dev/null +++ b/macos/Sources/Features/Terminal/Window Styles/HiddenTitlebarTerminalWindow.swift @@ -0,0 +1,78 @@ +import AppKit + +class HiddenTitlebarTerminalWindow: TerminalWindow { + override func awakeFromNib() { + super.awakeFromNib() + + // Setup our initial style + reapplyHiddenStyle() + + // Notifications + NotificationCenter.default.addObserver( + self, + selector: #selector(fullscreenDidExit(_:)), + name: .fullscreenDidExit, + object: nil) + } + + deinit { + NotificationCenter.default.removeObserver(self) + } + + // We override this so that with the hidden titlebar style the titlebar + // area is not draggable. + override var contentLayoutRect: CGRect { + var rect = super.contentLayoutRect + rect.origin.y = 0 + rect.size.height = self.frame.height + return rect + } + + /// Apply the hidden titlebar style. + private func reapplyHiddenStyle() { + styleMask = [ + // We need `titled` in the mask to get the normal window frame + .titled, + + // Full size content view so we can extend + // content in to the hidden titlebar's area + .fullSizeContentView, + + .resizable, + .closable, + .miniaturizable, + ] + + // Hide the title + titleVisibility = .hidden + titlebarAppearsTransparent = true + + // Hide the traffic lights (window control buttons) + standardWindowButton(.closeButton)?.isHidden = true + standardWindowButton(.miniaturizeButton)?.isHidden = true + standardWindowButton(.zoomButton)?.isHidden = true + + // Disallow tabbing if the titlebar is hidden, since that will (should) also hide the tab bar. + tabbingMode = .disallowed + + // Nuke it from orbit -- hide the titlebar container entirely, just in case. There are + // some operations that appear to bring back the titlebar visibility so this ensures + // it is gone forever. + if let themeFrame = contentView?.superview, + let titleBarContainer = themeFrame.firstDescendant(withClassName: "NSTitlebarContainerView") { + titleBarContainer.isHidden = true + } + } + + // MARK: Notifications + + @objc private func fullscreenDidExit(_ notification: Notification) { + // Make sure they're talking about our window + guard let fullscreen = notification.object as? FullscreenBase else { return } + guard fullscreen.window == self else { return } + + // On exit we need to reapply the style because macOS breaks it usually. + // This is safe to call repeatedly so if its not broken its still safe. + reapplyHiddenStyle() + } +} diff --git a/macos/Sources/Features/Terminal/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift similarity index 95% rename from macos/Sources/Features/Terminal/TerminalWindow.swift rename to macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift index 0b43582f3..208e86343 100644 --- a/macos/Sources/Features/Terminal/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift @@ -1,9 +1,8 @@ import Cocoa -class TerminalWindow: NSWindow { - /// This is the key in UserDefaults to use for the default `level` value. - static let defaultLevelKey: String = "TerminalDefaultLevel" - +/// The terminal window that we originally had in Ghostty for a long time. Kind of a soupy mess +/// of styling. +class LegacyTerminalWindow: TerminalWindow { @objc dynamic var keyEquivalent: String = "" /// This is used to determine if certain elements should be drawn light or dark and should @@ -56,11 +55,6 @@ class TerminalWindow: NSWindow { } } - // Both of these must be true for windows without decorations to be able to - // still become key/main and receive events. - override var canBecomeKey: Bool { return true } - override var canBecomeMain: Bool { return true } - // MARK: - Lifecycle override func awakeFromNib() { @@ -77,8 +71,6 @@ class TerminalWindow: NSWindow { if titlebarTabs { generateToolbar() } - - level = UserDefaults.standard.value(forKey: Self.defaultLevelKey) as? NSWindow.Level ?? .normal } deinit { @@ -135,25 +127,6 @@ class TerminalWindow: NSWindow { } } - // We override this so that with the hidden titlebar style the titlebar - // area is not draggable. - override var contentLayoutRect: CGRect { - var rect = super.contentLayoutRect - - // If we are using a hidden titlebar style, the content layout is the - // full frame making it so that it is not draggable. - if let controller = windowController as? TerminalController, - controller.derivedConfig.macosTitlebarStyle == "hidden" { - rect.origin.y = 0 - rect.size.height = self.frame.height - } - return rect - } - - // The window theme configuration from Ghostty. This is used to control some - // behaviors that don't look quite right in certain situations. - var windowTheme: TerminalWindowTheme? - // We only need to set this once, but need to do it after the window has been created in order // to determine if the theme is using a very dark background, in which case we don't want to // remove the effect view if the default tab bar is being used since the effect created in @@ -703,7 +676,7 @@ fileprivate class WindowDragView: NSView { fileprivate class WindowButtonsBackdropView: NSView { // This must be weak because the window has this view. Otherwise // a retain cycle occurs. - private weak var terminalWindow: TerminalWindow? + private weak var terminalWindow: LegacyTerminalWindow? private let isLightTheme: Bool private let overlayLayer = VibrantLayer() @@ -731,7 +704,7 @@ fileprivate class WindowButtonsBackdropView: NSView { fatalError("init(coder:) has not been implemented") } - init(window: TerminalWindow) { + init(window: LegacyTerminalWindow) { self.terminalWindow = window self.isLightTheme = window.isLightTheme @@ -746,10 +719,3 @@ fileprivate class WindowButtonsBackdropView: NSView { layer?.addSublayer(overlayLayer) } } - -enum TerminalWindowTheme: String { - case auto - case system - case light - case dark -} diff --git a/macos/Sources/Features/Terminal/Terminal.xib b/macos/Sources/Features/Terminal/Window Styles/Terminal.xib similarity index 86% rename from macos/Sources/Features/Terminal/Terminal.xib rename to macos/Sources/Features/Terminal/Window Styles/Terminal.xib index 65b03b6eb..cfbb2221c 100644 --- a/macos/Sources/Features/Terminal/Terminal.xib +++ b/macos/Sources/Features/Terminal/Window Styles/Terminal.xib @@ -1,8 +1,8 @@ - + - + @@ -17,10 +17,10 @@ - + - + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib b/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib new file mode 100644 index 000000000..eb4675657 --- /dev/null +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalLegacy.xib b/macos/Sources/Features/Terminal/Window Styles/TerminalLegacy.xib new file mode 100644 index 000000000..61ed6f782 --- /dev/null +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalLegacy.xib @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalTransparentTitlebar.xib b/macos/Sources/Features/Terminal/Window Styles/TerminalTransparentTitlebar.xib new file mode 100644 index 000000000..ada6959b3 --- /dev/null +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalTransparentTitlebar.xib @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift new file mode 100644 index 000000000..74744a962 --- /dev/null +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -0,0 +1,75 @@ +import AppKit + +/// The base class for all standalone, "normal" terminal windows. This sets the basic +/// style and configuration of the window based on the app configuration. +class TerminalWindow: NSWindow { + /// This is the key in UserDefaults to use for the default `level` value. This is + /// used by the manual float on top menu item feature. + static let defaultLevelKey: String = "TerminalDefaultLevel" + + // MARK: NSWindow Overrides + + override func awakeFromNib() { + guard let appDelegate = NSApp.delegate as? AppDelegate else { return } + + // All new windows are based on the app config at the time of creation. + let config = appDelegate.ghostty.config + + // If window decorations are disabled, remove our title + if (!config.windowDecorations) { styleMask.remove(.titled) } + + // Set our window positioning to coordinates if config value exists, otherwise + // fallback to original centering behavior + setInitialWindowPosition( + x: config.windowPositionX, + y: config.windowPositionY, + windowDecorations: config.windowDecorations) + + // If our traffic buttons should be hidden, then hide them + if config.macosWindowButtons == .hidden { + hideWindowButtons() + } + + // Get our saved level + level = UserDefaults.standard.value(forKey: Self.defaultLevelKey) as? NSWindow.Level ?? .normal + } + + // Both of these must be true for windows without decorations to be able to + // still become key/main and receive events. + override var canBecomeKey: Bool { return true } + override var canBecomeMain: Bool { return true } + + // MARK: Positioning And Styling + + /// This is called by the controller when there is a need to reset the window apperance. + func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) {} + + private func setInitialWindowPosition(x: Int16?, y: Int16?, windowDecorations: Bool) { + // If we don't have an X/Y then we try to use the previously saved window pos. + guard let x, let y else { + if (!LastWindowPosition.shared.restore(self)) { + center() + } + + return + } + + // Prefer the screen our window is being placed on otherwise our primary screen. + guard let screen = screen ?? NSScreen.screens.first else { + center() + return + } + + // Orient based on the top left of the primary monitor + let frame = screen.visibleFrame + setFrameOrigin(.init( + x: frame.minX + CGFloat(x), + y: frame.maxY - (CGFloat(y) + frame.height))) + } + + private func hideWindowButtons() { + standardWindowButton(.closeButton)?.isHidden = true + standardWindowButton(.miniaturizeButton)?.isHidden = true + standardWindowButton(.zoomButton)?.isHidden = true + } +} diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift new file mode 100644 index 000000000..4b3336874 --- /dev/null +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -0,0 +1,72 @@ +import AppKit + +class TransparentTitlebarTerminalWindow: TerminalWindow { + private var reapplyTimer: Timer? + + override func awakeFromNib() { + super.awakeFromNib() + } + + deinit { + reapplyTimer?.invalidate() + } + + override func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { + if #available(macOS 26.0, *) { + syncAppearanceTahoe(surfaceConfig) + } else { + syncAppearanceVentura(surfaceConfig) + } + } + + @available(macOS 26.0, *) + private func syncAppearanceTahoe(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { + guard let titlebarBackgroundView else { return } + titlebarBackgroundView.isHidden = true + backgroundColor = NSColor(surfaceConfig.backgroundColor) + } + + @available(macOS 13.0, *) + private func syncAppearanceVentura(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { + guard let titlebarContainer else { return } + + let configBgColor = NSColor(surfaceConfig.backgroundColor) + + // Set our window background color so it shows up + backgroundColor = configBgColor + + // Set the background color of our titlebar to match + titlebarContainer.wantsLayer = true + titlebarContainer.layer?.backgroundColor = configBgColor.withAlphaComponent(surfaceConfig.backgroundOpacity).cgColor + } + + private var titlebarBackgroundView: NSView? { + titlebarContainer?.firstDescendant(withClassName: "NSTitlebarBackgroundView") + } + + private var titlebarContainer: NSView? { + // If we aren't fullscreen then the titlebar container is part of our window. + if !styleMask.contains(.fullScreen) { + return titlebarContainerView + } + + // If we are fullscreen, the titlebar container view is part of a separate + // "fullscreen window", we need to find the window and then get the view. + for window in NSApplication.shared.windows { + // This is the private window class that contains the toolbar + guard window.className == "NSToolbarFullScreenWindow" else { continue } + + // The parent will match our window. This is used to filter the correct + // fullscreen window if we have multiple. + guard window.parent == self else { continue } + + return titlebarContainerView + } + + return nil + } + + private var titlebarContainerView: NSView? { + contentView?.firstViewFromRoot(withClassName: "NSTitlebarContainerView") + } +} diff --git a/macos/Sources/Helpers/Extensions/NSView+Extension.swift b/macos/Sources/Helpers/Extensions/NSView+Extension.swift index 48284df74..121d9a62a 100644 --- a/macos/Sources/Helpers/Extensions/NSView+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSView+Extension.swift @@ -13,6 +13,19 @@ extension NSView { return false } +} + +// MARK: View Traversal and Search + +extension NSView { + /// Returns the absolute root view by walking up the superview chain. + var rootView: NSView { + var root: NSView = self + while let superview = root.superview { + root = superview + } + return root + } /// Recursively finds and returns the first descendant view that has the given class name. func firstDescendant(withClassName name: String) -> NSView? { @@ -54,4 +67,18 @@ extension NSView { return nil } + + /// Finds and returns the first view with the given class name starting from the absolute root of the view hierarchy. + /// This includes private views like title bar views. + func firstViewFromRoot(withClassName name: String) -> NSView? { + let root = rootView + + // Check if the root view itself matches + if String(describing: type(of: root)) == name { + return root + } + + // Otherwise search descendants + return root.firstDescendant(withClassName: name) + } } diff --git a/macos/Sources/Helpers/Fullscreen.swift b/macos/Sources/Helpers/Fullscreen.swift index 6b10ceb40..3200608d0 100644 --- a/macos/Sources/Helpers/Fullscreen.swift +++ b/macos/Sources/Helpers/Fullscreen.swift @@ -78,10 +78,12 @@ class FullscreenBase { } @objc private func didEnterFullScreenNotification(_ notification: Notification) { + NotificationCenter.default.post(name: .fullscreenDidEnter, object: self) delegate?.fullscreenDidChange() } @objc private func didExitFullScreenNotification(_ notification: Notification) { + NotificationCenter.default.post(name: .fullscreenDidExit, object: self) delegate?.fullscreenDidChange() } } @@ -238,6 +240,7 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { self.window.makeFirstResponder(firstResponder) } + NotificationCenter.default.post(name: .fullscreenDidEnter, object: self) self.delegate?.fullscreenDidChange() } } @@ -268,7 +271,7 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { // This is a hack that I want to remove from this but for now, we need to // fix up the titlebar tabs here before we do everything below. - if let window = window as? TerminalWindow, + if let window = window as? LegacyTerminalWindow, window.titlebarTabs { window.titlebarTabs = true } @@ -303,6 +306,7 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { window.makeKeyAndOrderFront(nil) // Notify the delegate + NotificationCenter.default.post(name: .fullscreenDidExit, object: self) self.delegate?.fullscreenDidChange() } @@ -422,3 +426,8 @@ class NonNativeFullscreenVisibleMenu: NonNativeFullscreen { class NonNativeFullscreenPaddedNotch: NonNativeFullscreen { override var properties: Properties { Properties(paddedNotch: true) } } + +extension Notification.Name { + static let fullscreenDidEnter = Notification.Name("com.mitchellh.fullscreenDidEnter") + static let fullscreenDidExit = Notification.Name("com.mitchellh.fullscreenDidExit") +} From 7d02977482a3e8f6c1565c24ee26986038e0bf16 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 11 Jun 2025 07:00:40 -0700 Subject: [PATCH 165/371] macos: add NSView hierarchy debugging code --- .../TransparentTitlebarTerminalWindow.swift | 11 ++++- .../Helpers/Extensions/NSView+Extension.swift | 48 +++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index 4b3336874..d9d42365a 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -1,14 +1,21 @@ import AppKit class TransparentTitlebarTerminalWindow: TerminalWindow { - private var reapplyTimer: Timer? + private var debugTimer: Timer? override func awakeFromNib() { super.awakeFromNib() + + // Debug timer to print view hierarchy every second + debugTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in + print("=== TransparentTitlebarTerminalWindow Debug ===") + self?.contentView?.rootView.printViewHierarchy() + print("===============================================\n") + } } deinit { - reapplyTimer?.invalidate() + debugTimer?.invalidate() } override func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { diff --git a/macos/Sources/Helpers/Extensions/NSView+Extension.swift b/macos/Sources/Helpers/Extensions/NSView+Extension.swift index 121d9a62a..14c07f6c9 100644 --- a/macos/Sources/Helpers/Extensions/NSView+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSView+Extension.swift @@ -82,3 +82,51 @@ extension NSView { return root.firstDescendant(withClassName: name) } } + +// MARK: Debug + +extension NSView { + /// Prints the view hierarchy from the root in a tree-like ASCII format. + /// + /// I need this because the "Capture View Hiearchy" was broken under some scenarios in + /// Xcode 26 (FB17912569). But, I kept it around because it might be useful to print out + /// the view hierarchy without halting the program. + func printViewHierarchy() { + let root = rootView + print("View Hierarchy from Root:") + print(root.viewHierarchyDescription()) + } + + /// Returns a string representation of the view hierarchy in a tree-like format. + private func viewHierarchyDescription(indent: String = "", isLast: Bool = true) -> String { + var result = "" + + // Add the tree branch characters + result += indent + if !indent.isEmpty { + result += isLast ? "└── " : "├── " + } + + // Add the class name and optional identifier + let className = String(describing: type(of: self)) + result += className + + // Add identifier if present + if let identifier = self.identifier { + result += " (id: \(identifier.rawValue))" + } + + // Add frame info + result += " [frame: \(frame)]" + result += "\n" + + // Process subviews + for (index, subview) in subviews.enumerated() { + let isLastSubview = index == subviews.count - 1 + let newIndent = indent + (isLast ? " " : "│ ") + result += subview.viewHierarchyDescription(indent: newIndent, isLast: isLastSubview) + } + + return result + } +} From 6ce7f612a66ea6e50884b426a4b0c3cfd6dd68be Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 11 Jun 2025 07:29:44 -0700 Subject: [PATCH 166/371] macos: transparent titlebar needs to be rehidden when tabs change --- .../TransparentTitlebarTerminalWindow.swift | 64 ++++++++++++++++--- .../Helpers/Extensions/NSView+Extension.swift | 30 +++++++++ 2 files changed, 85 insertions(+), 9 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index d9d42365a..9f7b5e62f 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -1,24 +1,39 @@ import AppKit class TransparentTitlebarTerminalWindow: TerminalWindow { - private var debugTimer: Timer? + // We need to restore our last synced appearance so that we can reapply + // the appearance in certain scenarios. + private var lastSurfaceConfig: Ghostty.SurfaceView.DerivedConfig? + + // KVO observations + private var tabGroupWindowsObservation: NSKeyValueObservation? override func awakeFromNib() { super.awakeFromNib() - - // Debug timer to print view hierarchy every second - debugTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in - print("=== TransparentTitlebarTerminalWindow Debug ===") - self?.contentView?.rootView.printViewHierarchy() - print("===============================================\n") - } + + // We need to observe the tab group because we need to redraw on + // tabbed window changes and there is no notification for that. + setupTabGroupObservation() } deinit { - debugTimer?.invalidate() + tabGroupWindowsObservation?.invalidate() } + override func becomeMain() { + // On macOS Tahoe, the tab bar redraws and restores non-transparency when + // switching tabs. To overcome this, we resync the appearance whenever this + // window becomes main (focused). + if #available(macOS 26.0, *), + let lastSurfaceConfig { + syncAppearance(lastSurfaceConfig) + } + } + + // MARK: Appearance + override func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { + lastSurfaceConfig = surfaceConfig if #available(macOS 26.0, *) { syncAppearanceTahoe(surfaceConfig) } else { @@ -47,6 +62,8 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { titlebarContainer.layer?.backgroundColor = configBgColor.withAlphaComponent(surfaceConfig.backgroundOpacity).cgColor } + // MARK: View Finders + private var titlebarBackgroundView: NSView? { titlebarContainer?.firstDescendant(withClassName: "NSTitlebarBackgroundView") } @@ -76,4 +93,33 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { private var titlebarContainerView: NSView? { contentView?.firstViewFromRoot(withClassName: "NSTitlebarContainerView") } + + // MARK: Tab Group Observation + + private func setupTabGroupObservation() { + // Remove existing observation if any + tabGroupWindowsObservation?.invalidate() + tabGroupWindowsObservation = nil + + // Check if tabGroup is available + guard let tabGroup else { return } + + // Set up KVO observation for the windows array. Whenever it changes + // we resync the appearance because it can cause macOS to redraw the + // tab bar. + tabGroupWindowsObservation = tabGroup.observe( + \.windows, + options: [.new] + ) { [weak self] _, _ in + // NOTE: At one point, I guarded this on only if we went from 0 to N + // or N to 0 under the assumption that the tab bar would only get + // replaced on those cases. This turned out to be false (Tahoe). + // It's cheap enough to always redraw this so we should just do it + // unconditionally. + + guard let self else { return } + guard let lastSurfaceConfig else { return } + self.syncAppearance(lastSurfaceConfig) + } + } } diff --git a/macos/Sources/Helpers/Extensions/NSView+Extension.swift b/macos/Sources/Helpers/Extensions/NSView+Extension.swift index 14c07f6c9..0cf71138d 100644 --- a/macos/Sources/Helpers/Extensions/NSView+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSView+Extension.swift @@ -118,6 +118,36 @@ extension NSView { // Add frame info result += " [frame: \(frame)]" + + // Add visual properties + var properties: [String] = [] + + // Hidden status + if isHidden { + properties.append("hidden") + } + + // Opaque status + properties.append(isOpaque ? "opaque" : "transparent") + + // Layer backing + if wantsLayer { + properties.append("layer-backed") + if let bgColor = layer?.backgroundColor { + let color = NSColor(cgColor: bgColor) + if let rgb = color?.usingColorSpace(.deviceRGB) { + properties.append(String(format: "bg:rgba(%.0f,%.0f,%.0f,%.2f)", + rgb.redComponent * 255, + rgb.greenComponent * 255, + rgb.blueComponent * 255, + rgb.alphaComponent)) + } else { + properties.append("bg:\(bgColor)") + } + } + } + + result += " [\(properties.joined(separator: ", "))]" result += "\n" // Process subviews From 3595b2a8476ff16dae2ba266ef672d4fa295a777 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 11 Jun 2025 12:37:15 -0700 Subject: [PATCH 167/371] macos: transparent titlebar handles transparent background --- macos/Ghostty.xcodeproj/project.pbxproj | 4 + .../Terminal/TerminalController.swift | 53 +++-------- .../Window Styles/TerminalWindow.swift | 95 ++++++++++++++++++- .../TransparentTitlebarTerminalWindow.swift | 22 ++++- .../Helpers/Extensions/Double+Extension.swift | 5 + 5 files changed, 137 insertions(+), 42 deletions(-) create mode 100644 macos/Sources/Helpers/Extensions/Double+Extension.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 594579744..c00d6119a 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -12,6 +12,7 @@ 552964E62B34A9B400030505 /* vim in Resources */ = {isa = PBXBuildFile; fileRef = 552964E52B34A9B400030505 /* vim */; }; 857F63812A5E64F200CA4815 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 857F63802A5E64F200CA4815 /* MainMenu.xib */; }; 9351BE8E3D22937F003B3499 /* nvim in Resources */ = {isa = PBXBuildFile; fileRef = 9351BE8E2D22937F003B3499 /* nvim */; }; + A50297352DFA0F3400B4E924 /* Double+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50297342DFA0F3300B4E924 /* Double+Extension.swift */; }; A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D72B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D82B54DC6800493A16 /* Ghostty.App.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */; }; @@ -134,6 +135,7 @@ 552964E52B34A9B400030505 /* vim */ = {isa = PBXFileReference; lastKnownFileType = folder; name = vim; path = "../zig-out/share/vim"; sourceTree = ""; }; 857F63802A5E64F200CA4815 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = ""; }; 9351BE8E2D22937F003B3499 /* nvim */ = {isa = PBXFileReference; lastKnownFileType = folder; name = nvim; path = "../zig-out/share/nvim"; sourceTree = ""; }; + A50297342DFA0F3300B4E924 /* Double+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+Extension.swift"; sourceTree = ""; }; A514C8D52B54A16400493A16 /* Ghostty.Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Config.swift; sourceTree = ""; }; A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyTerminalWindow.swift; sourceTree = ""; }; A51BFC1D2B2FB5CE00E92F16 /* About.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = About.xib; sourceTree = ""; }; @@ -464,6 +466,7 @@ isa = PBXGroup; children = ( A586366A2DF0A98900E04A10 /* Array+Extension.swift */, + A50297342DFA0F3300B4E924 /* Double+Extension.swift */, A586366E2DF25D8300E04A10 /* Duration+Extension.swift */, A53A29802DB44A5E00B6E02C /* KeyboardShortcut+Extension.swift */, A53A297E2DB4480A00B6E02C /* EventModifiers+Extension.swift */, @@ -737,6 +740,7 @@ A51BFC222B2FB6B400E92F16 /* AboutView.swift in Sources */, A5278A9B2AA05B2600CD3039 /* Ghostty.Input.swift in Sources */, A53A29812DB44A6100B6E02C /* KeyboardShortcut+Extension.swift in Sources */, + A50297352DFA0F3400B4E924 /* Double+Extension.swift in Sources */, A5CBD0562C9E65B80017A1AE /* DraggableWindowView.swift in Sources */, C1F26EE92B76CBFC00404083 /* VibrantLayer.m in Sources */, A5593FDF2DF8D57C00B47B10 /* TerminalWindow.swift in Sources */, diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 7fb8f9a07..5adef8ded 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -449,57 +449,34 @@ class TerminalController: BaseTerminalController { } private func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { + // Let our window handle its own appearance if let window = window as? TerminalWindow { window.syncAppearance(surfaceConfig) } - guard let window = self.window as? LegacyTerminalWindow else { return } + guard let window else { return } - // Set our explicit appearance if we need to based on the configuration. - window.appearance = surfaceConfig.windowAppearance + if let window = window as? LegacyTerminalWindow { + // Update our window light/darkness based on our updated background color + window.isLightTheme = OSColor(surfaceConfig.backgroundColor).isLightColor - // Update our window light/darkness based on our updated background color - window.isLightTheme = OSColor(surfaceConfig.backgroundColor).isLightColor + // Sync our zoom state for splits + window.surfaceIsZoomed = surfaceTree.zoomed != nil - // Sync our zoom state for splits - window.surfaceIsZoomed = surfaceTree.zoomed != nil + // Set the font for the window and tab titles. + if let titleFontName = surfaceConfig.windowTitleFontFamily { + window.titlebarFont = NSFont(name: titleFontName, size: NSFont.systemFontSize) + } else { + window.titlebarFont = nil + } + } // If our window is not visible, then we do nothing. Some things such as blurring // have no effect if the window is not visible. Ultimately, we'll have this called // at some point when a surface becomes focused. guard window.isVisible else { return } - // Set the font for the window and tab titles. - if let titleFontName = surfaceConfig.windowTitleFontFamily { - window.titlebarFont = NSFont(name: titleFontName, size: NSFont.systemFontSize) - } else { - window.titlebarFont = nil - } - - // If we have window transparency then set it transparent. Otherwise set it opaque. - - // Window transparency only takes effect if our window is not native fullscreen. - // In native fullscreen we disable transparency/opacity because the background - // becomes gray and widgets show through. - if (!window.styleMask.contains(.fullScreen) && - surfaceConfig.backgroundOpacity < 1 - ) { - window.isOpaque = false - - // This is weird, but we don't use ".clear" because this creates a look that - // matches Terminal.app much more closer. This lets users transition from - // Terminal.app more easily. - window.backgroundColor = .white.withAlphaComponent(0.001) - - ghostty_set_window_background_blur(ghostty.app, Unmanaged.passUnretained(window).toOpaque()) - } else { - window.isOpaque = true - window.backgroundColor = .windowBackgroundColor - } - - window.hasShadow = surfaceConfig.macosWindowShadow - - guard window.hasStyledTabs else { return } + guard let window = window as? LegacyTerminalWindow, window.hasStyledTabs else { return } // Our background color depends on if our focused surface borders the top or not. // If it does, we match the focused surface. If it doesn't, we use the app diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index 74744a962..daf5b4554 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -1,4 +1,5 @@ import AppKit +import GhosttyKit /// The base class for all standalone, "normal" terminal windows. This sets the basic /// style and configuration of the window based on the app configuration. @@ -7,6 +8,14 @@ class TerminalWindow: NSWindow { /// used by the manual float on top menu item feature. static let defaultLevelKey: String = "TerminalDefaultLevel" + /// The configuration derived from the Ghostty config so we don't need to rely on references. + private var derivedConfig: DerivedConfig? + + /// Gets the terminal controller from the window controller. + var terminalController: TerminalController? { + windowController as? TerminalController + } + // MARK: NSWindow Overrides override func awakeFromNib() { @@ -15,6 +24,9 @@ class TerminalWindow: NSWindow { // All new windows are based on the app config at the time of creation. let config = appDelegate.ghostty.config + // Setup our initial config + derivedConfig = .init(config) + // If window decorations are disabled, remove our title if (!config.windowDecorations) { styleMask.remove(.titled) } @@ -42,7 +54,71 @@ class TerminalWindow: NSWindow { // MARK: Positioning And Styling /// This is called by the controller when there is a need to reset the window apperance. - func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) {} + func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { + // If our window is not visible, then we do nothing. Some things such as blurring + // have no effect if the window is not visible. Ultimately, we'll have this called + // at some point when a surface becomes focused. + guard isVisible else { return } + + // Basic properties + appearance = surfaceConfig.windowAppearance + hasShadow = surfaceConfig.macosWindowShadow + + // Window transparency only takes effect if our window is not native fullscreen. + // In native fullscreen we disable transparency/opacity because the background + // becomes gray and widgets show through. + if !styleMask.contains(.fullScreen) && + surfaceConfig.backgroundOpacity < 1 + { + isOpaque = false + + // This is weird, but we don't use ".clear" because this creates a look that + // matches Terminal.app much more closer. This lets users transition from + // Terminal.app more easily. + backgroundColor = .white.withAlphaComponent(0.001) + + if let appDelegate = NSApp.delegate as? AppDelegate { + ghostty_set_window_background_blur( + appDelegate.ghostty.app, + Unmanaged.passUnretained(self).toOpaque()) + } + } else { + isOpaque = true + + let backgroundColor = preferredBackgroundColor ?? NSColor(surfaceConfig.backgroundColor) + self.backgroundColor = backgroundColor.withAlphaComponent(1) + } + } + + /// The preferred window background color. The current window background color may not be set + /// to this, since this is dynamic based on the state of the surface tree. + /// + /// This background color will include alpha transparency if set. If the caller doesn't want that, + /// change the alpha channel again manually. + var preferredBackgroundColor: NSColor? { + if let terminalController, !terminalController.surfaceTree.isEmpty { + // If our focused surface borders the top then we prefer its background color + if let focusedSurface = terminalController.focusedSurface, + let treeRoot = terminalController.surfaceTree.root, + let focusedNode = treeRoot.node(view: focusedSurface), + treeRoot.spatial().doesBorder(side: .up, from: focusedNode), + let backgroundcolor = focusedSurface.backgroundColor { + let alpha = focusedSurface.derivedConfig.backgroundOpacity.clamped(to: 0.001...1) + return NSColor(backgroundcolor).withAlphaComponent(alpha) + } + + // Doesn't border the top or we don't have a focused surface, so + // we try to match the top-left surface. + let topLeftSurface = terminalController.surfaceTree.root?.leftmostLeaf() + if let topLeftBgColor = topLeftSurface?.backgroundColor { + let alpha = topLeftSurface?.derivedConfig.backgroundOpacity.clamped(to: 0.001...1) ?? 1 + return NSColor(topLeftBgColor).withAlphaComponent(alpha) + } + } + + let alpha = derivedConfig?.backgroundOpacity.clamped(to: 0.001...1) ?? 1 + return derivedConfig?.backgroundColor.withAlphaComponent(alpha) + } private func setInitialWindowPosition(x: Int16?, y: Int16?, windowDecorations: Bool) { // If we don't have an X/Y then we try to use the previously saved window pos. @@ -72,4 +148,21 @@ class TerminalWindow: NSWindow { standardWindowButton(.miniaturizeButton)?.isHidden = true standardWindowButton(.zoomButton)?.isHidden = true } + + // MARK: Config + + struct DerivedConfig { + let backgroundColor: NSColor + let backgroundOpacity: Double + + init() { + self.backgroundColor = NSColor.windowBackgroundColor + self.backgroundOpacity = 1 + } + + init(_ config: Ghostty.Config) { + self.backgroundColor = NSColor(config.backgroundColor) + self.backgroundOpacity = config.backgroundOpacity + } + } } diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index 9f7b5e62f..dfe2d35a1 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -33,6 +33,8 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { // MARK: Appearance override func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { + super.syncAppearance(surfaceConfig) + lastSurfaceConfig = surfaceConfig if #available(macOS 26.0, *) { syncAppearanceTahoe(surfaceConfig) @@ -43,9 +45,23 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { @available(macOS 26.0, *) private func syncAppearanceTahoe(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { - guard let titlebarBackgroundView else { return } - titlebarBackgroundView.isHidden = true - backgroundColor = NSColor(surfaceConfig.backgroundColor) + // When we have transparency, we need to set the titlebar background to match the + // window background but with opacity. The window background is set using the + // "preferred background color" property. + // + // As an inverse, if we don't have transparency, we don't bother with this because + // the window background will be set to the correct color so we can just hide the + // titlebar completely and we're good to go. + if !isOpaque { + if let titlebarView = titlebarContainer?.firstDescendant(withClassName: "NSTitlebarView") { + titlebarView.wantsLayer = true + titlebarView.layer?.backgroundColor = preferredBackgroundColor?.cgColor + } + } + + // In all cases, we have to hide the background view since this has multiple subviews + // that force a background color. + titlebarBackgroundView?.isHidden = true } @available(macOS 13.0, *) diff --git a/macos/Sources/Helpers/Extensions/Double+Extension.swift b/macos/Sources/Helpers/Extensions/Double+Extension.swift new file mode 100644 index 000000000..8d1151bac --- /dev/null +++ b/macos/Sources/Helpers/Extensions/Double+Extension.swift @@ -0,0 +1,5 @@ +extension Double { + func clamped(to range: ClosedRange) -> Double { + return Swift.min(Swift.max(self, range.lowerBound), range.upperBound) + } +} From dfa7a114def0f4a9617ef3433dd67c3bb288b924 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 11 Jun 2025 13:12:25 -0700 Subject: [PATCH 168/371] macos: make transparent titlebars robust against show/hide tabs --- .../TransparentTitlebarTerminalWindow.swift | 81 +++++++++++++------ 1 file changed, 58 insertions(+), 23 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index dfe2d35a1..98dd9f834 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -1,32 +1,41 @@ import AppKit +/// A terminal window style that provides a transparent titlebar effect. With this effect, the titlebar +/// matches the background color of the window. class TransparentTitlebarTerminalWindow: TerminalWindow { - // We need to restore our last synced appearance so that we can reapply - // the appearance in certain scenarios. + /// Stores the last surface configuration to reapply appearance when needed. + /// This is necessary because various macOS operations (tab switching, tab bar + /// visibility changes) can reset the titlebar appearance. private var lastSurfaceConfig: Ghostty.SurfaceView.DerivedConfig? - // KVO observations + /// KVO observation for tab group window changes. private var tabGroupWindowsObservation: NSKeyValueObservation? + private var tabBarVisibleObservation: NSKeyValueObservation? override func awakeFromNib() { super.awakeFromNib() - // We need to observe the tab group because we need to redraw on - // tabbed window changes and there is no notification for that. - setupTabGroupObservation() + // Setup all the KVO we will use, see the docs for the respective functions + // to learn why we need KVO. + setupKVO() } deinit { tabGroupWindowsObservation?.invalidate() + tabBarVisibleObservation?.invalidate() } override func becomeMain() { - // On macOS Tahoe, the tab bar redraws and restores non-transparency when - // switching tabs. To overcome this, we resync the appearance whenever this - // window becomes main (focused). - if #available(macOS 26.0, *), - let lastSurfaceConfig { - syncAppearance(lastSurfaceConfig) + guard let lastSurfaceConfig else { return } + syncAppearance(lastSurfaceConfig) + + // This is a nasty edge case. If we're going from 2 to 1 tab and the tab bar + // automatically disappears, then we need to resync our appearance because + // at some point macOS replaces the tab views. + if tabGroup?.windows.count ?? 0 == 2 { + DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(50)) { [weak self] in + self?.syncAppearance(self?.lastSurfaceConfig ?? lastSurfaceConfig) + } } } @@ -34,8 +43,14 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { override func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { super.syncAppearance(surfaceConfig) - + + // Save our config in case we need to reapply lastSurfaceConfig = surfaceConfig + + // Everytime we change appearance, set KVO up again in case any of our + // references changed (e.g. tabGroup is new). + setupKVO() + if #available(macOS 26.0, *) { syncAppearanceTahoe(surfaceConfig) } else { @@ -67,15 +82,8 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { @available(macOS 13.0, *) private func syncAppearanceVentura(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { guard let titlebarContainer else { return } - - let configBgColor = NSColor(surfaceConfig.backgroundColor) - - // Set our window background color so it shows up - backgroundColor = configBgColor - - // Set the background color of our titlebar to match titlebarContainer.wantsLayer = true - titlebarContainer.layer?.backgroundColor = configBgColor.withAlphaComponent(surfaceConfig.backgroundOpacity).cgColor + titlebarContainer.layer?.backgroundColor = preferredBackgroundColor?.cgColor } // MARK: View Finders @@ -111,7 +119,16 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { } // MARK: Tab Group Observation - + + private func setupKVO() { + // See the docs for the respective setup functions for why. + setupTabGroupObservation() + setupTabBarVisibleObservation() + } + + /// Monitors the tabGroup windows value for any changes and resyncs the appearance on change. + /// This is necessary because when the windows change, the tab bar and titlebar are recreated + /// which breaks our changes. private func setupTabGroupObservation() { // Remove existing observation if any tabGroupWindowsObservation?.invalidate() @@ -126,7 +143,7 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { tabGroupWindowsObservation = tabGroup.observe( \.windows, options: [.new] - ) { [weak self] _, _ in + ) { [weak self] _, change in // NOTE: At one point, I guarded this on only if we went from 0 to N // or N to 0 under the assumption that the tab bar would only get // replaced on those cases. This turned out to be false (Tahoe). @@ -138,4 +155,22 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { self.syncAppearance(lastSurfaceConfig) } } + + /// Monitors the tab bar for visibility. This lets the "Show/Hide Tab Bar" manual menu item + /// to not break our appearance. + private func setupTabBarVisibleObservation() { + // Remove existing observation if any + tabBarVisibleObservation?.invalidate() + tabBarVisibleObservation = nil + + // Set up KVO observation for isTabBarVisible + tabBarVisibleObservation = tabGroup?.observe( + \.isTabBarVisible, + options: [.new] + ) { [weak self] _, change in + guard let self else { return } + guard let lastSurfaceConfig else { return } + self.syncAppearance(lastSurfaceConfig) + } + } } From a804dab28845675271afa13a80e23fc524386c78 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 11 Jun 2025 14:35:49 -0700 Subject: [PATCH 169/371] macos: native terminal style works with new subclasses --- macos/Ghostty.xcodeproj/project.pbxproj | 6 +- .../Terminal/BaseTerminalController.swift | 6 +- .../Terminal/TerminalController.swift | 54 ++++++++---- .../TerminalTransparentTitlebar.xib | 2 +- .../Window Styles/TerminalWindow.swift | 88 +++++++++++++++++++ .../TransparentTitlebarTerminalWindow.swift | 2 + .../Helpers/Extensions/NSView+Extension.swift | 15 ++++ 7 files changed, 151 insertions(+), 22 deletions(-) diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index c00d6119a..5f5b3013c 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -402,12 +402,12 @@ isa = PBXGroup; children = ( A59630992AEE1C6400D64628 /* Terminal.xib */, - A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */, A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */, - A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */, A5593FE42DF8DE3000B47B10 /* TerminalLegacy.xib */, - A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */, A5593FE82DF927DF00B47B10 /* TerminalTransparentTitlebar.xib */, + A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */, + A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */, + A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */, A5593FE62DF927CC00B47B10 /* TransparentTitlebarTerminalWindow.swift */, ); path = "Window Styles"; diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index e91199358..849f13b34 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -568,7 +568,11 @@ class BaseTerminalController: NSWindowController, // Not zoomed or different node zoomed, zoom this node surfaceTree = SplitTree(root: surfaceTree.root, zoomed: targetNode) } - + + // Move focus to our window. Importantly this ensures that if we click the + // reset zoom button in a tab bar of an unfocused tab that we become focused. + window?.makeKeyAndOrderFront(nil) + // Ensure focus stays on the target surface. We lose focus when we do // this so we need to grab it again. DispatchQueue.main.async { diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 5adef8ded..082a3c806 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -14,6 +14,7 @@ class TerminalController: BaseTerminalController { guard let appDelegate = NSApp.delegate as? AppDelegate else { return defaultValue } let config = appDelegate.ghostty.config let nib = switch config.macosTitlebarStyle { + case "native": "Terminal" case "tabs": defaultValue case "hidden": "TerminalHiddenTitlebar" case "transparent": "TerminalTransparentTitlebar" @@ -132,6 +133,9 @@ class TerminalController: BaseTerminalController { if let window = window as? LegacyTerminalWindow { window.surfaceIsZoomed = to.zoomed != nil } + if let window = window as? TerminalWindow { + window.surfaceIsZoomed2 = to.zoomed != nil + } // If our surface tree is now nil then we close our window. if (to.isEmpty) { @@ -395,28 +399,44 @@ class TerminalController: BaseTerminalController { /// changes, when a window is closed, and when tabs are reordered /// with the mouse. func relabelTabs() { - // Reset this to false. It'll be set back to true later. - tabListenForFrame = false - - guard let windows = self.window?.tabbedWindows as? [LegacyTerminalWindow] else { return } - // We only listen for frame changes if we have more than 1 window, // otherwise the accessory view doesn't matter. - tabListenForFrame = windows.count > 1 + tabListenForFrame = window?.tabbedWindows?.count ?? 0 > 1 - for (tab, window) in zip(1..., windows) { - // We need to clear any windows beyond this because they have had - // a keyEquivalent set previously. - guard tab <= 9 else { - window.keyEquivalent = "" - continue + if let windows = window?.tabbedWindows as? [TerminalWindow] { + for (tab, window) in zip(1..., windows) { + // We need to clear any windows beyond this because they have had + // a keyEquivalent set previously. + guard tab <= 9 else { + window.keyEquivalent2 = "" + continue + } + + let action = "goto_tab:\(tab)" + if let equiv = ghostty.config.keyboardShortcut(for: action) { + window.keyEquivalent2 = "\(equiv)" + } else { + window.keyEquivalent2 = "" + } } + } - let action = "goto_tab:\(tab)" - if let equiv = ghostty.config.keyboardShortcut(for: action) { - window.keyEquivalent = "\(equiv)" - } else { - window.keyEquivalent = "" + // Legacy + if let windows = self.window?.tabbedWindows as? [LegacyTerminalWindow] { + for (tab, window) in zip(1..., windows) { + // We need to clear any windows beyond this because they have had + // a keyEquivalent set previously. + guard tab <= 9 else { + window.keyEquivalent = "" + continue + } + + let action = "goto_tab:\(tab)" + if let equiv = ghostty.config.keyboardShortcut(for: action) { + window.keyEquivalent = "\(equiv)" + } else { + window.keyEquivalent = "" + } } } } diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalTransparentTitlebar.xib b/macos/Sources/Features/Terminal/Window Styles/TerminalTransparentTitlebar.xib index ada6959b3..25922e2f3 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalTransparentTitlebar.xib +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalTransparentTitlebar.xib @@ -17,7 +17,7 @@ - + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index daf5b4554..9fac08c4b 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -1,4 +1,5 @@ import AppKit +import SwiftUI import GhosttyKit /// The base class for all standalone, "normal" terminal windows. This sets the basic @@ -42,6 +43,14 @@ class TerminalWindow: NSWindow { hideWindowButtons() } + // Setup the accessory view for tabs that shows our keyboard shortcuts, + // zoomed state, etc. Note I tried to use SwiftUI here but ran into issues + // where buttons were not clickable. + let stackView = NSStackView(views: [keyEquivalentLabel, resetZoomTabButton]) + stackView.setHuggingPriority(.defaultHigh, for: .horizontal) + stackView.spacing = 3 + tab.accessoryView = stackView + // Get our saved level level = UserDefaults.standard.value(forKey: Self.defaultLevelKey) as? NSWindow.Level ?? .normal } @@ -51,6 +60,85 @@ class TerminalWindow: NSWindow { override var canBecomeKey: Bool { return true } override var canBecomeMain: Bool { return true } + override func becomeKey() { + super.becomeKey() + resetZoomTabButton.contentTintColor = .controlAccentColor + } + + override func resignKey() { + super.resignKey() + resetZoomTabButton.contentTintColor = .secondaryLabelColor + } + + override func mergeAllWindows(_ sender: Any?) { + super.mergeAllWindows(sender) + + // It takes an event loop cycle to merge all the windows so we set a + // short timer to relabel the tabs (issue #1902) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in + self?.terminalController?.relabelTabs() + } + } + + // MARK: Tab Key Equivalents + + // TODO: rename once Legacy window removes + var keyEquivalent2: String? = nil { + didSet { + // When our key equivalent is set, we must update the tab label. + guard let keyEquivalent2 else { + keyEquivalentLabel.attributedStringValue = NSAttributedString() + return + } + + keyEquivalentLabel.attributedStringValue = NSAttributedString( + string: "\(keyEquivalent2) ", + attributes: [ + .font: NSFont.systemFont(ofSize: NSFont.smallSystemFontSize), + .foregroundColor: isKeyWindow ? NSColor.labelColor : NSColor.secondaryLabelColor, + ]) + } + } + + /// The label that has the key equivalent for tab views. + private lazy var keyEquivalentLabel: NSTextField = { + let label = NSTextField(labelWithAttributedString: NSAttributedString()) + label.setContentCompressionResistancePriority(.windowSizeStayPut, for: .horizontal) + label.postsFrameChangedNotifications = true + return label + }() + + // MARK: Surface Zoom + + /// Set to true if a surface is currently zoomed to show the reset zoom button. + var surfaceIsZoomed2: Bool = false { + didSet { + // Show/hide our reset zoom button depending on if we're zoomed. + // We want to show it if we are zoomed. + resetZoomTabButton.isHidden = !surfaceIsZoomed2 + } + } + + private lazy var resetZoomTabButton: NSButton = generateResetZoomButton() + + private func generateResetZoomButton() -> NSButton { + let button = NSButton() + button.isHidden = true + button.target = terminalController + button.action = #selector(TerminalController.splitZoom(_:)) + button.isBordered = false + button.allowsExpansionToolTips = true + button.toolTip = "Reset Zoom" + button.contentTintColor = .controlAccentColor + button.state = .on + button.image = NSImage(named:"ResetZoom") + button.frame = NSRect(x: 0, y: 0, width: 20, height: 20) + button.translatesAutoresizingMaskIntoConstraints = false + button.widthAnchor.constraint(equalToConstant: 20).isActive = true + button.heightAnchor.constraint(equalToConstant: 20).isActive = true + return button + } + // MARK: Positioning And Styling /// This is called by the controller when there is a need to reset the window apperance. diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index 98dd9f834..ada84ff12 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -26,6 +26,8 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { } override func becomeMain() { + super.becomeMain() + guard let lastSurfaceConfig else { return } syncAppearance(lastSurfaceConfig) diff --git a/macos/Sources/Helpers/Extensions/NSView+Extension.swift b/macos/Sources/Helpers/Extensions/NSView+Extension.swift index 0cf71138d..aa56fe32e 100644 --- a/macos/Sources/Helpers/Extensions/NSView+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSView+Extension.swift @@ -27,6 +27,21 @@ extension NSView { return root } + /// Checks if a view contains another view in its hierarchy. + func contains(_ view: NSView) -> Bool { + if self == view { + return true + } + + for subview in subviews { + if subview.contains(view) { + return true + } + } + + return false + } + /// Recursively finds and returns the first descendant view that has the given class name. func firstDescendant(withClassName name: String) -> NSView? { for subview in subviews { From 63e56d0402a04696fbaff2eb7e5dbbf8f6257740 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 11 Jun 2025 15:08:12 -0700 Subject: [PATCH 170/371] macos: titlebar fonts work with new terminal window --- .../Terminal/TerminalController.swift | 11 ++++ .../Window Styles/LegacyTerminalWindow.swift | 42 ------------- .../Window Styles/TerminalWindow.swift | 62 ++++++++++++++++++- .../TransparentTitlebarTerminalWindow.swift | 26 -------- 4 files changed, 72 insertions(+), 69 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 082a3c806..cf771d556 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -471,6 +471,17 @@ class TerminalController: BaseTerminalController { private func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { // Let our window handle its own appearance if let window = window as? TerminalWindow { + // Sync our zoom state for splits + window.surfaceIsZoomed2 = surfaceTree.zoomed != nil + + // Set the font for the window and tab titles. + if let titleFontName = surfaceConfig.windowTitleFontFamily { + window.titlebarFont2 = NSFont(name: titleFontName, size: NSFont.systemFontSize) + } else { + window.titlebarFont2 = nil + } + + // Call this last in case it uses any of the properties above. window.syncAppearance(surfaceConfig) } diff --git a/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift index 208e86343..e63681463 100644 --- a/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift @@ -77,48 +77,6 @@ class LegacyTerminalWindow: TerminalWindow { bindings.forEach() { $0.invalidate() } } - // MARK: Titlebar Helpers - // These helpers are generic to what we're trying to achieve (i.e. titlebar - // style tabs, titlebar styling, etc.). They're just here to make it easier. - - private var titlebarContainer: NSView? { - // If we aren't fullscreen then the titlebar container is part of our window. - if !styleMask.contains(.fullScreen) { - guard let view = contentView?.superview ?? contentView else { return nil } - return titlebarContainerView(in: view) - } - - // If we are fullscreen, the titlebar container view is part of a separate - // "fullscreen window", we need to find the window and then get the view. - for window in NSApplication.shared.windows { - // This is the private window class that contains the toolbar - guard window.className == "NSToolbarFullScreenWindow" else { continue } - - // The parent will match our window. This is used to filter the correct - // fullscreen window if we have multiple. - guard window.parent == self else { continue } - - guard let view = window.contentView else { continue } - return titlebarContainerView(in: view) - } - - return nil - } - - private func titlebarContainerView(in view: NSView) -> NSView? { - if view.className == "NSTitlebarContainerView" { - return view - } - - for subview in view.subviews { - if let found = titlebarContainerView(in: subview) { - return found - } - } - - return nil - } - // MARK: - NSWindow override var title: String { diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index 9fac08c4b..1e9ca1b01 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -72,7 +72,7 @@ class TerminalWindow: NSWindow { override func mergeAllWindows(_ sender: Any?) { super.mergeAllWindows(sender) - + // It takes an event loop cycle to merge all the windows so we set a // short timer to relabel the tabs (issue #1902) DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in @@ -139,6 +139,66 @@ class TerminalWindow: NSWindow { return button } + // MARK: Title Text + + override var title: String { + didSet { + // Whenever we change the window title we must also update our + // tab title if we're using custom fonts. + tab.attributedTitle = attributedTitle + } + } + + // Used to set the titlebar font. + var titlebarFont2: NSFont? { + didSet { + let font = titlebarFont2 ?? NSFont.titleBarFont(ofSize: NSFont.systemFontSize) + + titlebarTextField?.font = font + tab.attributedTitle = attributedTitle + } + } + + // Find the NSTextField responsible for displaying the titlebar's title. + private var titlebarTextField: NSTextField? { + titlebarContainer? + .firstDescendant(withClassName: "NSTitlebarView")? + .firstDescendant(withClassName: "NSTextField") as? NSTextField + } + + // Return a styled representation of our title property. + private var attributedTitle: NSAttributedString? { + guard let titlebarFont = titlebarFont2 else { return nil } + + let attributes: [NSAttributedString.Key: Any] = [ + .font: titlebarFont, + .foregroundColor: isKeyWindow ? NSColor.labelColor : NSColor.secondaryLabelColor, + ] + return NSAttributedString(string: title, attributes: attributes) + } + + var titlebarContainer: NSView? { + // If we aren't fullscreen then the titlebar container is part of our window. + if !styleMask.contains(.fullScreen) { + return contentView?.firstViewFromRoot(withClassName: "NSTitlebarContainerView") + } + + // If we are fullscreen, the titlebar container view is part of a separate + // "fullscreen window", we need to find the window and then get the view. + for window in NSApplication.shared.windows { + // This is the private window class that contains the toolbar + guard window.className == "NSToolbarFullScreenWindow" else { continue } + + // The parent will match our window. This is used to filter the correct + // fullscreen window if we have multiple. + guard window.parent == self else { continue } + + return window.contentView?.firstViewFromRoot(withClassName: "NSTitlebarContainerView") + } + + return nil + } + // MARK: Positioning And Styling /// This is called by the controller when there is a need to reset the window apperance. diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index ada84ff12..f949b6094 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -94,32 +94,6 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { titlebarContainer?.firstDescendant(withClassName: "NSTitlebarBackgroundView") } - private var titlebarContainer: NSView? { - // If we aren't fullscreen then the titlebar container is part of our window. - if !styleMask.contains(.fullScreen) { - return titlebarContainerView - } - - // If we are fullscreen, the titlebar container view is part of a separate - // "fullscreen window", we need to find the window and then get the view. - for window in NSApplication.shared.windows { - // This is the private window class that contains the toolbar - guard window.className == "NSToolbarFullScreenWindow" else { continue } - - // The parent will match our window. This is used to filter the correct - // fullscreen window if we have multiple. - guard window.parent == self else { continue } - - return titlebarContainerView - } - - return nil - } - - private var titlebarContainerView: NSView? { - contentView?.firstViewFromRoot(withClassName: "NSTitlebarContainerView") - } - // MARK: Tab Group Observation private func setupKVO() { From e5cb33e9114a7b0818043c0f210bc2039b10cc00 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 11 Jun 2025 15:09:42 -0700 Subject: [PATCH 171/371] typos --- .../Features/Terminal/Window Styles/TerminalWindow.swift | 2 +- macos/Sources/Helpers/Extensions/NSView+Extension.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index 1e9ca1b01..eb4b4a6da 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -201,7 +201,7 @@ class TerminalWindow: NSWindow { // MARK: Positioning And Styling - /// This is called by the controller when there is a need to reset the window apperance. + /// This is called by the controller when there is a need to reset the window appearance. func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { // If our window is not visible, then we do nothing. Some things such as blurring // have no effect if the window is not visible. Ultimately, we'll have this called diff --git a/macos/Sources/Helpers/Extensions/NSView+Extension.swift b/macos/Sources/Helpers/Extensions/NSView+Extension.swift index aa56fe32e..b958130f1 100644 --- a/macos/Sources/Helpers/Extensions/NSView+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSView+Extension.swift @@ -103,7 +103,7 @@ extension NSView { extension NSView { /// Prints the view hierarchy from the root in a tree-like ASCII format. /// - /// I need this because the "Capture View Hiearchy" was broken under some scenarios in + /// I need this because the "Capture View Hierarchy" was broken under some scenarios in /// Xcode 26 (FB17912569). But, I kept it around because it might be useful to print out /// the view hierarchy without halting the program. func printViewHierarchy() { From ccfd33022f2402b294aafdc9ce8224b15069a5f3 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 11 Jun 2025 15:15:06 -0700 Subject: [PATCH 172/371] macos: only titlebar tabs uses legacy styling now --- macos/Sources/Features/Terminal/TerminalController.swift | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index cf771d556..86b47b9bd 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -7,15 +7,13 @@ import GhosttyKit /// A classic, tabbed terminal experience. class TerminalController: BaseTerminalController { override var windowNibName: NSNib.Name? { - //NOTE(mitchellh): switch to this when we've transitioned all legacy logic out - //let defaultValue = "Terminal" - let defaultValue = "TerminalLegacy" + let defaultValue = "Terminal" guard let appDelegate = NSApp.delegate as? AppDelegate else { return defaultValue } let config = appDelegate.ghostty.config let nib = switch config.macosTitlebarStyle { case "native": "Terminal" - case "tabs": defaultValue + case "tabs": "TerminalLegacy" case "hidden": "TerminalHiddenTitlebar" case "transparent": "TerminalTransparentTitlebar" default: defaultValue From fd785f98bb5d794645079918df2828c4e0e09e1f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 11:36:38 -0700 Subject: [PATCH 173/371] macos: titlebar tabs uses legacy window for now --- macos/Ghostty.xcodeproj/project.pbxproj | 8 ++ .../Terminal/TerminalController.swift | 56 +++-------- .../Window Styles/LegacyTerminalWindow.swift | 93 ++----------------- .../TabsTitlebarTerminalWindow.swift | 58 ++++++++++++ .../Window Styles/TerminalHiddenTitlebar.xib | 2 +- .../Window Styles/TerminalTabsTitlebar.xib | 31 +++++++ .../Window Styles/TerminalWindow.swift | 12 +-- 7 files changed, 124 insertions(+), 136 deletions(-) create mode 100644 macos/Sources/Features/Terminal/Window Styles/TabsTitlebarTerminalWindow.swift create mode 100644 macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebar.xib diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 5f5b3013c..3f1cddf44 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -16,6 +16,8 @@ A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D72B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D82B54DC6800493A16 /* Ghostty.App.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */; }; + A51544FE2DFB111C009E85D8 /* TabsTitlebarTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51544FD2DFB1110009E85D8 /* TabsTitlebarTerminalWindow.swift */; }; + A51545002DFB112E009E85D8 /* TerminalTabsTitlebar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebar.xib */; }; A51B78472AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */; }; A51BFC1E2B2FB5CE00E92F16 /* About.xib in Resources */ = {isa = PBXBuildFile; fileRef = A51BFC1D2B2FB5CE00E92F16 /* About.xib */; }; A51BFC202B2FB64F00E92F16 /* AboutController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51BFC1F2B2FB64F00E92F16 /* AboutController.swift */; }; @@ -137,6 +139,8 @@ 9351BE8E2D22937F003B3499 /* nvim */ = {isa = PBXFileReference; lastKnownFileType = folder; name = nvim; path = "../zig-out/share/nvim"; sourceTree = ""; }; A50297342DFA0F3300B4E924 /* Double+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+Extension.swift"; sourceTree = ""; }; A514C8D52B54A16400493A16 /* Ghostty.Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Config.swift; sourceTree = ""; }; + A51544FD2DFB1110009E85D8 /* TabsTitlebarTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsTitlebarTerminalWindow.swift; sourceTree = ""; }; + A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTabsTitlebar.xib; sourceTree = ""; }; A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyTerminalWindow.swift; sourceTree = ""; }; A51BFC1D2B2FB5CE00E92F16 /* About.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = About.xib; sourceTree = ""; }; A51BFC1F2B2FB64F00E92F16 /* AboutController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutController.swift; sourceTree = ""; }; @@ -404,10 +408,12 @@ A59630992AEE1C6400D64628 /* Terminal.xib */, A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */, A5593FE42DF8DE3000B47B10 /* TerminalLegacy.xib */, + A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebar.xib */, A5593FE82DF927DF00B47B10 /* TerminalTransparentTitlebar.xib */, A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */, A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */, A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */, + A51544FD2DFB1110009E85D8 /* TabsTitlebarTerminalWindow.swift */, A5593FE62DF927CC00B47B10 /* TransparentTitlebarTerminalWindow.swift */, ); path = "Window Styles"; @@ -694,6 +700,7 @@ A5CDF1912AAF9A5800513312 /* ConfigurationErrors.xib in Resources */, 857F63812A5E64F200CA4815 /* MainMenu.xib in Resources */, A596309A2AEE1C6400D64628 /* Terminal.xib in Resources */, + A51545002DFB112E009E85D8 /* TerminalTabsTitlebar.xib in Resources */, A5CBD05C2CA0C5C70017A1AE /* QuickTerminal.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -761,6 +768,7 @@ A5333E1C2B5A1CE3008AEFF7 /* CrossKit.swift in Sources */, A5874D992DAD751B00E83852 /* CGS.swift in Sources */, A586366B2DF0A98C00E04A10 /* Array+Extension.swift in Sources */, + A51544FE2DFB111C009E85D8 /* TabsTitlebarTerminalWindow.swift in Sources */, A59444F729A2ED5200725BBA /* SettingsView.swift in Sources */, A56D58862ACDDB4100508D2C /* Ghostty.Shell.swift in Sources */, A5985CD72C320C4500C57AD3 /* String+Extension.swift in Sources */, diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 86b47b9bd..d59f71619 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -13,6 +13,7 @@ class TerminalController: BaseTerminalController { let config = appDelegate.ghostty.config let nib = switch config.macosTitlebarStyle { case "native": "Terminal" + //case "tabs": "TerminalTabsTitlebar" case "tabs": "TerminalLegacy" case "hidden": "TerminalHiddenTitlebar" case "transparent": "TerminalTransparentTitlebar" @@ -128,11 +129,8 @@ class TerminalController: BaseTerminalController { invalidateRestorableState() // Update our zoom state - if let window = window as? LegacyTerminalWindow { - window.surfaceIsZoomed = to.zoomed != nil - } if let window = window as? TerminalWindow { - window.surfaceIsZoomed2 = to.zoomed != nil + window.surfaceIsZoomed = to.zoomed != nil } // If our surface tree is now nil then we close our window. @@ -418,25 +416,6 @@ class TerminalController: BaseTerminalController { } } } - - // Legacy - if let windows = self.window?.tabbedWindows as? [LegacyTerminalWindow] { - for (tab, window) in zip(1..., windows) { - // We need to clear any windows beyond this because they have had - // a keyEquivalent set previously. - guard tab <= 9 else { - window.keyEquivalent = "" - continue - } - - let action = "goto_tab:\(tab)" - if let equiv = ghostty.config.keyboardShortcut(for: action) { - window.keyEquivalent = "\(equiv)" - } else { - window.keyEquivalent = "" - } - } - } } private func fixTabBar() { @@ -470,13 +449,13 @@ class TerminalController: BaseTerminalController { // Let our window handle its own appearance if let window = window as? TerminalWindow { // Sync our zoom state for splits - window.surfaceIsZoomed2 = surfaceTree.zoomed != nil + window.surfaceIsZoomed = surfaceTree.zoomed != nil // Set the font for the window and tab titles. if let titleFontName = surfaceConfig.windowTitleFontFamily { - window.titlebarFont2 = NSFont(name: titleFontName, size: NSFont.systemFontSize) + window.titlebarFont = NSFont(name: titleFontName, size: NSFont.systemFontSize) } else { - window.titlebarFont2 = nil + window.titlebarFont = nil } // Call this last in case it uses any of the properties above. @@ -488,16 +467,6 @@ class TerminalController: BaseTerminalController { if let window = window as? LegacyTerminalWindow { // Update our window light/darkness based on our updated background color window.isLightTheme = OSColor(surfaceConfig.backgroundColor).isLightColor - - // Sync our zoom state for splits - window.surfaceIsZoomed = surfaceTree.zoomed != nil - - // Set the font for the window and tab titles. - if let titleFontName = surfaceConfig.windowTitleFontFamily { - window.titlebarFont = NSFont(name: titleFontName, size: NSFont.systemFontSize) - } else { - window.titlebarFont = nil - } } // If our window is not visible, then we do nothing. Some things such as blurring @@ -916,18 +885,15 @@ class TerminalController: BaseTerminalController { } // TODO: remove - if let window = window as? LegacyTerminalWindow { + if let window = window as? LegacyTerminalWindow, + config.macosTitlebarStyle == "tabs" { // Handle titlebar tabs config option. Something about what we do while setting up the // titlebar tabs interferes with the window restore process unless window.tabbingMode // is set to .preferred, so we set it, and switch back to automatic as soon as we can. - if (config.macosTitlebarStyle == "tabs") { - window.tabbingMode = .preferred - window.titlebarTabs = true - DispatchQueue.main.async { - window.tabbingMode = .automatic - } - } else if (config.macosTitlebarStyle == "transparent") { - window.transparentTabs = true + window.tabbingMode = .preferred + window.titlebarTabs = true + DispatchQueue.main.async { + window.tabbingMode = .automatic } if window.hasStyledTabs { diff --git a/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift index e63681463..89afbf72f 100644 --- a/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift @@ -3,12 +3,16 @@ import Cocoa /// The terminal window that we originally had in Ghostty for a long time. Kind of a soupy mess /// of styling. class LegacyTerminalWindow: TerminalWindow { - @objc dynamic var keyEquivalent: String = "" - /// This is used to determine if certain elements should be drawn light or dark and should /// be updated whenever the window background color or surrounding elements changes. var isLightTheme: Bool = false + override var surfaceIsZoomed: Bool { + didSet { + updateResetZoomTitlebarButtonVisibility() + } + } + lazy var titlebarColor: NSColor = backgroundColor { didSet { guard let titlebarContainer else { return } @@ -17,33 +21,6 @@ class LegacyTerminalWindow: TerminalWindow { } } - private lazy var keyEquivalentLabel: NSTextField = { - let label = NSTextField(labelWithAttributedString: NSAttributedString()) - label.setContentCompressionResistancePriority(.windowSizeStayPut, for: .horizontal) - label.postsFrameChangedNotifications = true - - return label - }() - - private lazy var bindings = [ - observe(\.surfaceIsZoomed, options: [.initial, .new]) { [weak self] window, _ in - guard let tabGroup = self?.tabGroup else { return } - - self?.resetZoomTabButton.isHidden = !window.surfaceIsZoomed - self?.updateResetZoomTitlebarButtonVisibility() - }, - - observe(\.keyEquivalent, options: [.initial, .new]) { [weak self] window, _ in - let attributes: [NSAttributedString.Key: Any] = [ - .font: NSFont.systemFont(ofSize: NSFont.smallSystemFontSize), - .foregroundColor: window.isKeyWindow ? NSColor.labelColor : NSColor.secondaryLabelColor, - ] - let attributedString = NSAttributedString(string: " \(window.keyEquivalent) ", attributes: attributes) - - self?.keyEquivalentLabel.attributedStringValue = attributedString - }, - ] - // false if all three traffic lights are missing/hidden, otherwise true private var hasWindowButtons: Bool { get { @@ -60,31 +37,13 @@ class LegacyTerminalWindow: TerminalWindow { override func awakeFromNib() { super.awakeFromNib() - _ = bindings - - // Create the tab accessory view that houses the key-equivalent label and optional un-zoom button - let stackView = NSStackView(views: [keyEquivalentLabel, resetZoomTabButton]) - stackView.setHuggingPriority(.defaultHigh, for: .horizontal) - stackView.spacing = 3 - tab.accessoryView = stackView - if titlebarTabs { generateToolbar() } } - deinit { - bindings.forEach() { $0.invalidate() } - } - // MARK: - NSWindow - override var title: String { - didSet { - tab.attributedTitle = attributedTitle - } - } - // We only need to set this once, but need to do it after the window has been created in order // to determine if the theme is using a very dark background, in which case we don't want to // remove the effect view if the default tab bar is being used since the effect created in @@ -101,7 +60,6 @@ class LegacyTerminalWindow: TerminalWindow { super.becomeKey() updateNewTabButtonOpacity() - resetZoomTabButton.contentTintColor = .controlAccentColor resetZoomToolbarButton.contentTintColor = .controlAccentColor tab.attributedTitle = attributedTitle } @@ -110,7 +68,6 @@ class LegacyTerminalWindow: TerminalWindow { super.resignKey() updateNewTabButtonOpacity() - resetZoomTabButton.contentTintColor = .secondaryLabelColor resetZoomToolbarButton.contentTintColor = .tertiaryLabelColor tab.attributedTitle = attributedTitle } @@ -284,16 +241,8 @@ class LegacyTerminalWindow: TerminalWindow { // MARK: - Split Zoom Button - @objc dynamic var surfaceIsZoomed: Bool = false - private lazy var resetZoomToolbarButton: NSButton = generateResetZoomButton() - private lazy var resetZoomTabButton: NSButton = { - let button = generateResetZoomButton() - button.action = #selector(selectTabAndZoom(_:)) - return button - }() - private lazy var resetZoomTitlebarAccessoryViewController: NSTitlebarAccessoryViewController? = { guard let titlebarContainer else { return nil } let size = NSSize(width: titlebarContainer.bounds.height, height: titlebarContainer.bounds.height) @@ -356,37 +305,13 @@ class LegacyTerminalWindow: TerminalWindow { // MARK: - Titlebar Font // Used to set the titlebar font. - var titlebarFont: NSFont? { + override var titlebarFont: NSFont? { didSet { - let font = titlebarFont ?? NSFont.titleBarFont(ofSize: NSFont.systemFontSize) - - titlebarTextField?.font = font - tab.attributedTitle = attributedTitle - - if let toolbar = toolbar as? TerminalToolbar { - toolbar.titleFont = font - } + guard let toolbar = toolbar as? TerminalToolbar else { return } + toolbar.titleFont = titlebarFont ?? .titleBarFont(ofSize: NSFont.systemFontSize) } } - // Find the NSTextField responsible for displaying the titlebar's title. - private var titlebarTextField: NSTextField? { - guard let titlebarView = titlebarContainer?.subviews - .first(where: { $0.className == "NSTitlebarView" }) else { return nil } - return titlebarView.subviews.first(where: { $0 is NSTextField }) as? NSTextField - } - - // Return a styled representation of our title property. - private var attributedTitle: NSAttributedString? { - guard let titlebarFont else { return nil } - - let attributes: [NSAttributedString.Key: Any] = [ - .font: titlebarFont, - .foregroundColor: isKeyWindow ? NSColor.labelColor : NSColor.secondaryLabelColor, - ] - return NSAttributedString(string: title, attributes: attributes) - } - // MARK: - Titlebar Tabs private var windowButtonsBackdrop: WindowButtonsBackdropView? = nil diff --git a/macos/Sources/Features/Terminal/Window Styles/TabsTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TabsTitlebarTerminalWindow.swift new file mode 100644 index 000000000..858b54829 --- /dev/null +++ b/macos/Sources/Features/Terminal/Window Styles/TabsTitlebarTerminalWindow.swift @@ -0,0 +1,58 @@ +import AppKit +import SwiftUI + +class TabsTitlebarTerminalWindow: TerminalWindow, NSToolbarDelegate { + override func awakeFromNib() { + super.awakeFromNib() + + // We must hide the title since we're going to be moving tabs into + // the titlebar which have their own title. + titleVisibility = .hidden + + // Create a toolbar + let toolbar = NSToolbar(identifier: "TerminalToolbar") + toolbar.delegate = self + toolbar.centeredItemIdentifiers.insert(.title) + self.toolbar = toolbar + //toolbarStyle = .unifiedCompact + } + + // MARK: NSToolbarDelegate + + func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { + return [.title, .flexibleSpace, .space] + } + + func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { + return [.flexibleSpace, .title, .flexibleSpace] + } + + func toolbar(_ toolbar: NSToolbar, + itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, + willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { + switch itemIdentifier { + case .title: + let item = NSToolbarItem(itemIdentifier: .title) + item.view = NSHostingView(rootView: TitleItem()) + item.visibilityPriority = .user + item.isEnabled = true + return item + default: + return NSToolbarItem(itemIdentifier: itemIdentifier) + } + } + +} + +extension NSToolbarItem.Identifier { + /// Displays the title of the window + static let title = NSToolbarItem.Identifier("Title") +} + +extension TabsTitlebarTerminalWindow { + struct TitleItem: View { + var body: some View { + Text("HELLO THIS IS A PRETTY LONG TITLE") + } + } +} diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib b/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib index eb4675657..1a2a6c192 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib @@ -17,7 +17,7 @@ - + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebar.xib b/macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebar.xib new file mode 100644 index 000000000..779b6e094 --- /dev/null +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebar.xib @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index eb4b4a6da..a0e18d283 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -111,11 +111,11 @@ class TerminalWindow: NSWindow { // MARK: Surface Zoom /// Set to true if a surface is currently zoomed to show the reset zoom button. - var surfaceIsZoomed2: Bool = false { + var surfaceIsZoomed: Bool = false { didSet { // Show/hide our reset zoom button depending on if we're zoomed. // We want to show it if we are zoomed. - resetZoomTabButton.isHidden = !surfaceIsZoomed2 + resetZoomTabButton.isHidden = !surfaceIsZoomed } } @@ -150,9 +150,9 @@ class TerminalWindow: NSWindow { } // Used to set the titlebar font. - var titlebarFont2: NSFont? { + var titlebarFont: NSFont? { didSet { - let font = titlebarFont2 ?? NSFont.titleBarFont(ofSize: NSFont.systemFontSize) + let font = titlebarFont ?? NSFont.titleBarFont(ofSize: NSFont.systemFontSize) titlebarTextField?.font = font tab.attributedTitle = attributedTitle @@ -167,8 +167,8 @@ class TerminalWindow: NSWindow { } // Return a styled representation of our title property. - private var attributedTitle: NSAttributedString? { - guard let titlebarFont = titlebarFont2 else { return nil } + var attributedTitle: NSAttributedString? { + guard let titlebarFont = titlebarFont else { return nil } let attributes: [NSAttributedString.Key: Any] = [ .font: titlebarFont, From 5877913ab8104d9887efb6dbacee8c2bc7b39200 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 12:02:31 -0700 Subject: [PATCH 174/371] macoS: Split out terminal tabs for ventura vs tahoe --- macos/Ghostty.xcodeproj/project.pbxproj | 32 ++--- .../Terminal/TerminalController.swift | 114 +++--------------- .../HiddenTitlebarTerminalWindow.swift | 29 +++-- .../Window Styles/TerminalHiddenTitlebar.xib | 2 +- ...gacy.xib => TerminalTabsTitlebarTahoe.xib} | 2 +- ...ar.xib => TerminalTabsTitlebarVentura.xib} | 4 +- .../Window Styles/TerminalWindow.swift | 2 +- ... => TitlebarTabsTahoeTerminalWindow.swift} | 5 +- ...> TitlebarTabsVenturaTerminalWindow.swift} | 72 +++++++++-- macos/Sources/Helpers/Fullscreen.swift | 3 +- 10 files changed, 120 insertions(+), 145 deletions(-) rename macos/Sources/Features/Terminal/Window Styles/{TerminalLegacy.xib => TerminalTabsTitlebarTahoe.xib} (94%) rename macos/Sources/Features/Terminal/Window Styles/{TerminalTabsTitlebar.xib => TerminalTabsTitlebarVentura.xib} (91%) rename macos/Sources/Features/Terminal/Window Styles/{TabsTitlebarTerminalWindow.swift => TitlebarTabsTahoeTerminalWindow.swift} (90%) rename macos/Sources/Features/Terminal/Window Styles/{LegacyTerminalWindow.swift => TitlebarTabsVenturaTerminalWindow.swift} (91%) diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 3f1cddf44..cd0c17f9b 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -16,9 +16,9 @@ A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D72B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D82B54DC6800493A16 /* Ghostty.App.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */; }; - A51544FE2DFB111C009E85D8 /* TabsTitlebarTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51544FD2DFB1110009E85D8 /* TabsTitlebarTerminalWindow.swift */; }; - A51545002DFB112E009E85D8 /* TerminalTabsTitlebar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebar.xib */; }; - A51B78472AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */; }; + A51544FE2DFB111C009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51544FD2DFB1110009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift */; }; + A51545002DFB112E009E85D8 /* TerminalTabsTitlebarTahoe.xib in Resources */ = {isa = PBXBuildFile; fileRef = A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebarTahoe.xib */; }; + A51B78472AF4B58B00F3EDB9 /* TitlebarTabsVenturaTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51B78462AF4B58B00F3EDB9 /* TitlebarTabsVenturaTerminalWindow.swift */; }; A51BFC1E2B2FB5CE00E92F16 /* About.xib in Resources */ = {isa = PBXBuildFile; fileRef = A51BFC1D2B2FB5CE00E92F16 /* About.xib */; }; A51BFC202B2FB64F00E92F16 /* AboutController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51BFC1F2B2FB64F00E92F16 /* AboutController.swift */; }; A51BFC222B2FB6B400E92F16 /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51BFC212B2FB6B400E92F16 /* AboutView.swift */; }; @@ -57,7 +57,7 @@ A5593FDF2DF8D57C00B47B10 /* TerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */; }; A5593FE12DF8D74000B47B10 /* HiddenTitlebarTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */; }; A5593FE32DF8D78600B47B10 /* TerminalHiddenTitlebar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */; }; - A5593FE52DF8DE3000B47B10 /* TerminalLegacy.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5593FE42DF8DE3000B47B10 /* TerminalLegacy.xib */; }; + A5593FE52DF8DE3000B47B10 /* TerminalTabsTitlebarVentura.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5593FE42DF8DE3000B47B10 /* TerminalTabsTitlebarVentura.xib */; }; A5593FE72DF927D200B47B10 /* TransparentTitlebarTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FE62DF927CC00B47B10 /* TransparentTitlebarTerminalWindow.swift */; }; A5593FE92DF927DF00B47B10 /* TerminalTransparentTitlebar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5593FE82DF927DF00B47B10 /* TerminalTransparentTitlebar.xib */; }; A55B7BB829B6F53A0055DE60 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55B7BB729B6F53A0055DE60 /* Package.swift */; }; @@ -139,9 +139,9 @@ 9351BE8E2D22937F003B3499 /* nvim */ = {isa = PBXFileReference; lastKnownFileType = folder; name = nvim; path = "../zig-out/share/nvim"; sourceTree = ""; }; A50297342DFA0F3300B4E924 /* Double+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+Extension.swift"; sourceTree = ""; }; A514C8D52B54A16400493A16 /* Ghostty.Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Config.swift; sourceTree = ""; }; - A51544FD2DFB1110009E85D8 /* TabsTitlebarTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsTitlebarTerminalWindow.swift; sourceTree = ""; }; - A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTabsTitlebar.xib; sourceTree = ""; }; - A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegacyTerminalWindow.swift; sourceTree = ""; }; + A51544FD2DFB1110009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitlebarTabsTahoeTerminalWindow.swift; sourceTree = ""; }; + A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebarTahoe.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTabsTitlebarTahoe.xib; sourceTree = ""; }; + A51B78462AF4B58B00F3EDB9 /* TitlebarTabsVenturaTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitlebarTabsVenturaTerminalWindow.swift; sourceTree = ""; }; A51BFC1D2B2FB5CE00E92F16 /* About.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = About.xib; sourceTree = ""; }; A51BFC1F2B2FB64F00E92F16 /* AboutController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutController.swift; sourceTree = ""; }; A51BFC212B2FB6B400E92F16 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; }; @@ -174,7 +174,7 @@ A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalWindow.swift; sourceTree = ""; }; A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HiddenTitlebarTerminalWindow.swift; sourceTree = ""; }; A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalHiddenTitlebar.xib; sourceTree = ""; }; - A5593FE42DF8DE3000B47B10 /* TerminalLegacy.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalLegacy.xib; sourceTree = ""; }; + A5593FE42DF8DE3000B47B10 /* TerminalTabsTitlebarVentura.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTabsTitlebarVentura.xib; sourceTree = ""; }; A5593FE62DF927CC00B47B10 /* TransparentTitlebarTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransparentTitlebarTerminalWindow.swift; sourceTree = ""; }; A5593FE82DF927DF00B47B10 /* TerminalTransparentTitlebar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTransparentTitlebar.xib; sourceTree = ""; }; A55B7BB729B6F53A0055DE60 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; @@ -407,13 +407,13 @@ children = ( A59630992AEE1C6400D64628 /* Terminal.xib */, A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */, - A5593FE42DF8DE3000B47B10 /* TerminalLegacy.xib */, - A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebar.xib */, + A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebarTahoe.xib */, + A5593FE42DF8DE3000B47B10 /* TerminalTabsTitlebarVentura.xib */, A5593FE82DF927DF00B47B10 /* TerminalTransparentTitlebar.xib */, A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */, A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */, - A51B78462AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift */, - A51544FD2DFB1110009E85D8 /* TabsTitlebarTerminalWindow.swift */, + A51B78462AF4B58B00F3EDB9 /* TitlebarTabsVenturaTerminalWindow.swift */, + A51544FD2DFB1110009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift */, A5593FE62DF927CC00B47B10 /* TransparentTitlebarTerminalWindow.swift */, ); path = "Window Styles"; @@ -682,7 +682,7 @@ buildActionMask = 2147483647; files = ( FC9ABA9C2D0F53F80020D4C8 /* bash-completion in Resources */, - A5593FE52DF8DE3000B47B10 /* TerminalLegacy.xib in Resources */, + A5593FE52DF8DE3000B47B10 /* TerminalTabsTitlebarVentura.xib in Resources */, 29C15B1D2CDC3B2900520DD4 /* bat in Resources */, A586167C2B7703CC009BDB1D /* fish in Resources */, 55154BE02B33911F001622DC /* ghostty in Resources */, @@ -700,7 +700,7 @@ A5CDF1912AAF9A5800513312 /* ConfigurationErrors.xib in Resources */, 857F63812A5E64F200CA4815 /* MainMenu.xib in Resources */, A596309A2AEE1C6400D64628 /* Terminal.xib in Resources */, - A51545002DFB112E009E85D8 /* TerminalTabsTitlebar.xib in Resources */, + A51545002DFB112E009E85D8 /* TerminalTabsTitlebarTahoe.xib in Resources */, A5CBD05C2CA0C5C70017A1AE /* QuickTerminal.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -768,7 +768,7 @@ A5333E1C2B5A1CE3008AEFF7 /* CrossKit.swift in Sources */, A5874D992DAD751B00E83852 /* CGS.swift in Sources */, A586366B2DF0A98C00E04A10 /* Array+Extension.swift in Sources */, - A51544FE2DFB111C009E85D8 /* TabsTitlebarTerminalWindow.swift in Sources */, + A51544FE2DFB111C009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift in Sources */, A59444F729A2ED5200725BBA /* SettingsView.swift in Sources */, A56D58862ACDDB4100508D2C /* Ghostty.Shell.swift in Sources */, A5985CD72C320C4500C57AD3 /* String+Extension.swift in Sources */, @@ -777,7 +777,7 @@ A53A297F2DB4480F00B6E02C /* EventModifiers+Extension.swift in Sources */, A53A297B2DB2E49700B6E02C /* CommandPalette.swift in Sources */, A55B7BB829B6F53A0055DE60 /* Package.swift in Sources */, - A51B78472AF4B58B00F3EDB9 /* LegacyTerminalWindow.swift in Sources */, + A51B78472AF4B58B00F3EDB9 /* TitlebarTabsVenturaTerminalWindow.swift in Sources */, A57D79272C9C879B001D522E /* SecureInput.swift in Sources */, A5CEAFDC29B8009000646FDA /* SplitView.swift in Sources */, A5593FE12DF8D74000B47B10 /* HiddenTitlebarTerminalWindow.swift in Sources */, diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index d59f71619..977a064e0 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -13,10 +13,15 @@ class TerminalController: BaseTerminalController { let config = appDelegate.ghostty.config let nib = switch config.macosTitlebarStyle { case "native": "Terminal" - //case "tabs": "TerminalTabsTitlebar" - case "tabs": "TerminalLegacy" case "hidden": "TerminalHiddenTitlebar" case "transparent": "TerminalTransparentTitlebar" + case "tabs": + if #available(macOS 26.0, *) { + // TODO: Switch to Tahoe when ready + "TerminalTabsTitlebarVentura" + } else { + "TerminalTabsTitlebarVentura" + } default: defaultValue } @@ -447,68 +452,20 @@ class TerminalController: BaseTerminalController { private func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { // Let our window handle its own appearance - if let window = window as? TerminalWindow { - // Sync our zoom state for splits - window.surfaceIsZoomed = surfaceTree.zoomed != nil + guard let window = window as? TerminalWindow else { return } - // Set the font for the window and tab titles. - if let titleFontName = surfaceConfig.windowTitleFontFamily { - window.titlebarFont = NSFont(name: titleFontName, size: NSFont.systemFontSize) - } else { - window.titlebarFont = nil - } + // Sync our zoom state for splits + window.surfaceIsZoomed = surfaceTree.zoomed != nil - // Call this last in case it uses any of the properties above. - window.syncAppearance(surfaceConfig) - } - - guard let window else { return } - - if let window = window as? LegacyTerminalWindow { - // Update our window light/darkness based on our updated background color - window.isLightTheme = OSColor(surfaceConfig.backgroundColor).isLightColor - } - - // If our window is not visible, then we do nothing. Some things such as blurring - // have no effect if the window is not visible. Ultimately, we'll have this called - // at some point when a surface becomes focused. - guard window.isVisible else { return } - - guard let window = window as? LegacyTerminalWindow, window.hasStyledTabs else { return } - - // Our background color depends on if our focused surface borders the top or not. - // If it does, we match the focused surface. If it doesn't, we use the app - // configuration. - let backgroundColor: OSColor - if !surfaceTree.isEmpty { - if let focusedSurface = focusedSurface, - let treeRoot = surfaceTree.root, - let focusedNode = treeRoot.node(view: focusedSurface), - treeRoot.spatial().doesBorder(side: .up, from: focusedNode) { - // Similar to above, an alpha component of "0" causes compositor issues, so - // we use 0.001. See: https://github.com/ghostty-org/ghostty/pull/4308 - backgroundColor = OSColor(focusedSurface.backgroundColor ?? surfaceConfig.backgroundColor).withAlphaComponent(0.001) - } else { - // We don't have a focused surface or our surface doesn't border the - // top. We choose to match the color of the top-left most surface. - let topLeftSurface = surfaceTree.root?.leftmostLeaf() - backgroundColor = OSColor(topLeftSurface?.backgroundColor ?? derivedConfig.backgroundColor) - } + // Set the font for the window and tab titles. + if let titleFontName = surfaceConfig.windowTitleFontFamily { + window.titlebarFont = NSFont(name: titleFontName, size: NSFont.systemFontSize) } else { - backgroundColor = OSColor(self.derivedConfig.backgroundColor) + window.titlebarFont = nil } - window.titlebarColor = backgroundColor.withAlphaComponent(surfaceConfig.backgroundOpacity) - if (window.isOpaque) { - // Bg color is only synced if we have no transparency. This is because - // the transparency is handled at the surface level (window.backgroundColor - // ignores alpha components) - window.backgroundColor = backgroundColor - - // If there is transparency, calling this will make the titlebar opaque - // so we only call this if we are opaque. - window.updateTabBar() - } + // Call this last in case it uses any of the properties above. + window.syncAppearance(surfaceConfig) } /// Returns the default size of the window. This is contextual based on the focused surface because @@ -884,28 +841,6 @@ class TerminalController: BaseTerminalController { } } - // TODO: remove - if let window = window as? LegacyTerminalWindow, - config.macosTitlebarStyle == "tabs" { - // Handle titlebar tabs config option. Something about what we do while setting up the - // titlebar tabs interferes with the window restore process unless window.tabbingMode - // is set to .preferred, so we set it, and switch back to automatic as soon as we can. - window.tabbingMode = .preferred - window.titlebarTabs = true - DispatchQueue.main.async { - window.tabbingMode = .automatic - } - - if window.hasStyledTabs { - // Set the background color of the window - let backgroundColor = NSColor(config.backgroundColor) - window.backgroundColor = backgroundColor - - // This makes sure our titlebar renders correctly when there is a transparent background - window.titlebarColor = backgroundColor.withAlphaComponent(config.backgroundOpacity) - } - } - // Initialize our content view to the SwiftUI root window.contentView = NSHostingView(rootView: TerminalView( ghostty: self.ghostty, @@ -1110,23 +1045,6 @@ class TerminalController: BaseTerminalController { } //MARK: - TerminalViewDelegate - - override func titleDidChange(to: String) { - super.titleDidChange(to: to) - - guard let window = window as? LegacyTerminalWindow else { return } - - // Custom toolbar-based title used when titlebar tabs are enabled. - if let toolbar = window.toolbar as? TerminalToolbar { - if (window.titlebarTabs || derivedConfig.macosTitlebarStyle == "hidden") { - // Updating the title text as above automatically reveals the - // native title view in macOS 15.0 and above. Since we're using - // a custom view instead, we need to re-hide it. - window.titleVisibility = .hidden - } - toolbar.titleText = to - } - } override func focusedSurfaceDidChange(to: Ghostty.SurfaceView?) { super.focusedSurfaceDidChange(to: to) diff --git a/macos/Sources/Features/Terminal/Window Styles/HiddenTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/HiddenTitlebarTerminalWindow.swift index f2d3b9b85..5f4d6b177 100644 --- a/macos/Sources/Features/Terminal/Window Styles/HiddenTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/HiddenTitlebarTerminalWindow.swift @@ -19,15 +19,6 @@ class HiddenTitlebarTerminalWindow: TerminalWindow { NotificationCenter.default.removeObserver(self) } - // We override this so that with the hidden titlebar style the titlebar - // area is not draggable. - override var contentLayoutRect: CGRect { - var rect = super.contentLayoutRect - rect.origin.y = 0 - rect.size.height = self.frame.height - return rect - } - /// Apply the hidden titlebar style. private func reapplyHiddenStyle() { styleMask = [ @@ -64,6 +55,26 @@ class HiddenTitlebarTerminalWindow: TerminalWindow { } } + // MARK: NSWindow + + override var title: String { + didSet { + // Updating the title text as above automatically reveals the + // native title view in macOS 15.0 and above. Since we're using + // a custom view instead, we need to re-hide it. + reapplyHiddenStyle() + } + } + + // We override this so that with the hidden titlebar style the titlebar + // area is not draggable. + override var contentLayoutRect: CGRect { + var rect = super.contentLayoutRect + rect.origin.y = 0 + rect.size.height = self.frame.height + return rect + } + // MARK: Notifications @objc private func fullscreenDidExit(_ notification: Notification) { diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib b/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib index 1a2a6c192..eb4675657 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalHiddenTitlebar.xib @@ -17,7 +17,7 @@ - + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalLegacy.xib b/macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebarTahoe.xib similarity index 94% rename from macos/Sources/Features/Terminal/Window Styles/TerminalLegacy.xib rename to macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebarTahoe.xib index 61ed6f782..deaeded9f 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalLegacy.xib +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebarTahoe.xib @@ -13,7 +13,7 @@ - + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebar.xib b/macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebarVentura.xib similarity index 91% rename from macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebar.xib rename to macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebarVentura.xib index 779b6e094..bf53a4510 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebar.xib +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalTabsTitlebarVentura.xib @@ -13,11 +13,11 @@ - + - + diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index a0e18d283..f6b53c289 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -10,7 +10,7 @@ class TerminalWindow: NSWindow { static let defaultLevelKey: String = "TerminalDefaultLevel" /// The configuration derived from the Ghostty config so we don't need to rely on references. - private var derivedConfig: DerivedConfig? + private(set) var derivedConfig: DerivedConfig? /// Gets the terminal controller from the window controller. var terminalController: TerminalController? { diff --git a/macos/Sources/Features/Terminal/Window Styles/TabsTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift similarity index 90% rename from macos/Sources/Features/Terminal/Window Styles/TabsTitlebarTerminalWindow.swift rename to macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift index 858b54829..c45e93d79 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TabsTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift @@ -1,7 +1,8 @@ import AppKit import SwiftUI -class TabsTitlebarTerminalWindow: TerminalWindow, NSToolbarDelegate { +/// `macos-titlebar-style = tabs` for macOS 26 (Tahoe) and later. +class TitlebarTabsTahoeTerminalWindow: TerminalWindow, NSToolbarDelegate { override func awakeFromNib() { super.awakeFromNib() @@ -49,7 +50,7 @@ extension NSToolbarItem.Identifier { static let title = NSToolbarItem.Identifier("Title") } -extension TabsTitlebarTerminalWindow { +extension TitlebarTabsTahoeTerminalWindow { struct TitleItem: View { var body: some View { Text("HELLO THIS IS A PRETTY LONG TITLE") diff --git a/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift similarity index 91% rename from macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift rename to macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift index 89afbf72f..2f8eb5840 100644 --- a/macos/Sources/Features/Terminal/Window Styles/LegacyTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift @@ -1,11 +1,10 @@ import Cocoa -/// The terminal window that we originally had in Ghostty for a long time. Kind of a soupy mess -/// of styling. -class LegacyTerminalWindow: TerminalWindow { +/// Titlebar tabs for macOS 13 to 15. +class TitlebarTabsVenturaTerminalWindow: TerminalWindow { /// This is used to determine if certain elements should be drawn light or dark and should /// be updated whenever the window background color or surrounding elements changes. - var isLightTheme: Bool = false + fileprivate var isLightTheme: Bool = false override var surfaceIsZoomed: Bool { didSet { @@ -32,17 +31,30 @@ class LegacyTerminalWindow: TerminalWindow { } } - // MARK: - Lifecycle + // MARK: NSWindow override func awakeFromNib() { super.awakeFromNib() - if titlebarTabs { - generateToolbar() - } - } + // Handle titlebar tabs config option. Something about what we do while setting up the + // titlebar tabs interferes with the window restore process unless window.tabbingMode + // is set to .preferred, so we set it, and switch back to automatic as soon as we can. + tabbingMode = .preferred + DispatchQueue.main.async { + self.tabbingMode = .automatic + } - // MARK: - NSWindow + titlebarTabs = true + + // This should always be true since our super sets this up. + if let derivedConfig { + // Set the background color of the window + backgroundColor = derivedConfig.backgroundColor + + // This makes sure our titlebar renders correctly when there is a transparent background + titlebarColor = derivedConfig.backgroundColor.withAlphaComponent(derivedConfig.backgroundOpacity) + } + } // We only need to set this once, but need to do it after the window has been created in order // to determine if the theme is using a very dark background, in which case we don't want to @@ -145,7 +157,29 @@ class LegacyTerminalWindow: TerminalWindow { } } - // MARK: - Tab Bar Styling + // MARK: Appearance + + override func syncAppearance(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { + super.syncAppearance(surfaceConfig) + + // Update our window light/darkness based on our updated background color + isLightTheme = OSColor(surfaceConfig.backgroundColor).isLightColor + + // Update our titlebar color + if let preferredBackgroundColor { + titlebarColor = preferredBackgroundColor + } else if let derivedConfig { + titlebarColor = derivedConfig.backgroundColor.withAlphaComponent(derivedConfig.backgroundOpacity) + } + + if (isOpaque) { + // If there is transparency, calling this will make the titlebar opaque + // so we only call this if we are opaque. + updateTabBar() + } + } + + // MARK: Tab Bar Styling // This is true if we should apply styles to the titlebar or tab bar. var hasStyledTabs: Bool { @@ -333,6 +367,18 @@ class LegacyTerminalWindow: TerminalWindow { } } + override var title: String { + didSet { + // Updating the title text as above automatically reveals the + // native title view in macOS 15.0 and above. Since we're using + // a custom view instead, we need to re-hide it. + titleVisibility = .hidden + if let toolbar = toolbar as? TerminalToolbar { + toolbar.titleText = title + } + } + } + // We have to regenerate a toolbar when the titlebar tabs setting changes since our // custom toolbar conditionally generates the items based on this setting. I tried to // invalidate the toolbar items and force a refresh, but as far as I can tell that @@ -559,7 +605,7 @@ fileprivate class WindowDragView: NSView { fileprivate class WindowButtonsBackdropView: NSView { // This must be weak because the window has this view. Otherwise // a retain cycle occurs. - private weak var terminalWindow: LegacyTerminalWindow? + private weak var terminalWindow: TitlebarTabsVenturaTerminalWindow? private let isLightTheme: Bool private let overlayLayer = VibrantLayer() @@ -587,7 +633,7 @@ fileprivate class WindowButtonsBackdropView: NSView { fatalError("init(coder:) has not been implemented") } - init(window: LegacyTerminalWindow) { + init(window: TitlebarTabsVenturaTerminalWindow) { self.terminalWindow = window self.isLightTheme = window.isLightTheme diff --git a/macos/Sources/Helpers/Fullscreen.swift b/macos/Sources/Helpers/Fullscreen.swift index 3200608d0..d1dac49a3 100644 --- a/macos/Sources/Helpers/Fullscreen.swift +++ b/macos/Sources/Helpers/Fullscreen.swift @@ -271,8 +271,7 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { // This is a hack that I want to remove from this but for now, we need to // fix up the titlebar tabs here before we do everything below. - if let window = window as? LegacyTerminalWindow, - window.titlebarTabs { + if let window = window as? TitlebarTabsVenturaTerminalWindow, window.titlebarTabs { window.titlebarTabs = true } From 70029bf82ae13cc5697b7961db08fa2178740327 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 13:39:17 -0700 Subject: [PATCH 175/371] macos: tahoe terminal tabs shows title --- .../Terminal/TerminalController.swift | 8 ++-- .../Window Styles/TerminalWindow.swift | 7 ++-- .../TitlebarTabsTahoeTerminalWindow.swift | 42 +++++++++++++++++-- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 977a064e0..848617a53 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -18,7 +18,7 @@ class TerminalController: BaseTerminalController { case "tabs": if #available(macOS 26.0, *) { // TODO: Switch to Tahoe when ready - "TerminalTabsTitlebarVentura" + "TerminalTabsTitlebarTahoe" } else { "TerminalTabsTitlebarVentura" } @@ -409,15 +409,15 @@ class TerminalController: BaseTerminalController { // We need to clear any windows beyond this because they have had // a keyEquivalent set previously. guard tab <= 9 else { - window.keyEquivalent2 = "" + window.keyEquivalent = "" continue } let action = "goto_tab:\(tab)" if let equiv = ghostty.config.keyboardShortcut(for: action) { - window.keyEquivalent2 = "\(equiv)" + window.keyEquivalent = "\(equiv)" } else { - window.keyEquivalent2 = "" + window.keyEquivalent = "" } } } diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index f6b53c289..907e0b250 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -82,17 +82,16 @@ class TerminalWindow: NSWindow { // MARK: Tab Key Equivalents - // TODO: rename once Legacy window removes - var keyEquivalent2: String? = nil { + var keyEquivalent: String? = nil { didSet { // When our key equivalent is set, we must update the tab label. - guard let keyEquivalent2 else { + guard let keyEquivalent else { keyEquivalentLabel.attributedStringValue = NSAttributedString() return } keyEquivalentLabel.attributedStringValue = NSAttributedString( - string: "\(keyEquivalent2) ", + string: "\(keyEquivalent) ", attributes: [ .font: NSFont.systemFont(ofSize: NSFont.smallSystemFontSize), .foregroundColor: isKeyWindow ? NSColor.labelColor : NSColor.secondaryLabelColor, diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift index c45e93d79..a139b1b62 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift @@ -3,6 +3,9 @@ import SwiftUI /// `macos-titlebar-style = tabs` for macOS 26 (Tahoe) and later. class TitlebarTabsTahoeTerminalWindow: TerminalWindow, NSToolbarDelegate { + /// The view model for SwiftUI views + private var viewModel = ViewModel() + override func awakeFromNib() { super.awakeFromNib() @@ -15,7 +18,23 @@ class TitlebarTabsTahoeTerminalWindow: TerminalWindow, NSToolbarDelegate { toolbar.delegate = self toolbar.centeredItemIdentifiers.insert(.title) self.toolbar = toolbar - //toolbarStyle = .unifiedCompact + toolbarStyle = .unifiedCompact + } + + // MARK: NSWindow + + override var title: String { + didSet { + viewModel.title = title + } + } + + override func update() { + super.update() + + if let glass = titlebarContainer?.firstDescendant(withClassName: "NSGlassContainerView") { + glass.isHidden = true + } } // MARK: NSToolbarDelegate @@ -34,7 +53,7 @@ class TitlebarTabsTahoeTerminalWindow: TerminalWindow, NSToolbarDelegate { switch itemIdentifier { case .title: let item = NSToolbarItem(itemIdentifier: .title) - item.view = NSHostingView(rootView: TitleItem()) + item.view = NSHostingView(rootView: TitleItem(viewModel: viewModel)) item.visibilityPriority = .user item.isEnabled = true return item @@ -43,6 +62,11 @@ class TitlebarTabsTahoeTerminalWindow: TerminalWindow, NSToolbarDelegate { } } + // MARK: SwiftUI + + class ViewModel: ObservableObject { + @Published var title: String = "👻 Ghostty" + } } extension NSToolbarItem.Identifier { @@ -51,9 +75,21 @@ extension NSToolbarItem.Identifier { } extension TitlebarTabsTahoeTerminalWindow { + /// Displays the window title struct TitleItem: View { + @ObservedObject var viewModel: ViewModel + + var title: String { + // An empty title makes this view zero-sized and NSToolbar on macOS + // tahoe just deletes the item when that happens. So we use a space + // instead to ensure there's always some size. + viewModel.title.isEmpty ? " " : viewModel.title + } + var body: some View { - Text("HELLO THIS IS A PRETTY LONG TITLE") + Text(title) + .lineLimit(1) + .truncationMode(.tail) } } } From 658ec2eb6f13a7896720a3e95db87d2b808309d6 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 14:33:18 -0700 Subject: [PATCH 176/371] macos: add reset zoom to all window titles --- .../Terminal/BaseTerminalController.swift | 2 + .../Terminal/TerminalController.swift | 4 +- .../Window Styles/TerminalWindow.swift | 62 +++++++++++++++++++ macos/Sources/Helpers/Fullscreen.swift | 12 ++-- 4 files changed, 75 insertions(+), 5 deletions(-) diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 849f13b34..bc91b920e 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -758,6 +758,8 @@ class BaseTerminalController: NSWindowController, } } + func fullscreenDidChange() {} + // MARK: Clipboard Confirmation @objc private func onConfirmClipboardRequest(notification: SwiftUI.Notification) { diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 848617a53..cff230249 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -145,7 +145,9 @@ class TerminalController: BaseTerminalController { } - func fullscreenDidChange() { + override func fullscreenDidChange() { + super.fullscreenDidChange() + // When our fullscreen state changes, we resync our appearance because some // properties change when fullscreen or not. guard let focusedSurface else { return } diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index 907e0b250..4221d9ba4 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -9,6 +9,9 @@ class TerminalWindow: NSWindow { /// used by the manual float on top menu item feature. static let defaultLevelKey: String = "TerminalDefaultLevel" + /// The view model for SwiftUI views + private var viewModel = ViewModel() + /// The configuration derived from the Ghostty config so we don't need to rely on references. private(set) var derivedConfig: DerivedConfig? @@ -19,6 +22,15 @@ class TerminalWindow: NSWindow { // MARK: NSWindow Overrides + override var toolbar: NSToolbar? { + didSet { + DispatchQueue.main.async { + // When we have a toolbar, our SwiftUI view needs to know for layout + self.viewModel.hasToolbar = self.toolbar != nil + } + } + } + override func awakeFromNib() { guard let appDelegate = NSApp.delegate as? AppDelegate else { return } @@ -43,6 +55,18 @@ class TerminalWindow: NSWindow { hideWindowButtons() } + // Create our reset zoom titlebar accessory. + let resetZoomAccessory = NSTitlebarAccessoryViewController() + resetZoomAccessory.layoutAttribute = .right + resetZoomAccessory.view = NSHostingView(rootView: ResetZoomAccessoryView( + viewModel: viewModel, + action: { [weak self] in + guard let self else { return } + self.terminalController?.splitZoom(self) + })) + addTitlebarAccessoryViewController(resetZoomAccessory) + resetZoomAccessory.view.translatesAutoresizingMaskIntoConstraints = false + // Setup the accessory view for tabs that shows our keyboard shortcuts, // zoomed state, etc. Note I tried to use SwiftUI here but ran into issues // where buttons were not clickable. @@ -115,6 +139,10 @@ class TerminalWindow: NSWindow { // Show/hide our reset zoom button depending on if we're zoomed. // We want to show it if we are zoomed. resetZoomTabButton.isHidden = !surfaceIsZoomed + + DispatchQueue.main.async { + self.viewModel.isSurfaceZoomed = self.surfaceIsZoomed + } } } @@ -313,3 +341,37 @@ class TerminalWindow: NSWindow { } } } + +// MARK: SwiftUI View + +extension TerminalWindow { + class ViewModel: ObservableObject { + @Published var isSurfaceZoomed: Bool = false + @Published var hasToolbar: Bool = false + } + + struct ResetZoomAccessoryView: View { + @ObservedObject var viewModel: ViewModel + let action: () -> Void + + var body: some View { + if viewModel.isSurfaceZoomed { + VStack { + Button(action: action) { + Image("ResetZoom") + .foregroundColor(.accentColor) + } + .buttonStyle(.plain) + .help("Reset Split Zoom") + .frame(width: 20, height: 20) + Spacer() + } + // With a toolbar, the window title is taller, so we need more padding + // to properly align. + .padding(.top, viewModel.hasToolbar ? 10 : 5) + // We always need space at the end of the titlebar + .padding(.trailing, 10) + } + } + } +} diff --git a/macos/Sources/Helpers/Fullscreen.swift b/macos/Sources/Helpers/Fullscreen.swift index d1dac49a3..49cab0756 100644 --- a/macos/Sources/Helpers/Fullscreen.swift +++ b/macos/Sources/Helpers/Fullscreen.swift @@ -45,10 +45,6 @@ protocol FullscreenDelegate: AnyObject { func fullscreenDidChange() } -extension FullscreenDelegate { - func fullscreenDidChange() {} -} - /// The base class for fullscreen implementations, cannot be used as a FullscreenStyle on its own. class FullscreenBase { let window: NSWindow @@ -269,6 +265,12 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { window.styleMask = savedState.styleMask window.setFrame(window.frameRect(forContentRect: savedState.contentFrame), display: true) + // Removing the "titled" style also derefs all our accessory view controllers + // so we need to restore those. + for c in savedState.titlebarAccessoryViewControllers { + window.addTitlebarAccessoryViewController(c) + } + // This is a hack that I want to remove from this but for now, we need to // fix up the titlebar tabs here before we do everything below. if let window = window as? TitlebarTabsVenturaTerminalWindow, window.titlebarTabs { @@ -383,6 +385,7 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { let tabGroupIndex: Int? let contentFrame: NSRect let styleMask: NSWindow.StyleMask + let titlebarAccessoryViewControllers: [NSTitlebarAccessoryViewController] let dock: Bool let menu: Bool @@ -394,6 +397,7 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { self.tabGroupIndex = window.tabGroup?.windows.firstIndex(of: window) self.contentFrame = window.convertToScreen(contentView.frame) self.styleMask = window.styleMask + self.titlebarAccessoryViewControllers = window.titlebarAccessoryViewControllers self.dock = window.screen?.hasDock ?? false if let cgWindowId = window.cgWindowId { From de40e7ce028b57dc993fafc3c18be863d52437c1 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 14:36:33 -0700 Subject: [PATCH 177/371] macos: non-native fullscreen should restore toolbars --- macos/Sources/Helpers/Fullscreen.swift | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/macos/Sources/Helpers/Fullscreen.swift b/macos/Sources/Helpers/Fullscreen.swift index 49cab0756..a2294a0af 100644 --- a/macos/Sources/Helpers/Fullscreen.swift +++ b/macos/Sources/Helpers/Fullscreen.swift @@ -271,6 +271,10 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { window.addTitlebarAccessoryViewController(c) } + // Removing "titled" also clears our toolbar + window.toolbar = savedState.toolbar + window.toolbarStyle = savedState.toolbarStyle + // This is a hack that I want to remove from this but for now, we need to // fix up the titlebar tabs here before we do everything below. if let window = window as? TitlebarTabsVenturaTerminalWindow, window.titlebarTabs { @@ -385,6 +389,8 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { let tabGroupIndex: Int? let contentFrame: NSRect let styleMask: NSWindow.StyleMask + let toolbar: NSToolbar? + let toolbarStyle: NSWindow.ToolbarStyle let titlebarAccessoryViewControllers: [NSTitlebarAccessoryViewController] let dock: Bool let menu: Bool @@ -397,6 +403,8 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { self.tabGroupIndex = window.tabGroup?.windows.firstIndex(of: window) self.contentFrame = window.convertToScreen(contentView.frame) self.styleMask = window.styleMask + self.toolbar = window.toolbar + self.toolbarStyle = window.toolbarStyle self.titlebarAccessoryViewControllers = window.titlebarAccessoryViewControllers self.dock = window.screen?.hasDock ?? false From 5c8f1948cecf1c4dc63fb53fae0ef6203dd0d691 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 14:42:08 -0700 Subject: [PATCH 178/371] macos: remove the duplicated reset zoom accessory view from legacy --- .../Terminal/TerminalController.swift | 3 +- .../TitlebarTabsVenturaTerminalWindow.swift | 36 ------------------- 2 files changed, 2 insertions(+), 37 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index cff230249..9fbf154bc 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -18,7 +18,8 @@ class TerminalController: BaseTerminalController { case "tabs": if #available(macOS 26.0, *) { // TODO: Switch to Tahoe when ready - "TerminalTabsTitlebarTahoe" + "TerminalTabsTitlebarVentura" + //"TerminalTabsTitlebarTahoe" } else { "TerminalTabsTitlebarVentura" } diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift index 2f8eb5840..bc6a66a87 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift @@ -6,12 +6,6 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { /// be updated whenever the window background color or surrounding elements changes. fileprivate var isLightTheme: Bool = false - override var surfaceIsZoomed: Bool { - didSet { - updateResetZoomTitlebarButtonVisibility() - } - } - lazy var titlebarColor: NSColor = backgroundColor { didSet { guard let titlebarContainer else { return } @@ -108,8 +102,6 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { } } - updateResetZoomTitlebarButtonVisibility() - // The remainder of this function only applies to styled tabs. guard hasStyledTabs else { return } @@ -277,33 +269,6 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { private lazy var resetZoomToolbarButton: NSButton = generateResetZoomButton() - private lazy var resetZoomTitlebarAccessoryViewController: NSTitlebarAccessoryViewController? = { - guard let titlebarContainer else { return nil } - let size = NSSize(width: titlebarContainer.bounds.height, height: titlebarContainer.bounds.height) - let view = NSView(frame: NSRect(origin: .zero, size: size)) - - let button = generateResetZoomButton() - button.frame.origin.x = size.width/2 - button.bounds.width/2 - button.frame.origin.y = size.height/2 - button.bounds.height/2 - view.addSubview(button) - - let titlebarAccessoryViewController = NSTitlebarAccessoryViewController() - titlebarAccessoryViewController.view = view - titlebarAccessoryViewController.layoutAttribute = .right - - return titlebarAccessoryViewController - }() - - private func updateResetZoomTitlebarButtonVisibility() { - guard let tabGroup, let resetZoomTitlebarAccessoryViewController else { return } - - if !titlebarAccessoryViewControllers.contains(resetZoomTitlebarAccessoryViewController) { - addTitlebarAccessoryViewController(resetZoomTitlebarAccessoryViewController) - } - - resetZoomTitlebarAccessoryViewController.view.isHidden = tabGroup.isTabBarVisible ? true : !surfaceIsZoomed - } - private func generateResetZoomButton() -> NSButton { let button = NSButton() button.target = nil @@ -394,7 +359,6 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { resetZoomItem.view!.widthAnchor.constraint(equalToConstant: 22).isActive = true resetZoomItem.view!.heightAnchor.constraint(equalToConstant: 20).isActive = true } - updateResetZoomTitlebarButtonVisibility() } // For titlebar tabs, we want to hide the separator view so that we get rid From 6ae8bd737ae63bb15ba796512319632054248e21 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 15:11:35 -0700 Subject: [PATCH 179/371] macos: hide the reset zoom titlebar accessory when tab bar is shown --- .../Window Styles/TerminalWindow.swift | 23 ++++++++++++++++++- .../Helpers/Extensions/Array+Extension.swift | 4 ++++ .../Helpers/Extensions/NSView+Extension.swift | 17 +++++++++++++- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index 4221d9ba4..fe7293d5b 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -104,6 +104,26 @@ class TerminalWindow: NSWindow { } } + override func addTitlebarAccessoryViewController(_ childViewController: NSTitlebarAccessoryViewController) { + super.addTitlebarAccessoryViewController(childViewController) + + // Tab bar is attached as a titlebar accessory view controller (layout bottom). We + // can detect when it is shown or hidden by overriding add/remove and searching for + // it. This has been verified to work on macOS 12 to 26 + if childViewController.view.contains(className: "NSTabBar") { + viewModel.hasTabBar = true + } + } + + override func removeTitlebarAccessoryViewController(at index: Int) { + if let childViewController = titlebarAccessoryViewControllers[safe: index], + childViewController.view.contains(className: "NSTabBar") { + viewModel.hasTabBar = false + } + + super.removeTitlebarAccessoryViewController(at: index) + } + // MARK: Tab Key Equivalents var keyEquivalent: String? = nil { @@ -348,6 +368,7 @@ extension TerminalWindow { class ViewModel: ObservableObject { @Published var isSurfaceZoomed: Bool = false @Published var hasToolbar: Bool = false + @Published var hasTabBar: Bool = false } struct ResetZoomAccessoryView: View { @@ -355,7 +376,7 @@ extension TerminalWindow { let action: () -> Void var body: some View { - if viewModel.isSurfaceZoomed { + if viewModel.isSurfaceZoomed && !viewModel.hasTabBar { VStack { Button(action: action) { Image("ResetZoom") diff --git a/macos/Sources/Helpers/Extensions/Array+Extension.swift b/macos/Sources/Helpers/Extensions/Array+Extension.swift index 6f005a349..12f2de43d 100644 --- a/macos/Sources/Helpers/Extensions/Array+Extension.swift +++ b/macos/Sources/Helpers/Extensions/Array+Extension.swift @@ -1,4 +1,8 @@ extension Array { + subscript(safe index: Int) -> Element? { + return indices.contains(index) ? self[index] : nil + } + /// Returns the index before i, with wraparound. Assumes i is a valid index. func indexWrapping(before i: Int) -> Int { if i == 0 { diff --git a/macos/Sources/Helpers/Extensions/NSView+Extension.swift b/macos/Sources/Helpers/Extensions/NSView+Extension.swift index b958130f1..0da84abda 100644 --- a/macos/Sources/Helpers/Extensions/NSView+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSView+Extension.swift @@ -42,6 +42,21 @@ extension NSView { return false } + /// Checks if the view contains the given class in its hierarchy. + func contains(className name: String) -> Bool { + if String(describing: type(of: self)) == name { + return true + } + + for subview in subviews { + if subview.contains(className: name) { + return true + } + } + + return false + } + /// Recursively finds and returns the first descendant view that has the given class name. func firstDescendant(withClassName name: String) -> NSView? { for subview in subviews { @@ -113,7 +128,7 @@ extension NSView { } /// Returns a string representation of the view hierarchy in a tree-like format. - private func viewHierarchyDescription(indent: String = "", isLast: Bool = true) -> String { + func viewHierarchyDescription(indent: String = "", isLast: Bool = true) -> String { var result = "" // Add the tree branch characters From 5f9967024744827314535026221565763fd4791d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 16:37:26 -0700 Subject: [PATCH 180/371] macos: tahoe titlebar tabs taking shape --- .../Terminal/TerminalController.swift | 4 +- .../Window Styles/TerminalWindow.swift | 36 +++++- .../TitlebarTabsTahoeTerminalWindow.swift | 106 ++++++++++++++++-- .../Helpers/Extensions/NSView+Extension.swift | 10 ++ 4 files changed, 142 insertions(+), 14 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 9fbf154bc..0b0b264d3 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -18,8 +18,8 @@ class TerminalController: BaseTerminalController { case "tabs": if #available(macOS 26.0, *) { // TODO: Switch to Tahoe when ready - "TerminalTabsTitlebarVentura" - //"TerminalTabsTitlebarTahoe" + //"TerminalTabsTitlebarVentura" + "TerminalTabsTitlebarTahoe" } else { "TerminalTabsTitlebarVentura" } diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index fe7293d5b..032886802 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -110,20 +110,50 @@ class TerminalWindow: NSWindow { // Tab bar is attached as a titlebar accessory view controller (layout bottom). We // can detect when it is shown or hidden by overriding add/remove and searching for // it. This has been verified to work on macOS 12 to 26 - if childViewController.view.contains(className: "NSTabBar") { + if isTabBar(childViewController) { + childViewController.identifier = Self.tabBarIdentifier viewModel.hasTabBar = true } } override func removeTitlebarAccessoryViewController(at index: Int) { - if let childViewController = titlebarAccessoryViewControllers[safe: index], - childViewController.view.contains(className: "NSTabBar") { + if let childViewController = titlebarAccessoryViewControllers[safe: index], isTabBar(childViewController) { viewModel.hasTabBar = false } super.removeTitlebarAccessoryViewController(at: index) } + // MARK: Tab Bar + + /// This identifier is attached to the tab bar view controller when we detect it being + /// added. + private static let tabBarIdentifier: NSUserInterfaceItemIdentifier = .init("_ghosttyTabBar") + + func isTabBar(_ childViewController: NSTitlebarAccessoryViewController) -> Bool { + if childViewController.identifier == nil { + // The good case + if childViewController.view.contains(className: "NSTabBar") { + return true + } + + // When a new window is attached to an existing tab group, AppKit adds + // an empty NSView as an accessory view and adds the tab bar later. If + // we're at the bottom and are a single NSView we assume its a tab bar. + if childViewController.layoutAttribute == .bottom && + childViewController.view.className == "NSView" && + childViewController.view.subviews.isEmpty { + return true + } + + return false + } + + // View controllers should be tagged with this as soon as possible to + // increase our accuracy. We do this manually. + return childViewController.identifier == Self.tabBarIdentifier + } + // MARK: Tab Key Equivalents var keyEquivalent: String? = nil { diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift index a139b1b62..42bcabee7 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift @@ -20,7 +20,6 @@ class TitlebarTabsTahoeTerminalWindow: TerminalWindow, NSToolbarDelegate { self.toolbar = toolbar toolbarStyle = .unifiedCompact } - // MARK: NSWindow override var title: String { @@ -29,11 +28,92 @@ class TitlebarTabsTahoeTerminalWindow: TerminalWindow, NSToolbarDelegate { } } - override func update() { - super.update() + override var toolbar: NSToolbar? { + didSet{ + guard toolbar != nil else { return } - if let glass = titlebarContainer?.firstDescendant(withClassName: "NSGlassContainerView") { - glass.isHidden = true + // When a toolbar is added, remove the Liquid Glass look because we're + // abusing the toolbar as a tab bar. + if let glass = titlebarContainer?.firstDescendant(withClassName: "NSGlassContainerView") { + glass.isHidden = true + } + } + } + + override func becomeMain() { + super.becomeMain() + DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) { + self.contentView?.printViewHierarchy() + } + } + + // This is called by macOS for native tabbing in order to add the tab bar. We hook into + // this, detect the tab bar being added, and override its behavior. + override func addTitlebarAccessoryViewController(_ childViewController: NSTitlebarAccessoryViewController) { + // If this is the tab bar then we need to set it up for the titlebar + guard isTabBar(childViewController) else { + super.addTitlebarAccessoryViewController(childViewController) + return + } + + // Some setup needs to happen BEFORE it is added, such as layout. If + // we don't do this before the call below, we'll trigger an AppKit + // assertion. + childViewController.layoutAttribute = .right + + super.addTitlebarAccessoryViewController(childViewController) + + // View model updates must happen on their own ticks + DispatchQueue.main.async { + self.viewModel.hasTabBar = true + } + + // Setup the tab bar to go into the titlebar. + DispatchQueue.main.async { + // HACK: wait a tick before doing anything, to avoid edge cases during startup... :/ + // If we don't do this then on launch windows with restored state with tabs will end + // up with messed up tab bars that don't show all tabs. + let accessoryView = childViewController.view + guard let clipView = accessoryView.firstSuperview(withClassName: "NSTitlebarAccessoryClipView") else { return } + guard let titlebarView = clipView.firstSuperview(withClassName: "NSTitlebarView") else { return } + guard let toolbarView = titlebarView.firstDescendant(withClassName: "NSToolbarView") else { return } + + // The container is the view that we'll constrain our tab bar within. + let container = toolbarView + + // Constrain the accessory clip view (the parent of the accessory view + // usually that clips the children) to the container view. + clipView.translatesAutoresizingMaskIntoConstraints = false + clipView.leftAnchor.constraint(equalTo: container.leftAnchor, constant: 78).isActive = true + clipView.rightAnchor.constraint(equalTo: container.rightAnchor).isActive = true + clipView.topAnchor.constraint(equalTo: container.topAnchor).isActive = true + clipView.heightAnchor.constraint(equalTo: container.heightAnchor).isActive = true + clipView.needsLayout = true + + // Constrain the actual accessory view (the tab bar) to the clip view + // so it takes up the full space. + accessoryView.translatesAutoresizingMaskIntoConstraints = false + accessoryView.leftAnchor.constraint(equalTo: clipView.leftAnchor).isActive = true + accessoryView.rightAnchor.constraint(equalTo: clipView.rightAnchor).isActive = true + accessoryView.topAnchor.constraint(equalTo: clipView.topAnchor).isActive = true + accessoryView.heightAnchor.constraint(equalTo: clipView.heightAnchor).isActive = true + accessoryView.needsLayout = true + } + } + + override func removeTitlebarAccessoryViewController(at index: Int) { + guard let childViewController = titlebarAccessoryViewControllers[safe: index], + isTabBar(childViewController) else { + super.removeTitlebarAccessoryViewController(at: index) + return + } + + super.removeTitlebarAccessoryViewController(at: index) + + // View model needs to be updated on another tick because it + // triggers view updates. + DispatchQueue.main.async { + self.viewModel.hasTabBar = false } } @@ -66,6 +146,7 @@ class TitlebarTabsTahoeTerminalWindow: TerminalWindow, NSToolbarDelegate { class ViewModel: ObservableObject { @Published var title: String = "👻 Ghostty" + @Published var hasTabBar: Bool = false } } @@ -83,13 +164,20 @@ extension TitlebarTabsTahoeTerminalWindow { // An empty title makes this view zero-sized and NSToolbar on macOS // tahoe just deletes the item when that happens. So we use a space // instead to ensure there's always some size. - viewModel.title.isEmpty ? " " : viewModel.title + return viewModel.title.isEmpty ? " " : viewModel.title } var body: some View { - Text(title) - .lineLimit(1) - .truncationMode(.tail) + if !viewModel.hasTabBar { + Text(title) + .lineLimit(1) + .truncationMode(.tail) + } else { + // 1x1.gif strikes again! For real: if we render a zero-sized + // view here then the toolbar just disappears our view. I don't + // know. + Color.clear.frame(width: 1, height: 1) + } } } } diff --git a/macos/Sources/Helpers/Extensions/NSView+Extension.swift b/macos/Sources/Helpers/Extensions/NSView+Extension.swift index 0da84abda..b3628d406 100644 --- a/macos/Sources/Helpers/Extensions/NSView+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSView+Extension.swift @@ -57,6 +57,16 @@ extension NSView { return false } + /// Finds the superview with the given class name. + func firstSuperview(withClassName name: String) -> NSView? { + guard let superview else { return nil } + if String(describing: type(of: superview)) == name { + return superview + } + + return superview.firstSuperview(withClassName: name) + } + /// Recursively finds and returns the first descendant view that has the given class name. func firstDescendant(withClassName name: String) -> NSView? { for subview in subviews { From d84c30ce71546efc36e671beac1febf5b2a92875 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 18:10:25 -0700 Subject: [PATCH 181/371] macos: titlebar tabs should be transparent --- .../Window Styles/TitlebarTabsTahoeTerminalWindow.swift | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift index 42bcabee7..ca88322ed 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift @@ -2,7 +2,10 @@ import AppKit import SwiftUI /// `macos-titlebar-style = tabs` for macOS 26 (Tahoe) and later. -class TitlebarTabsTahoeTerminalWindow: TerminalWindow, NSToolbarDelegate { +/// +/// This inherits from transparent styling so that the titlebar matches the background color +/// of the window. +class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSToolbarDelegate { /// The view model for SwiftUI views private var viewModel = ViewModel() From 9d9c451b0a893c35c29ba453722cfb337d73817a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 20:03:19 -0700 Subject: [PATCH 182/371] macos: titlebar tabs handle hidden traffic buttons --- .../Terminal/Window Styles/TerminalWindow.swift | 9 ++++++--- .../TitlebarTabsTahoeTerminalWindow.swift | 11 +++++++++-- .../TitlebarTabsVenturaTerminalWindow.swift | 13 +++++-------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index 032886802..d9b98695e 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -13,7 +13,7 @@ class TerminalWindow: NSWindow { private var viewModel = ViewModel() /// The configuration derived from the Ghostty config so we don't need to rely on references. - private(set) var derivedConfig: DerivedConfig? + private(set) var derivedConfig: DerivedConfig = .init() /// Gets the terminal controller from the window controller. var terminalController: TerminalController? { @@ -341,8 +341,8 @@ class TerminalWindow: NSWindow { } } - let alpha = derivedConfig?.backgroundOpacity.clamped(to: 0.001...1) ?? 1 - return derivedConfig?.backgroundColor.withAlphaComponent(alpha) + let alpha = derivedConfig.backgroundOpacity.clamped(to: 0.001...1) + return derivedConfig.backgroundColor.withAlphaComponent(alpha) } private func setInitialWindowPosition(x: Int16?, y: Int16?, windowDecorations: Bool) { @@ -379,15 +379,18 @@ class TerminalWindow: NSWindow { struct DerivedConfig { let backgroundColor: NSColor let backgroundOpacity: Double + let macosWindowButtons: Ghostty.MacOSWindowButtons init() { self.backgroundColor = NSColor.windowBackgroundColor self.backgroundOpacity = 1 + self.macosWindowButtons = .visible } init(_ config: Ghostty.Config) { self.backgroundColor = NSColor(config.backgroundColor) self.backgroundOpacity = config.backgroundOpacity + self.macosWindowButtons = config.macosWindowButtons } } } diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift index ca88322ed..3dc505088 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift @@ -84,12 +84,19 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool // The container is the view that we'll constrain our tab bar within. let container = toolbarView + // The padding for the tab bar. If we're showing window buttons then + // we need to offset the window buttons. + let leftPadding: CGFloat = switch(self.derivedConfig.macosWindowButtons) { + case .hidden: 0 + case .visible: 70 + } + // Constrain the accessory clip view (the parent of the accessory view // usually that clips the children) to the container view. clipView.translatesAutoresizingMaskIntoConstraints = false - clipView.leftAnchor.constraint(equalTo: container.leftAnchor, constant: 78).isActive = true + clipView.leftAnchor.constraint(equalTo: container.leftAnchor, constant: leftPadding).isActive = true clipView.rightAnchor.constraint(equalTo: container.rightAnchor).isActive = true - clipView.topAnchor.constraint(equalTo: container.topAnchor).isActive = true + clipView.topAnchor.constraint(equalTo: container.topAnchor, constant: 2).isActive = true clipView.heightAnchor.constraint(equalTo: container.heightAnchor).isActive = true clipView.needsLayout = true diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift index bc6a66a87..6e19d144d 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift @@ -40,14 +40,11 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { titlebarTabs = true - // This should always be true since our super sets this up. - if let derivedConfig { - // Set the background color of the window - backgroundColor = derivedConfig.backgroundColor + // Set the background color of the window + backgroundColor = derivedConfig.backgroundColor - // This makes sure our titlebar renders correctly when there is a transparent background - titlebarColor = derivedConfig.backgroundColor.withAlphaComponent(derivedConfig.backgroundOpacity) - } + // This makes sure our titlebar renders correctly when there is a transparent background + titlebarColor = derivedConfig.backgroundColor.withAlphaComponent(derivedConfig.backgroundOpacity) } // We only need to set this once, but need to do it after the window has been created in order @@ -160,7 +157,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { // Update our titlebar color if let preferredBackgroundColor { titlebarColor = preferredBackgroundColor - } else if let derivedConfig { + } else { titlebarColor = derivedConfig.backgroundColor.withAlphaComponent(derivedConfig.backgroundOpacity) } From 17ad77b5b0b7b7ead22bcfda11c9250d064d408d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 12 Jun 2025 21:33:40 -0700 Subject: [PATCH 183/371] macos: fix background color of terminal window to match surface --- .../Window Styles/TerminalWindow.swift | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index d9b98695e..a1bb1d86d 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -322,22 +322,23 @@ class TerminalWindow: NSWindow { /// change the alpha channel again manually. var preferredBackgroundColor: NSColor? { if let terminalController, !terminalController.surfaceTree.isEmpty { + let surface: Ghostty.SurfaceView? + // If our focused surface borders the top then we prefer its background color if let focusedSurface = terminalController.focusedSurface, let treeRoot = terminalController.surfaceTree.root, let focusedNode = treeRoot.node(view: focusedSurface), - treeRoot.spatial().doesBorder(side: .up, from: focusedNode), - let backgroundcolor = focusedSurface.backgroundColor { - let alpha = focusedSurface.derivedConfig.backgroundOpacity.clamped(to: 0.001...1) - return NSColor(backgroundcolor).withAlphaComponent(alpha) + treeRoot.spatial().doesBorder(side: .up, from: focusedNode) { + surface = focusedSurface + } else { + // If it doesn't border the top, we use the top-left leaf + surface = terminalController.surfaceTree.root?.leftmostLeaf() } - // Doesn't border the top or we don't have a focused surface, so - // we try to match the top-left surface. - let topLeftSurface = terminalController.surfaceTree.root?.leftmostLeaf() - if let topLeftBgColor = topLeftSurface?.backgroundColor { - let alpha = topLeftSurface?.derivedConfig.backgroundOpacity.clamped(to: 0.001...1) ?? 1 - return NSColor(topLeftBgColor).withAlphaComponent(alpha) + if let surface { + let backgroundColor = surface.backgroundColor ?? surface.derivedConfig.backgroundColor + let alpha = surface.derivedConfig.backgroundOpacity.clamped(to: 0.001...1) + return NSColor(backgroundColor).withAlphaComponent(alpha) } } From 8824d11e1c8d0a3cbafeb0e88dd1b6dd7fa645d0 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Sat, 24 May 2025 17:01:06 -0500 Subject: [PATCH 184/371] linux: add dbus and systemd activation services --- dist/linux/app.desktop | 5 ++++- dist/linux/dbus.service | 4 ++++ dist/linux/systemd.service | 7 +++++++ nix/package.nix | 5 +++++ src/apprt/gtk/App.zig | 23 ++++++++++++++++++++--- src/apprt/gtk/Surface.zig | 9 +++++++++ src/build/GhosttyResources.zig | 10 ++++++++++ 7 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 dist/linux/dbus.service create mode 100644 dist/linux/systemd.service diff --git a/dist/linux/app.desktop b/dist/linux/app.desktop index 6e464ea87..bb25eec65 100644 --- a/dist/linux/app.desktop +++ b/dist/linux/app.desktop @@ -1,8 +1,10 @@ [Desktop Entry] +Version=1.0 Name=Ghostty Type=Application Comment=A terminal emulator -Exec=ghostty +TryExec=ghostty +Exec=ghostty %F Icon=com.mitchellh.ghostty Categories=System;TerminalEmulator; Keywords=terminal;tty;pty; @@ -16,6 +18,7 @@ X-TerminalArgTitle=--title= X-TerminalArgAppId=--class= X-TerminalArgDir=--working-directory= X-TerminalArgHold=--wait-after-command +DBusActivatable=true [Desktop Action new-window] Name=New Window diff --git a/dist/linux/dbus.service b/dist/linux/dbus.service new file mode 100644 index 000000000..4d508d168 --- /dev/null +++ b/dist/linux/dbus.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=com.mitchellh.ghostty +SystemdService=com.mitchellh.ghostty.service +Exec=ghostty diff --git a/dist/linux/systemd.service b/dist/linux/systemd.service new file mode 100644 index 000000000..dcc354eff --- /dev/null +++ b/dist/linux/systemd.service @@ -0,0 +1,7 @@ +[Unit] +Description=Ghostty + +[Service] +Type=dbus +BusName=com.mitchellh.ghostty +ExecStart=ghostty diff --git a/nix/package.nix b/nix/package.nix index 08dfd710b..9b793bc4b 100644 --- a/nix/package.nix +++ b/nix/package.nix @@ -117,6 +117,11 @@ in mkdir -p "$out/nix-support" + sed -i -e "s@^Exec=.*ghostty@Exec=$out/bin/ghostty@" $out/share/applications/com.mitchellh.ghostty.desktop + sed -i -e "s@^TryExec=.*ghostty@TryExec=$out/bin/ghostty@" $out/share/applications/com.mitchellh.ghostty.desktop + sed -i -e "s@^Exec=.*ghostty@Exec=$out/bin/ghostty@" $out/share/dbus-1/services/com.mitchellh.ghostty.service + sed -i -e "s@^ExecStart=.*ghostty@ExecStart=$out/bin/ghostty@" $out/lib/systemd/user/com.mitchellh.ghostty.service + mkdir -p "$terminfo/share" mv "$terminfo_src" "$terminfo/share/terminfo" ln -sf "$terminfo/share/terminfo" "$terminfo_src" diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 099a051a4..f431c0594 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -400,11 +400,15 @@ pub fn init(core_app: *CoreApp, opts: Options) !App { // This just calls the `activate` signal but its part of the normal startup // routine so we just call it, but only if the config allows it (this allows // for launching Ghostty in the "background" without immediately opening - // a window) + // a window). An initial window will not be immediately created if we were + // launched by D-Bus activation or systemd. D-Bus activation will send it's + // own `activate` or `new-window` signal later. // // https://gitlab.gnome.org/GNOME/glib/-/blob/bd2ccc2f69ecfd78ca3f34ab59e42e2b462bad65/gio/gapplication.c#L2302 - if (config.@"initial-window") - gio_app.activate(); + if (config.@"initial-window") switch (config.@"launched-from".?) { + .dbus, .systemd => {}, + else => gio_app.activate(), + }; // Internally, GTK ensures that only one instance of this provider exists in the provider list // for the display. @@ -1678,6 +1682,17 @@ fn gtkActionShowGTKInspector( }; } +fn gtkActionNewWindow( + _: *gio.SimpleAction, + _: ?*glib.Variant, + self: *App, +) callconv(.c) void { + log.info("received new window action", .{}); + _ = self.core_app.mailbox.push(.{ + .new_window = .{}, + }, .{ .forever = {} }); +} + /// This is called to setup the action map that this application supports. /// This should be called only once on startup. fn initActions(self: *App) void { @@ -1697,7 +1712,9 @@ fn initActions(self: *App) void { .{ "reload-config", gtkActionReloadConfig, null }, .{ "present-surface", gtkActionPresentSurface, t }, .{ "show-gtk-inspector", gtkActionShowGTKInspector, null }, + .{ "new-window", gtkActionNewWindow, null }, }; + inline for (actions) |entry| { const action = gio.SimpleAction.new(entry[0], entry[2]); defer action.unref(); diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 1e5b1bfe8..6c3101c3a 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -2325,6 +2325,15 @@ pub fn defaultTermioEnv(self: *Surface) !std.process.EnvMap { env.remove("GDK_DISABLE"); env.remove("GSK_RENDERER"); + // Remove some environment variables that are set when Ghostty is launched + // from a `.desktop` file, by D-Bus activation, or systemd. + env.remove("GIO_LAUNCHED_DESKTOP_FILE"); + env.remove("GIO_LAUNCHED_DESKTOP_FILE_PID"); + env.remove("DBUS_STARTER_ADDRESS"); + env.remove("DBUS_STARTER_BUS_TYPE"); + env.remove("INVOCATION_ID"); + env.remove("JOURNAL_STREAM"); + // Unset environment varies set by snaps if we're running in a snap. // This allows Ghostty to further launch additional snaps. if (env.get("SNAP")) |_| { diff --git a/src/build/GhosttyResources.zig b/src/build/GhosttyResources.zig index 3d6b99a34..13ceeaac3 100644 --- a/src/build/GhosttyResources.zig +++ b/src/build/GhosttyResources.zig @@ -201,6 +201,16 @@ pub fn init(b: *std.Build, cfg: *const Config) !GhosttyResources { b.path("dist/linux/app.desktop"), "share/applications/com.mitchellh.ghostty.desktop", ).step); + // DBus service for DBus activation + try steps.append(&b.addInstallFile( + b.path("dist/linux/dbus.service"), + "share/dbus-1/services/com.mitchellh.ghostty.service", + ).step); + // systemd user service + try steps.append(&b.addInstallFile( + b.path("dist/linux/systemd.service"), + "lib/systemd/user/com.mitchellh.ghostty.service", + ).step); // AppStream metainfo so that application has rich metadata within app stores try steps.append(&b.addInstallFile( From 649cca61ebb4fcfaca4fa99e988fbc2177d0a047 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 2 Jun 2025 14:37:03 -0500 Subject: [PATCH 185/371] gtk: use exhaustive switch for initial-window --- src/apprt/gtk/App.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index f431c0594..7aff9e1d2 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -406,8 +406,8 @@ pub fn init(core_app: *CoreApp, opts: Options) !App { // // https://gitlab.gnome.org/GNOME/glib/-/blob/bd2ccc2f69ecfd78ca3f34ab59e42e2b462bad65/gio/gapplication.c#L2302 if (config.@"initial-window") switch (config.@"launched-from".?) { + .desktop, .cli => gio_app.activate(), .dbus, .systemd => {}, - else => gio_app.activate(), }; // Internally, GTK ensures that only one instance of this provider exists in the provider list From 57392dfcb5509f6960dc0e5055a242a87da7be34 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 2 Jun 2025 14:38:58 -0500 Subject: [PATCH 186/371] linux: use explicit launched-from config in service files --- dist/linux/app.desktop | 2 +- dist/linux/dbus.service | 2 +- dist/linux/systemd.service | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/linux/app.desktop b/dist/linux/app.desktop index bb25eec65..b3f2d0d66 100644 --- a/dist/linux/app.desktop +++ b/dist/linux/app.desktop @@ -4,7 +4,7 @@ Name=Ghostty Type=Application Comment=A terminal emulator TryExec=ghostty -Exec=ghostty %F +Exec=ghostty --launched-from=desktop Icon=com.mitchellh.ghostty Categories=System;TerminalEmulator; Keywords=terminal;tty;pty; diff --git a/dist/linux/dbus.service b/dist/linux/dbus.service index 4d508d168..67a80d5dd 100644 --- a/dist/linux/dbus.service +++ b/dist/linux/dbus.service @@ -1,4 +1,4 @@ [D-BUS Service] Name=com.mitchellh.ghostty SystemdService=com.mitchellh.ghostty.service -Exec=ghostty +Exec=ghostty --launched-from=dbus diff --git a/dist/linux/systemd.service b/dist/linux/systemd.service index dcc354eff..9699dccdf 100644 --- a/dist/linux/systemd.service +++ b/dist/linux/systemd.service @@ -4,4 +4,4 @@ Description=Ghostty [Service] Type=dbus BusName=com.mitchellh.ghostty -ExecStart=ghostty +ExecStart=ghostty --launched-from=systemd From e5c737a423ef373aa94762476445ac9071fad989 Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 2 Jun 2025 15:24:32 -0500 Subject: [PATCH 187/371] linux: use launched-from for new window action --- dist/linux/app.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/linux/app.desktop b/dist/linux/app.desktop index b3f2d0d66..4475617f9 100644 --- a/dist/linux/app.desktop +++ b/dist/linux/app.desktop @@ -22,4 +22,4 @@ DBusActivatable=true [Desktop Action new-window] Name=New Window -Exec=ghostty +Exec=ghostty --launched-from=desktop From c1d04a61759d04f6adcff22bad3455d095b96c7c Mon Sep 17 00:00:00 2001 From: "Jeffrey C. Ollie" Date: Mon, 2 Jun 2025 15:42:22 -0500 Subject: [PATCH 188/371] gtk: document effect of changing the class on launching Ghostty --- src/config/Config.zig | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/config/Config.zig b/src/config/Config.zig index 2df66ba45..e4222583b 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -894,12 +894,17 @@ title: ?[:0]const u8 = null, /// The setting that will change the application class value. /// /// This controls the class field of the `WM_CLASS` X11 property (when running -/// under X11), and the Wayland application ID (when running under Wayland). +/// under X11), the Wayland application ID (when running under Wayland), and the +/// bus name that Ghostty uses to connect to DBus. /// /// Note that changing this value between invocations will create new, separate /// instances, of Ghostty when running with `gtk-single-instance=true`. See that /// option for more details. /// +/// Changing this value may break launching Ghostty from `.desktop` files, via +/// DBus activation, or systemd user services as the system is expecting Ghostty +/// to connect to DBus using the default `class` when it is launched. +/// /// The class name must follow the requirements defined [in the GTK /// documentation](https://docs.gtk.org/gio/type_func.Application.id_is_valid.html). /// From 00d41239dad768d903790b86d56bd8a3bb1de82b Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 11:11:00 -0700 Subject: [PATCH 189/371] macOS: prep the tab bar when system appearance changes --- .../TitlebarTabsTahoeTerminalWindow.swift | 182 +++++++++++++----- 1 file changed, 129 insertions(+), 53 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift index 3dc505088..ac4fae12a 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift @@ -9,20 +9,10 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool /// The view model for SwiftUI views private var viewModel = ViewModel() - override func awakeFromNib() { - super.awakeFromNib() - - // We must hide the title since we're going to be moving tabs into - // the titlebar which have their own title. - titleVisibility = .hidden - - // Create a toolbar - let toolbar = NSToolbar(identifier: "TerminalToolbar") - toolbar.delegate = self - toolbar.centeredItemIdentifiers.insert(.title) - self.toolbar = toolbar - toolbarStyle = .unifiedCompact + deinit { + tabBarObserver = nil } + // MARK: NSWindow override var title: String { @@ -43,11 +33,27 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool } } + override func awakeFromNib() { + super.awakeFromNib() + + // We must hide the title since we're going to be moving tabs into + // the titlebar which have their own title. + titleVisibility = .hidden + + // Create a toolbar + let toolbar = NSToolbar(identifier: "TerminalToolbar") + toolbar.delegate = self + toolbar.centeredItemIdentifiers.insert(.title) + self.toolbar = toolbar + toolbarStyle = .unifiedCompact + } + override func becomeMain() { super.becomeMain() - DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2)) { - self.contentView?.printViewHierarchy() - } + + // Check if we have a tab bar and set it up if we have to. See the comment + // on this function to learn why we need to check this here. + setupTabBar() } // This is called by macOS for native tabbing in order to add the tab bar. We hook into @@ -66,48 +72,12 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool super.addTitlebarAccessoryViewController(childViewController) - // View model updates must happen on their own ticks - DispatchQueue.main.async { - self.viewModel.hasTabBar = true - } - // Setup the tab bar to go into the titlebar. DispatchQueue.main.async { // HACK: wait a tick before doing anything, to avoid edge cases during startup... :/ // If we don't do this then on launch windows with restored state with tabs will end // up with messed up tab bars that don't show all tabs. - let accessoryView = childViewController.view - guard let clipView = accessoryView.firstSuperview(withClassName: "NSTitlebarAccessoryClipView") else { return } - guard let titlebarView = clipView.firstSuperview(withClassName: "NSTitlebarView") else { return } - guard let toolbarView = titlebarView.firstDescendant(withClassName: "NSToolbarView") else { return } - - // The container is the view that we'll constrain our tab bar within. - let container = toolbarView - - // The padding for the tab bar. If we're showing window buttons then - // we need to offset the window buttons. - let leftPadding: CGFloat = switch(self.derivedConfig.macosWindowButtons) { - case .hidden: 0 - case .visible: 70 - } - - // Constrain the accessory clip view (the parent of the accessory view - // usually that clips the children) to the container view. - clipView.translatesAutoresizingMaskIntoConstraints = false - clipView.leftAnchor.constraint(equalTo: container.leftAnchor, constant: leftPadding).isActive = true - clipView.rightAnchor.constraint(equalTo: container.rightAnchor).isActive = true - clipView.topAnchor.constraint(equalTo: container.topAnchor, constant: 2).isActive = true - clipView.heightAnchor.constraint(equalTo: container.heightAnchor).isActive = true - clipView.needsLayout = true - - // Constrain the actual accessory view (the tab bar) to the clip view - // so it takes up the full space. - accessoryView.translatesAutoresizingMaskIntoConstraints = false - accessoryView.leftAnchor.constraint(equalTo: clipView.leftAnchor).isActive = true - accessoryView.rightAnchor.constraint(equalTo: clipView.rightAnchor).isActive = true - accessoryView.topAnchor.constraint(equalTo: clipView.topAnchor).isActive = true - accessoryView.heightAnchor.constraint(equalTo: clipView.heightAnchor).isActive = true - accessoryView.needsLayout = true + self.setupTabBar() } } @@ -120,11 +90,117 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool super.removeTitlebarAccessoryViewController(at: index) + removeTabBar() + } + + // MARK: Tab Bar Setup + + private var tabBarObserver: NSObjectProtocol? { + didSet { + // When we change this we want to clear our old observer + guard let oldValue else { return } + NotificationCenter.default.removeObserver(oldValue) + } + } + + /// Take the NSTabBar that is on the window and convert it into titlebar tabs. + /// + /// Let me explain more background on what is happening here. When a tab bar is created, only the + /// main window actually has an NSTabBar. When an NSWindow in the tab group gains main, AppKit + /// creates/moves (unsure which) the NSTabBar for it and shows it. When it loses main, the tab bar + /// is removed from the view hierarchy. + /// + /// We can't detect this via `addTitlebarAccessoryViewController` because AppKit + /// _always_ creates an accessory view controller for every window in the tab group, but puts a + /// zero-sized NSView into it (that the tab bar is then attached to later). + /// + /// The best way I've found to detect this is to search for and setup the tab bar anytime the + /// window gains focus. There are probably edge cases to check but to resolve all this I made + /// this function which is idempotent to call. + /// + /// There are more scenarios to look out for and they're documented within the method. + func setupTabBar() { + // We only want to setup the observer once + guard tabBarObserver == nil else { return } + + // Find our tab bar. If it doesn't exist we don't do anything. + guard let tabBar = contentView?.rootView.firstDescendant(withClassName: "NSTabBar") else { return } + + // View model updates must happen on their own ticks. + DispatchQueue.main.async { + self.viewModel.hasTabBar = true + } + + // Find our clip view + guard let clipView = tabBar.firstSuperview(withClassName: "NSTitlebarAccessoryClipView") else { return } + guard let accessoryView = clipView.subviews[safe: 0] else { return } + guard let titlebarView = clipView.firstSuperview(withClassName: "NSTitlebarView") else { return } + guard let toolbarView = titlebarView.firstDescendant(withClassName: "NSToolbarView") else { return } + + // The container is the view that we'll constrain our tab bar within. + let container = toolbarView + + // The padding for the tab bar. If we're showing window buttons then + // we need to offset the window buttons. + let leftPadding: CGFloat = switch(self.derivedConfig.macosWindowButtons) { + case .hidden: 0 + case .visible: 70 + } + + // Constrain the accessory clip view (the parent of the accessory view + // usually that clips the children) to the container view. + clipView.translatesAutoresizingMaskIntoConstraints = false + accessoryView.translatesAutoresizingMaskIntoConstraints = false + + // Setup all our constraints + NSLayoutConstraint.activate([ + clipView.leftAnchor.constraint(equalTo: container.leftAnchor, constant: leftPadding), + clipView.rightAnchor.constraint(equalTo: container.rightAnchor), + clipView.topAnchor.constraint(equalTo: container.topAnchor, constant: 2), + clipView.heightAnchor.constraint(equalTo: container.heightAnchor), + accessoryView.leftAnchor.constraint(equalTo: clipView.leftAnchor), + accessoryView.rightAnchor.constraint(equalTo: clipView.rightAnchor), + accessoryView.topAnchor.constraint(equalTo: clipView.topAnchor), + accessoryView.heightAnchor.constraint(equalTo: clipView.heightAnchor), + ]) + + clipView.needsLayout = true + accessoryView.needsLayout = true + + // We need to setup an observer for the NSTabBar frame. When we change system + // appearance, the tab bar temporarily becomes width/height 0 and breaks all our + // constraints and AppKit responds by nuking the whole tab bar cause it doesn't + // know what to do with it. We need to detect this before bad things happen. + tabBar.postsFrameChangedNotifications = true + tabBarObserver = NotificationCenter.default.addObserver( + forName: NSView.frameDidChangeNotification, + object: tabBar, + queue: .main + ) { [weak self] _ in + guard let self else { return } + + // Check if either width or height is zero + guard tabBar.frame.size.width == 0 || tabBar.frame.size.height == 0 else { return } + + // Remove the observer so we can call setup again. + self.tabBarObserver = nil + + // Wait a tick to let the new tab bars appear and then set them up. + DispatchQueue.main.async { + self.setupTabBar() + } + } + } + + func removeTabBar() { // View model needs to be updated on another tick because it // triggers view updates. DispatchQueue.main.async { self.viewModel.hasTabBar = false } + + // Clear our observations + self.tabBarObserver = nil } // MARK: NSToolbarDelegate From b1b74d3421693fa9d7042fd9167603ade3619aa3 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 12:25:21 -0700 Subject: [PATCH 190/371] comments --- .../TitlebarTabsTahoeTerminalWindow.swift | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift index ac4fae12a..145c37c59 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift @@ -25,8 +25,8 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool didSet{ guard toolbar != nil else { return } - // When a toolbar is added, remove the Liquid Glass look because we're - // abusing the toolbar as a tab bar. + // When a toolbar is added, remove the Liquid Glass look to have a cleaner + // appearance for our custom titlebar tabs. if let glass = titlebarContainer?.firstDescendant(withClassName: "NSGlassContainerView") { glass.isHidden = true } @@ -110,9 +110,9 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool /// creates/moves (unsure which) the NSTabBar for it and shows it. When it loses main, the tab bar /// is removed from the view hierarchy. /// - /// We can't detect this via `addTitlebarAccessoryViewController` because AppKit - /// _always_ creates an accessory view controller for every window in the tab group, but puts a - /// zero-sized NSView into it (that the tab bar is then attached to later). + /// We can't reliably detect this via `addTitlebarAccessoryViewController` because AppKit + /// creates an accessory view controller for every window in the tab group, but only attaches + /// the actual NSTabBar to the main window's accessory view. /// /// The best way I've found to detect this is to search for and setup the tab bar anytime the /// window gains focus. There are probably edge cases to check but to resolve all this I made @@ -167,10 +167,10 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool clipView.needsLayout = true accessoryView.needsLayout = true - // We need to setup an observer for the NSTabBar frame. When we change system - // appearance, the tab bar temporarily becomes width/height 0 and breaks all our - // constraints and AppKit responds by nuking the whole tab bar cause it doesn't - // know what to do with it. We need to detect this before bad things happen. + // Setup an observer for the NSTabBar frame. When system appearance changes or + // other events occur, the tab bar can temporarily become zero-sized. When this + // happens, we need to remove our custom constraints and re-apply them once the + // tab bar has proper dimensions again to avoid constraint conflicts. tabBar.postsFrameChangedNotifications = true tabBarObserver = NotificationCenter.default.addObserver( forName: NSView.frameDidChangeNotification, From 59812c3b02ec6fffe0d9febf3b234faf27bd4dbc Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 12:27:44 -0700 Subject: [PATCH 191/371] macos: remove TODO --- macos/Sources/Features/Terminal/TerminalController.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 0b0b264d3..03a4e548e 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -17,8 +17,6 @@ class TerminalController: BaseTerminalController { case "transparent": "TerminalTransparentTitlebar" case "tabs": if #available(macOS 26.0, *) { - // TODO: Switch to Tahoe when ready - //"TerminalTabsTitlebarVentura" "TerminalTabsTitlebarTahoe" } else { "TerminalTabsTitlebarVentura" From f7f0514b9ff8065e7e0b75cf0e05e75d1ef00642 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 13:14:14 -0700 Subject: [PATCH 192/371] macos: move old toolbar into ventura file --- macos/Ghostty.xcodeproj/project.pbxproj | 4 - .../Features/Terminal/TerminalToolbar.swift | 130 ----------------- .../TitlebarTabsVenturaTerminalWindow.swift | 131 ++++++++++++++++++ 3 files changed, 131 insertions(+), 134 deletions(-) delete mode 100644 macos/Sources/Features/Terminal/TerminalToolbar.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index cd0c17f9b..e9c02ef41 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -120,7 +120,6 @@ A5E112972AF7401B00C6E0C2 /* ClipboardConfirmationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E112962AF7401B00C6E0C2 /* ClipboardConfirmationView.swift */; }; A5FEB3002ABB69450068369E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FEB2FF2ABB69450068369E /* main.swift */; }; AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */; }; - AEF9CE242B6AD07A0017E195 /* TerminalToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEF9CE232B6AD07A0017E195 /* TerminalToolbar.swift */; }; C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; C159E89D2B69A2EF00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; C1F26EA72B738B9900404083 /* NSView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F26EA62B738B9900404083 /* NSView+Extension.swift */; }; @@ -239,7 +238,6 @@ A5E112962AF7401B00C6E0C2 /* ClipboardConfirmationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClipboardConfirmationView.swift; sourceTree = ""; }; A5FEB2FF2ABB69450068369E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPasteboard+Extension.swift"; sourceTree = ""; }; - AEF9CE232B6AD07A0017E195 /* TerminalToolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalToolbar.swift; sourceTree = ""; }; C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSColor+Extension.swift"; sourceTree = ""; }; C1F26EA62B738B9900404083 /* NSView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSView+Extension.swift"; sourceTree = ""; }; C1F26EE72B76CBFC00404083 /* VibrantLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VibrantLayer.h; sourceTree = ""; }; @@ -507,7 +505,6 @@ A596309B2AEE1C9E00D64628 /* TerminalController.swift */, A5D0AF3A2B36A1DE00D21823 /* TerminalRestorable.swift */, A596309D2AEE1D6C00D64628 /* TerminalView.swift */, - AEF9CE232B6AD07A0017E195 /* TerminalToolbar.swift */, A535B9D9299C569B0017E2E4 /* ErrorView.swift */, A54D786B2CA79788001B19B1 /* BaseTerminalController.swift */, ); @@ -799,7 +796,6 @@ A596309E2AEE1D6C00D64628 /* TerminalView.swift in Sources */, A58636662DEF964100E04A10 /* TerminalSplitTreeView.swift in Sources */, A52FFF592CAA4FF3000C6A5B /* Fullscreen.swift in Sources */, - AEF9CE242B6AD07A0017E195 /* TerminalToolbar.swift in Sources */, C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */, A5CEAFDE29B8058B00646FDA /* SplitView.Divider.swift in Sources */, A5E112972AF7401B00C6E0C2 /* ClipboardConfirmationView.swift in Sources */, diff --git a/macos/Sources/Features/Terminal/TerminalToolbar.swift b/macos/Sources/Features/Terminal/TerminalToolbar.swift deleted file mode 100644 index 9da14562c..000000000 --- a/macos/Sources/Features/Terminal/TerminalToolbar.swift +++ /dev/null @@ -1,130 +0,0 @@ -import Cocoa - -// Custom NSToolbar subclass that displays a centered window title, -// in order to accommodate the titlebar tabs feature. -class TerminalToolbar: NSToolbar, NSToolbarDelegate { - private let titleTextField = CenteredDynamicLabel(labelWithString: "👻 Ghostty") - - var titleText: String { - get { - titleTextField.stringValue - } - - set { - titleTextField.stringValue = newValue - } - } - - var titleFont: NSFont? { - get { - titleTextField.font - } - - set { - titleTextField.font = newValue - } - } - - var titleIsHidden: Bool { - get { - titleTextField.isHidden - } - - set { - titleTextField.isHidden = newValue - } - } - - override init(identifier: NSToolbar.Identifier) { - super.init(identifier: identifier) - - delegate = self - centeredItemIdentifiers.insert(.titleText) - } - - func toolbar(_ toolbar: NSToolbar, - itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, - willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { - var item: NSToolbarItem - - switch itemIdentifier { - case .titleText: - item = NSToolbarItem(itemIdentifier: .titleText) - item.view = self.titleTextField - item.visibilityPriority = .user - - // This ensures the title text field doesn't disappear when shrinking the view - self.titleTextField.translatesAutoresizingMaskIntoConstraints = false - self.titleTextField.setContentHuggingPriority(.defaultLow, for: .horizontal) - self.titleTextField.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) - - // Add constraints to the toolbar item's view - NSLayoutConstraint.activate([ - // Set the height constraint to match the toolbar's height - self.titleTextField.heightAnchor.constraint(equalToConstant: 22), // Adjust as needed - ]) - - item.isEnabled = true - case .resetZoom: - item = NSToolbarItem(itemIdentifier: .resetZoom) - default: - item = NSToolbarItem(itemIdentifier: itemIdentifier) - } - - return item - } - - func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { - return [.titleText, .flexibleSpace, .space, .resetZoom] - } - - func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { - // These space items are here to ensure that the title remains centered when it starts - // getting smaller than the max size so starts clipping. Lucky for us, two of the - // built-in spacers plus the un-zoom button item seems to exactly match the space - // on the left that's reserved for the window buttons. - return [.flexibleSpace, .titleText, .flexibleSpace] - } -} - -/// A label that expands to fit whatever text you put in it and horizontally centers itself in the current window. -fileprivate class CenteredDynamicLabel: NSTextField { - override func viewDidMoveToSuperview() { - // Configure the text field - isEditable = false - isBordered = false - drawsBackground = false - alignment = .center - lineBreakMode = .byTruncatingTail - cell?.truncatesLastVisibleLine = true - - // Use Auto Layout - translatesAutoresizingMaskIntoConstraints = false - - // Set content hugging and compression resistance priorities - setContentHuggingPriority(.defaultLow, for: .horizontal) - setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) - } - - // Vertically center the text - override func draw(_ dirtyRect: NSRect) { - guard let attributedString = self.attributedStringValue.mutableCopy() as? NSMutableAttributedString else { - super.draw(dirtyRect) - return - } - - let textSize = attributedString.size() - - let yOffset = (self.bounds.height - textSize.height) / 2 - 1 // -1 to center it better - - let centeredRect = NSRect(x: self.bounds.origin.x, y: self.bounds.origin.y + yOffset, - width: self.bounds.width, height: textSize.height) - - attributedString.draw(in: centeredRect) - } -} - -extension NSToolbarItem.Identifier { - static let resetZoom = NSToolbarItem.Identifier("ResetZoom") - static let titleText = NSToolbarItem.Identifier("TitleText") -} diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift index 6e19d144d..20280b982 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift @@ -609,3 +609,134 @@ fileprivate class WindowButtonsBackdropView: NSView { layer?.addSublayer(overlayLayer) } } + +// MARK: Toolbar + +// Custom NSToolbar subclass that displays a centered window title, +// in order to accommodate the titlebar tabs feature. +fileprivate class TerminalToolbar: NSToolbar, NSToolbarDelegate { + private let titleTextField = CenteredDynamicLabel(labelWithString: "👻 Ghostty") + + var titleText: String { + get { + titleTextField.stringValue + } + + set { + titleTextField.stringValue = newValue + } + } + + var titleFont: NSFont? { + get { + titleTextField.font + } + + set { + titleTextField.font = newValue + } + } + + var titleIsHidden: Bool { + get { + titleTextField.isHidden + } + + set { + titleTextField.isHidden = newValue + } + } + + override init(identifier: NSToolbar.Identifier) { + super.init(identifier: identifier) + + delegate = self + centeredItemIdentifiers.insert(.titleText) + } + + func toolbar(_ toolbar: NSToolbar, + itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, + willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { + var item: NSToolbarItem + + switch itemIdentifier { + case .titleText: + item = NSToolbarItem(itemIdentifier: .titleText) + item.view = self.titleTextField + item.visibilityPriority = .user + + // This ensures the title text field doesn't disappear when shrinking the view + self.titleTextField.translatesAutoresizingMaskIntoConstraints = false + self.titleTextField.setContentHuggingPriority(.defaultLow, for: .horizontal) + self.titleTextField.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) + + // Add constraints to the toolbar item's view + NSLayoutConstraint.activate([ + // Set the height constraint to match the toolbar's height + self.titleTextField.heightAnchor.constraint(equalToConstant: 22), // Adjust as needed + ]) + + item.isEnabled = true + case .resetZoom: + item = NSToolbarItem(itemIdentifier: .resetZoom) + default: + item = NSToolbarItem(itemIdentifier: itemIdentifier) + } + + return item + } + + func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { + return [.titleText, .flexibleSpace, .space, .resetZoom] + } + + func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { + // These space items are here to ensure that the title remains centered when it starts + // getting smaller than the max size so starts clipping. Lucky for us, two of the + // built-in spacers plus the un-zoom button item seems to exactly match the space + // on the left that's reserved for the window buttons. + return [.flexibleSpace, .titleText, .flexibleSpace] + } +} + +/// A label that expands to fit whatever text you put in it and horizontally centers itself in the current window. +fileprivate class CenteredDynamicLabel: NSTextField { + override func viewDidMoveToSuperview() { + // Configure the text field + isEditable = false + isBordered = false + drawsBackground = false + alignment = .center + lineBreakMode = .byTruncatingTail + cell?.truncatesLastVisibleLine = true + + // Use Auto Layout + translatesAutoresizingMaskIntoConstraints = false + + // Set content hugging and compression resistance priorities + setContentHuggingPriority(.defaultLow, for: .horizontal) + setContentCompressionResistancePriority(.defaultHigh, for: .horizontal) + } + + // Vertically center the text + override func draw(_ dirtyRect: NSRect) { + guard let attributedString = self.attributedStringValue.mutableCopy() as? NSMutableAttributedString else { + super.draw(dirtyRect) + return + } + + let textSize = attributedString.size() + + let yOffset = (self.bounds.height - textSize.height) / 2 - 1 // -1 to center it better + + let centeredRect = NSRect(x: self.bounds.origin.x, y: self.bounds.origin.y + yOffset, + width: self.bounds.width, height: textSize.height) + + attributedString.draw(in: centeredRect) + } +} + +extension NSToolbarItem.Identifier { + static let resetZoom = NSToolbarItem.Identifier("ResetZoom") + static let titleText = NSToolbarItem.Identifier("TitleText") +} From a7df90ee5529b2cccac5651c57661dac1f350b99 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 13:36:03 -0700 Subject: [PATCH 193/371] macos: remove split zoom accessory when tabs appear --- .../Window Styles/TerminalWindow.swift | 50 +++++++++++++++++-- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index a1bb1d86d..d588a5944 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -12,6 +12,9 @@ class TerminalWindow: NSWindow { /// The view model for SwiftUI views private var viewModel = ViewModel() + /// Reset split zoom button in titlebar + private let resetZoomAccessory = NSTitlebarAccessoryViewController() + /// The configuration derived from the Ghostty config so we don't need to rely on references. private(set) var derivedConfig: DerivedConfig = .init() @@ -56,7 +59,6 @@ class TerminalWindow: NSWindow { } // Create our reset zoom titlebar accessory. - let resetZoomAccessory = NSTitlebarAccessoryViewController() resetZoomAccessory.layoutAttribute = .right resetZoomAccessory.view = NSHostingView(rootView: ResetZoomAccessoryView( viewModel: viewModel, @@ -94,6 +96,18 @@ class TerminalWindow: NSWindow { resetZoomTabButton.contentTintColor = .secondaryLabelColor } + override func becomeMain() { + super.becomeMain() + + // Its possible we miss the accessory titlebar call so we check again + // whenever the window becomes main. Both of these are idempotent. + if hasTabBar { + tabBarDidAppear() + } else { + tabBarDidDisappear() + } + } + override func mergeAllWindows(_ sender: Any?) { super.mergeAllWindows(sender) @@ -112,13 +126,13 @@ class TerminalWindow: NSWindow { // it. This has been verified to work on macOS 12 to 26 if isTabBar(childViewController) { childViewController.identifier = Self.tabBarIdentifier - viewModel.hasTabBar = true + tabBarDidAppear() } } override func removeTitlebarAccessoryViewController(at index: Int) { if let childViewController = titlebarAccessoryViewControllers[safe: index], isTabBar(childViewController) { - viewModel.hasTabBar = false + tabBarDidDisappear() } super.removeTitlebarAccessoryViewController(at: index) @@ -130,6 +144,11 @@ class TerminalWindow: NSWindow { /// added. private static let tabBarIdentifier: NSUserInterfaceItemIdentifier = .init("_ghosttyTabBar") + /// Returns true if there is a tab bar visible on this window. + var hasTabBar: Bool { + contentView?.firstViewFromRoot(withClassName: "NSTabBar") != nil + } + func isTabBar(_ childViewController: NSTitlebarAccessoryViewController) -> Bool { if childViewController.identifier == nil { // The good case @@ -154,6 +173,28 @@ class TerminalWindow: NSWindow { return childViewController.identifier == Self.tabBarIdentifier } + /// Ensures we only run didAppear/didDisappear once per state. + private var tabBarDidAppearRan = false + + private func tabBarDidAppear() { + guard !tabBarDidAppearRan else { return } + tabBarDidAppearRan = true + + // Remove our reset zoom accessory. For some reason having a SwiftUI + // titlebar accessory causes our content view scaling to be wrong. + // Removing it fixes it, we just need to remember to add it again later. + if let idx = titlebarAccessoryViewControllers.firstIndex(of: resetZoomAccessory) { + removeTitlebarAccessoryViewController(at: idx) + } + } + + private func tabBarDidDisappear() { + guard tabBarDidAppearRan else { return } + tabBarDidAppearRan = false + + addTitlebarAccessoryViewController(resetZoomAccessory) + } + // MARK: Tab Key Equivalents var keyEquivalent: String? = nil { @@ -402,7 +443,6 @@ extension TerminalWindow { class ViewModel: ObservableObject { @Published var isSurfaceZoomed: Bool = false @Published var hasToolbar: Bool = false - @Published var hasTabBar: Bool = false } struct ResetZoomAccessoryView: View { @@ -410,7 +450,7 @@ extension TerminalWindow { let action: () -> Void var body: some View { - if viewModel.isSurfaceZoomed && !viewModel.hasTabBar { + if viewModel.isSurfaceZoomed { VStack { Button(action: action) { Image("ResetZoom") From 8cfc904c0c86a8e87cb6f5234aa6fe55e4bd2d53 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 14:38:07 -0700 Subject: [PATCH 194/371] macos: fix up some sequoia regressions --- .../Window Styles/TerminalWindow.swift | 27 +++++++++++-------- macos/Sources/Helpers/Fullscreen.swift | 12 +++------ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index d588a5944..74181089d 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -173,13 +173,7 @@ class TerminalWindow: NSWindow { return childViewController.identifier == Self.tabBarIdentifier } - /// Ensures we only run didAppear/didDisappear once per state. - private var tabBarDidAppearRan = false - private func tabBarDidAppear() { - guard !tabBarDidAppearRan else { return } - tabBarDidAppearRan = true - // Remove our reset zoom accessory. For some reason having a SwiftUI // titlebar accessory causes our content view scaling to be wrong. // Removing it fixes it, we just need to remember to add it again later. @@ -189,10 +183,11 @@ class TerminalWindow: NSWindow { } private func tabBarDidDisappear() { - guard tabBarDidAppearRan else { return } - tabBarDidAppearRan = false - - addTitlebarAccessoryViewController(resetZoomAccessory) + if styleMask.contains(.titled) { + if titlebarAccessoryViewControllers.firstIndex(of: resetZoomAccessory) == nil { + addTitlebarAccessoryViewController(resetZoomAccessory) + } + } } // MARK: Tab Key Equivalents @@ -448,6 +443,16 @@ extension TerminalWindow { struct ResetZoomAccessoryView: View { @ObservedObject var viewModel: ViewModel let action: () -> Void + + // The padding from the top that the view appears. This was all just manually + // measured based on the OS. + var topPadding: CGFloat { + if #available(macOS 26.0, *) { + return viewModel.hasToolbar ? 10 : 5 + } else { + return viewModel.hasToolbar ? 9 : 4 + } + } var body: some View { if viewModel.isSurfaceZoomed { @@ -463,7 +468,7 @@ extension TerminalWindow { } // With a toolbar, the window title is taller, so we need more padding // to properly align. - .padding(.top, viewModel.hasToolbar ? 10 : 5) + .padding(.top, topPadding) // We always need space at the end of the titlebar .padding(.trailing, 10) } diff --git a/macos/Sources/Helpers/Fullscreen.swift b/macos/Sources/Helpers/Fullscreen.swift index a2294a0af..d78775a1d 100644 --- a/macos/Sources/Helpers/Fullscreen.swift +++ b/macos/Sources/Helpers/Fullscreen.swift @@ -268,19 +268,15 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { // Removing the "titled" style also derefs all our accessory view controllers // so we need to restore those. for c in savedState.titlebarAccessoryViewControllers { - window.addTitlebarAccessoryViewController(c) + if window.titlebarAccessoryViewControllers.firstIndex(of: c) == nil { + window.addTitlebarAccessoryViewController(c) + } } // Removing "titled" also clears our toolbar window.toolbar = savedState.toolbar window.toolbarStyle = savedState.toolbarStyle - - // This is a hack that I want to remove from this but for now, we need to - // fix up the titlebar tabs here before we do everything below. - if let window = window as? TitlebarTabsVenturaTerminalWindow, window.titlebarTabs { - window.titlebarTabs = true - } - + // If the window was previously in a tab group that isn't empty now, // we re-add it. We have to do this because our process of doing non-native // fullscreen removes the window from the tab group. From 1388c277d5978094994b3b928b9d79a950974989 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 14:43:01 -0700 Subject: [PATCH 195/371] macos: sequoia should use same tab bar identifier as TerminalWindow --- .../Terminal/Window Styles/TerminalWindow.swift | 2 +- .../TitlebarTabsVenturaTerminalWindow.swift | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index 74181089d..f9dfb9591 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -142,7 +142,7 @@ class TerminalWindow: NSWindow { /// This identifier is attached to the tab bar view controller when we detect it being /// added. - private static let tabBarIdentifier: NSUserInterfaceItemIdentifier = .init("_ghosttyTabBar") + static let tabBarIdentifier: NSUserInterfaceItemIdentifier = .init("_ghosttyTabBar") /// Returns true if there is a tab bar visible on this window. var hasTabBar: Bool { diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift index 20280b982..a236df107 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift @@ -196,8 +196,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { // We can only update titlebar tabs if there is a titlebar. Without the // styleMask check the app will crash (issue #1876) if titlebarTabs && styleMask.contains(.titled) { - guard let tabBarAccessoryViewController = titlebarAccessoryViewControllers.first(where: { $0.identifier == Self.TabBarController}) else { return } - + guard let tabBarAccessoryViewController = titlebarAccessoryViewControllers.first(where: { $0.identifier == Self.tabBarIdentifier}) else { return } tabBarAccessoryViewController.layoutAttribute = .right pushTabsToTitlebar(tabBarAccessoryViewController) } @@ -314,9 +313,6 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { private var windowDragHandle: WindowDragView? = nil - // The tab bar controller ID from macOS - static private let TabBarController = NSUserInterfaceItemIdentifier("_tabBarController") - // Used by the window controller to enable/disable titlebar tabs. var titlebarTabs = false { didSet { @@ -384,10 +380,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { // This is called by macOS for native tabbing in order to add the tab bar. We hook into // this, detect the tab bar being added, and override its behavior. override func addTitlebarAccessoryViewController(_ childViewController: NSTitlebarAccessoryViewController) { - let isTabBar = self.titlebarTabs && ( - childViewController.layoutAttribute == .bottom || - childViewController.identifier == Self.TabBarController - ) + let isTabBar = self.titlebarTabs && isTabBar(childViewController) if (isTabBar) { // Ensure it has the right layoutAttribute to force it next to our titlebar @@ -399,7 +392,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { // Mark the controller for future reference so we can easily find it. Otherwise // the tab bar has no ID by default. - childViewController.identifier = Self.TabBarController + childViewController.identifier = Self.tabBarIdentifier } super.addTitlebarAccessoryViewController(childViewController) @@ -410,7 +403,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { } override func removeTitlebarAccessoryViewController(at index: Int) { - let isTabBar = titlebarAccessoryViewControllers[index].identifier == Self.TabBarController + let isTabBar = titlebarAccessoryViewControllers[index].identifier == Self.tabBarIdentifier super.removeTitlebarAccessoryViewController(at: index) if (isTabBar) { resetCustomTabBarViews() From ac4b0dcac0b5b864a212ddf2c08280b72c5a8016 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 14:57:49 -0700 Subject: [PATCH 196/371] macos: fix transparent tabs on sequoia --- .../TitlebarTabsVenturaTerminalWindow.swift | 16 ------- .../TransparentTitlebarTerminalWindow.swift | 47 +++++++++++++++++-- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift index a236df107..99111b55b 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsVenturaTerminalWindow.swift @@ -99,9 +99,6 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { } } - // The remainder of this function only applies to styled tabs. - guard hasStyledTabs else { return } - titlebarSeparatorStyle = tabbedWindows != nil && !titlebarTabs ? .line : .none if titlebarTabs { hideToolbarOverflowButton() @@ -170,19 +167,6 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow { // MARK: Tab Bar Styling - // This is true if we should apply styles to the titlebar or tab bar. - var hasStyledTabs: Bool { - // If we have titlebar tabs then we always style. - guard !titlebarTabs else { return true } - - // We style the tabs if they're transparent - return transparentTabs - } - - // Set to true if the background color should bleed through the titlebar/tab bar. - // This only applies to non-titlebar tabs. - var transparentTabs: Bool = false - var hasVeryDarkBackground: Bool { backgroundColor.luminance < 0.05 } diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index f949b6094..94e938326 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -11,6 +11,13 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { /// KVO observation for tab group window changes. private var tabGroupWindowsObservation: NSKeyValueObservation? private var tabBarVisibleObservation: NSKeyValueObservation? + + deinit { + tabGroupWindowsObservation?.invalidate() + tabBarVisibleObservation?.invalidate() + } + + // MARK: NSWindow override func awakeFromNib() { super.awakeFromNib() @@ -19,11 +26,6 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { // to learn why we need KVO. setupKVO() } - - deinit { - tabGroupWindowsObservation?.invalidate() - tabBarVisibleObservation?.invalidate() - } override func becomeMain() { super.becomeMain() @@ -40,6 +42,16 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { } } } + + override func update() { + super.update() + + // On macOS 13 to 15, we need to hide the NSVisualEffectView in order to allow our + // titlebar to be truly transparent. + if #unavailable(macOS 26.0) { + hideEffectView() + } + } // MARK: Appearance @@ -86,6 +98,7 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { guard let titlebarContainer else { return } titlebarContainer.wantsLayer = true titlebarContainer.layer?.backgroundColor = preferredBackgroundColor?.cgColor + effectViewIsHidden = false } // MARK: View Finders @@ -149,4 +162,28 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { self.syncAppearance(lastSurfaceConfig) } } + + // MARK: macOS 13 to 15 + + // We only need to set this once, but need to do it after the window has been created in order + // to determine if the theme is using a very dark background, in which case we don't want to + // remove the effect view if the default tab bar is being used since the effect created in + // `updateTabsForVeryDarkBackgrounds` creates a confusing visual design. + private var effectViewIsHidden = false + + private func hideEffectView() { + guard !effectViewIsHidden else { return } + + // By hiding the visual effect view, we allow the window's (or titlebar's in this case) + // background color to show through. If we were to set `titlebarAppearsTransparent` to true + // the selected tab would look fine, but the unselected ones and new tab button backgrounds + // would be an opaque color. When the titlebar isn't transparent, however, the system applies + // a compositing effect to the unselected tab backgrounds, which makes them blend with the + // titlebar's/window's background. + if let effectView = titlebarContainer?.descendants(withClassName: "NSVisualEffectView").first { + effectView.isHidden = true + } + + effectViewIsHidden = true + } } From 1b6142b271b72048f82648920f6de0b2b48960f5 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 15:02:05 -0700 Subject: [PATCH 197/371] macos: don't restore tab bar with non-native fs --- macos/Sources/Helpers/Fullscreen.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/macos/Sources/Helpers/Fullscreen.swift b/macos/Sources/Helpers/Fullscreen.swift index d78775a1d..f3940a9aa 100644 --- a/macos/Sources/Helpers/Fullscreen.swift +++ b/macos/Sources/Helpers/Fullscreen.swift @@ -268,6 +268,12 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle { // Removing the "titled" style also derefs all our accessory view controllers // so we need to restore those. for c in savedState.titlebarAccessoryViewControllers { + // Restoring the tab bar causes all sorts of problems. Its best to just ignore it, + // even though this is kind of a hack. + if let window = window as? TerminalWindow, window.isTabBar(c) { + continue + } + if window.titlebarAccessoryViewControllers.firstIndex(of: c) == nil { window.addTitlebarAccessoryViewController(c) } From 928603c23e1e59717e1c042e3d39487066d9f12f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 13 Jun 2025 20:20:49 -0700 Subject: [PATCH 198/371] macos: use a runtime liquid glass check for our Tahoe styling --- macos/Ghostty.xcodeproj/project.pbxproj | 8 ++-- .../Terminal/TerminalController.swift | 2 +- .../Window Styles/TerminalWindow.swift | 2 +- .../TransparentTitlebarTerminalWindow.swift | 4 +- macos/Sources/Helpers/AppInfo.swift | 44 +++++++++++++++++++ macos/Sources/Helpers/Xcode.swift | 10 ----- 6 files changed, 52 insertions(+), 18 deletions(-) create mode 100644 macos/Sources/Helpers/AppInfo.swift delete mode 100644 macos/Sources/Helpers/Xcode.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index e9c02ef41..4943f2f4d 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -90,7 +90,7 @@ A5A1F8852A489D6800D1E8BC /* terminfo in Resources */ = {isa = PBXBuildFile; fileRef = A5A1F8842A489D6800D1E8BC /* terminfo */; }; A5A2A3CA2D4445E30033CF96 /* Dock.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A2A3C92D4445E20033CF96 /* Dock.swift */; }; A5A2A3CC2D444ABB0033CF96 /* NSApplication+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */; }; - A5A6F72A2CC41B8900B232A5 /* Xcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A6F7292CC41B8700B232A5 /* Xcode.swift */; }; + A5A6F72A2CC41B8900B232A5 /* AppInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A6F7292CC41B8700B232A5 /* AppInfo.swift */; }; A5AEB1652D5BE7D000513529 /* LastWindowPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */; }; A5B30539299BEAAB0047F10C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5B30538299BEAAB0047F10C /* Assets.xcassets */; }; A5CA378C2D2A4DEB00931030 /* KeyboardLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CA378B2D2A4DE800931030 /* KeyboardLayout.swift */; }; @@ -205,7 +205,7 @@ A5A1F8842A489D6800D1E8BC /* terminfo */ = {isa = PBXFileReference; lastKnownFileType = folder; name = terminfo; path = "../zig-out/share/terminfo"; sourceTree = ""; }; A5A2A3C92D4445E20033CF96 /* Dock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Dock.swift; sourceTree = ""; }; A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSApplication+Extension.swift"; sourceTree = ""; }; - A5A6F7292CC41B8700B232A5 /* Xcode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Xcode.swift; sourceTree = ""; }; + A5A6F7292CC41B8700B232A5 /* AppInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInfo.swift; sourceTree = ""; }; A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LastWindowPosition.swift; sourceTree = ""; }; A5B30531299BEAAA0047F10C /* Ghostty.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Ghostty.app; sourceTree = BUILT_PRODUCTS_DIR; }; A5B30538299BEAAB0047F10C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -312,8 +312,8 @@ children = ( A58636692DF0A98100E04A10 /* Extensions */, A5874D9B2DAD781100E83852 /* Private */, + A5A6F7292CC41B8700B232A5 /* AppInfo.swift */, A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */, - A5A6F7292CC41B8700B232A5 /* Xcode.swift */, A5CEAFFE29C2410700646FDA /* Backport.swift */, A5333E1B2B5A1CE3008AEFF7 /* CrossKit.swift */, A5CBD0572C9F30860017A1AE /* Cursor.swift */, @@ -756,7 +756,7 @@ A52FFF5D2CAB4D08000C6A5B /* NSScreen+Extension.swift in Sources */, A53426352A7DA53D00EBB7A2 /* AppDelegate.swift in Sources */, A5CBD0582C9F30960017A1AE /* Cursor.swift in Sources */, - A5A6F72A2CC41B8900B232A5 /* Xcode.swift in Sources */, + A5A6F72A2CC41B8900B232A5 /* AppInfo.swift in Sources */, A52FFF5B2CAA54B1000C6A5B /* FullscreenMode+Extension.swift in Sources */, A5333E222B5A2128008AEFF7 /* SurfaceView_AppKit.swift in Sources */, A5CA378E2D31D6C300931030 /* Weak.swift in Sources */, diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 03a4e548e..49b3fea34 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -16,7 +16,7 @@ class TerminalController: BaseTerminalController { case "hidden": "TerminalHiddenTitlebar" case "transparent": "TerminalTransparentTitlebar" case "tabs": - if #available(macOS 26.0, *) { + if #available(macOS 26.0, *), hasLiquidGlass() { "TerminalTabsTitlebarTahoe" } else { "TerminalTabsTitlebarVentura" diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index f9dfb9591..e24323113 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -447,7 +447,7 @@ extension TerminalWindow { // The padding from the top that the view appears. This was all just manually // measured based on the OS. var topPadding: CGFloat { - if #available(macOS 26.0, *) { + if #available(macOS 26.0, *), hasLiquidGlass() { return viewModel.hasToolbar ? 10 : 5 } else { return viewModel.hasToolbar ? 9 : 4 diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index 94e938326..1a92fa024 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -48,7 +48,7 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { // On macOS 13 to 15, we need to hide the NSVisualEffectView in order to allow our // titlebar to be truly transparent. - if #unavailable(macOS 26.0) { + if !effectViewIsHidden && !hasLiquidGlass() { hideEffectView() } } @@ -65,7 +65,7 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { // references changed (e.g. tabGroup is new). setupKVO() - if #available(macOS 26.0, *) { + if #available(macOS 26.0, *), hasLiquidGlass() { syncAppearanceTahoe(surfaceConfig) } else { syncAppearanceVentura(surfaceConfig) diff --git a/macos/Sources/Helpers/AppInfo.swift b/macos/Sources/Helpers/AppInfo.swift new file mode 100644 index 000000000..cf66e332d --- /dev/null +++ b/macos/Sources/Helpers/AppInfo.swift @@ -0,0 +1,44 @@ +import Foundation + +/// True if we appear to be running in Xcode. +func isRunningInXcode() -> Bool { + if let _ = ProcessInfo.processInfo.environment["__XCODE_BUILT_PRODUCTS_DIR_PATHS"] { + return true + } + + return false +} + +/// True if we have liquid glass available. +func hasLiquidGlass() -> Bool { + // Can't have liquid glass unless we're in macOS 26+ + if #unavailable(macOS 26.0) { + return false + } + + // If we aren't running SDK 26.0 or later then we definitely + // do not have liquid glass. + guard let sdkName = Bundle.main.infoDictionary?["DTSDKName"] as? String else { + // If we don't have this, we assume we're built against the latest + // since we're on macOS 26+ + return true + } + + // If the SDK doesn't start with macosx then we just assume we + // have it because we already verified we're on macOS above. + guard sdkName.hasPrefix("macosx") else { + return true + } + + // The SDK version must be at least 26 + let versionString = String(sdkName.dropFirst("macosx".count)) + guard let major = if let dotIndex = versionString.firstIndex(of: ".") { + Int(String(versionString[..= 26 +} diff --git a/macos/Sources/Helpers/Xcode.swift b/macos/Sources/Helpers/Xcode.swift deleted file mode 100644 index 281bad18b..000000000 --- a/macos/Sources/Helpers/Xcode.swift +++ /dev/null @@ -1,10 +0,0 @@ -import Foundation - -/// True if we appear to be running in Xcode. -func isRunningInXcode() -> Bool { - if let _ = ProcessInfo.processInfo.environment["__XCODE_BUILT_PRODUCTS_DIR_PATHS"] { - return true - } - - return false -} From 5b9f4acbc8d3498614d8784008f735d9333e3752 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 14 Jun 2025 12:30:09 -0700 Subject: [PATCH 199/371] ci: update macOS builders to Sequoia (15) and Xcode 16.4 We have been building on macOS 14 and Xcode 16.0 for a longggg time now. This gets us to a version that will be running Xcode 26 eventually so we can ultimately build for Tahoe on a stable OS. This should change nothing in the interim. --- .github/workflows/release-pr.yml | 8 ++++---- .github/workflows/release-tag.yml | 6 +++--- .github/workflows/release-tip.yml | 12 ++++++------ .github/workflows/test.yml | 12 ++++++------ 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml index 574b1ab73..3f89bd702 100644 --- a/.github/workflows/release-pr.yml +++ b/.github/workflows/release-pr.yml @@ -47,7 +47,7 @@ jobs: sentry-cli dif upload --project ghostty --wait dsym.zip build-macos: - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia timeout-minutes: 90 steps: - name: Checkout code @@ -94,7 +94,7 @@ jobs: - name: Build Ghostty.app run: | cd macos - sudo xcode-select -s /Applications/Xcode_16.0.app + sudo xcode-select -s /Applications/Xcode_16.4.app xcodebuild -target Ghostty -configuration Release # We inject the "build number" as simply the number of commits since HEAD. @@ -199,7 +199,7 @@ jobs: destination-dir: ./ build-macos-debug: - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia timeout-minutes: 90 steps: - name: Checkout code @@ -246,7 +246,7 @@ jobs: - name: Build Ghostty.app run: | cd macos - sudo xcode-select -s /Applications/Xcode_16.0.app + sudo xcode-select -s /Applications/Xcode_16.4.app xcodebuild -target Ghostty -configuration Release # We inject the "build number" as simply the number of commits since HEAD. diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml index db8049df7..3deafd066 100644 --- a/.github/workflows/release-tag.yml +++ b/.github/workflows/release-tag.yml @@ -120,7 +120,7 @@ jobs: build-macos: needs: [setup] - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia timeout-minutes: 90 env: GHOSTTY_VERSION: ${{ needs.setup.outputs.version }} @@ -139,7 +139,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: XCode Select - run: sudo xcode-select -s /Applications/Xcode_16.0.app + run: sudo xcode-select -s /Applications/Xcode_16.4.app - name: Setup Sparkle env: @@ -288,7 +288,7 @@ jobs: appcast: needs: [setup, build-macos] - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia env: GHOSTTY_VERSION: ${{ needs.setup.outputs.version }} GHOSTTY_BUILD: ${{ needs.setup.outputs.build }} diff --git a/.github/workflows/release-tip.yml b/.github/workflows/release-tip.yml index 73a1ddeeb..6c6399afd 100644 --- a/.github/workflows/release-tip.yml +++ b/.github/workflows/release-tip.yml @@ -154,7 +154,7 @@ jobs: ) }} - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia timeout-minutes: 90 steps: - name: Checkout code @@ -173,7 +173,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: XCode Select - run: sudo xcode-select -s /Applications/Xcode_16.0.app + run: sudo xcode-select -s /Applications/Xcode_16.4.app # Setup Sparkle - name: Setup Sparkle @@ -369,7 +369,7 @@ jobs: ) }} - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia timeout-minutes: 90 steps: - name: Checkout code @@ -388,7 +388,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: XCode Select - run: sudo xcode-select -s /Applications/Xcode_16.0.app + run: sudo xcode-select -s /Applications/Xcode_16.4.app # Setup Sparkle - name: Setup Sparkle @@ -544,7 +544,7 @@ jobs: ) }} - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia timeout-minutes: 90 steps: - name: Checkout code @@ -563,7 +563,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: XCode Select - run: sudo xcode-select -s /Applications/Xcode_16.0.app + run: sudo xcode-select -s /Applications/Xcode_16.4.app # Setup Sparkle - name: Setup Sparkle diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8a98584a2..814acec8f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -270,7 +270,7 @@ jobs: ghostty-source.tar.gz build-macos: - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia needs: test steps: - name: Checkout code @@ -286,7 +286,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: Xcode Select - run: sudo xcode-select -s /Applications/Xcode_16.0.app + run: sudo xcode-select -s /Applications/Xcode_16.4.app - name: get the Zig deps id: deps @@ -361,7 +361,7 @@ jobs: xcodebuild -target Ghostty-iOS "CODE_SIGNING_ALLOWED=NO" build-macos-matrix: - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia needs: test steps: - name: Checkout code @@ -377,7 +377,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: Xcode Select - run: sudo xcode-select -s /Applications/Xcode_16.0.app + run: sudo xcode-select -s /Applications/Xcode_16.4.app - name: get the Zig deps id: deps @@ -679,7 +679,7 @@ jobs: nix develop -c zig build -Dsentry=${{ matrix.sentry }} test-macos: - runs-on: namespace-profile-ghostty-macos + runs-on: namespace-profile-ghostty-macos-sequoia needs: test steps: - name: Checkout code @@ -695,7 +695,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: Xcode Select - run: sudo xcode-select -s /Applications/Xcode_16.0.app + run: sudo xcode-select -s /Applications/Xcode_16.4.app - name: get the Zig deps id: deps From 2f33eee166d68f3775387df14e752244c8626bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristo=CC=81fer=20R?= Date: Sat, 14 Jun 2025 16:26:03 -0400 Subject: [PATCH 200/371] fix comptime if statement --- src/os/hostname.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/hostname.zig b/src/os/hostname.zig index ddcdeb59e..a75ca1cbb 100644 --- a/src/os/hostname.zig +++ b/src/os/hostname.zig @@ -48,7 +48,7 @@ pub fn parseUrl(url: []const u8) UrlParsingError!std.Uri { return std.Uri.parse(url) catch |e| { // The mac-address-as-hostname issue is specific to macOS so we just return an error if we // hit it on other platforms. - comptime if (builtin.os.tag != .macos) return e; + if (comptime builtin.os.tag != .macos) return e; // It's possible this is a mac address on macOS where the last 2 characters in the // address are non-digits, e.g. 'ff', and thus an invalid port. From c4a978b07aa1ada5bd6817b2194fa8f853bbff5e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 14 Jun 2025 13:49:58 -0700 Subject: [PATCH 201/371] macos: set toolbar title `isBordered` to avoid glass view This was recommended by the WWDC25 session on AppKit updates. My hack was not the right approach. --- .../TitlebarTabsTahoeTerminalWindow.swift | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift index 145c37c59..9381f7329 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TitlebarTabsTahoeTerminalWindow.swift @@ -21,18 +21,6 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool } } - override var toolbar: NSToolbar? { - didSet{ - guard toolbar != nil else { return } - - // When a toolbar is added, remove the Liquid Glass look to have a cleaner - // appearance for our custom titlebar tabs. - if let glass = titlebarContainer?.firstDescendant(withClassName: "NSGlassContainerView") { - glass.isHidden = true - } - } - } - override func awakeFromNib() { super.awakeFromNib() @@ -222,6 +210,11 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool item.view = NSHostingView(rootView: TitleItem(viewModel: viewModel)) item.visibilityPriority = .user item.isEnabled = true + + // This is the documented way to avoid the glass view on an item. + // We don't want glass on our title. + item.isBordered = false + return item default: return NSToolbarItem(itemIdentifier: itemIdentifier) From 202020cd7d10bb6fa7b61c5d67033ddb5565b52c Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 14 Jun 2025 14:21:40 -0700 Subject: [PATCH 202/371] macos: menu item symbols for Tahoe This is recommended for macOS Tahoe and all standard menu items now have associated images. This makes our app look more polished and native for macOS Tahoe. For icon choice, I tried to copy other native macOS apps as much as possible, mostly from Xcode. It looks like a lot of apps aren't updated yet. I'm absolutely open to suggestions for better icons but I think these are a good starting point. One menu change is I moved "reset font size" above "increase font size" which better matches other apps (e.g. Terminal.app). --- macos/Ghostty.xcodeproj/project.pbxproj | 4 ++ macos/Sources/App/macOS/AppDelegate.swift | 40 ++++++++++++++++++- macos/Sources/App/macOS/MainMenu.xib | 16 ++++---- .../Sources/Ghostty/SurfaceView_AppKit.swift | 25 ++++++++---- .../Extensions/NSMenuItem+Extension.swift | 11 +++++ 5 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 macos/Sources/Helpers/Extensions/NSMenuItem+Extension.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 4943f2f4d..a5663202b 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -93,6 +93,7 @@ A5A6F72A2CC41B8900B232A5 /* AppInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A6F7292CC41B8700B232A5 /* AppInfo.swift */; }; A5AEB1652D5BE7D000513529 /* LastWindowPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AEB1642D5BE7BF00513529 /* LastWindowPosition.swift */; }; A5B30539299BEAAB0047F10C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5B30538299BEAAB0047F10C /* Assets.xcassets */; }; + A5B4EA852DFE691B0022C3A2 /* NSMenuItem+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5B4EA842DFE69140022C3A2 /* NSMenuItem+Extension.swift */; }; A5CA378C2D2A4DEB00931030 /* KeyboardLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CA378B2D2A4DE800931030 /* KeyboardLayout.swift */; }; A5CA378E2D31D6C300931030 /* Weak.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CA378D2D31D6C100931030 /* Weak.swift */; }; A5CBD0562C9E65B80017A1AE /* DraggableWindowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CBD0552C9E65A50017A1AE /* DraggableWindowView.swift */; }; @@ -210,6 +211,7 @@ A5B30531299BEAAA0047F10C /* Ghostty.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Ghostty.app; sourceTree = BUILT_PRODUCTS_DIR; }; A5B30538299BEAAB0047F10C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; A5B3053D299BEAAB0047F10C /* Ghostty.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Ghostty.entitlements; sourceTree = ""; }; + A5B4EA842DFE69140022C3A2 /* NSMenuItem+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSMenuItem+Extension.swift"; sourceTree = ""; }; A5CA378B2D2A4DE800931030 /* KeyboardLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardLayout.swift; sourceTree = ""; }; A5CA378D2D31D6C100931030 /* Weak.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Weak.swift; sourceTree = ""; }; A5CBD0552C9E65A50017A1AE /* DraggableWindowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DraggableWindowView.swift; sourceTree = ""; }; @@ -478,6 +480,7 @@ A599CDAF2CF103F20049FA26 /* NSAppearance+Extension.swift */, A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */, A54B0CEA2D0CFB4A00CBEFF8 /* NSImage+Extension.swift */, + A5B4EA842DFE69140022C3A2 /* NSMenuItem+Extension.swift */, A52FFF5C2CAB4D05000C6A5B /* NSScreen+Extension.swift */, AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */, C1F26EA62B738B9900404083 /* NSView+Extension.swift */, @@ -763,6 +766,7 @@ A5CDF1952AAFA19600513312 /* ConfigurationErrorsView.swift in Sources */, A55B7BBC29B6FC330055DE60 /* SurfaceView.swift in Sources */, A5333E1C2B5A1CE3008AEFF7 /* CrossKit.swift in Sources */, + A5B4EA852DFE691B0022C3A2 /* NSMenuItem+Extension.swift in Sources */, A5874D992DAD751B00E83852 /* CGS.swift in Sources */, A586366B2DF0A98C00E04A10 /* Array+Extension.swift in Sources */, A51544FE2DFB111C009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift in Sources */, diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index 7fb52a025..f460017f5 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -166,7 +166,7 @@ class AppDelegate: NSObject, // This registers the Ghostty => Services menu to exist. NSApp.servicesMenu = menuServices - + // Setup a local event monitor for app-level keyboard shortcuts. See // localEventHandler for more info why. _ = NSEvent.addLocalMonitorForEvents( @@ -242,6 +242,9 @@ class AppDelegate: NSObject, ghostty_app_set_color_scheme(app, scheme) } + + // Setup our menu + setupMenuImages() } func applicationDidBecomeActive(_ notification: Notification) { @@ -392,6 +395,41 @@ class AppDelegate: NSObject, return dockMenu } + /// Setup all the images for our menu items. + private func setupMenuImages() { + // Note: This COULD Be done all in the xib file, but I find it easier to + // modify this stuff as code. + self.menuNewWindow?.setImageIfDesired(systemSymbolName: "macwindow.badge.plus") + self.menuNewTab?.setImageIfDesired(systemSymbolName: "macwindow") + self.menuSplitRight?.setImageIfDesired(systemSymbolName: "rectangle.righthalf.inset.filled") + self.menuSplitLeft?.setImageIfDesired(systemSymbolName: "rectangle.leadinghalf.inset.filled") + self.menuSplitUp?.setImageIfDesired(systemSymbolName: "rectangle.tophalf.inset.filled") + self.menuSplitDown?.setImageIfDesired(systemSymbolName: "rectangle.bottomhalf.inset.filled") + self.menuClose?.setImageIfDesired(systemSymbolName: "xmark") + self.menuIncreaseFontSize?.setImageIfDesired(systemSymbolName: "textformat.size.larger") + self.menuResetFontSize?.setImageIfDesired(systemSymbolName: "textformat.size") + self.menuDecreaseFontSize?.setImageIfDesired(systemSymbolName: "textformat.size.smaller") + self.menuCommandPalette?.setImageIfDesired(systemSymbolName: "filemenu.and.selection") + self.menuQuickTerminal?.setImageIfDesired(systemSymbolName: "apple.terminal") + self.menuChangeTitle?.setImageIfDesired(systemSymbolName: "pencil.line") + self.menuTerminalInspector?.setImageIfDesired(systemSymbolName: "scope") + self.menuToggleFullScreen?.setImageIfDesired(systemSymbolName: "square.arrowtriangle.4.outward") + self.menuToggleVisibility?.setImageIfDesired(systemSymbolName: "eye") + self.menuZoomSplit?.setImageIfDesired(systemSymbolName: "arrow.up.left.and.arrow.down.right") + self.menuPreviousSplit?.setImageIfDesired(systemSymbolName: "chevron.backward.2") + self.menuNextSplit?.setImageIfDesired(systemSymbolName: "chevron.forward.2") + self.menuEqualizeSplits?.setImageIfDesired(systemSymbolName: "inset.filled.topleft.topright.bottomleft.bottomright.rectangle") + self.menuSelectSplitLeft?.setImageIfDesired(systemSymbolName: "arrow.left") + self.menuSelectSplitRight?.setImageIfDesired(systemSymbolName: "arrow.right") + self.menuSelectSplitAbove?.setImageIfDesired(systemSymbolName: "arrow.up") + self.menuSelectSplitBelow?.setImageIfDesired(systemSymbolName: "arrow.down") + self.menuMoveSplitDividerUp?.setImageIfDesired(systemSymbolName: "arrow.up.to.line") + self.menuMoveSplitDividerDown?.setImageIfDesired(systemSymbolName: "arrow.down.to.line") + self.menuMoveSplitDividerLeft?.setImageIfDesired(systemSymbolName: "arrow.left.to.line") + self.menuMoveSplitDividerRight?.setImageIfDesired(systemSymbolName: "arrow.right.to.line") + self.menuFloatOnTop?.setImageIfDesired(systemSymbolName: "square.3.layers.3d.top.filled") + } + /// Sync all of our menu item keyboard shortcuts with the Ghostty configuration. private func syncMenuShortcuts(_ config: Ghostty.Config) { guard ghostty.readiness == .ready else { return } diff --git a/macos/Sources/App/macOS/MainMenu.xib b/macos/Sources/App/macOS/MainMenu.xib index 7130d544e..c9bff8b4a 100644 --- a/macos/Sources/App/macOS/MainMenu.xib +++ b/macos/Sources/App/macOS/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -251,18 +251,18 @@ - - - - - - + + + + + + diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index e4f6f507c..3e87176fc 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -1281,6 +1281,10 @@ extension Ghostty { let menu = NSMenu() + // We just use a floating var so we can easily setup metadata on each item + // in a row without storing it all. + var item: NSMenuItem + // If we have a selection, add copy if self.selectedRange().length > 0 { menu.addItem(withTitle: "Copy", action: #selector(copy(_:)), keyEquivalent: "") @@ -1288,16 +1292,23 @@ extension Ghostty { menu.addItem(withTitle: "Paste", action: #selector(paste(_:)), keyEquivalent: "") menu.addItem(.separator()) - menu.addItem(withTitle: "Split Right", action: #selector(splitRight(_:)), keyEquivalent: "") - menu.addItem(withTitle: "Split Left", action: #selector(splitLeft(_:)), keyEquivalent: "") - menu.addItem(withTitle: "Split Down", action: #selector(splitDown(_:)), keyEquivalent: "") - menu.addItem(withTitle: "Split Up", action: #selector(splitUp(_:)), keyEquivalent: "") + item = menu.addItem(withTitle: "Split Right", action: #selector(splitRight(_:)), keyEquivalent: "") + item.setImageIfDesired(systemSymbolName: "rectangle.righthalf.inset.filled") + item = menu.addItem(withTitle: "Split Left", action: #selector(splitLeft(_:)), keyEquivalent: "") + item.setImageIfDesired(systemSymbolName: "rectangle.leadinghalf.inset.filled") + item = menu.addItem(withTitle: "Split Down", action: #selector(splitDown(_:)), keyEquivalent: "") + item.setImageIfDesired(systemSymbolName: "rectangle.bottomhalf.inset.filled") + item = menu.addItem(withTitle: "Split Up", action: #selector(splitUp(_:)), keyEquivalent: "") + item.setImageIfDesired(systemSymbolName: "rectangle.tophalf.inset.filled") menu.addItem(.separator()) - menu.addItem(withTitle: "Reset Terminal", action: #selector(resetTerminal(_:)), keyEquivalent: "") - menu.addItem(withTitle: "Toggle Terminal Inspector", action: #selector(toggleTerminalInspector(_:)), keyEquivalent: "") + item = menu.addItem(withTitle: "Reset Terminal", action: #selector(resetTerminal(_:)), keyEquivalent: "") + item.setImageIfDesired(systemSymbolName: "arrow.trianglehead.2.clockwise") + item = menu.addItem(withTitle: "Toggle Terminal Inspector", action: #selector(toggleTerminalInspector(_:)), keyEquivalent: "") + item.setImageIfDesired(systemSymbolName: "scope") menu.addItem(.separator()) - menu.addItem(withTitle: "Change Title...", action: #selector(changeTitle(_:)), keyEquivalent: "") + item = menu.addItem(withTitle: "Change Title...", action: #selector(changeTitle(_:)), keyEquivalent: "") + item.setImageIfDesired(systemSymbolName: "pencil.line") return menu } diff --git a/macos/Sources/Helpers/Extensions/NSMenuItem+Extension.swift b/macos/Sources/Helpers/Extensions/NSMenuItem+Extension.swift new file mode 100644 index 000000000..e512904ef --- /dev/null +++ b/macos/Sources/Helpers/Extensions/NSMenuItem+Extension.swift @@ -0,0 +1,11 @@ +import AppKit + +extension NSMenuItem { + /// Sets the image property from a symbol if we want images on our menu items. + func setImageIfDesired(systemSymbolName symbol: String) { + // We only set on macOS 26 when icons on menu items became the norm. + if #available(macOS 26, *) { + image = NSImage(systemSymbolName: symbol, accessibilityDescription: title) + } + } +} From 7cc7f6cb06e67b2c5d11575bfac0d7a377d36150 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 15 Jun 2025 06:51:00 -0700 Subject: [PATCH 203/371] macos 15 regression: transparent style shouldn't draw border This fixes a regression from our Tahoe window styling changes on earlier, stable versions of macOS. We need to set "titlebarAppearsTransparent" to true in order to hide the bottom border. --- .../Window Styles/TransparentTitlebarTerminalWindow.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index 1a92fa024..0d064a7f7 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -96,9 +96,16 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { @available(macOS 13.0, *) private func syncAppearanceVentura(_ surfaceConfig: Ghostty.SurfaceView.DerivedConfig) { guard let titlebarContainer else { return } + + // Setup the titlebar background color to match ours titlebarContainer.wantsLayer = true titlebarContainer.layer?.backgroundColor = preferredBackgroundColor?.cgColor + + // See the docs for the function that sets this to true on why effectViewIsHidden = false + + // Necessary to not draw the border around the title + titlebarAppearsTransparent = true } // MARK: View Finders From 57c79fa357bb4dce1770db99ba3269682902e460 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 15 Jun 2025 07:48:14 -0700 Subject: [PATCH 204/371] macos: Tahoe menu item icons, missed the "Ghostty" menu entirely This is a follow up to #7594, I missed an entire menu. --- macos/Sources/App/macOS/AppDelegate.swift | 6 ++++++ macos/Sources/App/macOS/MainMenu.xib | 1 + 2 files changed, 7 insertions(+) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index f460017f5..c56d7c3ac 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -18,6 +18,7 @@ class AppDelegate: NSObject, ) /// Various menu items so that we can programmatically sync the keyboard shortcut with the Ghostty config + @IBOutlet private var menuAbout: NSMenuItem? @IBOutlet private var menuServices: NSMenu? @IBOutlet private var menuCheckForUpdates: NSMenuItem? @IBOutlet private var menuOpenConfig: NSMenuItem? @@ -399,6 +400,11 @@ class AppDelegate: NSObject, private func setupMenuImages() { // Note: This COULD Be done all in the xib file, but I find it easier to // modify this stuff as code. + self.menuAbout?.setImageIfDesired(systemSymbolName: "info.circle") + self.menuCheckForUpdates?.setImageIfDesired(systemSymbolName: "square.and.arrow.down") + self.menuOpenConfig?.setImageIfDesired(systemSymbolName: "gear") + self.menuReloadConfig?.setImageIfDesired(systemSymbolName: "arrow.trianglehead.2.clockwise.rotate.90") + self.menuSecureInput?.setImageIfDesired(systemSymbolName: "lock.display") self.menuNewWindow?.setImageIfDesired(systemSymbolName: "macwindow.badge.plus") self.menuNewTab?.setImageIfDesired(systemSymbolName: "macwindow") self.menuSplitRight?.setImageIfDesired(systemSymbolName: "rectangle.righthalf.inset.filled") diff --git a/macos/Sources/App/macOS/MainMenu.xib b/macos/Sources/App/macOS/MainMenu.xib index c9bff8b4a..5cd6d9bec 100644 --- a/macos/Sources/App/macOS/MainMenu.xib +++ b/macos/Sources/App/macOS/MainMenu.xib @@ -14,6 +14,7 @@ + From 4237dad240089f35643b5f83ccf83c17323bb694 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 9 Jun 2025 12:20:15 -0700 Subject: [PATCH 205/371] macOS: simple SplitView AX Proper labels, action to move the divider --- .../Features/Splits/SplitView.Divider.swift | 35 +++++++++++++++++ macos/Sources/Features/Splits/SplitView.swift | 38 ++++++++++++++++++- .../Splits/TerminalSplitTreeView.swift | 2 + 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Features/Splits/SplitView.Divider.swift b/macos/Sources/Features/Splits/SplitView.Divider.swift index 83847ff0c..a01175dce 100644 --- a/macos/Sources/Features/Splits/SplitView.Divider.swift +++ b/macos/Sources/Features/Splits/SplitView.Divider.swift @@ -7,6 +7,7 @@ extension SplitView { let visibleSize: CGFloat let invisibleSize: CGFloat let color: Color + @Binding var split: CGFloat private var visibleWidth: CGFloat? { switch (direction) { @@ -79,6 +80,40 @@ extension SplitView { NSCursor.pop() } } + .accessibilityElement(children: .ignore) + .accessibilityLabel(axLabel) + .accessibilityValue("\(Int(split * 100))%") + .accessibilityHint(axHint) + .accessibilityAddTraits(.isButton) + .accessibilityAdjustableAction { direction in + let adjustment: CGFloat = 0.025 + switch direction { + case .increment: + split = min(split + adjustment, 0.9) + case .decrement: + split = max(split - adjustment, 0.1) + @unknown default: + break + } + } + } + + private var axLabel: String { + switch direction { + case .horizontal: + return "Horizontal split divider" + case .vertical: + return "Vertical split divider" + } + } + + private var axHint: String { + switch direction { + case .horizontal: + return "Drag to resize the left and right panes" + case .vertical: + return "Drag to resize the top and bottom panes" + } } } } diff --git a/macos/Sources/Features/Splits/SplitView.swift b/macos/Sources/Features/Splits/SplitView.swift index 9747ac99f..3dc3c36a3 100644 --- a/macos/Sources/Features/Splits/SplitView.swift +++ b/macos/Sources/Features/Splits/SplitView.swift @@ -42,16 +42,23 @@ struct SplitView: View { left .frame(width: leftRect.size.width, height: leftRect.size.height) .offset(x: leftRect.origin.x, y: leftRect.origin.y) + .accessibilityElement(children: .contain) + .accessibilityLabel(leftPaneLabel) right .frame(width: rightRect.size.width, height: rightRect.size.height) .offset(x: rightRect.origin.x, y: rightRect.origin.y) + .accessibilityElement(children: .contain) + .accessibilityLabel(rightPaneLabel) Divider(direction: direction, visibleSize: splitterVisibleSize, invisibleSize: splitterInvisibleSize, - color: dividerColor) + color: dividerColor, + split: $split) .position(splitterPoint) .gesture(dragGesture(geo.size, splitterPoint: splitterPoint)) } + .accessibilityElement(children: .contain) + .accessibilityLabel(splitViewLabel) } } @@ -137,6 +144,35 @@ struct SplitView: View { return CGPoint(x: size.width / 2, y: leftRect.size.height) } } + + // MARK: Accessibility + + private var splitViewLabel: String { + switch direction { + case .horizontal: + return "Horizontal split view" + case .vertical: + return "Vertical split view" + } + } + + private var leftPaneLabel: String { + switch direction { + case .horizontal: + return "Left pane" + case .vertical: + return "Top pane" + } + } + + private var rightPaneLabel: String { + switch direction { + case .horizontal: + return "Right pane" + case .vertical: + return "Bottom pane" + } + } } enum SplitViewDirection: Codable { diff --git a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift index 2810fc2b4..f19640707 100644 --- a/macos/Sources/Features/Splits/TerminalSplitTreeView.swift +++ b/macos/Sources/Features/Splits/TerminalSplitTreeView.swift @@ -32,6 +32,8 @@ struct TerminalSplitSubtreeView: View { Ghostty.InspectableSurface( surfaceView: leafView, isSplit: !isRoot) + .accessibilityElement(children: .contain) + .accessibilityLabel("Terminal pane") case .split(let split): let splitViewDirection: SplitViewDirection = switch (split.direction) { From c90eb2e9525288d790d5a5be5e80a9f7272c1318 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 9 Jun 2025 12:48:42 -0700 Subject: [PATCH 206/371] macos: AX for debug warning --- macos/Sources/Features/Terminal/TerminalView.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/macos/Sources/Features/Terminal/TerminalView.swift b/macos/Sources/Features/Terminal/TerminalView.swift index cb6f11bce..b5be0ae42 100644 --- a/macos/Sources/Features/Terminal/TerminalView.swift +++ b/macos/Sources/Features/Terminal/TerminalView.swift @@ -139,6 +139,10 @@ struct DebugBuildWarningView: View { } .background(Color(.windowBackgroundColor)) .frame(maxWidth: .infinity) + .accessibilityElement(children: .combine) + .accessibilityLabel("Debug build warning") + .accessibilityValue("Debug builds of Ghostty are very slow and you may experience performance problems. Debug builds are only recommended during development.") + .accessibilityAddTraits(.isStaticText) .onTapGesture { isPopover = true } From be437f5b64c903f82ee04f039541af83e7f08897 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 9 Jun 2025 14:09:23 -0700 Subject: [PATCH 207/371] macos: bare minimum terminal ax --- .../Sources/Ghostty/SurfaceView_AppKit.swift | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 3e87176fc..3f9bb5e53 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -1844,3 +1844,26 @@ extension Ghostty.SurfaceView { return false } } + +// MARK: Accessibility + +extension Ghostty.SurfaceView { + /// Indicates that this view should be exposed to accessibility tools like VoiceOver. + /// By returning true, we make the terminal surface accessible to screen readers + /// and other assistive technologies. + override func isAccessibilityElement() -> Bool { + return true + } + + /// Defines the accessibility role for this view, which helps assistive technologies + /// understand what kind of content this view contains and how users can interact with it. + override func accessibilityRole() -> NSAccessibility.Role? { + /// We use .textArea because the terminal surface is essentially an editable text area + /// where users can input commands and view output. + return .textArea + } + + override func accessibilityHelp() -> String? { + return "Terminal content area" + } +} From c5f921bb066d5fb6b50d3a5570ef727a2f5ea35f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 9 Jun 2025 15:48:03 -0700 Subject: [PATCH 208/371] apprt/embedded: improve text reading APIs (selection, random points) --- include/ghostty.h | 33 ++- .../Sources/Ghostty/SurfaceView_AppKit.swift | 75 +++--- src/Surface.zig | 127 ++++++++++ src/apprt/embedded.zig | 222 ++++++++++++------ src/terminal/main.zig | 1 + 5 files changed, 357 insertions(+), 101 deletions(-) diff --git a/include/ghostty.h b/include/ghostty.h index 9f17d0b97..9fc58aa87 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -355,6 +355,27 @@ typedef struct { double tl_px_y; uint32_t offset_start; uint32_t offset_len; + const char* text; + uintptr_t text_len; +} ghostty_text_s; + +typedef enum { + GHOSTTY_POINT_ACTIVE, + GHOSTTY_POINT_VIEWPORT, + GHOSTTY_POINT_SCREEN, + GHOSTTY_POINT_SURFACE, +} ghostty_point_tag_e; + +typedef struct { + ghostty_point_tag_e tag; + uint32_t x; + uint32_t y; +} ghostty_point_s; + +typedef struct { + ghostty_point_s top_left; + ghostty_point_s bottom_right; + bool rectangle; } ghostty_selection_s; typedef struct { @@ -832,16 +853,16 @@ void ghostty_surface_complete_clipboard_request(ghostty_surface_t, void*, bool); bool ghostty_surface_has_selection(ghostty_surface_t); -uintptr_t ghostty_surface_selection(ghostty_surface_t, char*, uintptr_t); +bool ghostty_surface_read_selection(ghostty_surface_t, ghostty_text_s*); +bool ghostty_surface_read_text(ghostty_surface_t, + ghostty_selection_s, + ghostty_text_s*); +void ghostty_surface_free_text(ghostty_surface_t, ghostty_text_s*); #ifdef __APPLE__ void ghostty_surface_set_display_id(ghostty_surface_t, uint32_t); void* ghostty_surface_quicklook_font(ghostty_surface_t); -uintptr_t ghostty_surface_quicklook_word(ghostty_surface_t, - char*, - uintptr_t, - ghostty_selection_s*); -bool ghostty_surface_selection_info(ghostty_surface_t, ghostty_selection_s*); +bool ghostty_surface_quicklook_word(ghostty_surface_t, ghostty_text_s*); #endif ghostty_inspector_t ghostty_surface_inspector(ghostty_surface_t); diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 3f9bb5e53..cf9252c88 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -1215,11 +1215,10 @@ extension Ghostty { guard let surface = self.surface else { return super.quickLook(with: event) } // Grab the text under the cursor - var info: ghostty_selection_s = ghostty_selection_s(); - let text = String(unsafeUninitializedCapacity: 1000000) { - Int(ghostty_surface_quicklook_word(surface, $0.baseAddress, UInt($0.count), &info)) - } - guard !text.isEmpty else { return super.quickLook(with: event) } + var text = ghostty_text_s() + guard ghostty_surface_quicklook_word(surface, &text) else { return super.quickLook(with: event) } + defer { ghostty_surface_free_text(surface, &text) } + guard text.text_len > 0 else { return super.quickLook(with: event) } // If we can get a font then we use the font. This should always work // since we always have a primary font. The only scenario this doesn't @@ -1236,8 +1235,8 @@ extension Ghostty { } // Ghostty coordinate system is top-left, convert to bottom-left for AppKit - let pt = NSMakePoint(info.tl_px_x, frame.size.height - info.tl_px_y) - let str = NSAttributedString.init(string: text, attributes: attributes) + let pt = NSMakePoint(text.tl_px_x, frame.size.height - text.tl_px_y) + let str = NSAttributedString.init(string: String(cString: text.text), attributes: attributes) self.showDefinition(for: str, at: pt); } @@ -1522,9 +1521,10 @@ extension Ghostty.SurfaceView: NSTextInputClient { // Get our range from the Ghostty API. There is a race condition between getting the // range and actually using it since our selection may change but there isn't a good // way I can think of to solve this for AppKit. - var sel: ghostty_selection_s = ghostty_selection_s(); - guard ghostty_surface_selection_info(surface, &sel) else { return NSRange() } - return NSRange(location: Int(sel.offset_start), length: Int(sel.offset_len)) + var text = ghostty_text_s() + guard ghostty_surface_read_selection(surface, &text) else { return NSRange() } + defer { ghostty_surface_free_text(surface, &text) } + return NSRange(location: Int(text.offset_start), length: Int(text.offset_len)) } func setMarkedText(_ string: Any, selectedRange: NSRange, replacementRange: NSRange) { @@ -1562,7 +1562,6 @@ extension Ghostty.SurfaceView: NSTextInputClient { func attributedSubstring(forProposedRange range: NSRange, actualRange: NSRangePointer?) -> NSAttributedString? { // Ghostty.logger.warning("pressure substring range=\(range) selectedRange=\(self.selectedRange())") guard let surface = self.surface else { return nil } - guard ghostty_surface_has_selection(surface) else { return nil } // If the range is empty then we don't need to return anything guard range.length > 0 else { return nil } @@ -1572,11 +1571,10 @@ extension Ghostty.SurfaceView: NSTextInputClient { // bogus ranges I truly don't understand so we just always return the // attributed string containing our selection which is... weird but works? - // Get our selection. We cap it at 1MB for the purpose of this. This is - // arbitrary. If this is a good reason to increase it I'm happy to. - let v = String(unsafeUninitializedCapacity: 1000000) { - Int(ghostty_surface_selection(surface, $0.baseAddress, UInt($0.count))) - } + // Get our selection text + var text = ghostty_text_s() + guard ghostty_surface_read_selection(surface, &text) else { return nil } + defer { ghostty_surface_free_text(surface, &text) } // If we can get a font then we use the font. This should always work // since we always have a primary font. The only scenario this doesn't @@ -1592,7 +1590,7 @@ extension Ghostty.SurfaceView: NSTextInputClient { font.release() } - return .init(string: v, attributes: attributes) + return .init(string: String(cString: text.text), attributes: attributes) } func characterIndex(for point: NSPoint) -> Int { @@ -1614,12 +1612,15 @@ extension Ghostty.SurfaceView: NSTextInputClient { // point right now. I'm sure I'm missing something fundamental... if range.length > 0 && range != self.selectedRange() { // QuickLook - var sel: ghostty_selection_s = ghostty_selection_s(); - if ghostty_surface_selection_info(surface, &sel) { + var text = ghostty_text_s() + if ghostty_surface_read_selection(surface, &text) { // The -2/+2 here is subjective. QuickLook seems to offset the rectangle // a bit and I think these small adjustments make it look more natural. - x = sel.tl_px_x - 2; - y = sel.tl_px_y + 2; + x = text.tl_px_x - 2; + y = text.tl_px_y + 2; + + // Free our text + ghostty_surface_free_text(surface, &text) } else { ghostty_surface_ime_point(surface, &x, &y) } @@ -1745,14 +1746,13 @@ extension Ghostty.SurfaceView: NSServicesMenuRequestor { ) -> Bool { guard let surface = self.surface else { return false } - // We currently cap the maximum copy size to 1MB. iTerm2 I believe - // caps theirs at 0.1MB (configurable) so this is probably reasonable. - let v = String(unsafeUninitializedCapacity: 1000000) { - Int(ghostty_surface_selection(surface, $0.baseAddress, UInt($0.count))) - } + // Read the selection + var text = ghostty_text_s() + guard ghostty_surface_read_selection(surface, &text) else { return false } + defer { ghostty_surface_free_text(surface, &text) } pboard.declareTypes([.string], owner: nil) - pboard.setString(v, forType: .string) + pboard.setString(String(cString: text.text), forType: .string) return true } @@ -1866,4 +1866,25 @@ extension Ghostty.SurfaceView { override func accessibilityHelp() -> String? { return "Terminal content area" } + + /// Returns the range of text that is currently selected in the terminal. + /// This allows VoiceOver and other assistive technologies to understand + /// what text the user has selected. + override func accessibilitySelectedTextRange() -> NSRange { + return selectedRange() + } + + /// Returns the currently selected text as a string. + /// This allows assistive technologies to read the selected content. + override func accessibilitySelectedText() -> String? { + guard let surface = self.surface else { return nil } + + // Attempt to read the selection + var text = ghostty_text_s() + guard ghostty_surface_read_selection(surface, &text) else { return nil } + defer { ghostty_surface_free_text(surface, &text) } + + let str = String(cString: text.text) + return str.isEmpty ? nil : str + } } diff --git a/src/Surface.zig b/src/Surface.zig index 9ab7234d6..41d40125a 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -1292,6 +1292,133 @@ fn recomputeInitialSize( ) catch return error.AppActionFailed; } +/// Represents text read from the terminal and some metadata about it +/// that is often useful to apprts. +pub const Text = struct { + /// The text that was read from the terminal. + text: [:0]const u8, + + /// The viewport information about this text, if it is visible in + /// the viewport. + /// + /// NOTE(mitchellh): This will only be non-null currently if the entirety + /// of the selection is contained within the viewport. We don't have a + /// use case currently for partial bounds but we should support this + /// eventually. + viewport: ?Viewport = null, + + pub const Viewport = struct { + /// The top-left corner of the selection in pixels within the viewport. + tl_px_x: f64, + tl_px_y: f64, + + /// The linear offset of the start of the selection and the length. + /// This is "linear" in the sense that it is the offset in the + /// flattened viewport as a single array of text. + offset_start: u32, + offset_len: u32, + }; + + pub fn deinit(self: *Text, alloc: Allocator) void { + alloc.free(self.text); + } +}; + +/// Grab the value of text at the given selection point. Note that the +/// selection structure is used as a way to determine the area of the +/// screen to read from, it doesn't have to match the user's current +/// selection state. +/// +/// The returned value contains allocated data and must be deinitialized. +pub fn dumpText( + self: *Surface, + alloc: Allocator, + sel: terminal.Selection, +) !Text { + self.renderer_state.mutex.lock(); + defer self.renderer_state.mutex.unlock(); + return try self.dumpTextLocked(alloc, sel); +} + +/// Same as `dumpText` but assumes the renderer state mutex is already +/// held. +pub fn dumpTextLocked( + self: *Surface, + alloc: Allocator, + sel: terminal.Selection, +) !Text { + // Read out the text + const text = try self.io.terminal.screen.selectionString(alloc, .{ + .sel = sel, + .trim = false, + }); + errdefer alloc.free(text); + + // Calculate our viewport info if we can. + const vp: ?Text.Viewport = viewport: { + // If our tl or br is not in the viewport then we don't + // have a viewport. One day we should extend this to support + // partial selections that are in the viewport. + const tl_pt = self.io.terminal.screen.pages.pointFromPin( + .viewport, + sel.topLeft(&self.io.terminal.screen), + ) orelse break :viewport null; + const br_pt = self.io.terminal.screen.pages.pointFromPin( + .viewport, + sel.bottomRight(&self.io.terminal.screen), + ) orelse break :viewport null; + const tl_coord = tl_pt.coord(); + const br_coord = br_pt.coord(); + + // Our sizes are all scaled so we need to send the unscaled values back. + const content_scale = self.rt_surface.getContentScale() catch .{ .x = 1, .y = 1 }; + const x: f64 = x: { + // Simple x * cell width gives the left + var x: f64 = @floatFromInt(tl_coord.x * self.size.cell.width); + + // Add padding + x += @floatFromInt(self.size.padding.left); + + // Scale + x /= content_scale.x; + + break :x x; + }; + const y: f64 = y: { + // Simple y * cell height gives the top + var y: f64 = @floatFromInt(tl_coord.y * self.size.cell.height); + + // We want the text baseline + y += @floatFromInt(self.size.cell.height); + y -= @floatFromInt(self.font_metrics.cell_baseline); + + // Add padding + y += @floatFromInt(self.size.padding.top); + + // Scale + y /= content_scale.y; + + break :y y; + }; + + // Utilize viewport sizing to convert to offsets + const start = tl_coord.y * self.io.terminal.screen.pages.cols + tl_coord.x; + const end = br_coord.y * self.io.terminal.screen.pages.cols + br_coord.x; + + break :viewport .{ + .tl_px_x = x, + .tl_px_y = y, + .offset_start = start, + .offset_len = end - start, + }; + }; + + return .{ + .text = text, + .viewport = vp, + }; +} + /// Returns true if the terminal has a selection. pub fn hasSelection(self: *const Surface) bool { self.renderer_state.mutex.lock(); diff --git a/src/apprt/embedded.zig b/src/apprt/embedded.zig index 5334c8ecd..dbc74e6ae 100644 --- a/src/apprt/embedded.zig +++ b/src/apprt/embedded.zig @@ -1138,13 +1138,6 @@ pub const CAPI = struct { } }; - const Selection = extern struct { - tl_x_px: f64, - tl_y_px: f64, - offset_start: u32, - offset_len: u32, - }; - const SurfaceSize = extern struct { columns: u16, rows: u16, @@ -1154,6 +1147,83 @@ pub const CAPI = struct { cell_height_px: u32, }; + // ghostty_text_s + const Text = extern struct { + tl_px_x: f64, + tl_px_y: f64, + offset_start: u32, + offset_len: u32, + text: ?[*:0]const u8, + text_len: usize, + + pub fn deinit(self: *Text) void { + if (self.text) |ptr| { + global.alloc.free(ptr[0..self.text_len :0]); + } + } + }; + + // ghostty_point_s + const Point = extern struct { + tag: Tag, + x: u32, + y: u32, + + const Tag = enum(c_int) { + active = 0, + viewport = 1, + screen = 2, + history = 3, + }; + + fn core(self: Point) terminal.Point { + // This comes from the C API so we can't trust the input. + const pt_x = std.math.cast( + terminal.size.CellCountInt, + self.x, + ) orelse std.math.maxInt(terminal.size.CellCountInt); + + return switch (self.tag) { + inline else => |tag| @unionInit( + terminal.Point, + @tagName(tag), + .{ .x = pt_x, .y = self.y }, + ), + }; + } + + fn clamp(self: Point, screen: *const terminal.Screen) Point { + // Clamp our point to the screen bounds. + const clamped_x = @min(self.x, screen.pages.cols -| 1); + const clamped_y = @min(self.y, screen.pages.rows -| 1); + return .{ .tag = self.tag, .x = clamped_x, .y = clamped_y }; + } + }; + + // ghostty_selection_s + const Selection = extern struct { + tl: Point, + br: Point, + rectangle: bool, + + fn core( + self: Selection, + screen: *const terminal.Screen, + ) ?terminal.Selection { + return .{ + .bounds = .{ .untracked = .{ + .start = screen.pages.pin( + self.tl.clamp(screen).core(), + ) orelse return null, + .end = screen.pages.pin( + self.br.clamp(screen).core(), + ) orelse return null, + } }, + .rectangle = self.rectangle, + }; + } + }; + // Reference the conditional exports based on target platform // so they're included in the C API. comptime { @@ -1369,23 +1439,80 @@ pub const CAPI = struct { return surface.core_surface.hasSelection(); } - /// Copies the surface selection text into the provided buffer and - /// returns the copied size. If the buffer is too small, there is no - /// selection, or there is an error, then 0 is returned. - export fn ghostty_surface_selection(surface: *Surface, buf: [*]u8, cap: usize) usize { - const selection_ = surface.core_surface.selectionString(global.alloc) catch |err| { - log.warn("error getting selection err={}", .{err}); - return 0; + /// Same as ghostty_surface_read_text but reads from the user selection, + /// if any. + export fn ghostty_surface_read_selection( + surface: *Surface, + result: *Text, + ) bool { + const core_surface = &surface.core_surface; + core_surface.renderer_state.mutex.lock(); + defer core_surface.renderer_state.mutex.unlock(); + + // If we don't have a selection, do nothing. + const core_sel = core_surface.io.terminal.screen.selection orelse return false; + + // Read the text from the selection. + return readTextLocked(surface, core_sel, result); + } + + /// Read some arbitrary text from the surface. + /// + /// This is an expensive operation so it shouldn't be called too + /// often. We recommend that callers cache the result and throttle + /// calls to this function. + export fn ghostty_surface_read_text( + surface: *Surface, + sel: Selection, + result: *Text, + ) bool { + surface.core_surface.renderer_state.mutex.lock(); + defer surface.core_surface.renderer_state.mutex.unlock(); + + const core_sel = sel.core( + &surface.core_surface.renderer_state.terminal.screen, + ) orelse return false; + + return readTextLocked(surface, core_sel, result); + } + + fn readTextLocked( + surface: *Surface, + core_sel: terminal.Selection, + result: *Text, + ) bool { + const core_surface = &surface.core_surface; + + // Get our text directly from the core surface. + const text = core_surface.dumpTextLocked( + global.alloc, + core_sel, + ) catch |err| { + log.warn("error reading text err={}", .{err}); + return false; }; - const selection = selection_ orelse return 0; - defer global.alloc.free(selection); - // If the buffer is too small, return no selection. - if (selection.len > cap) return 0; + const vp: CoreSurface.Text.Viewport = text.viewport orelse .{ + .tl_px_x = -1, + .tl_px_y = -1, + .offset_start = 0, + .offset_len = 0, + }; - // Copy into the buffer and return the length - @memcpy(buf[0..selection.len], selection); - return selection.len; + result.* = .{ + .tl_px_x = vp.tl_px_x, + .tl_px_y = vp.tl_px_y, + .offset_start = vp.offset_start, + .offset_len = vp.offset_len, + .text = text.text.ptr, + .text_len = text.text.len, + }; + + return true; + } + + export fn ghostty_surface_free_text(ptr: *Text) void { + ptr.deinit(); } /// Tell the surface that it needs to schedule a render @@ -1888,21 +2015,12 @@ pub const CAPI = struct { /// This does not modify the selection active on the surface (if any). export fn ghostty_surface_quicklook_word( ptr: *Surface, - buf: [*]u8, - cap: usize, - info: *Selection, - ) usize { + result: *Text, + ) bool { const surface = &ptr.core_surface; surface.renderer_state.mutex.lock(); defer surface.renderer_state.mutex.unlock(); - // To make everything in this function easier, we modify the - // selection to be the word under the cursor and call normal APIs. - // We restore the old selection so it isn't ever changed. Since we hold - // the renderer mutex it'll never show up in a frame. - const prev = surface.io.terminal.screen.selection; - defer surface.io.terminal.screen.selection = prev; - // Get our word selection const sel = sel: { const screen = &surface.renderer_state.terminal.screen; @@ -1915,45 +2033,13 @@ pub const CAPI = struct { }, }) orelse { if (comptime std.debug.runtime_safety) unreachable; - return 0; + return false; }; - break :sel surface.io.terminal.screen.selectWord(pin) orelse return 0; + break :sel surface.io.terminal.screen.selectWord(pin) orelse return false; }; - // Set the selection - surface.io.terminal.screen.selection = sel; - - // No we call normal functions. These require that the lock - // is unlocked. This may cause a frame flicker with the fake - // selection but I think the lack of new complexity is worth it - // for now. - { - surface.renderer_state.mutex.unlock(); - defer surface.renderer_state.mutex.lock(); - const len = ghostty_surface_selection(ptr, buf, cap); - if (!ghostty_surface_selection_info(ptr, info)) return 0; - return len; - } - } - - /// This returns the selection metadata for the current selection. - /// This will return false if there is no selection or the - /// selection is not fully contained in the viewport (since the - /// metadata is all about that). - export fn ghostty_surface_selection_info( - ptr: *Surface, - info: *Selection, - ) bool { - const sel = ptr.core_surface.selectionInfo() orelse - return false; - - info.* = .{ - .tl_x_px = sel.tl_x_px, - .tl_y_px = sel.tl_y_px, - .offset_start = sel.offset_start, - .offset_len = sel.offset_len, - }; - return true; + // Read the selection + return readTextLocked(ptr, sel, result); } export fn ghostty_inspector_metal_init(ptr: *Inspector, device: objc.c.id) bool { diff --git a/src/terminal/main.zig b/src/terminal/main.zig index df3788d30..74ffe6341 100644 --- a/src/terminal/main.zig +++ b/src/terminal/main.zig @@ -35,6 +35,7 @@ pub const Page = page.Page; pub const PageList = @import("PageList.zig"); pub const Parser = @import("Parser.zig"); pub const Pin = PageList.Pin; +pub const Point = point.Point; pub const Screen = @import("Screen.zig"); pub const ScreenType = Terminal.ScreenType; pub const Selection = @import("Selection.zig"); From e1ee180172ae5ba192dd4f272a70e21df11138ad Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 15 Jun 2025 13:06:18 -0700 Subject: [PATCH 209/371] apprt/embedded: API to read text can get top left/bottom right coords --- include/ghostty.h | 7 +++++ src/apprt/embedded.zig | 59 ++++++++++++++++++++++++++++-------------- 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/include/ghostty.h b/include/ghostty.h index 9fc58aa87..fc2c915cb 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -366,8 +366,15 @@ typedef enum { GHOSTTY_POINT_SURFACE, } ghostty_point_tag_e; +typedef enum { + GHOSTTY_POINT_COORD_EXACT, + GHOSTTY_POINT_COORD_TOP_LEFT, + GHOSTTY_POINT_COORD_BOTTOM_RIGHT, +} ghostty_point_coord_e; + typedef struct { ghostty_point_tag_e tag; + ghostty_point_coord_e coord; uint32_t x; uint32_t y; } ghostty_point_s; diff --git a/src/apprt/embedded.zig b/src/apprt/embedded.zig index dbc74e6ae..a61c75e96 100644 --- a/src/apprt/embedded.zig +++ b/src/apprt/embedded.zig @@ -1166,6 +1166,7 @@ pub const CAPI = struct { // ghostty_point_s const Point = extern struct { tag: Tag, + coord_tag: CoordTag, x: u32, y: u32, @@ -1176,27 +1177,51 @@ pub const CAPI = struct { history = 3, }; - fn core(self: Point) terminal.Point { - // This comes from the C API so we can't trust the input. - const pt_x = std.math.cast( - terminal.size.CellCountInt, - self.x, - ) orelse std.math.maxInt(terminal.size.CellCountInt); + const CoordTag = enum(c_int) { + exact = 0, + top_left = 1, + bottom_right = 2, + }; - return switch (self.tag) { - inline else => |tag| @unionInit( - terminal.Point, + fn pin( + self: Point, + screen: *const terminal.Screen, + ) ?terminal.Pin { + // The core point tag. + const tag: terminal.point.Tag = switch (self.tag) { + inline else => |tag| @field( + terminal.point.Tag, @tagName(tag), - .{ .x = pt_x, .y = self.y }, ), }; - } - fn clamp(self: Point, screen: *const terminal.Screen) Point { // Clamp our point to the screen bounds. const clamped_x = @min(self.x, screen.pages.cols -| 1); const clamped_y = @min(self.y, screen.pages.rows -| 1); - return .{ .tag = self.tag, .x = clamped_x, .y = clamped_y }; + + return switch (self.coord_tag) { + // Exact coordinates require a specific pin. + .exact => exact: { + const pt_x = std.math.cast( + terminal.size.CellCountInt, + clamped_x, + ) orelse std.math.maxInt(terminal.size.CellCountInt); + + const pt: terminal.Point = switch (tag) { + inline else => |v| @unionInit( + terminal.Point, + @tagName(v), + .{ .x = pt_x, .y = clamped_y }, + ), + }; + + break :exact screen.pages.pin(pt) orelse null; + }, + + .top_left => screen.pages.getTopLeft(tag), + + .bottom_right => screen.pages.getBottomRight(tag), + }; } }; @@ -1212,12 +1237,8 @@ pub const CAPI = struct { ) ?terminal.Selection { return .{ .bounds = .{ .untracked = .{ - .start = screen.pages.pin( - self.tl.clamp(screen).core(), - ) orelse return null, - .end = screen.pages.pin( - self.br.clamp(screen).core(), - ) orelse return null, + .start = self.tl.pin(screen) orelse return null, + .end = self.br.pin(screen) orelse return null, } }, .rectangle = self.rectangle, }; From 839d89f2dcbc77dd0f1de9e34f0e5e5eb5e21316 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 15 Jun 2025 13:46:34 -0700 Subject: [PATCH 210/371] macos: simple cache of screen contents for ax --- .../Sources/Ghostty/SurfaceView_AppKit.swift | 76 ++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index cf9252c88..046e79a23 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -138,6 +138,9 @@ extension Ghostty { // by the user, this is set to the prior value (which may be empty, but non-nil). private var titleFromTerminal: String? + // The cached contents of the screen. + private var cachedScreenContents: CachedValue + /// Event monitor (see individual events for why) private var eventMonitor: Any? = nil @@ -159,11 +162,38 @@ extension Ghostty { self.derivedConfig = DerivedConfig() } + // We need to initialize this so it does something but we want to set + // it back up later so we can reference `self`. This is a hack we should + // fix at some point. + self.cachedScreenContents = .init(duration: .milliseconds(500)) { "" } + // Initialize with some default frame size. The important thing is that this // is non-zero so that our layer bounds are non-zero so that our renderer // can do SOMETHING. super.init(frame: NSMakeRect(0, 0, 800, 600)) + // Our cache of screen data + cachedScreenContents = .init(duration: .milliseconds(500)) { [weak self] in + guard let self else { return "" } + guard let surface = self.surface else { return "" } + var text = ghostty_text_s() + let sel = ghostty_selection_s( + top_left: ghostty_point_s( + tag: GHOSTTY_POINT_SCREEN, + coord: GHOSTTY_POINT_COORD_TOP_LEFT, + x: 0, + y: 0), + bottom_right: ghostty_point_s( + tag: GHOSTTY_POINT_SCREEN, + coord: GHOSTTY_POINT_COORD_BOTTOM_RIGHT, + x: 0, + y: 0), + rectangle: false) + guard ghostty_surface_read_text(surface, sel, &text) else { return "" } + defer { ghostty_surface_free_text(surface, &text) } + return String(cString: text.text) + } + // Set a timer to show the ghost emoji after 500ms if no title is set titleFallbackTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] _ in if let self = self, self.title.isEmpty { @@ -1866,7 +1896,11 @@ extension Ghostty.SurfaceView { override func accessibilityHelp() -> String? { return "Terminal content area" } - + + override func accessibilityValue() -> Any? { + return cachedScreenContents.get() + } + /// Returns the range of text that is currently selected in the terminal. /// This allows VoiceOver and other assistive technologies to understand /// what text the user has selected. @@ -1888,3 +1922,43 @@ extension Ghostty.SurfaceView { return str.isEmpty ? nil : str } } + +/// Caches a value for some period of time, evicting it automatically when that time expires. +/// We use this to cache our surface content. This probably should be extracted some day +/// to a more generic helper. +/// +// TODO: +// - Auto-expire the data so it doesn't take memory +fileprivate class CachedValue { + private var value: Value? + private let fetch: () -> T + private let duration: Duration + + struct Value { + var value: T + var expires: ContinuousClock.Instant + } + + init(duration: Duration, fetch: @escaping () -> T) { + self.duration = duration + self.fetch = fetch + } + + func get() -> T { + let now = ContinuousClock.now + if let value { + // If the value isn't expired just return it + if value.expires > now { + return value.value + } + + // Value is expired, clear it + self.value = nil + } + + // We don't have a value (or it expired). Fetch and store. + let result = fetch() + self.value = .init(value: result, expires: now + duration) + return result + } +} From e69c756c895f1cc9106e22d419037a926c3176c7 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 15 Jun 2025 13:55:03 -0700 Subject: [PATCH 211/371] macos: auto-expire cached screen contents --- .../Sources/Ghostty/SurfaceView_AppKit.swift | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 046e79a23..57fa56e77 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -1926,39 +1926,43 @@ extension Ghostty.SurfaceView { /// Caches a value for some period of time, evicting it automatically when that time expires. /// We use this to cache our surface content. This probably should be extracted some day /// to a more generic helper. -/// -// TODO: -// - Auto-expire the data so it doesn't take memory fileprivate class CachedValue { - private var value: Value? + private var value: T? private let fetch: () -> T private let duration: Duration - - struct Value { - var value: T - var expires: ContinuousClock.Instant - } + private var expiryTask: Task? init(duration: Duration, fetch: @escaping () -> T) { self.duration = duration self.fetch = fetch } - func get() -> T { - let now = ContinuousClock.now - if let value { - // If the value isn't expired just return it - if value.expires > now { - return value.value - } + deinit { + expiryTask?.cancel() + } - // Value is expired, clear it - self.value = nil + func get() -> T { + if let value { + return value } // We don't have a value (or it expired). Fetch and store. let result = fetch() - self.value = .init(value: result, expires: now + duration) + let now = ContinuousClock.now + let expires = now + duration + self.value = result + + // Schedule a task to clear the value + expiryTask = Task { [weak self] in + do { + try await Task.sleep(until: expires) + self?.value = nil + self?.expiryTask = nil + } catch { + // Task was cancelled, do nothing + } + } + return result } } From a2b4a2c0e42cb2bdf970598083e59e5be88f511d Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 15 Jun 2025 14:00:39 -0700 Subject: [PATCH 212/371] macos: complete more ax APIs for terminal accessibility --- .../Sources/Ghostty/SurfaceView_AppKit.swift | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 57fa56e77..a47dbdaca 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -1921,6 +1921,59 @@ extension Ghostty.SurfaceView { let str = String(cString: text.text) return str.isEmpty ? nil : str } + + /// Returns the number of characters in the terminal content. + /// This helps assistive technologies understand the size of the content. + override func accessibilityNumberOfCharacters() -> Int { + let content = cachedScreenContents.get() + return content.count + } + + /// Returns the visible character range for the terminal. + /// For terminals, we typically show all content as visible. + override func accessibilityVisibleCharacterRange() -> NSRange { + let content = cachedScreenContents.get() + return NSRange(location: 0, length: content.count) + } + + /// Returns the line number for a given character index. + /// This helps assistive technologies navigate by line. + override func accessibilityLine(for index: Int) -> Int { + let content = cachedScreenContents.get() + let substring = String(content.prefix(index)) + return substring.components(separatedBy: .newlines).count - 1 + } + + /// Returns a substring for the given range. + /// This allows assistive technologies to read specific portions of the content. + override func accessibilityString(for range: NSRange) -> String? { + let content = cachedScreenContents.get() + guard let swiftRange = Range(range, in: content) else { return nil } + return String(content[swiftRange]) + } + + /// Returns an attributed string for the given range. + /// + /// Note: right now this only applies font information. One day it'd be nice to extend + /// this to copy styling information as well but we need to augment Ghostty core to + /// expose that. + /// + /// This provides styling information to assistive technologies. + override func accessibilityAttributedString(for range: NSRange) -> NSAttributedString? { + guard let surface = self.surface else { return nil } + guard let plainString = accessibilityString(for: range) else { return nil } + + var attributes: [NSAttributedString.Key: Any] = [:] + + // Try to get the font from the surface + if let fontRaw = ghostty_surface_quicklook_font(surface) { + let font = Unmanaged.fromOpaque(fontRaw) + attributes[.font] = font.takeUnretainedValue() + font.release() + } + + return NSAttributedString(string: plainString, attributes: attributes) + } } /// Caches a value for some period of time, evicting it automatically when that time expires. From b629f3337a147f7a2f77f801b6fd621c90cfb4d2 Mon Sep 17 00:00:00 2001 From: Jon Parise Date: Mon, 16 Jun 2025 19:32:42 -0400 Subject: [PATCH 213/371] bash: remove dependency on $GHOSTTY_RESOURCES_DIR We were depending on $GHOSTTY_RESOURCES_DIR for two reasons: 1. To locate our script-adjacent bash-preexec.sh script 2. To restrict our script's execution to environments in which $GHOSTTY_RESOURCES_DIR is available (i.e. Ghostty-only shells) For (1), we can instead determine our directory using $BASH_SOURCE[0]. This is slightly differently than our previous behavior, where we'd always load bash-preexec.sh from the $GHOSTTY_RESOURCES_DIR hierarchy, even if ghostty.bash from source from somewhere else on the file system ... but we never relied on that behavior, even in development. For (2), there's no harm in source'ing this script outside of Ghostty, and if that does become a concern, we can restore this condition or use something more targeted based on those specific cases. Historically, I believe (2) was in place to enable (1), so addressing (1) removes the need for (2). And lastly, none of the other shell integration scripts depend on $GHOSTTY_RESOURCES_DIR. --- src/shell-integration/bash/ghostty.bash | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/shell-integration/bash/ghostty.bash b/src/shell-integration/bash/ghostty.bash index 0cfd41663..0766198f9 100644 --- a/src/shell-integration/bash/ghostty.bash +++ b/src/shell-integration/bash/ghostty.bash @@ -15,10 +15,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# We need to be in interactive mode and we need to have the Ghostty -# resources dir set which also tells us we're running in Ghostty. +# We need to be in interactive mode to proceed. if [[ "$-" != *i* ]] ; then builtin return; fi -if [ -z "$GHOSTTY_RESOURCES_DIR" ]; then builtin return; fi # When automatic shell integration is active, we were started in POSIX # mode and need to manually recreate the bash startup sequence. @@ -98,7 +96,7 @@ if [[ "$GHOSTTY_SHELL_FEATURES" == *"sudo"* && -n "$TERMINFO" ]]; then fi # Import bash-preexec, safe to do multiple times -builtin source "$GHOSTTY_RESOURCES_DIR/shell-integration/bash/bash-preexec.sh" +builtin source "$(dirname -- "${BASH_SOURCE[0]}")/bash-preexec.sh" # This is set to 1 when we're executing a command so that we don't # send prompt marks multiple times. From 6d283c012e19f7b09eb2a07b19133f093b5270a0 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 17 Jun 2025 13:34:18 -0700 Subject: [PATCH 214/371] ci: build macOS releases with Xcode 26 Resolves #7591 This moves our CI to build macOS on Sequoia (macOS 15) with Xcode 26, including the new macOS 26 beta SDK. Importantly, this will make our builds on macOS 26 use the new styling. I've added a new job that ensures we can continue to build with Xcode 16 and the macOS 15 SDK, as well, although I think that might come to an end when we switch over to an IconComposer-based icon. I'll verify then. For now, we continue to support both. I've also removed our `hasLiquidGlass` check, since this will now always be true for macOS 26 builds. --- .github/workflows/release-pr.yml | 4 +- .github/workflows/release-tip.yml | 6 +- .github/workflows/test.yml | 56 ++++++++++++++----- .../Terminal/TerminalController.swift | 2 +- .../Window Styles/TerminalWindow.swift | 2 +- .../TransparentTitlebarTerminalWindow.swift | 10 ++-- macos/Sources/Helpers/AppInfo.swift | 34 ----------- 7 files changed, 56 insertions(+), 58 deletions(-) diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml index 3f89bd702..a1cc2af19 100644 --- a/.github/workflows/release-pr.yml +++ b/.github/workflows/release-pr.yml @@ -94,7 +94,7 @@ jobs: - name: Build Ghostty.app run: | cd macos - sudo xcode-select -s /Applications/Xcode_16.4.app + sudo xcode-select -s /Applications/Xcode_26.0.app xcodebuild -target Ghostty -configuration Release # We inject the "build number" as simply the number of commits since HEAD. @@ -246,7 +246,7 @@ jobs: - name: Build Ghostty.app run: | cd macos - sudo xcode-select -s /Applications/Xcode_16.4.app + sudo xcode-select -s /Applications/Xcode_26.0.app xcodebuild -target Ghostty -configuration Release # We inject the "build number" as simply the number of commits since HEAD. diff --git a/.github/workflows/release-tip.yml b/.github/workflows/release-tip.yml index 6c6399afd..2a3277ea6 100644 --- a/.github/workflows/release-tip.yml +++ b/.github/workflows/release-tip.yml @@ -173,7 +173,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: XCode Select - run: sudo xcode-select -s /Applications/Xcode_16.4.app + run: sudo xcode-select -s /Applications/Xcode_26.0.app # Setup Sparkle - name: Setup Sparkle @@ -388,7 +388,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: XCode Select - run: sudo xcode-select -s /Applications/Xcode_16.4.app + run: sudo xcode-select -s /Applications/Xcode_26.0.app # Setup Sparkle - name: Setup Sparkle @@ -563,7 +563,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: XCode Select - run: sudo xcode-select -s /Applications/Xcode_16.4.app + run: sudo xcode-select -s /Applications/Xcode_26.0.app # Setup Sparkle - name: Setup Sparkle diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 814acec8f..2eca0a41e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,6 +18,7 @@ jobs: - build-nix - build-snap - build-macos + - build-macos-sequoia-stable - build-macos-tahoe - build-macos-matrix - build-windows @@ -270,6 +271,46 @@ jobs: ghostty-source.tar.gz build-macos: + runs-on: namespace-profile-ghostty-macos-sequoia + needs: test + steps: + - name: Checkout code + uses: actions/checkout@v4 + + # Install Nix and use that to run our tests so our environment matches exactly. + - uses: cachix/install-nix-action@v31 + with: + nix_path: nixpkgs=channel:nixos-unstable + - uses: cachix/cachix-action@v16 + with: + name: ghostty + authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" + + - name: Xcode Select + run: sudo xcode-select -s /Applications/Xcode_26.0.app + + - name: get the Zig deps + id: deps + run: nix build -L .#deps && echo "deps=$(readlink ./result)" >> $GITHUB_OUTPUT + + # GhosttyKit is the framework that is built from Zig for our native + # Mac app to access. + - name: Build GhosttyKit + run: nix develop -c zig build --system ${{ steps.deps.outputs.deps }} + + # The native app is built with native Xcode tooling. This also does + # codesigning. IMPORTANT: this must NOT run in a Nix environment. + # Nix breaks xcodebuild so this has to be run outside. + - name: Build Ghostty.app + run: cd macos && xcodebuild -target Ghostty + + # Build the iOS target without code signing just to verify it works. + - name: Build Ghostty iOS + run: | + cd macos + xcodebuild -target Ghostty-iOS "CODE_SIGNING_ALLOWED=NO" + + build-macos-sequoia-stable: runs-on: namespace-profile-ghostty-macos-sequoia needs: test steps: @@ -328,17 +369,6 @@ jobs: - name: Xcode Select run: sudo xcode-select -s /Applications/Xcode_26.0.app - # TODO(tahoe): - # https://developer.apple.com/documentation/xcode-release-notes/xcode-26-release-notes#Interface-Builder - # We allow this step to fail because if our image already has - # the workaround in place this will fail. - - name: Xcode 26 Beta 17A5241e Metal Workaround - continue-on-error: true - run: | - xcodebuild -downloadComponent metalToolchain -exportPath /tmp/MyMetalExport/ - sed -i '' -e 's/17A5241c/17A5241e/g' /tmp/MyMetalExport/MetalToolchain-17A5241c.exportedBundle/ExportMetadata.plist - xcodebuild -importComponent metalToolchain -importPath /tmp/MyMetalExport/MetalToolchain-17A5241c.exportedBundle - - name: get the Zig deps id: deps run: nix build -L .#deps && echo "deps=$(readlink ./result)" >> $GITHUB_OUTPUT @@ -377,7 +407,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: Xcode Select - run: sudo xcode-select -s /Applications/Xcode_16.4.app + run: sudo xcode-select -s /Applications/Xcode_26.0.app - name: get the Zig deps id: deps @@ -695,7 +725,7 @@ jobs: authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - name: Xcode Select - run: sudo xcode-select -s /Applications/Xcode_16.4.app + run: sudo xcode-select -s /Applications/Xcode_26.0.app - name: get the Zig deps id: deps diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 49b3fea34..03a4e548e 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -16,7 +16,7 @@ class TerminalController: BaseTerminalController { case "hidden": "TerminalHiddenTitlebar" case "transparent": "TerminalTransparentTitlebar" case "tabs": - if #available(macOS 26.0, *), hasLiquidGlass() { + if #available(macOS 26.0, *) { "TerminalTabsTitlebarTahoe" } else { "TerminalTabsTitlebarVentura" diff --git a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift index e24323113..f9dfb9591 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TerminalWindow.swift @@ -447,7 +447,7 @@ extension TerminalWindow { // The padding from the top that the view appears. This was all just manually // measured based on the OS. var topPadding: CGFloat { - if #available(macOS 26.0, *), hasLiquidGlass() { + if #available(macOS 26.0, *) { return viewModel.hasToolbar ? 10 : 5 } else { return viewModel.hasToolbar ? 9 : 4 diff --git a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift index 0d064a7f7..f6ad6e56c 100644 --- a/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift +++ b/macos/Sources/Features/Terminal/Window Styles/TransparentTitlebarTerminalWindow.swift @@ -45,11 +45,13 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { override func update() { super.update() - + // On macOS 13 to 15, we need to hide the NSVisualEffectView in order to allow our // titlebar to be truly transparent. - if !effectViewIsHidden && !hasLiquidGlass() { - hideEffectView() + if #unavailable(macOS 26) { + if !effectViewIsHidden { + hideEffectView() + } } } @@ -65,7 +67,7 @@ class TransparentTitlebarTerminalWindow: TerminalWindow { // references changed (e.g. tabGroup is new). setupKVO() - if #available(macOS 26.0, *), hasLiquidGlass() { + if #available(macOS 26.0, *) { syncAppearanceTahoe(surfaceConfig) } else { syncAppearanceVentura(surfaceConfig) diff --git a/macos/Sources/Helpers/AppInfo.swift b/macos/Sources/Helpers/AppInfo.swift index cf66e332d..281bad18b 100644 --- a/macos/Sources/Helpers/AppInfo.swift +++ b/macos/Sources/Helpers/AppInfo.swift @@ -8,37 +8,3 @@ func isRunningInXcode() -> Bool { return false } - -/// True if we have liquid glass available. -func hasLiquidGlass() -> Bool { - // Can't have liquid glass unless we're in macOS 26+ - if #unavailable(macOS 26.0) { - return false - } - - // If we aren't running SDK 26.0 or later then we definitely - // do not have liquid glass. - guard let sdkName = Bundle.main.infoDictionary?["DTSDKName"] as? String else { - // If we don't have this, we assume we're built against the latest - // since we're on macOS 26+ - return true - } - - // If the SDK doesn't start with macosx then we just assume we - // have it because we already verified we're on macOS above. - guard sdkName.hasPrefix("macosx") else { - return true - } - - // The SDK version must be at least 26 - let versionString = String(sdkName.dropFirst("macosx".count)) - guard let major = if let dotIndex = versionString.firstIndex(of: ".") { - Int(String(versionString[..= 26 -} From e6c77789d341742aa80d7387cfba67bba9843b75 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 17 Jun 2025 15:02:59 -0700 Subject: [PATCH 215/371] macOS: Confirm close on window close Fixes #7615 We were incorrectly closing the window without confirmation when there were no tabs. --- .../Features/Terminal/TerminalController.swift | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 03a4e548e..2e4fb7363 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -1001,20 +1001,14 @@ class TerminalController: BaseTerminalController { @IBAction override func closeWindow(_ sender: Any?) { guard let window = window else { return } - guard let tabGroup = window.tabGroup else { - // No tabs, no tab group, just perform a normal close. - closeWindowImmediately() - return - } - // If have one window then we just do a normal close - if tabGroup.windows.count == 1 { - closeWindowImmediately() - return - } + // We need to check all the windows in our tab group for confirmation + // if we're closing the window. If we don't have a tabgroup for any + // reason we check ourselves. + let windows: [NSWindow] = window.tabGroup?.windows ?? [window] // Check if any windows require close confirmation. - let needsConfirm = tabGroup.windows.contains { tabWindow in + let needsConfirm = windows.contains { tabWindow in guard let controller = tabWindow.windowController as? TerminalController else { return false } From 51b9fa751a13fab2884e37292159379372f4da91 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 17 Jun 2025 16:13:23 -0700 Subject: [PATCH 216/371] macos: disambiguate close tab vs close window for confirmation This fixes an issue where pressing the red close button in a window or the "x" button on a tab couldn't differentiate and would always close the tab or close the window (depending on tab counts). It seems like in both cases, AppKit triggers the `windowShouldClose` delegate method on the controller, but for the close window case it triggers this on ALL the windows in the group, not just the one that was clicked. I implemented a kind of silly coordinator that debounces `windowShouldClose` calls over 100ms and uses that to differentiate between the two cases. --- macos/Ghostty.xcodeproj/project.pbxproj | 6 +- .../Terminal/TerminalController.swift | 21 +-- .../Extensions/NSWindow+Extension.swift | 6 + .../Helpers/TabGroupCloseCoordinator.swift | 124 ++++++++++++++++++ 4 files changed, 148 insertions(+), 9 deletions(-) create mode 100644 macos/Sources/Helpers/TabGroupCloseCoordinator.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index a5663202b..5c584709e 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -119,6 +119,7 @@ A5E112932AF73E6E00C6E0C2 /* ClipboardConfirmation.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5E112922AF73E6E00C6E0C2 /* ClipboardConfirmation.xib */; }; A5E112952AF73E8A00C6E0C2 /* ClipboardConfirmationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E112942AF73E8A00C6E0C2 /* ClipboardConfirmationController.swift */; }; A5E112972AF7401B00C6E0C2 /* ClipboardConfirmationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E112962AF7401B00C6E0C2 /* ClipboardConfirmationView.swift */; }; + A5E4082A2E022E9E0035FEAC /* TabGroupCloseCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408292E022E9B0035FEAC /* TabGroupCloseCoordinator.swift */; }; A5FEB3002ABB69450068369E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FEB2FF2ABB69450068369E /* main.swift */; }; AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */; }; C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; @@ -238,6 +239,7 @@ A5E112922AF73E6E00C6E0C2 /* ClipboardConfirmation.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ClipboardConfirmation.xib; sourceTree = ""; }; A5E112942AF73E8A00C6E0C2 /* ClipboardConfirmationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClipboardConfirmationController.swift; sourceTree = ""; }; A5E112962AF7401B00C6E0C2 /* ClipboardConfirmationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClipboardConfirmationView.swift; sourceTree = ""; }; + A5E408292E022E9B0035FEAC /* TabGroupCloseCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabGroupCloseCoordinator.swift; sourceTree = ""; }; A5FEB2FF2ABB69450068369E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPasteboard+Extension.swift"; sourceTree = ""; }; C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSColor+Extension.swift"; sourceTree = ""; }; @@ -320,12 +322,13 @@ A5333E1B2B5A1CE3008AEFF7 /* CrossKit.swift */, A5CBD0572C9F30860017A1AE /* Cursor.swift */, A5D0AF3C2B37804400D21823 /* CodableBridge.swift */, + A5CBD0552C9E65A50017A1AE /* DraggableWindowView.swift */, A58636702DF298F700E04A10 /* ExpiringUndoManager.swift */, A52FFF582CAA4FF1000C6A5B /* Fullscreen.swift */, A59630962AEE163600D64628 /* HostingWindow.swift */, A5CA378B2D2A4DE800931030 /* KeyboardLayout.swift */, A59FB5D02AE0DEA7009128F3 /* MetalView.swift */, - A5CBD0552C9E65A50017A1AE /* DraggableWindowView.swift */, + A5E408292E022E9B0035FEAC /* TabGroupCloseCoordinator.swift */, A5CA378D2D31D6C100931030 /* Weak.swift */, C1F26EE72B76CBFC00404083 /* VibrantLayer.h */, C1F26EE82B76CBFC00404083 /* VibrantLayer.m */, @@ -792,6 +795,7 @@ A599CDB02CF103F60049FA26 /* NSAppearance+Extension.swift in Sources */, A52FFF572CA90484000C6A5B /* QuickTerminalScreen.swift in Sources */, A5CC36132C9CD72D004D6760 /* SecureInputOverlay.swift in Sources */, + A5E4082A2E022E9E0035FEAC /* TabGroupCloseCoordinator.swift in Sources */, A535B9DA299C569B0017E2E4 /* ErrorView.swift in Sources */, A53A29882DB69D2F00B6E02C /* TerminalCommandPalette.swift in Sources */, A51BFC202B2FB64F00E92F16 /* AboutController.swift in Sources */, diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 03a4e548e..01ed25e63 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -5,7 +5,7 @@ import Combine import GhosttyKit /// A classic, tabbed terminal experience. -class TerminalController: BaseTerminalController { +class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Controller { override var windowNibName: NSNib.Name? { let defaultValue = "Terminal" @@ -882,14 +882,20 @@ class TerminalController: BaseTerminalController { ghostty.newTab(surface: surface) } - //MARK: - NSWindowDelegate + // MARK: NSWindowDelegate + + // TabGroupCloseCoordinator.Controller + lazy private(set) var tabGroupCloseCoordinator = TabGroupCloseCoordinator() override func windowShouldClose(_ sender: NSWindow) -> Bool { - // If we have tabs, then this should only close the tab. - if window?.tabGroup?.windows.count ?? 0 > 1 { - closeTab(sender) - } else { - closeWindow(sender) + tabGroupCloseCoordinator.windowShouldClose(sender) { [weak self] scope in + guard let self else { return } + switch (scope) { + case .tab: closeTab(nil) + case .window: + guard self.window?.isFirstWindowInTabGroup ?? false else { return } + closeWindow(nil) + } } // We will always explicitly close the window using the above @@ -1270,4 +1276,3 @@ extension TerminalController: NSMenuItemValidation { } } } - diff --git a/macos/Sources/Helpers/Extensions/NSWindow+Extension.swift b/macos/Sources/Helpers/Extensions/NSWindow+Extension.swift index 06a9fa4e0..f9ed364aa 100644 --- a/macos/Sources/Helpers/Extensions/NSWindow+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSWindow+Extension.swift @@ -9,4 +9,10 @@ extension NSWindow { guard windowNumber > 0 else { return nil } return CGWindowID(windowNumber) } + + /// True if this is the first window in the tab group. + var isFirstWindowInTabGroup: Bool { + guard let firstWindow = tabGroup?.windows.first else { return true } + return firstWindow === self + } } diff --git a/macos/Sources/Helpers/TabGroupCloseCoordinator.swift b/macos/Sources/Helpers/TabGroupCloseCoordinator.swift new file mode 100644 index 000000000..ca41bf89c --- /dev/null +++ b/macos/Sources/Helpers/TabGroupCloseCoordinator.swift @@ -0,0 +1,124 @@ +import AppKit + +/// Coordinates close operations for windows that are part of a tab group. +/// +/// This coordinator helps distinguish between closing a single tab versus closing +/// an entire window (with all its tabs). When macOS native tabs are used, close +/// operations can be ambiguous - this coordinator tracks close requests across +/// multiple windows in a tab group to determine the user's intent. +class TabGroupCloseCoordinator { + /// The scope of a close operation. + enum CloseScope { + case tab + case window + } + + /// Protocol that window controllers must implement to use the coordinator. + protocol Controller { + /// The tab group close coordinator instance for this controller. + var tabGroupCloseCoordinator: TabGroupCloseCoordinator { get } + } + + /// Callback type for close operations. + typealias Callback = (CloseScope) -> Void + + // We use weak vars and ObjectIdentifiers below because we don't want to + // create any strong reference cycles during coordination. + + /// The tab group being coordinated. Weak reference to avoid cycles. + private weak var tabGroup: NSWindowTabGroup? + + /// Map of window identifiers to their close callbacks. + private var closeRequests: [ObjectIdentifier: Callback] = [:] + + /// Timer used to debounce close requests and determine intent. + private var debounceTimer: Timer? + + deinit { + trigger(.tab) + } + + /// Call this from the windowShouldClose override in order to track whether + /// a window close event is from a tab or a window. If this window already + /// requested a close then only the latest will be called. + func windowShouldClose( + _ window: NSWindow, + callback: @escaping Callback + ) { + // If this window isn't part of a tab group we assume its a window + // close for the window and let our timer keep running for the rest. + guard let tabGroup = window.tabGroup else { + callback(.window) + return + } + + // Forward to the proper coordinator + if let firstController = tabGroup.windows.first?.windowController as? Controller, + firstController.tabGroupCloseCoordinator !== self { + let coordinator = firstController.tabGroupCloseCoordinator + coordinator.windowShouldClose(window, callback: callback) + return + } + + // If our tab group is nil then we either are seeing this for the first + // time or our weak ref expired and we should fire our callbacks. + if self.tabGroup == nil { + self.tabGroup = tabGroup + debounceTimer?.fire() + debounceTimer = nil + } + + // No matter what, we cancel our debounce and restart this. This opens + // us up to a DoS if close requests are looped but this would only + // happen in hostile scenarios that are self-inflicted. + debounceTimer?.invalidate() + debounceTimer = nil + + // If this tab group doesn't match then I don't really know what to + // do. This shouldn't happen. So we just assume it's a tab close + // and trigger the rest. No right answer here as far as I know. + if self.tabGroup != tabGroup { + callback(.tab) + trigger(.tab) + return + } + + // Add the request + closeRequests[ObjectIdentifier(window)] = callback + + // If close requests matches all our windows then we are done. + if closeRequests.count == tabGroup.windows.count { + let allWindows = Set(tabGroup.windows.map { ObjectIdentifier($0) }) + if Set(closeRequests.keys) == allWindows { + trigger(.window) + return + } + } + + // Setup our new timer + debounceTimer = Timer.scheduledTimer( + withTimeInterval: Duration.milliseconds(100).timeInterval, + repeats: false + ) { [weak self] _ in + self?.trigger(.tab) + } + } + + /// Triggers all pending close callbacks with the given scope. + /// + /// This method is called when the coordinator has determined the user's intent + /// (either closing a tab or the entire window). It executes all pending callbacks + /// and resets the coordinator's state. + /// + /// - Parameter scope: The determined scope of the close operation. + private func trigger(_ scope: CloseScope) { + // Reset our state + tabGroup = nil + debounceTimer?.invalidate() + debounceTimer = nil + + // Trigger all of our callbacks + closeRequests.forEach { $0.value(scope) } + closeRequests = [:] + } +} From 559fd922959905e12dabfdecf8b2a78db8ecda22 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 17 Jun 2025 16:23:15 -0700 Subject: [PATCH 217/371] build: use `xcrun --sdk metal` for metal paths This wasn't working before but it just requires a restart of the machine for the changes to take effect. The namespace runners have this prebuilt so this should work now. The other workaround was flaky for unknown reasons so I'd prefer to go back to this. --- src/build/MetallibStep.zig | 33 +++++++-------------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/src/build/MetallibStep.zig b/src/build/MetallibStep.zig index bac3a72c5..b7405c496 100644 --- a/src/build/MetallibStep.zig +++ b/src/build/MetallibStep.zig @@ -22,10 +22,11 @@ step: *Step, output: LazyPath, pub fn create(b: *std.Build, opts: Options) ?*MetallibStep { - switch (opts.target.result.os.tag) { - .macos, .ios => {}, - else => return null, // Only macOS and iOS are supported. - } + const sdk = switch (opts.target.result.os.tag) { + .macos => "macosx", + .ios => "iphoneos", + else => return null, + }; const self = b.allocator.create(MetallibStep) catch @panic("OOM"); @@ -37,31 +38,11 @@ pub fn create(b: *std.Build, opts: Options) ?*MetallibStep { else => unreachable, }; - // Find the metal and metallib executables. The Apple docs - // at the time of writing (June 2025) say to use - // `xcrun --sdk metal` but this doesn't work with Xcode 26. - // - // I don't know if this is a bug but the xcodebuild approach also - // works with Xcode 15 so it seems safe to use this instead. - // - // Reported bug: FB17874042. - var code: u8 = undefined; - const metal_exe = std.mem.trim(u8, b.runAllowFail( - &.{ "xcodebuild", "-find-executable", "metal" }, - &code, - .Ignore, - ) catch return null, "\r\n "); - const metallib_exe = std.mem.trim(u8, b.runAllowFail( - &.{ "xcodebuild", "-find-executable", "metallib" }, - &code, - .Ignore, - ) catch return null, "\r\n "); - const run_ir = RunStep.create( b, b.fmt("metal {s}", .{opts.name}), ); - run_ir.addArgs(&.{ metal_exe, "-o" }); + run_ir.addArgs(&.{ "/usr/bin/xcrun", "-sdk", sdk, "metal", "-o" }); const output_ir = run_ir.addOutputFileArg(b.fmt("{s}.ir", .{opts.name})); run_ir.addArgs(&.{"-c"}); for (opts.sources) |source| run_ir.addFileArg(source); @@ -81,7 +62,7 @@ pub fn create(b: *std.Build, opts: Options) ?*MetallibStep { b, b.fmt("metallib {s}", .{opts.name}), ); - run_lib.addArgs(&.{ metallib_exe, "-o" }); + run_lib.addArgs(&.{ "/usr/bin/xcrun", "-sdk", sdk, "metallib", "-o" }); const output_lib = run_lib.addOutputFileArg(b.fmt("{s}.metallib", .{opts.name})); run_lib.addFileArg(output_ir); run_lib.step.dependOn(&run_ir.step); From 7d2da23021921551e977413c87ddc675a1a7beb9 Mon Sep 17 00:00:00 2001 From: Ken VanDine Date: Wed, 18 Jun 2025 10:06:35 -0400 Subject: [PATCH 218/371] snap: vendor libgtk4-layer-shell.so --- snap/snapcraft.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index b57411a6c..d7fc63712 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -72,8 +72,6 @@ parts: build-packages: - libgtk-4-dev - libadwaita-1-dev - # TODO: Add when the Snap is updated to Ubuntu 24.10+ - # - gtk4-layer-shell - libxml2-utils - git - patchelf @@ -82,7 +80,10 @@ parts: craftctl set version=$(cat VERSION) $CRAFT_PART_SRC/../../zig/src/zig build -Dpatch-rpath=\$ORIGIN/../usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR:/snap/core24/current/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR -Doptimize=ReleaseFast -Dcpu=baseline cp -rp zig-out/* $CRAFT_PART_INSTALL/ - sed -i 's|Icon=com.mitchellh.ghostty|Icon=/snap/ghostty/current/share/icons/hicolor/512x512/apps/com.mitchellh.ghostty.png|g' $CRAFT_PART_INSTALL/share/applications/com.mitchellh.ghostty.desktop + # Install libgtk4-layer-shell.so + mkdir -p $CRAFT_PART_INSTALL/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR + cp .zig-cache/*/*/libgtk4-layer-shell.so $CRAFT_PART_INSTALL/usr/lib/$CRAFT_ARCH_TRIPLET_BUILD_FOR/ + sed -i 's|Icon=com.mitchellh.ghostty|Icon=${SNAP}/share/icons/hicolor/512x512/apps/com.mitchellh.ghostty.png|g' $CRAFT_PART_INSTALL/share/applications/com.mitchellh.ghostty.desktop libs: plugin: nil From b89cb59d792ac0a6b6eec52ae517b3ae3311e66b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rio=20Victor=20Ribeiro=20Silva?= Date: Fri, 20 Jun 2025 10:23:10 -0300 Subject: [PATCH 219/371] translation(pt_BR): add missing translation --- po/pt_BR.UTF-8.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/po/pt_BR.UTF-8.po b/po/pt_BR.UTF-8.po index d2ba0e693..c7bdf4df7 100644 --- a/po/pt_BR.UTF-8.po +++ b/po/pt_BR.UTF-8.po @@ -9,15 +9,16 @@ msgstr "" "Project-Id-Version: com.mitchellh.ghostty\n" "Report-Msgid-Bugs-To: m@mitchellh.com\n" "POT-Creation-Date: 2025-04-22 08:57-0700\n" -"PO-Revision-Date: 2025-03-28 11:04-0300\n" -"Last-Translator: Gustavo Peres \n" -"Language-Team: Brazilian Portuguese \n" +"PO-Revision-Date: 2025-06-20 10:19-0300\n" +"Last-Translator: Mário Victor Ribeiro Silva \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.6\n" #: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:5 msgid "Change Terminal Title" @@ -174,8 +175,8 @@ msgid "" "An application is attempting to read from the clipboard. The current " "clipboard contents are shown below." msgstr "" -"Uma aplicação está tentando ler da área de transferência. O conteúdo atual " -"da área de transferência está sendo exibido abaixo." +"Uma aplicação está tentando ler da área de transferência. O conteúdo atual da " +"área de transferência está sendo exibido abaixo." #: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:10 #: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:10 @@ -189,8 +190,8 @@ msgstr "Permitir" #: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:7 msgid "" -"An application is attempting to write to the clipboard. The current " -"clipboard contents are shown below." +"An application is attempting to write to the clipboard. The current clipboard " +"contents are shown below." msgstr "" "Uma aplicação está tentando escrever na área de transferência. O conteúdo " "atual da área de transferência está aparecendo abaixo." @@ -217,11 +218,10 @@ msgstr "Visualizar abas abertas" #: src/apprt/gtk/Window.zig:249 msgid "New Split" -msgstr "" +msgstr "Nova divisão" #: src/apprt/gtk/Window.zig:312 -msgid "" -"⚠️ You're running a debug build of Ghostty! Performance will be degraded." +msgid "⚠️ You're running a debug build of Ghostty! Performance will be degraded." msgstr "" "⚠️ Você está rodando uma build de debug do Ghostty! O desempenho será afetado." From fda08a699987c2caf8585e66d4f2111c369f855b Mon Sep 17 00:00:00 2001 From: Zhaofeng Li Date: Fri, 20 Jun 2025 14:02:07 -0600 Subject: [PATCH 220/371] build: Use correct SDK for iOS Simulator shader build --- src/build/MetallibStep.zig | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/build/MetallibStep.zig b/src/build/MetallibStep.zig index b7405c496..1067e519c 100644 --- a/src/build/MetallibStep.zig +++ b/src/build/MetallibStep.zig @@ -24,9 +24,20 @@ output: LazyPath, pub fn create(b: *std.Build, opts: Options) ?*MetallibStep { const sdk = switch (opts.target.result.os.tag) { .macos => "macosx", - .ios => "iphoneos", + .ios => switch (opts.target.result.abi) { + .simulator => "iphonesimulator", + else => "iphoneos", + }, else => return null, }; + const platform_version_arg = switch (opts.target.result.os.tag) { + .macos => "-mmacos-version-min", + .ios => switch (opts.target.result.abi) { + .simulator => "-mios-simulator-version-min", + else => "-mios-version-min", + }, + else => null, + }; const self = b.allocator.create(MetallibStep) catch @panic("OOM"); @@ -46,16 +57,11 @@ pub fn create(b: *std.Build, opts: Options) ?*MetallibStep { const output_ir = run_ir.addOutputFileArg(b.fmt("{s}.ir", .{opts.name})); run_ir.addArgs(&.{"-c"}); for (opts.sources) |source| run_ir.addFileArg(source); - switch (opts.target.result.os.tag) { - .ios => run_ir.addArgs(&.{b.fmt( - "-mios-version-min={s}", - .{min_version}, - )}), - .macos => run_ir.addArgs(&.{b.fmt( - "-mmacos-version-min={s}", - .{min_version}, - )}), - else => {}, + if (platform_version_arg) |arg| { + run_ir.addArgs(&.{b.fmt( + "{s}={s}", + .{ arg, min_version }, + )}); } const run_lib = RunStep.create( From f40cd3cae3469da4c5a70e637c3243d7a4c2f804 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Sun, 19 Jan 2025 16:47:08 -0500 Subject: [PATCH 221/371] chore: improve Metal API definitions a bit --- src/renderer/Metal.zig | 16 ++- src/renderer/metal/api.zig | 225 +++++++++++++++++++++++++++++++++++-- 2 files changed, 228 insertions(+), 13 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 99dbc838e..639ef354b 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -2337,9 +2337,11 @@ pub fn setScreenSize( desc.setProperty("height", @as(c_ulong, @intCast(size.screen.height))); desc.setProperty( "usage", - @intFromEnum(mtl.MTLTextureUsage.render_target) | - @intFromEnum(mtl.MTLTextureUsage.shader_read) | - @intFromEnum(mtl.MTLTextureUsage.shader_write), + mtl.MTLTextureUsage{ + .render_target = true, + .shader_read = true, + .shader_write = true, + }, ); // If we fail to create the texture, then we just don't have a screen @@ -2377,9 +2379,11 @@ pub fn setScreenSize( desc.setProperty("height", @as(c_ulong, @intCast(size.screen.height))); desc.setProperty( "usage", - @intFromEnum(mtl.MTLTextureUsage.render_target) | - @intFromEnum(mtl.MTLTextureUsage.shader_read) | - @intFromEnum(mtl.MTLTextureUsage.shader_write), + mtl.MTLTextureUsage{ + .render_target = true, + .shader_read = true, + .shader_write = true, + }, ); // If we fail to create the texture, then we just don't have a screen diff --git a/src/renderer/metal/api.zig b/src/renderer/metal/api.zig index 46cb4f6bc..90a1a65ab 100644 --- a/src/renderer/metal/api.zig +++ b/src/renderer/metal/api.zig @@ -1,4 +1,10 @@ //! This file contains the definitions of the Metal API that we use. +//! +//! Because the online Apple developer docs have recently (as of January 2025) +//! been changed to hide enum values, `Metal-cpp` has been used as a reference +//! source instead. +//! +//! Ref: https://developer.apple.com/metal/cpp/ /// https://developer.apple.com/documentation/metal/mtlcommandbufferstatus?language=objc pub const MTLCommandBufferStatus = enum(c_ulong) { @@ -22,6 +28,10 @@ pub const MTLLoadAction = enum(c_ulong) { pub const MTLStoreAction = enum(c_ulong) { dont_care = 0, store = 1, + multisample_resolve = 2, + store_and_multisample_resolve = 3, + unknown = 4, + custom_sample_depth_store = 5, }; /// https://developer.apple.com/documentation/metal/mtlresourceoptions?language=objc @@ -73,16 +83,60 @@ pub const MTLIndexType = enum(c_ulong) { /// https://developer.apple.com/documentation/metal/mtlvertexformat?language=objc pub const MTLVertexFormat = enum(c_ulong) { + invalid = 0, + uchar2 = 1, + uchar3 = 2, uchar4 = 3, + char2 = 4, + char3 = 5, + char4 = 6, + uchar2normalized = 7, + uchar3normalized = 8, + uchar4normalized = 9, + char2normalized = 10, + char3normalized = 11, + char4normalized = 12, ushort2 = 13, + ushort3 = 14, + ushort4 = 15, short2 = 16, + short3 = 17, + short4 = 18, + ushort2normalized = 19, + ushort3normalized = 20, + ushort4normalized = 21, + short2normalized = 22, + short3normalized = 23, + short4normalized = 24, + half2 = 25, + half3 = 26, + half4 = 27, + float = 28, float2 = 29, + float3 = 30, float4 = 31, + int = 32, int2 = 33, + int3 = 34, + int4 = 35, uint = 36, uint2 = 37, + uint3 = 38, uint4 = 39, + int1010102normalized = 40, + uint1010102normalized = 41, + uchar4normalized_bgra = 42, uchar = 45, + char = 46, + ucharnormalized = 47, + charnormalized = 48, + ushort = 49, + short = 50, + ushortnormalized = 51, + shortnormalized = 52, + half = 53, + floatrg11b10 = 54, + floatrgb9e5 = 55, }; /// https://developer.apple.com/documentation/metal/mtlvertexstepfunction?language=objc @@ -90,20 +144,158 @@ pub const MTLVertexStepFunction = enum(c_ulong) { constant = 0, per_vertex = 1, per_instance = 2, + per_patch = 3, + per_patch_control_point = 4, }; /// https://developer.apple.com/documentation/metal/mtlpixelformat?language=objc pub const MTLPixelFormat = enum(c_ulong) { + invalid = 0, + a8unorm = 1, r8unorm = 10, + r8unorm_srgb = 11, + r8snorm = 12, + r8uint = 13, + r8sint = 14, + r16unorm = 20, + r16snorm = 22, + r16uint = 23, + r16sint = 24, + r16float = 25, + rg8unorm = 30, + rg8unorm_srgb = 31, + rg8snorm = 32, + rg8uint = 33, + rg8sint = 34, + b5g6r5unorm = 40, + a1bgr5unorm = 41, + abgr4unorm = 42, + bgr5a1unorm = 43, + r32uint = 53, + r32sint = 54, + r32float = 55, + rg16unorm = 60, + rg16snorm = 62, + rg16uint = 63, + rg16sint = 64, + rg16float = 65, rgba8unorm = 70, rgba8unorm_srgb = 71, + rgba8snorm = 72, rgba8uint = 73, + rgba8sint = 74, bgra8unorm = 80, bgra8unorm_srgb = 81, + rgb10a2unorm = 90, + rgb10a2uint = 91, + rg11b10float = 92, + rgb9e5float = 93, + bgr10a2unorm = 94, + bgr10_xr = 554, + bgr10_xr_srgb = 555, + rg32uint = 103, + rg32sint = 104, + rg32float = 105, + rgba16unorm = 110, + rgba16snorm = 112, + rgba16uint = 113, + rgba16sint = 114, + rgba16float = 115, + bgra10_xr = 552, + bgra10_xr_srgb = 553, + rgba32uint = 123, + rgba32sint = 124, + rgba32float = 125, + bc1_rgba = 130, + bc1_rgba_srgb = 131, + bc2_rgba = 132, + bc2_rgba_srgb = 133, + bc3_rgba = 134, + bc3_rgba_srgb = 135, + bc4_runorm = 140, + bc4_rsnorm = 141, + bc5_rgunorm = 142, + bc5_rgsnorm = 143, + bc6h_rgbfloat = 150, + bc6h_rgbufloat = 151, + bc7_rgbaunorm = 152, + bc7_rgbaunorm_srgb = 153, + pvrtc_rgb_2bpp = 160, + pvrtc_rgb_2bpp_srgb = 161, + pvrtc_rgb_4bpp = 162, + pvrtc_rgb_4bpp_srgb = 163, + pvrtc_rgba_2bpp = 164, + pvrtc_rgba_2bpp_srgb = 165, + pvrtc_rgba_4bpp = 166, + pvrtc_rgba_4bpp_srgb = 167, + eac_r11unorm = 170, + eac_r11snorm = 172, + eac_rg11unorm = 174, + eac_rg11snorm = 176, + eac_rgba8 = 178, + eac_rgba8_srgb = 179, + etc2_rgb8 = 180, + etc2_rgb8_srgb = 181, + etc2_rgb8a1 = 182, + etc2_rgb8a1_srgb = 183, + astc_4x4_srgb = 186, + astc_5x4_srgb = 187, + astc_5x5_srgb = 188, + astc_6x5_srgb = 189, + astc_6x6_srgb = 190, + astc_8x5_srgb = 192, + astc_8x6_srgb = 193, + astc_8x8_srgb = 194, + astc_10x5_srgb = 195, + astc_10x6_srgb = 196, + astc_10x8_srgb = 197, + astc_10x10_srgb = 198, + astc_12x10_srgb = 199, + astc_12x12_srgb = 200, + astc_4x4_ldr = 204, + astc_5x4_ldr = 205, + astc_5x5_ldr = 206, + astc_6x5_ldr = 207, + astc_6x6_ldr = 208, + astc_8x5_ldr = 210, + astc_8x6_ldr = 211, + astc_8x8_ldr = 212, + astc_10x5_ldr = 213, + astc_10x6_ldr = 214, + astc_10x8_ldr = 215, + astc_10x10_ldr = 216, + astc_12x10_ldr = 217, + astc_12x12_ldr = 218, + astc_4x4_hdr = 222, + astc_5x4_hdr = 223, + astc_5x5_hdr = 224, + astc_6x5_hdr = 225, + astc_6x6_hdr = 226, + astc_8x5_hdr = 228, + astc_8x6_hdr = 229, + astc_8x8_hdr = 230, + astc_10x5_hdr = 231, + astc_10x6_hdr = 232, + astc_10x8_hdr = 233, + astc_10x10_hdr = 234, + astc_12x10_hdr = 235, + astc_12x12_hdr = 236, + gbgr422 = 240, + bgrg422 = 241, + depth16unorm = 250, + depth32float = 252, + stencil8 = 253, + depth24unorm_stencil8 = 255, + depth32float_stencil8 = 260, + x32_stencil8 = 261, + x24_stencil8 = 262, }; /// https://developer.apple.com/documentation/metal/mtlpurgeablestate?language=objc pub const MTLPurgeableState = enum(c_ulong) { + keep_current = 1, + non_volatile = 2, + @"volatile" = 3, empty = 4, }; @@ -155,13 +347,32 @@ pub const MTLBlendOperation = enum(c_ulong) { max = 4, }; -/// https://developer.apple.com/documentation/metal/mtltextureusage?language=objc -pub const MTLTextureUsage = enum(c_ulong) { - unknown = 0, - shader_read = 1, - shader_write = 2, - render_target = 4, - pixel_format_view = 8, +/// https://developer.apple.com/documentation/metal/mtltextureusage?language=objc +pub const MTLTextureUsage = packed struct(c_ulong) { + /// https://developer.apple.com/documentation/metal/mtltextureusage/shaderread?language=objc + shader_read: bool = false, // TextureUsageShaderRead = 1, + + /// https://developer.apple.com/documentation/metal/mtltextureusage/shaderwrite?language=objc + shader_write: bool = false, // TextureUsageShaderWrite = 2, + + /// https://developer.apple.com/documentation/metal/mtltextureusage/rendertarget?language=objc + render_target: bool = false, // TextureUsageRenderTarget = 4, + + _reserved: u1 = 0, // The enum skips from 4 to 16, 8 has no documented use. + + /// https://developer.apple.com/documentation/metal/mtltextureusage/pixelformatview?language=objc + pixel_format_view: bool = false, // TextureUsagePixelFormatView = 16, + + /// https://developer.apple.com/documentation/metal/mtltextureusage/shaderatomic?language=objc + shader_atomic: bool = false, // TextureUsageShaderAtomic = 32, + + __reserved: @Type(.{ .Int = .{ + .signedness = .unsigned, + .bits = @bitSizeOf(c_ulong) - 6, + } }) = 0, + + /// https://developer.apple.com/documentation/metal/mtltextureusage/unknown?language=objc + const unknown: MTLTextureUsage = @bitCast(0); // TextureUsageUnknown = 0, }; pub const MTLClearColor = extern struct { From 77c050c156945a8bc7f1e46f732e33e842a58fe0 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Sun, 19 Jan 2025 18:28:36 -0500 Subject: [PATCH 222/371] refactor(Metal): make pipeline handling DRYer --- src/renderer/metal/shaders.zig | 474 +++++++++++---------------------- 1 file changed, 151 insertions(+), 323 deletions(-) diff --git a/src/renderer/metal/shaders.zig b/src/renderer/metal/shaders.zig index 8fa170bf2..ff5f1e6bd 100644 --- a/src/renderer/metal/shaders.zig +++ b/src/renderer/metal/shaders.zig @@ -106,7 +106,7 @@ pub const Image = extern struct { /// The uniforms that are passed to the terminal cell shader. pub const Uniforms = extern struct { - // Note: all of the explicit aligmnments are copied from the + // Note: all of the explicit alignments are copied from the // MSL developer reference just so that we can be sure that we got // it all exactly right. @@ -171,7 +171,7 @@ pub const Uniforms = extern struct { /// The uniforms used for custom postprocess shaders. pub const PostUniforms = extern struct { - // Note: all of the explicit aligmnments are copied from the + // Note: all of the explicit alignments are copied from the // MSL developer reference just so that we can be sure that we got // it all exactly right. resolution: [3]f32 align(16), @@ -282,65 +282,16 @@ fn initPostPipeline( }; defer post_library.msgSend(void, objc.sel("release"), .{}); - // Get our vertex and fragment functions - const func_vert = func_vert: { - const str = try macos.foundation.String.createWithBytes( - "full_screen_vertex", - .utf8, - false, - ); - defer str.release(); - - const ptr = library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - break :func_vert objc.Object.fromId(ptr.?); - }; - const func_frag = func_frag: { - const str = try macos.foundation.String.createWithBytes( - "main0", - .utf8, - false, - ); - defer str.release(); - - const ptr = post_library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - break :func_frag objc.Object.fromId(ptr.?); - }; - defer func_vert.msgSend(void, objc.sel("release"), .{}); - defer func_frag.msgSend(void, objc.sel("release"), .{}); - - // Create our descriptor - const desc = init: { - const Class = objc.getClass("MTLRenderPipelineDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - defer desc.msgSend(void, objc.sel("release"), .{}); - desc.setProperty("vertexFunction", func_vert); - desc.setProperty("fragmentFunction", func_frag); - - // Set our color attachment - const attachments = objc.Object.fromId(desc.getProperty(?*anyopaque, "colorAttachments")); - { - const attachment = attachments.msgSend( - objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, 0)}, - ); - - attachment.setProperty("pixelFormat", @intFromEnum(pixel_format)); - } - - // Make our state - var err: ?*anyopaque = null; - const pipeline_state = device.msgSend( - objc.Object, - objc.sel("newRenderPipelineStateWithDescriptor:error:"), - .{ desc, &err }, + return (Pipeline{ + .vertex_fn = "full_screen_vertex", + .fragment_fn = "main0", + .blending_enabled = false, + }).init( + device, + library, + post_library, + pixel_format, ); - try checkError(err); - - return pipeline_state; } /// This is a single parameter for the terminal cell shader. @@ -374,113 +325,18 @@ fn initCellTextPipeline( library: objc.Object, pixel_format: mtl.MTLPixelFormat, ) !objc.Object { - // Get our vertex and fragment functions - const func_vert = func_vert: { - const str = try macos.foundation.String.createWithBytes( - "cell_text_vertex", - .utf8, - false, - ); - defer str.release(); - - const ptr = library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - break :func_vert objc.Object.fromId(ptr.?); - }; - const func_frag = func_frag: { - const str = try macos.foundation.String.createWithBytes( - "cell_text_fragment", - .utf8, - false, - ); - defer str.release(); - - const ptr = library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - break :func_frag objc.Object.fromId(ptr.?); - }; - defer func_vert.msgSend(void, objc.sel("release"), .{}); - defer func_frag.msgSend(void, objc.sel("release"), .{}); - - // Create the vertex descriptor. The vertex descriptor describes the - // data layout of the vertex inputs. We use indexed (or "instanced") - // rendering, so this makes it so that each instance gets a single - // Cell as input. - const vertex_desc = vertex_desc: { - const desc = init: { - const Class = objc.getClass("MTLVertexDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - - // Our attributes are the fields of the input - const attrs = objc.Object.fromId(desc.getProperty(?*anyopaque, "attributes")); - autoAttribute(CellText, attrs); - - // The layout describes how and when we fetch the next vertex input. - const layouts = objc.Object.fromId(desc.getProperty(?*anyopaque, "layouts")); - { - const layout = layouts.msgSend( - objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, 0)}, - ); - - // Access each Cell per instance, not per vertex. - layout.setProperty("stepFunction", @intFromEnum(mtl.MTLVertexStepFunction.per_instance)); - layout.setProperty("stride", @as(c_ulong, @sizeOf(CellText))); - } - - break :vertex_desc desc; - }; - defer vertex_desc.msgSend(void, objc.sel("release"), .{}); - - // Create our descriptor - const desc = init: { - const Class = objc.getClass("MTLRenderPipelineDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - defer desc.msgSend(void, objc.sel("release"), .{}); - - // Set our properties - desc.setProperty("vertexFunction", func_vert); - desc.setProperty("fragmentFunction", func_frag); - desc.setProperty("vertexDescriptor", vertex_desc); - - // Set our color attachment - const attachments = objc.Object.fromId(desc.getProperty(?*anyopaque, "colorAttachments")); - { - const attachment = attachments.msgSend( - objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, 0)}, - ); - - attachment.setProperty("pixelFormat", @intFromEnum(pixel_format)); - - // Blending. This is required so that our text we render on top - // of our drawable properly blends into the bg. - attachment.setProperty("blendingEnabled", true); - attachment.setProperty("rgbBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); - attachment.setProperty("alphaBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); - attachment.setProperty("sourceRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); - attachment.setProperty("sourceAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); - attachment.setProperty("destinationRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); - attachment.setProperty("destinationAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); - } - - // Make our state - var err: ?*anyopaque = null; - const pipeline_state = device.msgSend( - objc.Object, - objc.sel("newRenderPipelineStateWithDescriptor:error:"), - .{ desc, &err }, + return (Pipeline{ + .vertex_fn = "cell_text_vertex", + .fragment_fn = "cell_text_fragment", + .Vertex = CellText, + .step_fn = .per_instance, + .blending_enabled = true, + }).init( + device, + library, + library, + pixel_format, ); - try checkError(err); - errdefer pipeline_state.msgSend(void, objc.sel("release"), .{}); - - return pipeline_state; } /// This is a single parameter for the cell bg shader. @@ -492,78 +348,16 @@ fn initCellBgPipeline( library: objc.Object, pixel_format: mtl.MTLPixelFormat, ) !objc.Object { - // Get our vertex and fragment functions - const func_vert = func_vert: { - const str = try macos.foundation.String.createWithBytes( - "cell_bg_vertex", - .utf8, - false, - ); - defer str.release(); - - const ptr = library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - break :func_vert objc.Object.fromId(ptr.?); - }; - defer func_vert.msgSend(void, objc.sel("release"), .{}); - const func_frag = func_frag: { - const str = try macos.foundation.String.createWithBytes( - "cell_bg_fragment", - .utf8, - false, - ); - defer str.release(); - - const ptr = library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - break :func_frag objc.Object.fromId(ptr.?); - }; - defer func_frag.msgSend(void, objc.sel("release"), .{}); - - // Create our descriptor - const desc = init: { - const Class = objc.getClass("MTLRenderPipelineDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - defer desc.msgSend(void, objc.sel("release"), .{}); - - // Set our properties - desc.setProperty("vertexFunction", func_vert); - desc.setProperty("fragmentFunction", func_frag); - - // Set our color attachment - const attachments = objc.Object.fromId(desc.getProperty(?*anyopaque, "colorAttachments")); - { - const attachment = attachments.msgSend( - objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, 0)}, - ); - - attachment.setProperty("pixelFormat", @intFromEnum(pixel_format)); - - // Blending. This is required so that our text we render on top - // of our drawable properly blends into the bg. - attachment.setProperty("blendingEnabled", true); - attachment.setProperty("rgbBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); - attachment.setProperty("alphaBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); - attachment.setProperty("sourceRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); - attachment.setProperty("sourceAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); - attachment.setProperty("destinationRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); - attachment.setProperty("destinationAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); - } - - // Make our state - var err: ?*anyopaque = null; - const pipeline_state = device.msgSend( - objc.Object, - objc.sel("newRenderPipelineStateWithDescriptor:error:"), - .{ desc, &err }, + return (Pipeline{ + .vertex_fn = "cell_bg_vertex", + .fragment_fn = "cell_bg_fragment", + .blending_enabled = false, + }).init( + device, + library, + library, + pixel_format, ); - try checkError(err); - errdefer pipeline_state.msgSend(void, objc.sel("release"), .{}); - - return pipeline_state; } /// Initialize the image render pipeline for our shader library. @@ -572,113 +366,147 @@ fn initImagePipeline( library: objc.Object, pixel_format: mtl.MTLPixelFormat, ) !objc.Object { - // Get our vertex and fragment functions - const func_vert = func_vert: { - const str = try macos.foundation.String.createWithBytes( - "image_vertex", - .utf8, - false, - ); - defer str.release(); + return (Pipeline{ + .vertex_fn = "image_vertex", + .fragment_fn = "image_fragment", + .Vertex = Image, + .step_fn = .per_instance, + .blending_enabled = true, + }).init( + device, + library, + library, + pixel_format, + ); +} - const ptr = library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - break :func_vert objc.Object.fromId(ptr.?); - }; - const func_frag = func_frag: { - const str = try macos.foundation.String.createWithBytes( - "image_fragment", - .utf8, - false, - ); - defer str.release(); +/// A struct with all the necessary info to initialize a pipeline. +const Pipeline = struct { + /// Name of the vertex function + vertex_fn: []const u8, + /// Name of the fragment function + fragment_fn: []const u8, - const ptr = library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - break :func_frag objc.Object.fromId(ptr.?); - }; - defer func_vert.msgSend(void, objc.sel("release"), .{}); - defer func_frag.msgSend(void, objc.sel("release"), .{}); + /// Vertex attribute struct + Vertex: ?type = null, + /// Vertex step function + step_fn: mtl.MTLVertexStepFunction = .per_vertex, - // Create the vertex descriptor. The vertex descriptor describes the - // data layout of the vertex inputs. We use indexed (or "instanced") - // rendering, so this makes it so that each instance gets a single - // Image as input. - const vertex_desc = vertex_desc: { + /// Whether blending is enabled for the color attachment + blending_enabled: bool = true, + + fn init( + self: *const Pipeline, + device: objc.Object, + vertex_library: objc.Object, + fragment_library: objc.Object, + pixel_format: mtl.MTLPixelFormat, + ) !objc.Object { + // Create our descriptor const desc = init: { - const Class = objc.getClass("MTLVertexDescriptor").?; + const Class = objc.getClass("MTLRenderPipelineDescriptor").?; const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); break :init id_init; }; + defer desc.msgSend(void, objc.sel("release"), .{}); - // Our attributes are the fields of the input - const attrs = objc.Object.fromId(desc.getProperty(?*anyopaque, "attributes")); - autoAttribute(Image, attrs); - - // The layout describes how and when we fetch the next vertex input. - const layouts = objc.Object.fromId(desc.getProperty(?*anyopaque, "layouts")); + // Get our vertex and fragment functions and add them to the descriptor. { - const layout = layouts.msgSend( + const str = try macos.foundation.String.createWithBytes( + self.vertex_fn, + .utf8, + false, + ); + defer str.release(); + + const ptr = vertex_library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); + const func_vert = objc.Object.fromId(ptr.?); + defer func_vert.msgSend(void, objc.sel("release"), .{}); + + desc.setProperty("vertexFunction", func_vert); + } + { + const str = try macos.foundation.String.createWithBytes( + self.fragment_fn, + .utf8, + false, + ); + defer str.release(); + + const ptr = fragment_library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); + const func_frag = objc.Object.fromId(ptr.?); + defer func_frag.msgSend(void, objc.sel("release"), .{}); + + desc.setProperty("fragmentFunction", func_frag); + } + + // If we have vertex attributes, create and add a vertex descriptor. + if (self.Vertex) |V| { + const vertex_desc = init: { + const Class = objc.getClass("MTLVertexDescriptor").?; + const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); + const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); + break :init id_init; + }; + defer vertex_desc.msgSend(void, objc.sel("release"), .{}); + + // Our attributes are the fields of the input + const attrs = objc.Object.fromId(vertex_desc.getProperty(?*anyopaque, "attributes")); + autoAttribute(V, attrs); + + // The layout describes how and when we fetch the next vertex input. + const layouts = objc.Object.fromId(vertex_desc.getProperty(?*anyopaque, "layouts")); + { + const layout = layouts.msgSend( + objc.Object, + objc.sel("objectAtIndexedSubscript:"), + .{@as(c_ulong, 0)}, + ); + + layout.setProperty("stepFunction", @intFromEnum(self.step_fn)); + layout.setProperty("stride", @as(c_ulong, @sizeOf(V))); + } + + desc.setProperty("vertexDescriptor", vertex_desc); + } + + // Set our color attachment + const attachments = objc.Object.fromId(desc.getProperty(?*anyopaque, "colorAttachments")); + { + const attachment = attachments.msgSend( objc.Object, objc.sel("objectAtIndexedSubscript:"), .{@as(c_ulong, 0)}, ); - // Access each Image per instance, not per vertex. - layout.setProperty("stepFunction", @intFromEnum(mtl.MTLVertexStepFunction.per_instance)); - layout.setProperty("stride", @as(c_ulong, @sizeOf(Image))); + attachment.setProperty("pixelFormat", @intFromEnum(pixel_format)); + + attachment.setProperty("blendingEnabled", self.blending_enabled); + // We always use premultiplied alpha blending for now. + if (self.blending_enabled) { + attachment.setProperty("rgbBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); + attachment.setProperty("alphaBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); + attachment.setProperty("sourceRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); + attachment.setProperty("sourceAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); + attachment.setProperty("destinationRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); + attachment.setProperty("destinationAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); + } } - break :vertex_desc desc; - }; - defer vertex_desc.msgSend(void, objc.sel("release"), .{}); - - // Create our descriptor - const desc = init: { - const Class = objc.getClass("MTLRenderPipelineDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - defer desc.msgSend(void, objc.sel("release"), .{}); - - // Set our properties - desc.setProperty("vertexFunction", func_vert); - desc.setProperty("fragmentFunction", func_frag); - desc.setProperty("vertexDescriptor", vertex_desc); - - // Set our color attachment - const attachments = objc.Object.fromId(desc.getProperty(?*anyopaque, "colorAttachments")); - { - const attachment = attachments.msgSend( + // Make our state + var err: ?*anyopaque = null; + const pipeline_state = device.msgSend( objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, 0)}, + objc.sel("newRenderPipelineStateWithDescriptor:error:"), + .{ desc, &err }, ); + try checkError(err); + errdefer pipeline_state.msgSend(void, objc.sel("release"), .{}); - attachment.setProperty("pixelFormat", @intFromEnum(pixel_format)); - - // Blending. This is required so that our text we render on top - // of our drawable properly blends into the bg. - attachment.setProperty("blendingEnabled", true); - attachment.setProperty("rgbBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); - attachment.setProperty("alphaBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); - attachment.setProperty("sourceRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); - attachment.setProperty("sourceAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); - attachment.setProperty("destinationRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); - attachment.setProperty("destinationAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); + return pipeline_state; } - - // Make our state - var err: ?*anyopaque = null; - const pipeline_state = device.msgSend( - objc.Object, - objc.sel("newRenderPipelineStateWithDescriptor:error:"), - .{ desc, &err }, - ); - try checkError(err); - - return pipeline_state; -} +}; fn autoAttribute(T: type, attrs: objc.Object) void { inline for (@typeInfo(T).@"struct".fields, 0..) |field, i| { From 7cfc906c607d94b19613fff17bf261c36f0fca92 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Wed, 9 Apr 2025 15:26:28 -0600 Subject: [PATCH 223/371] debug: properly set thread names on macOS --- src/crash/sentry.zig | 7 +++++++ src/os/cf_release_thread.zig | 8 ++++++++ src/os/macos.zig | 4 ++++ src/renderer/Thread.zig | 7 +++++++ src/termio/Exec.zig | 7 +++++++ src/termio/Thread.zig | 8 ++++++++ 6 files changed, 41 insertions(+) diff --git a/src/crash/sentry.zig b/src/crash/sentry.zig index c29184020..820c3e9a1 100644 --- a/src/crash/sentry.zig +++ b/src/crash/sentry.zig @@ -81,6 +81,13 @@ pub fn init(gpa: Allocator) !void { fn initThread(gpa: Allocator) !void { if (comptime !build_options.sentry) return; + // Right now, on Darwin, `std.Thread.setName` can only name the current + // thread, and we have no way to get the current thread from within it, + // so instead we use this code to name the thread instead. + if (builtin.os.tag.isDarwin()) { + internal_os.macos.pthread_setname_np(&"sentry-init".*); + } + var arena = std.heap.ArenaAllocator.init(gpa); defer arena.deinit(); const alloc = arena.allocator(); diff --git a/src/os/cf_release_thread.zig b/src/os/cf_release_thread.zig index dbf8e6592..445dc4864 100644 --- a/src/os/cf_release_thread.zig +++ b/src/os/cf_release_thread.zig @@ -8,6 +8,7 @@ const std = @import("std"); const builtin = @import("builtin"); const macos = @import("macos"); +const internal_os = @import("../os/main.zig"); const xev = @import("../global.zig").xev; const BlockingQueue = @import("../datastruct/main.zig").BlockingQueue; @@ -119,6 +120,13 @@ pub fn threadMain(self: *Thread) void { fn threadMain_(self: *Thread) !void { defer log.debug("cf release thread exited", .{}); + // Right now, on Darwin, `std.Thread.setName` can only name the current + // thread, and we have no way to get the current thread from within it, + // so instead we use this code to name the thread instead. + if (builtin.os.tag.isDarwin()) { + internal_os.macos.pthread_setname_np(&"cf_release".*); + } + // Start the async handlers. We start these first so that they're // registered even if anything below fails so we can drain the mailbox. self.wakeup.wait(&self.loop, &self.wakeup_c, Thread, self, wakeupCallback); diff --git a/src/os/macos.zig b/src/os/macos.zig index ca7c81a47..100d0fe44 100644 --- a/src/os/macos.zig +++ b/src/os/macos.zig @@ -88,6 +88,10 @@ extern "c" fn pthread_set_qos_class_self_np( relative_priority: c_int, ) c_int; +pub extern "c" fn pthread_setname_np( + name: [*:0]const u8, +) void; + pub const NSOperatingSystemVersion = extern struct { major: i64, minor: i64, diff --git a/src/renderer/Thread.zig b/src/renderer/Thread.zig index 1e9c29b26..52f599549 100644 --- a/src/renderer/Thread.zig +++ b/src/renderer/Thread.zig @@ -198,6 +198,13 @@ pub fn threadMain(self: *Thread) void { fn threadMain_(self: *Thread) !void { defer log.debug("renderer thread exited", .{}); + // Right now, on Darwin, `std.Thread.setName` can only name the current + // thread, and we have no way to get the current thread from within it, + // so instead we use this code to name the thread instead. + if (builtin.os.tag.isDarwin()) { + internal_os.macos.pthread_setname_np(&"renderer".*); + } + // Setup our crash metadata crash.sentry.thread_state = .{ .type = .renderer, diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig index 317ad13b4..aed7cefb6 100644 --- a/src/termio/Exec.zig +++ b/src/termio/Exec.zig @@ -1364,6 +1364,13 @@ pub const ReadThread = struct { // Always close our end of the pipe when we exit. defer posix.close(quit); + // Right now, on Darwin, `std.Thread.setName` can only name the current + // thread, and we have no way to get the current thread from within it, + // so instead we use this code to name the thread instead. + if (builtin.os.tag.isDarwin()) { + internal_os.macos.pthread_setname_np(&"io-reader".*); + } + // Setup our crash metadata crash.sentry.thread_state = .{ .type = .io, diff --git a/src/termio/Thread.zig b/src/termio/Thread.zig index d8018341d..35da3c2d2 100644 --- a/src/termio/Thread.zig +++ b/src/termio/Thread.zig @@ -16,6 +16,7 @@ const ArenaAllocator = std.heap.ArenaAllocator; const builtin = @import("builtin"); const xev = @import("../global.zig").xev; 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; @@ -202,6 +203,13 @@ pub fn threadMain(self: *Thread, io: *termio.Termio) void { fn threadMain_(self: *Thread, io: *termio.Termio) !void { defer log.debug("IO thread exited", .{}); + // Right now, on Darwin, `std.Thread.setName` can only name the current + // thread, and we have no way to get the current thread from within it, + // so instead we use this code to name the thread instead. + if (builtin.os.tag.isDarwin()) { + internal_os.macos.pthread_setname_np(&"io".*); + } + // Setup our crash metadata crash.sentry.thread_state = .{ .type = .io, From 521872442a9029031615b0c672781cc46e7fd106 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Sun, 18 May 2025 19:39:17 -0600 Subject: [PATCH 224/371] vendor: update glad to OpenGL 4.3 --- vendor/glad/include/glad/gl.h | 884 +++++++++++++++++++++++++++++++- vendor/glad/include/glad/glad.h | 1 - vendor/glad/src/gl.c | 304 +++++++++-- 3 files changed, 1130 insertions(+), 59 deletions(-) delete mode 100644 vendor/glad/include/glad/glad.h diff --git a/vendor/glad/include/glad/gl.h b/vendor/glad/include/glad/gl.h index 2f71276dc..b9b398187 100644 --- a/vendor/glad/include/glad/gl.h +++ b/vendor/glad/include/glad/gl.h @@ -1,5 +1,5 @@ /** - * Loader generated by glad 2.0.0 on Mon Oct 24 00:13:28 2022 + * Loader generated by glad 2.0.8 on Mon May 19 01:37:34 2025 * * SPDX-License-Identifier: (WTFPL OR CC0-1.0) AND Apache-2.0 * @@ -8,7 +8,7 @@ * Extensions: 0 * * APIs: - * - gl:core=3.3 + * - gl:core=4.3 * * Options: * - ALIAS = False @@ -19,10 +19,10 @@ * - ON_DEMAND = False * * Commandline: - * --api='gl:core=3.3' --extensions='' c --loader --mx + * --api='gl:core=4.3' --extensions='' c --loader --mx * * Online: - * http://glad.sh/#api=gl%3Acore%3D3.3&extensions=&generator=c&options=LOADER%2CMX + * http://glad.sh/#api=gl%3Acore%3D4.3&extensions=&generator=c&options=LOADER%2CMX * */ @@ -165,7 +165,7 @@ extern "C" { #define GLAD_VERSION_MAJOR(version) (version / 10000) #define GLAD_VERSION_MINOR(version) (version % 10000) -#define GLAD_GENERATOR_VERSION "2.0.0" +#define GLAD_GENERATOR_VERSION "2.0.8" typedef void (*GLADapiproc)(void); @@ -177,14 +177,25 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #endif /* GLAD_PLATFORM_H_ */ +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 #define GL_ACTIVE_ATTRIBUTES 0x8B89 #define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 #define GL_ACTIVE_TEXTURE 0x84E0 #define GL_ACTIVE_UNIFORMS 0x8B86 #define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 #define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 #define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_VARIABLES 0x9305 #define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_ALL_SHADER_BITS 0xFFFFFFFF #define GL_ALPHA 0x1906 #define GL_ALREADY_SIGNALED 0x911A #define GL_ALWAYS 0x0207 @@ -192,9 +203,28 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_AND_INVERTED 0x1504 #define GL_AND_REVERSE 0x1502 #define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A #define GL_ARRAY_BUFFER 0x8892 #define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ARRAY_SIZE 0x92FB +#define GL_ARRAY_STRIDE 0x92FE +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 #define GL_ATTACHED_SHADERS 0x8B85 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 #define GL_BACK 0x0405 #define GL_BACK_LEFT 0x0402 #define GL_BACK_RIGHT 0x0403 @@ -213,26 +243,34 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_BLEND_SRC 0x0BE1 #define GL_BLEND_SRC_ALPHA 0x80CB #define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLOCK_INDEX 0x92FD #define GL_BLUE 0x1905 #define GL_BLUE_INTEGER 0x8D96 #define GL_BOOL 0x8B56 #define GL_BOOL_VEC2 0x8B57 #define GL_BOOL_VEC3 0x8B58 #define GL_BOOL_VEC4 0x8B59 +#define GL_BUFFER 0x82E0 #define GL_BUFFER_ACCESS 0x88BB #define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 #define GL_BUFFER_MAPPED 0x88BC #define GL_BUFFER_MAP_LENGTH 0x9120 #define GL_BUFFER_MAP_OFFSET 0x9121 #define GL_BUFFER_MAP_POINTER 0x88BD #define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 #define GL_BUFFER_USAGE 0x8765 +#define GL_BUFFER_VARIABLE 0x92E5 #define GL_BYTE 0x1400 +#define GL_CAVEAT_SUPPORT 0x82B8 #define GL_CCW 0x0901 #define GL_CLAMP_READ_COLOR 0x891C #define GL_CLAMP_TO_BORDER 0x812D #define GL_CLAMP_TO_EDGE 0x812F #define GL_CLEAR 0x1500 +#define GL_CLEAR_BUFFER 0x82B4 #define GL_CLIP_DISTANCE0 0x3000 #define GL_CLIP_DISTANCE1 0x3001 #define GL_CLIP_DISTANCE2 0x3002 @@ -276,39 +314,93 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_COLOR_ATTACHMENT9 0x8CE9 #define GL_COLOR_BUFFER_BIT 0x00004000 #define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_COLOR_ENCODING 0x8296 #define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_COLOR_RENDERABLE 0x8286 #define GL_COLOR_WRITEMASK 0x0C23 +#define GL_COMMAND_BARRIER_BIT 0x00000040 #define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B #define GL_COMPILE_STATUS 0x8B81 +#define GL_COMPRESSED_R11_EAC 0x9270 #define GL_COMPRESSED_RED 0x8225 #define GL_COMPRESSED_RED_RGTC1 0x8DBB #define GL_COMPRESSED_RG 0x8226 +#define GL_COMPRESSED_RG11_EAC 0x9272 #define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 #define GL_COMPRESSED_RGBA 0x84EE +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F #define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 #define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 #define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE #define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 #define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D #define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 #define GL_CONDITION_SATISFIED 0x911C #define GL_CONSTANT_ALPHA 0x8003 #define GL_CONSTANT_COLOR 0x8001 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 #define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 #define GL_CONTEXT_FLAGS 0x821E +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 #define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 #define GL_CONTEXT_PROFILE_MASK 0x9126 #define GL_COPY 0x1503 #define GL_COPY_INVERTED 0x150C #define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 #define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 #define GL_CULL_FACE 0x0B44 #define GL_CULL_FACE_MODE 0x0B45 #define GL_CURRENT_PROGRAM 0x8B8D #define GL_CURRENT_QUERY 0x8865 #define GL_CURRENT_VERTEX_ATTRIB 0x8626 #define GL_CW 0x0900 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E #define GL_DECR 0x1E03 #define GL_DECR_WRAP 0x8508 #define GL_DELETE_STATUS 0x8B80 @@ -324,16 +416,33 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_DEPTH_COMPONENT24 0x81A6 #define GL_DEPTH_COMPONENT32 0x81A7 #define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH_COMPONENTS 0x8284 #define GL_DEPTH_FUNC 0x0B74 #define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_RENDERABLE 0x8287 #define GL_DEPTH_STENCIL 0x84F9 #define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA #define GL_DEPTH_TEST 0x0B71 #define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF #define GL_DITHER 0x0BD0 #define GL_DONT_CARE 0x1100 #define GL_DOUBLE 0x140A #define GL_DOUBLEBUFFER 0x0C32 +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE #define GL_DRAW_BUFFER 0x0C01 #define GL_DRAW_BUFFER0 0x8825 #define GL_DRAW_BUFFER1 0x8826 @@ -353,11 +462,14 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_DRAW_BUFFER9 0x882E #define GL_DRAW_FRAMEBUFFER 0x8CA9 #define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 #define GL_DST_ALPHA 0x0304 #define GL_DST_COLOR 0x0306 #define GL_DYNAMIC_COPY 0x88EA #define GL_DYNAMIC_DRAW 0x88E8 #define GL_DYNAMIC_READ 0x88E9 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_EQUAL 0x0202 @@ -366,7 +478,9 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FALSE 0 #define GL_FASTEST 0x1101 #define GL_FILL 0x1B02 +#define GL_FILTER 0x829A #define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_FIXED 0x140C #define GL_FIXED_ONLY 0x891D #define GL_FLOAT 0x1406 #define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD @@ -382,8 +496,15 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FLOAT_VEC2 0x8B50 #define GL_FLOAT_VEC3 0x8B51 #define GL_FLOAT_VEC4 0x8B52 +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D #define GL_FRAGMENT_SHADER 0x8B30 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 #define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_FRAGMENT_TEXTURE 0x829F #define GL_FRAMEBUFFER 0x8D40 #define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 #define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 @@ -399,15 +520,24 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 #define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 #define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_FRAMEBUFFER_BLEND 0x828B #define GL_FRAMEBUFFER_COMPLETE 0x8CD5 #define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 #define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 #define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB #define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 #define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 #define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 #define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A #define GL_FRAMEBUFFER_SRGB 0x8DB9 #define GL_FRAMEBUFFER_UNDEFINED 0x8219 #define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD @@ -416,24 +546,97 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_FRONT_FACE 0x0B46 #define GL_FRONT_LEFT 0x0400 #define GL_FRONT_RIGHT 0x0401 +#define GL_FULL_SUPPORT 0x82B7 #define GL_FUNC_ADD 0x8006 #define GL_FUNC_REVERSE_SUBTRACT 0x800B #define GL_FUNC_SUBTRACT 0x800A #define GL_GEOMETRY_INPUT_TYPE 0x8917 #define GL_GEOMETRY_OUTPUT_TYPE 0x8918 #define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_GEOMETRY_TEXTURE 0x829E #define GL_GEOMETRY_VERTICES_OUT 0x8916 #define GL_GEQUAL 0x0206 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 #define GL_GREATER 0x0204 #define GL_GREEN 0x1904 #define GL_GREEN_INTEGER 0x8D95 #define GL_HALF_FLOAT 0x140B +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_HIGH_INT 0x8DF5 +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A #define GL_INCR 0x1E02 #define GL_INCR_WRAP 0x8507 #define GL_INFO_LOG_LENGTH 0x8B84 #define GL_INT 0x1404 #define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_INTERNALFORMAT_SUPPORTED 0x826F #define GL_INT_2_10_10_10_REV 0x8D9F +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F #define GL_INT_SAMPLER_1D 0x8DC9 #define GL_INT_SAMPLER_1D_ARRAY 0x8DCE #define GL_INT_SAMPLER_2D 0x8DCA @@ -444,6 +647,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_INT_SAMPLER_3D 0x8DCB #define GL_INT_SAMPLER_BUFFER 0x8DD0 #define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E #define GL_INT_VEC2 0x8B53 #define GL_INT_VEC3 0x8B54 #define GL_INT_VEC4 0x8B55 @@ -453,8 +657,12 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_INVALID_OPERATION 0x0502 #define GL_INVALID_VALUE 0x0501 #define GL_INVERT 0x150A +#define GL_ISOLINES 0x8E7A +#define GL_IS_PER_PATCH 0x92E7 +#define GL_IS_ROW_MAJOR 0x9300 #define GL_KEEP 0x1E00 #define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_LAYER_PROVOKING_VERTEX 0x825E #define GL_LEFT 0x0406 #define GL_LEQUAL 0x0203 #define GL_LESS 0x0201 @@ -473,71 +681,176 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_LINE_WIDTH_RANGE 0x0B22 #define GL_LINK_STATUS 0x8B82 +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F #define GL_LOGIC_OP_MODE 0x0BF0 #define GL_LOWER_LEFT 0x8CA1 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_LOW_INT 0x8DF3 #define GL_MAJOR_VERSION 0x821B +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 #define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 #define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 #define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 #define GL_MAP_READ_BIT 0x0001 #define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 #define GL_MAP_WRITE_BIT 0x0002 +#define GL_MATRIX_STRIDE 0x92FF #define GL_MAX 0x8008 #define GL_MAX_3D_TEXTURE_SIZE 0x8073 #define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 #define GL_MAX_CLIP_DISTANCES 0x0D32 #define GL_MAX_COLOR_ATTACHMENTS 0x8CDF #define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 #define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 #define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F #define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D #define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E #define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF #define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEPTH 0x8280 #define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F #define GL_MAX_DRAW_BUFFERS 0x8824 #define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC #define GL_MAX_ELEMENTS_INDICES 0x80E9 #define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE #define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA #define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D #define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD #define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 #define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 #define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 #define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 #define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 #define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C #define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_MAX_IMAGE_UNITS 0x8F38 #define GL_MAX_INTEGER_SAMPLES 0x9110 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_MAX_PATCH_VERTICES 0x8E7D #define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F #define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 #define GL_MAX_RENDERBUFFER_SIZE 0x84E8 #define GL_MAX_SAMPLES 0x8D57 #define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 #define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 #define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B #define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 #define GL_MAX_TEXTURE_LOD_BIAS 0x84FD #define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 #define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B #define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 #define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 #define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_LOCATIONS 0x826E #define GL_MAX_VARYING_COMPONENTS 0x8B4B #define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC #define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA #define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_VERTEX_STREAMS 0x8E71 #define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C #define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B #define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VIEWPORTS 0x825B #define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_WIDTH 0x827E +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_MEDIUM_INT 0x8DF4 #define GL_MIN 0x8007 #define GL_MINOR_VERSION 0x821C +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC #define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIPMAP 0x8293 #define GL_MIRRORED_REPEAT 0x8370 #define GL_MULTISAMPLE 0x809D +#define GL_NAME_LENGTH 0x92F9 #define GL_NAND 0x150E #define GL_NEAREST 0x2600 #define GL_NEAREST_MIPMAP_LINEAR 0x2702 @@ -549,9 +862,16 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_NOR 0x1508 #define GL_NOTEQUAL 0x0205 #define GL_NO_ERROR 0 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A #define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 #define GL_NUM_EXTENSIONS 0x821D +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 #define GL_OBJECT_TYPE 0x9112 +#define GL_OFFSET 0x92FC #define GL_ONE 1 #define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 #define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 @@ -566,6 +886,10 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_OR_REVERSE 0x150B #define GL_OUT_OF_MEMORY 0x0505 #define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B #define GL_PACK_IMAGE_HEIGHT 0x806C #define GL_PACK_LSB_FIRST 0x0D01 #define GL_PACK_ROW_LENGTH 0x0D02 @@ -573,6 +897,11 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_PACK_SKIP_PIXELS 0x0D04 #define GL_PACK_SKIP_ROWS 0x0D03 #define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_PATCHES 0x000E +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 #define GL_PIXEL_PACK_BUFFER 0x88EB #define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED #define GL_PIXEL_UNPACK_BUFFER 0x88EC @@ -594,8 +923,18 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_POLYGON_SMOOTH_HINT 0x0C53 #define GL_PRIMITIVES_GENERATED 0x8C87 #define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 #define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_PROGRAM 0x82E2 +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A #define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_PROGRAM_SEPARABLE 0x8258 #define GL_PROVOKING_VERTEX 0x8E4F #define GL_PROXY_TEXTURE_1D 0x8063 #define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 @@ -605,8 +944,11 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 #define GL_PROXY_TEXTURE_3D 0x8070 #define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B #define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_QUADS 0x0007 #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_QUERY 0x82E3 #define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 #define GL_QUERY_BY_REGION_WAIT 0x8E15 #define GL_QUERY_COUNTER_BITS 0x8864 @@ -633,9 +975,18 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_READ_FRAMEBUFFER 0x8CA8 #define GL_READ_FRAMEBUFFER_BINDING 0x8CAA #define GL_READ_ONLY 0x88B8 +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E #define GL_READ_WRITE 0x88BA #define GL_RED 0x1903 #define GL_RED_INTEGER 0x8D94 +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 #define GL_RENDERBUFFER 0x8D41 #define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 #define GL_RENDERBUFFER_BINDING 0x8CA7 @@ -679,6 +1030,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_RGB32UI 0x8D71 #define GL_RGB4 0x804F #define GL_RGB5 0x8050 +#define GL_RGB565 0x8D62 #define GL_RGB5_A1 0x8057 #define GL_RGB8 0x8051 #define GL_RGB8I 0x8D8F @@ -705,6 +1057,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_RGB_INTEGER 0x8D98 #define GL_RG_INTEGER 0x8228 #define GL_RIGHT 0x0407 +#define GL_SAMPLER 0x82E6 #define GL_SAMPLER_1D 0x8B5D #define GL_SAMPLER_1D_ARRAY 0x8DC0 #define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 @@ -721,6 +1074,8 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_SAMPLER_BINDING 0x8919 #define GL_SAMPLER_BUFFER 0x8DC2 #define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D #define GL_SAMPLER_CUBE_SHADOW 0x8DC5 #define GL_SAMPLES 0x80A9 #define GL_SAMPLES_PASSED 0x8914 @@ -733,16 +1088,35 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_SAMPLE_MASK 0x8E51 #define GL_SAMPLE_MASK_VALUE 0x8E52 #define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_SHADING 0x8C36 #define GL_SCISSOR_BOX 0x0C10 #define GL_SCISSOR_TEST 0x0C11 #define GL_SEPARATE_ATTRIBS 0x8C8D #define GL_SET 0x150F +#define GL_SHADER 0x82E1 +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 #define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 #define GL_SHADER_TYPE 0x8B4F #define GL_SHADING_LANGUAGE_VERSION 0x8B8C #define GL_SHORT 0x1402 #define GL_SIGNALED 0x9119 #define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF #define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 #define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 #define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 @@ -756,6 +1130,10 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_SRGB8 0x8C41 #define GL_SRGB8_ALPHA8 0x8C43 #define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 #define GL_STATIC_COPY 0x88E6 #define GL_STATIC_DRAW 0x88E4 #define GL_STATIC_READ 0x88E5 @@ -770,6 +1148,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_STENCIL_BACK_WRITEMASK 0x8CA5 #define GL_STENCIL_BUFFER_BIT 0x00000400 #define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_COMPONENTS 0x8285 #define GL_STENCIL_FAIL 0x0B94 #define GL_STENCIL_FUNC 0x0B92 #define GL_STENCIL_INDEX 0x1901 @@ -780,6 +1159,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 #define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 #define GL_STENCIL_REF 0x0B97 +#define GL_STENCIL_RENDERABLE 0x8288 #define GL_STENCIL_TEST 0x0B90 #define GL_STENCIL_VALUE_MASK 0x0B93 #define GL_STENCIL_WRITEMASK 0x0B98 @@ -794,6 +1174,21 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 #define GL_SYNC_STATUS 0x9114 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 #define GL_TEXTURE 0x1702 #define GL_TEXTURE0 0x84C0 #define GL_TEXTURE1 0x84C1 @@ -846,18 +1241,26 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_TEXTURE_BINDING_3D 0x806A #define GL_TEXTURE_BINDING_BUFFER 0x8C2C #define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A #define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 #define GL_TEXTURE_BLUE_SIZE 0x805E #define GL_TEXTURE_BLUE_TYPE 0x8C12 #define GL_TEXTURE_BORDER_COLOR 0x1004 #define GL_TEXTURE_BUFFER 0x8C2A #define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_BUFFER_SIZE 0x919E #define GL_TEXTURE_COMPARE_FUNC 0x884D #define GL_TEXTURE_COMPARE_MODE 0x884C #define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 #define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 #define GL_TEXTURE_COMPRESSION_HINT 0x84EF #define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 #define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A @@ -868,10 +1271,17 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_TEXTURE_DEPTH 0x8071 #define GL_TEXTURE_DEPTH_SIZE 0x884A #define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 #define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 #define GL_TEXTURE_GREEN_SIZE 0x805D #define GL_TEXTURE_GREEN_TYPE 0x8C11 #define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF #define GL_TEXTURE_INTERNAL_FORMAT 0x1003 #define GL_TEXTURE_LOD_BIAS 0x8501 #define GL_TEXTURE_MAG_FILTER 0x2800 @@ -883,6 +1293,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_TEXTURE_RED_SIZE 0x805C #define GL_TEXTURE_RED_TYPE 0x8C10 #define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_SHADOW 0x82A1 #define GL_TEXTURE_SHARED_SIZE 0x8C3F #define GL_TEXTURE_STENCIL_SIZE 0x88F1 #define GL_TEXTURE_SWIZZLE_A 0x8E45 @@ -890,6 +1301,12 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_TEXTURE_SWIZZLE_G 0x8E43 #define GL_TEXTURE_SWIZZLE_R 0x8E42 #define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC #define GL_TEXTURE_WIDTH 0x1000 #define GL_TEXTURE_WRAP_R 0x8072 #define GL_TEXTURE_WRAP_S 0x2802 @@ -898,12 +1315,22 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF #define GL_TIMESTAMP 0x8E28 #define GL_TIME_ELAPSED 0x88BF +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 #define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 #define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F #define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 #define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 #define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 #define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 #define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 #define GL_TRIANGLES 0x0004 @@ -912,15 +1339,24 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_TRIANGLE_STRIP 0x0005 #define GL_TRIANGLE_STRIP_ADJACENCY 0x000D #define GL_TRUE 1 +#define GL_TYPE 0x92FA +#define GL_UNDEFINED_VERTEX 0x8260 +#define GL_UNIFORM 0x92E1 #define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_UNIFORM_BLOCK 0x92E2 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 #define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 #define GL_UNIFORM_BLOCK_BINDING 0x8A3F #define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 #define GL_UNIFORM_BLOCK_INDEX 0x8A3A #define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC #define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 #define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 #define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 #define GL_UNIFORM_BUFFER 0x8A11 #define GL_UNIFORM_BUFFER_BINDING 0x8A28 @@ -934,6 +1370,10 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_UNIFORM_SIZE 0x8A38 #define GL_UNIFORM_TYPE 0x8A37 #define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 #define GL_UNPACK_IMAGE_HEIGHT 0x806E #define GL_UNPACK_LSB_FIRST 0x0CF1 #define GL_UNPACK_ROW_LENGTH 0x0CF2 @@ -953,6 +1393,18 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A #define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 #define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 #define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 @@ -963,6 +1415,7 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 #define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 #define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F #define GL_UNSIGNED_INT_VEC2 0x8DC6 #define GL_UNSIGNED_INT_VEC3 0x8DC7 #define GL_UNSIGNED_INT_VEC4 0x8DC8 @@ -978,19 +1431,52 @@ typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apipro #define GL_VALIDATE_STATUS 0x8B83 #define GL_VENDOR 0x1F00 #define GL_VERSION 0x1F02 +#define GL_VERTEX_ARRAY 0x8074 #define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 #define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 #define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 #define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 #define GL_VERTEX_SHADER 0x8B31 +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_VERTEX_TEXTURE 0x829B #define GL_VIEWPORT 0x0BA2 +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 #define GL_WAIT_FAILED 0x911D #define GL_WRITE_ONLY 0x88B9 #define GL_XOR 0x1506 @@ -1074,12 +1560,18 @@ typedef void (GLAD_API_PTR *GLVULKANPROCNV)(void); #define GL_VERSION_3_1 1 #define GL_VERSION_3_2 1 #define GL_VERSION_3_3 1 +#define GL_VERSION_4_0 1 +#define GL_VERSION_4_1 1 +#define GL_VERSION_4_2 1 +#define GL_VERSION_4_3 1 +typedef void (GLAD_API_PTR *PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program); typedef void (GLAD_API_PTR *PFNGLACTIVETEXTUREPROC)(GLenum texture); typedef void (GLAD_API_PTR *PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); typedef void (GLAD_API_PTR *PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); typedef void (GLAD_API_PTR *PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); +typedef void (GLAD_API_PTR *PFNGLBEGINQUERYINDEXEDPROC)(GLenum target, GLuint index, GLuint id); typedef void (GLAD_API_PTR *PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); typedef void (GLAD_API_PTR *PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); @@ -1088,27 +1580,38 @@ typedef void (GLAD_API_PTR *PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint inde typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +typedef void (GLAD_API_PTR *PFNGLBINDIMAGETEXTUREPROC)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (GLAD_API_PTR *PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline); typedef void (GLAD_API_PTR *PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); typedef void (GLAD_API_PTR *PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); +typedef void (GLAD_API_PTR *PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id); typedef void (GLAD_API_PTR *PFNGLBINDVERTEXARRAYPROC)(GLuint array); +typedef void (GLAD_API_PTR *PFNGLBINDVERTEXBUFFERPROC)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); typedef void (GLAD_API_PTR *PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONSEPARATEIPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDEQUATIONIPROC)(GLuint buf, GLenum mode); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCSEPARATEIPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GLAD_API_PTR *PFNGLBLENDFUNCIPROC)(GLuint buf, GLenum src, GLenum dst); typedef void (GLAD_API_PTR *PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef void (GLAD_API_PTR *PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void * data, GLenum usage); typedef void (GLAD_API_PTR *PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void * data); typedef GLenum (GLAD_API_PTR *PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); typedef void (GLAD_API_PTR *PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); typedef void (GLAD_API_PTR *PFNGLCLEARPROC)(GLbitfield mask); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERDATAPROC)(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void * data); +typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERSUBDATAPROC)(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void * data); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint * value); typedef void (GLAD_API_PTR *PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHPROC)(GLdouble depth); +typedef void (GLAD_API_PTR *PFNGLCLEARDEPTHFPROC)(GLfloat d); typedef void (GLAD_API_PTR *PFNGLCLEARSTENCILPROC)(GLint s); typedef GLenum (GLAD_API_PTR *PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); typedef void (GLAD_API_PTR *PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); @@ -1121,6 +1624,7 @@ typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLi typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void * data); typedef void (GLAD_API_PTR *PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (GLAD_API_PTR *PFNGLCOPYIMAGESUBDATAPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); typedef void (GLAD_API_PTR *PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); @@ -1128,44 +1632,66 @@ typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint lev typedef void (GLAD_API_PTR *PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); typedef GLuint (GLAD_API_PTR *PFNGLCREATEPROGRAMPROC)(void); typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROC)(GLenum type); +typedef GLuint (GLAD_API_PTR *PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const* strings); typedef void (GLAD_API_PTR *PFNGLCULLFACEPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void * userParam); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint * ids, GLboolean enabled); +typedef void (GLAD_API_PTR *PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar * buf); typedef void (GLAD_API_PTR *PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint * buffers); typedef void (GLAD_API_PTR *PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint * framebuffers); typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint * pipelines); typedef void (GLAD_API_PTR *PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint * ids); typedef void (GLAD_API_PTR *PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint * renderbuffers); typedef void (GLAD_API_PTR *PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint * samplers); typedef void (GLAD_API_PTR *PFNGLDELETESHADERPROC)(GLuint shader); typedef void (GLAD_API_PTR *PFNGLDELETESYNCPROC)(GLsync sync); typedef void (GLAD_API_PTR *PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei n, const GLuint * ids); typedef void (GLAD_API_PTR *PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint * arrays); typedef void (GLAD_API_PTR *PFNGLDEPTHFUNCPROC)(GLenum func); typedef void (GLAD_API_PTR *PFNGLDEPTHMASKPROC)(GLboolean flag); typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEARRAYVPROC)(GLuint first, GLsizei count, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEINDEXEDPROC)(GLuint index, GLdouble n, GLdouble f); +typedef void (GLAD_API_PTR *PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); typedef void (GLAD_API_PTR *PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); typedef void (GLAD_API_PTR *PFNGLDISABLEPROC)(GLenum cap); typedef void (GLAD_API_PTR *PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); typedef void (GLAD_API_PTR *PFNGLDISABLEIPROC)(GLenum target, GLuint index); +typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (GLAD_API_PTR *PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr indirect); typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect); typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERPROC)(GLenum buf); typedef void (GLAD_API_PTR *PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum * bufs); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLuint baseinstance); typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void * indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices); typedef void (GLAD_API_PTR *PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void * indices, GLint basevertex); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKPROC)(GLenum mode, GLuint id); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)(GLenum mode, GLuint id, GLsizei instancecount); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)(GLenum mode, GLuint id, GLuint stream); +typedef void (GLAD_API_PTR *PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); typedef void (GLAD_API_PTR *PFNGLENABLEPROC)(GLenum cap); typedef void (GLAD_API_PTR *PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); typedef void (GLAD_API_PTR *PFNGLENABLEIPROC)(GLenum target, GLuint index); typedef void (GLAD_API_PTR *PFNGLENDCONDITIONALRENDERPROC)(void); typedef void (GLAD_API_PTR *PFNGLENDQUERYPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLENDQUERYINDEXEDPROC)(GLenum target, GLuint index); typedef void (GLAD_API_PTR *PFNGLENDTRANSFORMFEEDBACKPROC)(void); typedef GLsync (GLAD_API_PTR *PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); typedef void (GLAD_API_PTR *PFNGLFINISHPROC)(void); typedef void (GLAD_API_PTR *PFNGLFLUSHPROC)(void); typedef void (GLAD_API_PTR *PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); @@ -1175,13 +1701,19 @@ typedef void (GLAD_API_PTR *PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLe typedef void (GLAD_API_PTR *PFNGLFRONTFACEPROC)(GLenum mode); typedef void (GLAD_API_PTR *PFNGLGENBUFFERSPROC)(GLsizei n, GLuint * buffers); typedef void (GLAD_API_PTR *PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint * framebuffers); +typedef void (GLAD_API_PTR *PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint * pipelines); typedef void (GLAD_API_PTR *PFNGLGENQUERIESPROC)(GLsizei n, GLuint * ids); typedef void (GLAD_API_PTR *PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint * renderbuffers); typedef void (GLAD_API_PTR *PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint * samplers); typedef void (GLAD_API_PTR *PFNGLGENTEXTURESPROC)(GLsizei n, GLuint * textures); +typedef void (GLAD_API_PTR *PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint * ids); typedef void (GLAD_API_PTR *PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint * arrays); typedef void (GLAD_API_PTR *PFNGLGENERATEMIPMAPPROC)(GLenum target); +typedef void (GLAD_API_PTR *PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)(GLuint program, GLuint bufferIndex, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINENAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint * values); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei * length, GLint * size, GLenum * type, GLchar * name); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei * length, GLchar * uniformBlockName); typedef void (GLAD_API_PTR *PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint * params); @@ -1196,19 +1728,39 @@ typedef void (GLAD_API_PTR *PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum typedef void (GLAD_API_PTR *PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void ** params); typedef void (GLAD_API_PTR *PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void * data); typedef void (GLAD_API_PTR *PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void * img); +typedef GLuint (GLAD_API_PTR *PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum * sources, GLenum * types, GLuint * ids, GLenum * severities, GLsizei * lengths, GLchar * messageLog); +typedef void (GLAD_API_PTR *PFNGLGETDOUBLEI_VPROC)(GLenum target, GLuint index, GLdouble * data); typedef void (GLAD_API_PTR *PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble * data); typedef GLenum (GLAD_API_PTR *PFNGLGETERRORPROC)(void); +typedef void (GLAD_API_PTR *PFNGLGETFLOATI_VPROC)(GLenum target, GLuint index, GLfloat * data); typedef void (GLAD_API_PTR *PFNGLGETFLOATVPROC)(GLenum pname, GLfloat * data); typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar * name); typedef GLint (GLAD_API_PTR *PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 * data); typedef void (GLAD_API_PTR *PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 * data); typedef void (GLAD_API_PTR *PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint * data); typedef void (GLAD_API_PTR *PFNGLGETINTEGERVPROC)(GLenum pname, GLint * data); +typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATI64VPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 * params); +typedef void (GLAD_API_PTR *PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat * val); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETOBJECTPTRLABELPROC)(const void * ptr, GLsizei bufSize, GLsizei * length, GLchar * label); +typedef void (GLAD_API_PTR *PFNGLGETPOINTERVPROC)(GLenum pname, void ** params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLenum * binaryFormat, void * binary); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint program, GLenum programInterface, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint * params); +typedef GLuint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuint program, GLenum programInterface, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei * length, GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum * props, GLsizei count, GLsizei * length, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETPROGRAMSTAGEIVPROC)(GLuint program, GLenum shadertype, GLenum pname, GLint * values); typedef void (GLAD_API_PTR *PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint * params); +typedef void (GLAD_API_PTR *PFNGLGETQUERYINDEXEDIVPROC)(GLenum target, GLuint index, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 * params); typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 * params); @@ -1220,10 +1772,13 @@ typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GL typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * infoLog); +typedef void (GLAD_API_PTR *PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint * range, GLint * precision); typedef void (GLAD_API_PTR *PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei * length, GLchar * source); typedef void (GLAD_API_PTR *PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint * params); typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGPROC)(GLenum name); typedef const GLubyte * (GLAD_API_PTR *PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); +typedef GLuint (GLAD_API_PTR *PFNGLGETSUBROUTINEINDEXPROC)(GLuint program, GLenum shadertype, const GLchar * name); +typedef GLint (GLAD_API_PTR *PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint program, GLenum shadertype, const GLchar * name); typedef void (GLAD_API_PTR *PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei * length, GLint * values); typedef void (GLAD_API_PTR *PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void * pixels); typedef void (GLAD_API_PTR *PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat * params); @@ -1236,36 +1791,56 @@ typedef void (GLAD_API_PTR *PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program typedef GLuint (GLAD_API_PTR *PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar * uniformBlockName); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const* uniformNames, GLuint * uniformIndices); typedef GLint (GLAD_API_PTR *PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar * name); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMSUBROUTINEUIVPROC)(GLenum shadertype, GLint location, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETUNIFORMDVPROC)(GLuint program, GLint location, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint * params); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint * params); +typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBLDVPROC)(GLuint index, GLenum pname, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void ** pointer); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble * params); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat * params); typedef void (GLAD_API_PTR *PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint * params); typedef void (GLAD_API_PTR *PFNGLHINTPROC)(GLenum target, GLenum mode); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (GLAD_API_PTR *PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments); +typedef void (GLAD_API_PTR *PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum * attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXIMAGEPROC)(GLuint texture, GLint level); +typedef void (GLAD_API_PTR *PFNGLINVALIDATETEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); typedef GLboolean (GLAD_API_PTR *PFNGLISBUFFERPROC)(GLuint buffer); typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDPROC)(GLenum cap); typedef GLboolean (GLAD_API_PTR *PFNGLISENABLEDIPROC)(GLenum target, GLuint index); typedef GLboolean (GLAD_API_PTR *PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPROC)(GLuint program); +typedef GLboolean (GLAD_API_PTR *PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline); typedef GLboolean (GLAD_API_PTR *PFNGLISQUERYPROC)(GLuint id); typedef GLboolean (GLAD_API_PTR *PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); typedef GLboolean (GLAD_API_PTR *PFNGLISSAMPLERPROC)(GLuint sampler); typedef GLboolean (GLAD_API_PTR *PFNGLISSHADERPROC)(GLuint shader); typedef GLboolean (GLAD_API_PTR *PFNGLISSYNCPROC)(GLsync sync); typedef GLboolean (GLAD_API_PTR *PFNGLISTEXTUREPROC)(GLuint texture); +typedef GLboolean (GLAD_API_PTR *PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id); typedef GLboolean (GLAD_API_PTR *PFNGLISVERTEXARRAYPROC)(GLuint array); typedef void (GLAD_API_PTR *PFNGLLINEWIDTHPROC)(GLfloat width); typedef void (GLAD_API_PTR *PFNGLLINKPROGRAMPROC)(GLuint program); typedef void (GLAD_API_PTR *PFNGLLOGICOPPROC)(GLenum opcode); typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); typedef void * (GLAD_API_PTR *PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GLAD_API_PTR *PFNGLMEMORYBARRIERPROC)(GLbitfield barriers); +typedef void (GLAD_API_PTR *PFNGLMINSAMPLESHADINGPROC)(GLfloat value); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint * first, const GLsizei * count, GLsizei drawcount); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWARRAYSINDIRECTPROC)(GLenum mode, const void * indirect, GLsizei drawcount, GLsizei stride); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount); typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei * count, GLenum type, const void *const* indices, GLsizei drawcount, const GLint * basevertex); +typedef void (GLAD_API_PTR *PFNGLMULTIDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void * indirect, GLsizei drawcount, GLsizei stride); +typedef void (GLAD_API_PTR *PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLOBJECTPTRLABELPROC)(const void * ptr, GLsizei length, const GLchar * label); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERFVPROC)(GLenum pname, const GLfloat * values); +typedef void (GLAD_API_PTR *PFNGLPATCHPARAMETERIPROC)(GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPAUSETRANSFORMFEEDBACKPROC)(void); typedef void (GLAD_API_PTR *PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); typedef void (GLAD_API_PTR *PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); @@ -1275,13 +1850,69 @@ typedef void (GLAD_API_PTR *PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint typedef void (GLAD_API_PTR *PFNGLPOINTSIZEPROC)(GLfloat size); typedef void (GLAD_API_PTR *PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); typedef void (GLAD_API_PTR *PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); +typedef void (GLAD_API_PTR *PFNGLPOPDEBUGGROUPPROC)(void); typedef void (GLAD_API_PTR *PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); +typedef void (GLAD_API_PTR *PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void * binary, GLsizei length); +typedef void (GLAD_API_PTR *PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); +typedef void (GLAD_API_PTR *PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLPROVOKINGVERTEXPROC)(GLenum mode); +typedef void (GLAD_API_PTR *PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar * message); typedef void (GLAD_API_PTR *PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); typedef void (GLAD_API_PTR *PFNGLREADBUFFERPROC)(GLenum src); typedef void (GLAD_API_PTR *PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void * pixels); +typedef void (GLAD_API_PTR *PFNGLRELEASESHADERCOMPILERPROC)(void); typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (GLAD_API_PTR *PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLRESUMETRANSFORMFEEDBACKPROC)(void); typedef void (GLAD_API_PTR *PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); typedef void (GLAD_API_PTR *PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint * param); @@ -1291,7 +1922,12 @@ typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint * param); typedef void (GLAD_API_PTR *PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORARRAYVPROC)(GLuint first, GLsizei count, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLSCISSORINDEXEDVPROC)(GLuint index, const GLint * v); +typedef void (GLAD_API_PTR *PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint * shaders, GLenum binaryFormat, const void * binary, GLsizei length); typedef void (GLAD_API_PTR *PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const* string, const GLint * length); +typedef void (GLAD_API_PTR *PFNGLSHADERSTORAGEBLOCKBINDINGPROC)(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); typedef void (GLAD_API_PTR *PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); typedef void (GLAD_API_PTR *PFNGLSTENCILMASKPROC)(GLuint mask); @@ -1299,6 +1935,7 @@ typedef void (GLAD_API_PTR *PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint ma typedef void (GLAD_API_PTR *PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); typedef void (GLAD_API_PTR *PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); typedef void (GLAD_API_PTR *PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GLAD_API_PTR *PFNGLTEXBUFFERRANGEPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); typedef void (GLAD_API_PTR *PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); @@ -1310,28 +1947,42 @@ typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat * params); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); typedef void (GLAD_API_PTR *PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint * params); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE1DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GLAD_API_PTR *PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void * pixels); typedef void (GLAD_API_PTR *PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void * pixels); +typedef void (GLAD_API_PTR *PFNGLTEXTUREVIEWPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); typedef void (GLAD_API_PTR *PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const* varyings, GLenum bufferMode); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1DPROC)(GLint location, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLUNIFORM1DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); typedef void (GLAD_API_PTR *PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM1IPROC)(GLint location, GLint v0); typedef void (GLAD_API_PTR *PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); typedef void (GLAD_API_PTR *PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2DPROC)(GLint location, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLUNIFORM2DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); typedef void (GLAD_API_PTR *PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); typedef void (GLAD_API_PTR *PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); typedef void (GLAD_API_PTR *PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLUNIFORM3DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); typedef void (GLAD_API_PTR *PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); typedef void (GLAD_API_PTR *PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); typedef void (GLAD_API_PTR *PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLUNIFORM4DVPROC)(GLint location, GLsizei count, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); typedef void (GLAD_API_PTR *PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat * value); typedef void (GLAD_API_PTR *PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); @@ -1339,18 +1990,30 @@ typedef void (GLAD_API_PTR *PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); typedef void (GLAD_API_PTR *PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble * value); typedef void (GLAD_API_PTR *PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat * value); +typedef void (GLAD_API_PTR *PFNGLUNIFORMSUBROUTINESUIVPROC)(GLenum shadertype, GLsizei count, const GLuint * indices); typedef GLboolean (GLAD_API_PTR *PFNGLUNMAPBUFFERPROC)(GLenum target); typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program); typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPROC)(GLuint program); +typedef void (GLAD_API_PTR *PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); @@ -1387,7 +2050,9 @@ typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshor typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBBINDINGPROC)(GLuint attribindex, GLuint bindingindex); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); @@ -1408,7 +2073,18 @@ typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLub typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint * v); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DPROC)(GLuint index, GLdouble x); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL1DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL2DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL3DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBL4DVPROC)(GLuint index, const GLdouble * v); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBLPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void * pointer); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); @@ -1418,7 +2094,11 @@ typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum typ typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint * value); typedef void (GLAD_API_PTR *PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void * pointer); +typedef void (GLAD_API_PTR *PFNGLVERTEXBINDINGDIVISORPROC)(GLuint bindingindex, GLuint divisor); typedef void (GLAD_API_PTR *PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTARRAYVPROC)(GLuint first, GLsizei count, const GLfloat * v); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GLAD_API_PTR *PFNGLVIEWPORTINDEXEDFVPROC)(GLuint index, const GLfloat * v); typedef void (GLAD_API_PTR *PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); typedef struct GladGLContext { @@ -1436,11 +2116,17 @@ typedef struct GladGLContext { int VERSION_3_1; int VERSION_3_2; int VERSION_3_3; + int VERSION_4_0; + int VERSION_4_1; + int VERSION_4_2; + int VERSION_4_3; + PFNGLACTIVESHADERPROGRAMPROC ActiveShaderProgram; PFNGLACTIVETEXTUREPROC ActiveTexture; PFNGLATTACHSHADERPROC AttachShader; PFNGLBEGINCONDITIONALRENDERPROC BeginConditionalRender; PFNGLBEGINQUERYPROC BeginQuery; + PFNGLBEGINQUERYINDEXEDPROC BeginQueryIndexed; PFNGLBEGINTRANSFORMFEEDBACKPROC BeginTransformFeedback; PFNGLBINDATTRIBLOCATIONPROC BindAttribLocation; PFNGLBINDBUFFERPROC BindBuffer; @@ -1449,27 +2135,38 @@ typedef struct GladGLContext { PFNGLBINDFRAGDATALOCATIONPROC BindFragDataLocation; PFNGLBINDFRAGDATALOCATIONINDEXEDPROC BindFragDataLocationIndexed; PFNGLBINDFRAMEBUFFERPROC BindFramebuffer; + PFNGLBINDIMAGETEXTUREPROC BindImageTexture; + PFNGLBINDPROGRAMPIPELINEPROC BindProgramPipeline; PFNGLBINDRENDERBUFFERPROC BindRenderbuffer; PFNGLBINDSAMPLERPROC BindSampler; PFNGLBINDTEXTUREPROC BindTexture; + PFNGLBINDTRANSFORMFEEDBACKPROC BindTransformFeedback; PFNGLBINDVERTEXARRAYPROC BindVertexArray; + PFNGLBINDVERTEXBUFFERPROC BindVertexBuffer; PFNGLBLENDCOLORPROC BlendColor; PFNGLBLENDEQUATIONPROC BlendEquation; PFNGLBLENDEQUATIONSEPARATEPROC BlendEquationSeparate; + PFNGLBLENDEQUATIONSEPARATEIPROC BlendEquationSeparatei; + PFNGLBLENDEQUATIONIPROC BlendEquationi; PFNGLBLENDFUNCPROC BlendFunc; PFNGLBLENDFUNCSEPARATEPROC BlendFuncSeparate; + PFNGLBLENDFUNCSEPARATEIPROC BlendFuncSeparatei; + PFNGLBLENDFUNCIPROC BlendFunci; PFNGLBLITFRAMEBUFFERPROC BlitFramebuffer; PFNGLBUFFERDATAPROC BufferData; PFNGLBUFFERSUBDATAPROC BufferSubData; PFNGLCHECKFRAMEBUFFERSTATUSPROC CheckFramebufferStatus; PFNGLCLAMPCOLORPROC ClampColor; PFNGLCLEARPROC Clear; + PFNGLCLEARBUFFERDATAPROC ClearBufferData; + PFNGLCLEARBUFFERSUBDATAPROC ClearBufferSubData; PFNGLCLEARBUFFERFIPROC ClearBufferfi; PFNGLCLEARBUFFERFVPROC ClearBufferfv; PFNGLCLEARBUFFERIVPROC ClearBufferiv; PFNGLCLEARBUFFERUIVPROC ClearBufferuiv; PFNGLCLEARCOLORPROC ClearColor; PFNGLCLEARDEPTHPROC ClearDepth; + PFNGLCLEARDEPTHFPROC ClearDepthf; PFNGLCLEARSTENCILPROC ClearStencil; PFNGLCLIENTWAITSYNCPROC ClientWaitSync; PFNGLCOLORMASKPROC ColorMask; @@ -1482,6 +2179,7 @@ typedef struct GladGLContext { PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC CompressedTexSubImage2D; PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC CompressedTexSubImage3D; PFNGLCOPYBUFFERSUBDATAPROC CopyBufferSubData; + PFNGLCOPYIMAGESUBDATAPROC CopyImageSubData; PFNGLCOPYTEXIMAGE1DPROC CopyTexImage1D; PFNGLCOPYTEXIMAGE2DPROC CopyTexImage2D; PFNGLCOPYTEXSUBIMAGE1DPROC CopyTexSubImage1D; @@ -1489,44 +2187,66 @@ typedef struct GladGLContext { PFNGLCOPYTEXSUBIMAGE3DPROC CopyTexSubImage3D; PFNGLCREATEPROGRAMPROC CreateProgram; PFNGLCREATESHADERPROC CreateShader; + PFNGLCREATESHADERPROGRAMVPROC CreateShaderProgramv; PFNGLCULLFACEPROC CullFace; + PFNGLDEBUGMESSAGECALLBACKPROC DebugMessageCallback; + PFNGLDEBUGMESSAGECONTROLPROC DebugMessageControl; + PFNGLDEBUGMESSAGEINSERTPROC DebugMessageInsert; PFNGLDELETEBUFFERSPROC DeleteBuffers; PFNGLDELETEFRAMEBUFFERSPROC DeleteFramebuffers; PFNGLDELETEPROGRAMPROC DeleteProgram; + PFNGLDELETEPROGRAMPIPELINESPROC DeleteProgramPipelines; PFNGLDELETEQUERIESPROC DeleteQueries; PFNGLDELETERENDERBUFFERSPROC DeleteRenderbuffers; PFNGLDELETESAMPLERSPROC DeleteSamplers; PFNGLDELETESHADERPROC DeleteShader; PFNGLDELETESYNCPROC DeleteSync; PFNGLDELETETEXTURESPROC DeleteTextures; + PFNGLDELETETRANSFORMFEEDBACKSPROC DeleteTransformFeedbacks; PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays; PFNGLDEPTHFUNCPROC DepthFunc; PFNGLDEPTHMASKPROC DepthMask; PFNGLDEPTHRANGEPROC DepthRange; + PFNGLDEPTHRANGEARRAYVPROC DepthRangeArrayv; + PFNGLDEPTHRANGEINDEXEDPROC DepthRangeIndexed; + PFNGLDEPTHRANGEFPROC DepthRangef; PFNGLDETACHSHADERPROC DetachShader; PFNGLDISABLEPROC Disable; PFNGLDISABLEVERTEXATTRIBARRAYPROC DisableVertexAttribArray; PFNGLDISABLEIPROC Disablei; + PFNGLDISPATCHCOMPUTEPROC DispatchCompute; + PFNGLDISPATCHCOMPUTEINDIRECTPROC DispatchComputeIndirect; PFNGLDRAWARRAYSPROC DrawArrays; + PFNGLDRAWARRAYSINDIRECTPROC DrawArraysIndirect; PFNGLDRAWARRAYSINSTANCEDPROC DrawArraysInstanced; + PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC DrawArraysInstancedBaseInstance; PFNGLDRAWBUFFERPROC DrawBuffer; PFNGLDRAWBUFFERSPROC DrawBuffers; PFNGLDRAWELEMENTSPROC DrawElements; PFNGLDRAWELEMENTSBASEVERTEXPROC DrawElementsBaseVertex; + PFNGLDRAWELEMENTSINDIRECTPROC DrawElementsIndirect; PFNGLDRAWELEMENTSINSTANCEDPROC DrawElementsInstanced; + PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC DrawElementsInstancedBaseInstance; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC DrawElementsInstancedBaseVertex; + PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC DrawElementsInstancedBaseVertexBaseInstance; PFNGLDRAWRANGEELEMENTSPROC DrawRangeElements; PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC DrawRangeElementsBaseVertex; + PFNGLDRAWTRANSFORMFEEDBACKPROC DrawTransformFeedback; + PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC DrawTransformFeedbackInstanced; + PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC DrawTransformFeedbackStream; + PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC DrawTransformFeedbackStreamInstanced; PFNGLENABLEPROC Enable; PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray; PFNGLENABLEIPROC Enablei; PFNGLENDCONDITIONALRENDERPROC EndConditionalRender; PFNGLENDQUERYPROC EndQuery; + PFNGLENDQUERYINDEXEDPROC EndQueryIndexed; PFNGLENDTRANSFORMFEEDBACKPROC EndTransformFeedback; PFNGLFENCESYNCPROC FenceSync; PFNGLFINISHPROC Finish; PFNGLFLUSHPROC Flush; PFNGLFLUSHMAPPEDBUFFERRANGEPROC FlushMappedBufferRange; + PFNGLFRAMEBUFFERPARAMETERIPROC FramebufferParameteri; PFNGLFRAMEBUFFERRENDERBUFFERPROC FramebufferRenderbuffer; PFNGLFRAMEBUFFERTEXTUREPROC FramebufferTexture; PFNGLFRAMEBUFFERTEXTURE1DPROC FramebufferTexture1D; @@ -1536,13 +2256,19 @@ typedef struct GladGLContext { PFNGLFRONTFACEPROC FrontFace; PFNGLGENBUFFERSPROC GenBuffers; PFNGLGENFRAMEBUFFERSPROC GenFramebuffers; + PFNGLGENPROGRAMPIPELINESPROC GenProgramPipelines; PFNGLGENQUERIESPROC GenQueries; PFNGLGENRENDERBUFFERSPROC GenRenderbuffers; PFNGLGENSAMPLERSPROC GenSamplers; PFNGLGENTEXTURESPROC GenTextures; + PFNGLGENTRANSFORMFEEDBACKSPROC GenTransformFeedbacks; PFNGLGENVERTEXARRAYSPROC GenVertexArrays; PFNGLGENERATEMIPMAPPROC GenerateMipmap; + PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC GetActiveAtomicCounterBufferiv; PFNGLGETACTIVEATTRIBPROC GetActiveAttrib; + PFNGLGETACTIVESUBROUTINENAMEPROC GetActiveSubroutineName; + PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC GetActiveSubroutineUniformName; + PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC GetActiveSubroutineUniformiv; PFNGLGETACTIVEUNIFORMPROC GetActiveUniform; PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC GetActiveUniformBlockName; PFNGLGETACTIVEUNIFORMBLOCKIVPROC GetActiveUniformBlockiv; @@ -1557,19 +2283,39 @@ typedef struct GladGLContext { PFNGLGETBUFFERPOINTERVPROC GetBufferPointerv; PFNGLGETBUFFERSUBDATAPROC GetBufferSubData; PFNGLGETCOMPRESSEDTEXIMAGEPROC GetCompressedTexImage; + PFNGLGETDEBUGMESSAGELOGPROC GetDebugMessageLog; + PFNGLGETDOUBLEI_VPROC GetDoublei_v; PFNGLGETDOUBLEVPROC GetDoublev; PFNGLGETERRORPROC GetError; + PFNGLGETFLOATI_VPROC GetFloati_v; PFNGLGETFLOATVPROC GetFloatv; PFNGLGETFRAGDATAINDEXPROC GetFragDataIndex; PFNGLGETFRAGDATALOCATIONPROC GetFragDataLocation; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC GetFramebufferAttachmentParameteriv; + PFNGLGETFRAMEBUFFERPARAMETERIVPROC GetFramebufferParameteriv; PFNGLGETINTEGER64I_VPROC GetInteger64i_v; PFNGLGETINTEGER64VPROC GetInteger64v; PFNGLGETINTEGERI_VPROC GetIntegeri_v; PFNGLGETINTEGERVPROC GetIntegerv; + PFNGLGETINTERNALFORMATI64VPROC GetInternalformati64v; + PFNGLGETINTERNALFORMATIVPROC GetInternalformativ; PFNGLGETMULTISAMPLEFVPROC GetMultisamplefv; + PFNGLGETOBJECTLABELPROC GetObjectLabel; + PFNGLGETOBJECTPTRLABELPROC GetObjectPtrLabel; + PFNGLGETPOINTERVPROC GetPointerv; + PFNGLGETPROGRAMBINARYPROC GetProgramBinary; PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog; + PFNGLGETPROGRAMINTERFACEIVPROC GetProgramInterfaceiv; + PFNGLGETPROGRAMPIPELINEINFOLOGPROC GetProgramPipelineInfoLog; + PFNGLGETPROGRAMPIPELINEIVPROC GetProgramPipelineiv; + PFNGLGETPROGRAMRESOURCEINDEXPROC GetProgramResourceIndex; + PFNGLGETPROGRAMRESOURCELOCATIONPROC GetProgramResourceLocation; + PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC GetProgramResourceLocationIndex; + PFNGLGETPROGRAMRESOURCENAMEPROC GetProgramResourceName; + PFNGLGETPROGRAMRESOURCEIVPROC GetProgramResourceiv; + PFNGLGETPROGRAMSTAGEIVPROC GetProgramStageiv; PFNGLGETPROGRAMIVPROC GetProgramiv; + PFNGLGETQUERYINDEXEDIVPROC GetQueryIndexediv; PFNGLGETQUERYOBJECTI64VPROC GetQueryObjecti64v; PFNGLGETQUERYOBJECTIVPROC GetQueryObjectiv; PFNGLGETQUERYOBJECTUI64VPROC GetQueryObjectui64v; @@ -1581,10 +2327,13 @@ typedef struct GladGLContext { PFNGLGETSAMPLERPARAMETERFVPROC GetSamplerParameterfv; PFNGLGETSAMPLERPARAMETERIVPROC GetSamplerParameteriv; PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog; + PFNGLGETSHADERPRECISIONFORMATPROC GetShaderPrecisionFormat; PFNGLGETSHADERSOURCEPROC GetShaderSource; PFNGLGETSHADERIVPROC GetShaderiv; PFNGLGETSTRINGPROC GetString; PFNGLGETSTRINGIPROC GetStringi; + PFNGLGETSUBROUTINEINDEXPROC GetSubroutineIndex; + PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC GetSubroutineUniformLocation; PFNGLGETSYNCIVPROC GetSynciv; PFNGLGETTEXIMAGEPROC GetTexImage; PFNGLGETTEXLEVELPARAMETERFVPROC GetTexLevelParameterfv; @@ -1597,36 +2346,56 @@ typedef struct GladGLContext { PFNGLGETUNIFORMBLOCKINDEXPROC GetUniformBlockIndex; PFNGLGETUNIFORMINDICESPROC GetUniformIndices; PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation; + PFNGLGETUNIFORMSUBROUTINEUIVPROC GetUniformSubroutineuiv; + PFNGLGETUNIFORMDVPROC GetUniformdv; PFNGLGETUNIFORMFVPROC GetUniformfv; PFNGLGETUNIFORMIVPROC GetUniformiv; PFNGLGETUNIFORMUIVPROC GetUniformuiv; PFNGLGETVERTEXATTRIBIIVPROC GetVertexAttribIiv; PFNGLGETVERTEXATTRIBIUIVPROC GetVertexAttribIuiv; + PFNGLGETVERTEXATTRIBLDVPROC GetVertexAttribLdv; PFNGLGETVERTEXATTRIBPOINTERVPROC GetVertexAttribPointerv; PFNGLGETVERTEXATTRIBDVPROC GetVertexAttribdv; PFNGLGETVERTEXATTRIBFVPROC GetVertexAttribfv; PFNGLGETVERTEXATTRIBIVPROC GetVertexAttribiv; PFNGLHINTPROC Hint; + PFNGLINVALIDATEBUFFERDATAPROC InvalidateBufferData; + PFNGLINVALIDATEBUFFERSUBDATAPROC InvalidateBufferSubData; + PFNGLINVALIDATEFRAMEBUFFERPROC InvalidateFramebuffer; + PFNGLINVALIDATESUBFRAMEBUFFERPROC InvalidateSubFramebuffer; + PFNGLINVALIDATETEXIMAGEPROC InvalidateTexImage; + PFNGLINVALIDATETEXSUBIMAGEPROC InvalidateTexSubImage; PFNGLISBUFFERPROC IsBuffer; PFNGLISENABLEDPROC IsEnabled; PFNGLISENABLEDIPROC IsEnabledi; PFNGLISFRAMEBUFFERPROC IsFramebuffer; PFNGLISPROGRAMPROC IsProgram; + PFNGLISPROGRAMPIPELINEPROC IsProgramPipeline; PFNGLISQUERYPROC IsQuery; PFNGLISRENDERBUFFERPROC IsRenderbuffer; PFNGLISSAMPLERPROC IsSampler; PFNGLISSHADERPROC IsShader; PFNGLISSYNCPROC IsSync; PFNGLISTEXTUREPROC IsTexture; + PFNGLISTRANSFORMFEEDBACKPROC IsTransformFeedback; PFNGLISVERTEXARRAYPROC IsVertexArray; PFNGLLINEWIDTHPROC LineWidth; PFNGLLINKPROGRAMPROC LinkProgram; PFNGLLOGICOPPROC LogicOp; PFNGLMAPBUFFERPROC MapBuffer; PFNGLMAPBUFFERRANGEPROC MapBufferRange; + PFNGLMEMORYBARRIERPROC MemoryBarrier; + PFNGLMINSAMPLESHADINGPROC MinSampleShading; PFNGLMULTIDRAWARRAYSPROC MultiDrawArrays; + PFNGLMULTIDRAWARRAYSINDIRECTPROC MultiDrawArraysIndirect; PFNGLMULTIDRAWELEMENTSPROC MultiDrawElements; PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC MultiDrawElementsBaseVertex; + PFNGLMULTIDRAWELEMENTSINDIRECTPROC MultiDrawElementsIndirect; + PFNGLOBJECTLABELPROC ObjectLabel; + PFNGLOBJECTPTRLABELPROC ObjectPtrLabel; + PFNGLPATCHPARAMETERFVPROC PatchParameterfv; + PFNGLPATCHPARAMETERIPROC PatchParameteri; + PFNGLPAUSETRANSFORMFEEDBACKPROC PauseTransformFeedback; PFNGLPIXELSTOREFPROC PixelStoref; PFNGLPIXELSTOREIPROC PixelStorei; PFNGLPOINTPARAMETERFPROC PointParameterf; @@ -1636,13 +2405,69 @@ typedef struct GladGLContext { PFNGLPOINTSIZEPROC PointSize; PFNGLPOLYGONMODEPROC PolygonMode; PFNGLPOLYGONOFFSETPROC PolygonOffset; + PFNGLPOPDEBUGGROUPPROC PopDebugGroup; PFNGLPRIMITIVERESTARTINDEXPROC PrimitiveRestartIndex; + PFNGLPROGRAMBINARYPROC ProgramBinary; + PFNGLPROGRAMPARAMETERIPROC ProgramParameteri; + PFNGLPROGRAMUNIFORM1DPROC ProgramUniform1d; + PFNGLPROGRAMUNIFORM1DVPROC ProgramUniform1dv; + PFNGLPROGRAMUNIFORM1FPROC ProgramUniform1f; + PFNGLPROGRAMUNIFORM1FVPROC ProgramUniform1fv; + PFNGLPROGRAMUNIFORM1IPROC ProgramUniform1i; + PFNGLPROGRAMUNIFORM1IVPROC ProgramUniform1iv; + PFNGLPROGRAMUNIFORM1UIPROC ProgramUniform1ui; + PFNGLPROGRAMUNIFORM1UIVPROC ProgramUniform1uiv; + PFNGLPROGRAMUNIFORM2DPROC ProgramUniform2d; + PFNGLPROGRAMUNIFORM2DVPROC ProgramUniform2dv; + PFNGLPROGRAMUNIFORM2FPROC ProgramUniform2f; + PFNGLPROGRAMUNIFORM2FVPROC ProgramUniform2fv; + PFNGLPROGRAMUNIFORM2IPROC ProgramUniform2i; + PFNGLPROGRAMUNIFORM2IVPROC ProgramUniform2iv; + PFNGLPROGRAMUNIFORM2UIPROC ProgramUniform2ui; + PFNGLPROGRAMUNIFORM2UIVPROC ProgramUniform2uiv; + PFNGLPROGRAMUNIFORM3DPROC ProgramUniform3d; + PFNGLPROGRAMUNIFORM3DVPROC ProgramUniform3dv; + PFNGLPROGRAMUNIFORM3FPROC ProgramUniform3f; + PFNGLPROGRAMUNIFORM3FVPROC ProgramUniform3fv; + PFNGLPROGRAMUNIFORM3IPROC ProgramUniform3i; + PFNGLPROGRAMUNIFORM3IVPROC ProgramUniform3iv; + PFNGLPROGRAMUNIFORM3UIPROC ProgramUniform3ui; + PFNGLPROGRAMUNIFORM3UIVPROC ProgramUniform3uiv; + PFNGLPROGRAMUNIFORM4DPROC ProgramUniform4d; + PFNGLPROGRAMUNIFORM4DVPROC ProgramUniform4dv; + PFNGLPROGRAMUNIFORM4FPROC ProgramUniform4f; + PFNGLPROGRAMUNIFORM4FVPROC ProgramUniform4fv; + PFNGLPROGRAMUNIFORM4IPROC ProgramUniform4i; + PFNGLPROGRAMUNIFORM4IVPROC ProgramUniform4iv; + PFNGLPROGRAMUNIFORM4UIPROC ProgramUniform4ui; + PFNGLPROGRAMUNIFORM4UIVPROC ProgramUniform4uiv; + PFNGLPROGRAMUNIFORMMATRIX2DVPROC ProgramUniformMatrix2dv; + PFNGLPROGRAMUNIFORMMATRIX2FVPROC ProgramUniformMatrix2fv; + PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC ProgramUniformMatrix2x3dv; + PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC ProgramUniformMatrix2x3fv; + PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC ProgramUniformMatrix2x4dv; + PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC ProgramUniformMatrix2x4fv; + PFNGLPROGRAMUNIFORMMATRIX3DVPROC ProgramUniformMatrix3dv; + PFNGLPROGRAMUNIFORMMATRIX3FVPROC ProgramUniformMatrix3fv; + PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC ProgramUniformMatrix3x2dv; + PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC ProgramUniformMatrix3x2fv; + PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC ProgramUniformMatrix3x4dv; + PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC ProgramUniformMatrix3x4fv; + PFNGLPROGRAMUNIFORMMATRIX4DVPROC ProgramUniformMatrix4dv; + PFNGLPROGRAMUNIFORMMATRIX4FVPROC ProgramUniformMatrix4fv; + PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC ProgramUniformMatrix4x2dv; + PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC ProgramUniformMatrix4x2fv; + PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC ProgramUniformMatrix4x3dv; + PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC ProgramUniformMatrix4x3fv; PFNGLPROVOKINGVERTEXPROC ProvokingVertex; + PFNGLPUSHDEBUGGROUPPROC PushDebugGroup; PFNGLQUERYCOUNTERPROC QueryCounter; PFNGLREADBUFFERPROC ReadBuffer; PFNGLREADPIXELSPROC ReadPixels; + PFNGLRELEASESHADERCOMPILERPROC ReleaseShaderCompiler; PFNGLRENDERBUFFERSTORAGEPROC RenderbufferStorage; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC RenderbufferStorageMultisample; + PFNGLRESUMETRANSFORMFEEDBACKPROC ResumeTransformFeedback; PFNGLSAMPLECOVERAGEPROC SampleCoverage; PFNGLSAMPLEMASKIPROC SampleMaski; PFNGLSAMPLERPARAMETERIIVPROC SamplerParameterIiv; @@ -1652,7 +2477,12 @@ typedef struct GladGLContext { PFNGLSAMPLERPARAMETERIPROC SamplerParameteri; PFNGLSAMPLERPARAMETERIVPROC SamplerParameteriv; PFNGLSCISSORPROC Scissor; + PFNGLSCISSORARRAYVPROC ScissorArrayv; + PFNGLSCISSORINDEXEDPROC ScissorIndexed; + PFNGLSCISSORINDEXEDVPROC ScissorIndexedv; + PFNGLSHADERBINARYPROC ShaderBinary; PFNGLSHADERSOURCEPROC ShaderSource; + PFNGLSHADERSTORAGEBLOCKBINDINGPROC ShaderStorageBlockBinding; PFNGLSTENCILFUNCPROC StencilFunc; PFNGLSTENCILFUNCSEPARATEPROC StencilFuncSeparate; PFNGLSTENCILMASKPROC StencilMask; @@ -1660,6 +2490,7 @@ typedef struct GladGLContext { PFNGLSTENCILOPPROC StencilOp; PFNGLSTENCILOPSEPARATEPROC StencilOpSeparate; PFNGLTEXBUFFERPROC TexBuffer; + PFNGLTEXBUFFERRANGEPROC TexBufferRange; PFNGLTEXIMAGE1DPROC TexImage1D; PFNGLTEXIMAGE2DPROC TexImage2D; PFNGLTEXIMAGE2DMULTISAMPLEPROC TexImage2DMultisample; @@ -1671,28 +2502,42 @@ typedef struct GladGLContext { PFNGLTEXPARAMETERFVPROC TexParameterfv; PFNGLTEXPARAMETERIPROC TexParameteri; PFNGLTEXPARAMETERIVPROC TexParameteriv; + PFNGLTEXSTORAGE1DPROC TexStorage1D; + PFNGLTEXSTORAGE2DPROC TexStorage2D; + PFNGLTEXSTORAGE2DMULTISAMPLEPROC TexStorage2DMultisample; + PFNGLTEXSTORAGE3DPROC TexStorage3D; + PFNGLTEXSTORAGE3DMULTISAMPLEPROC TexStorage3DMultisample; PFNGLTEXSUBIMAGE1DPROC TexSubImage1D; PFNGLTEXSUBIMAGE2DPROC TexSubImage2D; PFNGLTEXSUBIMAGE3DPROC TexSubImage3D; + PFNGLTEXTUREVIEWPROC TextureView; PFNGLTRANSFORMFEEDBACKVARYINGSPROC TransformFeedbackVaryings; + PFNGLUNIFORM1DPROC Uniform1d; + PFNGLUNIFORM1DVPROC Uniform1dv; PFNGLUNIFORM1FPROC Uniform1f; PFNGLUNIFORM1FVPROC Uniform1fv; PFNGLUNIFORM1IPROC Uniform1i; PFNGLUNIFORM1IVPROC Uniform1iv; PFNGLUNIFORM1UIPROC Uniform1ui; PFNGLUNIFORM1UIVPROC Uniform1uiv; + PFNGLUNIFORM2DPROC Uniform2d; + PFNGLUNIFORM2DVPROC Uniform2dv; PFNGLUNIFORM2FPROC Uniform2f; PFNGLUNIFORM2FVPROC Uniform2fv; PFNGLUNIFORM2IPROC Uniform2i; PFNGLUNIFORM2IVPROC Uniform2iv; PFNGLUNIFORM2UIPROC Uniform2ui; PFNGLUNIFORM2UIVPROC Uniform2uiv; + PFNGLUNIFORM3DPROC Uniform3d; + PFNGLUNIFORM3DVPROC Uniform3dv; PFNGLUNIFORM3FPROC Uniform3f; PFNGLUNIFORM3FVPROC Uniform3fv; PFNGLUNIFORM3IPROC Uniform3i; PFNGLUNIFORM3IVPROC Uniform3iv; PFNGLUNIFORM3UIPROC Uniform3ui; PFNGLUNIFORM3UIVPROC Uniform3uiv; + PFNGLUNIFORM4DPROC Uniform4d; + PFNGLUNIFORM4DVPROC Uniform4dv; PFNGLUNIFORM4FPROC Uniform4f; PFNGLUNIFORM4FVPROC Uniform4fv; PFNGLUNIFORM4IPROC Uniform4i; @@ -1700,18 +2545,30 @@ typedef struct GladGLContext { PFNGLUNIFORM4UIPROC Uniform4ui; PFNGLUNIFORM4UIVPROC Uniform4uiv; PFNGLUNIFORMBLOCKBINDINGPROC UniformBlockBinding; + PFNGLUNIFORMMATRIX2DVPROC UniformMatrix2dv; PFNGLUNIFORMMATRIX2FVPROC UniformMatrix2fv; + PFNGLUNIFORMMATRIX2X3DVPROC UniformMatrix2x3dv; PFNGLUNIFORMMATRIX2X3FVPROC UniformMatrix2x3fv; + PFNGLUNIFORMMATRIX2X4DVPROC UniformMatrix2x4dv; PFNGLUNIFORMMATRIX2X4FVPROC UniformMatrix2x4fv; + PFNGLUNIFORMMATRIX3DVPROC UniformMatrix3dv; PFNGLUNIFORMMATRIX3FVPROC UniformMatrix3fv; + PFNGLUNIFORMMATRIX3X2DVPROC UniformMatrix3x2dv; PFNGLUNIFORMMATRIX3X2FVPROC UniformMatrix3x2fv; + PFNGLUNIFORMMATRIX3X4DVPROC UniformMatrix3x4dv; PFNGLUNIFORMMATRIX3X4FVPROC UniformMatrix3x4fv; + PFNGLUNIFORMMATRIX4DVPROC UniformMatrix4dv; PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv; + PFNGLUNIFORMMATRIX4X2DVPROC UniformMatrix4x2dv; PFNGLUNIFORMMATRIX4X2FVPROC UniformMatrix4x2fv; + PFNGLUNIFORMMATRIX4X3DVPROC UniformMatrix4x3dv; PFNGLUNIFORMMATRIX4X3FVPROC UniformMatrix4x3fv; + PFNGLUNIFORMSUBROUTINESUIVPROC UniformSubroutinesuiv; PFNGLUNMAPBUFFERPROC UnmapBuffer; PFNGLUSEPROGRAMPROC UseProgram; + PFNGLUSEPROGRAMSTAGESPROC UseProgramStages; PFNGLVALIDATEPROGRAMPROC ValidateProgram; + PFNGLVALIDATEPROGRAMPIPELINEPROC ValidateProgramPipeline; PFNGLVERTEXATTRIB1DPROC VertexAttrib1d; PFNGLVERTEXATTRIB1DVPROC VertexAttrib1dv; PFNGLVERTEXATTRIB1FPROC VertexAttrib1f; @@ -1748,7 +2605,9 @@ typedef struct GladGLContext { PFNGLVERTEXATTRIB4UBVPROC VertexAttrib4ubv; PFNGLVERTEXATTRIB4UIVPROC VertexAttrib4uiv; PFNGLVERTEXATTRIB4USVPROC VertexAttrib4usv; + PFNGLVERTEXATTRIBBINDINGPROC VertexAttribBinding; PFNGLVERTEXATTRIBDIVISORPROC VertexAttribDivisor; + PFNGLVERTEXATTRIBFORMATPROC VertexAttribFormat; PFNGLVERTEXATTRIBI1IPROC VertexAttribI1i; PFNGLVERTEXATTRIBI1IVPROC VertexAttribI1iv; PFNGLVERTEXATTRIBI1UIPROC VertexAttribI1ui; @@ -1769,7 +2628,18 @@ typedef struct GladGLContext { PFNGLVERTEXATTRIBI4UIPROC VertexAttribI4ui; PFNGLVERTEXATTRIBI4UIVPROC VertexAttribI4uiv; PFNGLVERTEXATTRIBI4USVPROC VertexAttribI4usv; + PFNGLVERTEXATTRIBIFORMATPROC VertexAttribIFormat; PFNGLVERTEXATTRIBIPOINTERPROC VertexAttribIPointer; + PFNGLVERTEXATTRIBL1DPROC VertexAttribL1d; + PFNGLVERTEXATTRIBL1DVPROC VertexAttribL1dv; + PFNGLVERTEXATTRIBL2DPROC VertexAttribL2d; + PFNGLVERTEXATTRIBL2DVPROC VertexAttribL2dv; + PFNGLVERTEXATTRIBL3DPROC VertexAttribL3d; + PFNGLVERTEXATTRIBL3DVPROC VertexAttribL3dv; + PFNGLVERTEXATTRIBL4DPROC VertexAttribL4d; + PFNGLVERTEXATTRIBL4DVPROC VertexAttribL4dv; + PFNGLVERTEXATTRIBLFORMATPROC VertexAttribLFormat; + PFNGLVERTEXATTRIBLPOINTERPROC VertexAttribLPointer; PFNGLVERTEXATTRIBP1UIPROC VertexAttribP1ui; PFNGLVERTEXATTRIBP1UIVPROC VertexAttribP1uiv; PFNGLVERTEXATTRIBP2UIPROC VertexAttribP2ui; @@ -1779,7 +2649,11 @@ typedef struct GladGLContext { PFNGLVERTEXATTRIBP4UIPROC VertexAttribP4ui; PFNGLVERTEXATTRIBP4UIVPROC VertexAttribP4uiv; PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer; + PFNGLVERTEXBINDINGDIVISORPROC VertexBindingDivisor; PFNGLVIEWPORTPROC Viewport; + PFNGLVIEWPORTARRAYVPROC ViewportArrayv; + PFNGLVIEWPORTINDEXEDFPROC ViewportIndexedf; + PFNGLVIEWPORTINDEXEDFVPROC ViewportIndexedfv; PFNGLWAITSYNCPROC WaitSync; void* glad_loader_handle; diff --git a/vendor/glad/include/glad/glad.h b/vendor/glad/include/glad/glad.h deleted file mode 100644 index f70d5b73f..000000000 --- a/vendor/glad/include/glad/glad.h +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/vendor/glad/src/gl.c b/vendor/glad/src/gl.c index ad49f387a..3eaf35450 100644 --- a/vendor/glad/src/gl.c +++ b/vendor/glad/src/gl.c @@ -90,6 +90,7 @@ static void glad_gl_load_GL_VERSION_1_1(GladGLContext *context, GLADuserptrloadf context->DrawArrays = (PFNGLDRAWARRAYSPROC) load(userptr, "glDrawArrays"); context->DrawElements = (PFNGLDRAWELEMENTSPROC) load(userptr, "glDrawElements"); context->GenTextures = (PFNGLGENTEXTURESPROC) load(userptr, "glGenTextures"); + context->GetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); context->IsTexture = (PFNGLISTEXTUREPROC) load(userptr, "glIsTexture"); context->PolygonOffset = (PFNGLPOLYGONOFFSETPROC) load(userptr, "glPolygonOffset"); context->TexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC) load(userptr, "glTexSubImage1D"); @@ -411,39 +412,229 @@ static void glad_gl_load_GL_VERSION_3_3(GladGLContext *context, GLADuserptrloadf context->VertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC) load(userptr, "glVertexAttribP4ui"); context->VertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC) load(userptr, "glVertexAttribP4uiv"); } +static void glad_gl_load_GL_VERSION_4_0(GladGLContext *context, GLADuserptrloadfunc load, void* userptr) { + if(!context->VERSION_4_0) return; + context->BeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC) load(userptr, "glBeginQueryIndexed"); + context->BindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC) load(userptr, "glBindTransformFeedback"); + context->BlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC) load(userptr, "glBlendEquationSeparatei"); + context->BlendEquationi = (PFNGLBLENDEQUATIONIPROC) load(userptr, "glBlendEquationi"); + context->BlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC) load(userptr, "glBlendFuncSeparatei"); + context->BlendFunci = (PFNGLBLENDFUNCIPROC) load(userptr, "glBlendFunci"); + context->DeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC) load(userptr, "glDeleteTransformFeedbacks"); + context->DrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC) load(userptr, "glDrawArraysIndirect"); + context->DrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC) load(userptr, "glDrawElementsIndirect"); + context->DrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC) load(userptr, "glDrawTransformFeedback"); + context->DrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) load(userptr, "glDrawTransformFeedbackStream"); + context->EndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC) load(userptr, "glEndQueryIndexed"); + context->GenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC) load(userptr, "glGenTransformFeedbacks"); + context->GetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC) load(userptr, "glGetActiveSubroutineName"); + context->GetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) load(userptr, "glGetActiveSubroutineUniformName"); + context->GetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) load(userptr, "glGetActiveSubroutineUniformiv"); + context->GetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC) load(userptr, "glGetProgramStageiv"); + context->GetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC) load(userptr, "glGetQueryIndexediv"); + context->GetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC) load(userptr, "glGetSubroutineIndex"); + context->GetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) load(userptr, "glGetSubroutineUniformLocation"); + context->GetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC) load(userptr, "glGetUniformSubroutineuiv"); + context->GetUniformdv = (PFNGLGETUNIFORMDVPROC) load(userptr, "glGetUniformdv"); + context->IsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC) load(userptr, "glIsTransformFeedback"); + context->MinSampleShading = (PFNGLMINSAMPLESHADINGPROC) load(userptr, "glMinSampleShading"); + context->PatchParameterfv = (PFNGLPATCHPARAMETERFVPROC) load(userptr, "glPatchParameterfv"); + context->PatchParameteri = (PFNGLPATCHPARAMETERIPROC) load(userptr, "glPatchParameteri"); + context->PauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC) load(userptr, "glPauseTransformFeedback"); + context->ResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC) load(userptr, "glResumeTransformFeedback"); + context->Uniform1d = (PFNGLUNIFORM1DPROC) load(userptr, "glUniform1d"); + context->Uniform1dv = (PFNGLUNIFORM1DVPROC) load(userptr, "glUniform1dv"); + context->Uniform2d = (PFNGLUNIFORM2DPROC) load(userptr, "glUniform2d"); + context->Uniform2dv = (PFNGLUNIFORM2DVPROC) load(userptr, "glUniform2dv"); + context->Uniform3d = (PFNGLUNIFORM3DPROC) load(userptr, "glUniform3d"); + context->Uniform3dv = (PFNGLUNIFORM3DVPROC) load(userptr, "glUniform3dv"); + context->Uniform4d = (PFNGLUNIFORM4DPROC) load(userptr, "glUniform4d"); + context->Uniform4dv = (PFNGLUNIFORM4DVPROC) load(userptr, "glUniform4dv"); + context->UniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC) load(userptr, "glUniformMatrix2dv"); + context->UniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC) load(userptr, "glUniformMatrix2x3dv"); + context->UniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC) load(userptr, "glUniformMatrix2x4dv"); + context->UniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC) load(userptr, "glUniformMatrix3dv"); + context->UniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC) load(userptr, "glUniformMatrix3x2dv"); + context->UniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC) load(userptr, "glUniformMatrix3x4dv"); + context->UniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC) load(userptr, "glUniformMatrix4dv"); + context->UniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC) load(userptr, "glUniformMatrix4x2dv"); + context->UniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC) load(userptr, "glUniformMatrix4x3dv"); + context->UniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC) load(userptr, "glUniformSubroutinesuiv"); +} +static void glad_gl_load_GL_VERSION_4_1(GladGLContext *context, GLADuserptrloadfunc load, void* userptr) { + if(!context->VERSION_4_1) return; + context->ActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC) load(userptr, "glActiveShaderProgram"); + context->BindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC) load(userptr, "glBindProgramPipeline"); + context->ClearDepthf = (PFNGLCLEARDEPTHFPROC) load(userptr, "glClearDepthf"); + context->CreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC) load(userptr, "glCreateShaderProgramv"); + context->DeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC) load(userptr, "glDeleteProgramPipelines"); + context->DepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC) load(userptr, "glDepthRangeArrayv"); + context->DepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC) load(userptr, "glDepthRangeIndexed"); + context->DepthRangef = (PFNGLDEPTHRANGEFPROC) load(userptr, "glDepthRangef"); + context->GenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC) load(userptr, "glGenProgramPipelines"); + context->GetDoublei_v = (PFNGLGETDOUBLEI_VPROC) load(userptr, "glGetDoublei_v"); + context->GetFloati_v = (PFNGLGETFLOATI_VPROC) load(userptr, "glGetFloati_v"); + context->GetProgramBinary = (PFNGLGETPROGRAMBINARYPROC) load(userptr, "glGetProgramBinary"); + context->GetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC) load(userptr, "glGetProgramPipelineInfoLog"); + context->GetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC) load(userptr, "glGetProgramPipelineiv"); + context->GetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC) load(userptr, "glGetShaderPrecisionFormat"); + context->GetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC) load(userptr, "glGetVertexAttribLdv"); + context->IsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC) load(userptr, "glIsProgramPipeline"); + context->ProgramBinary = (PFNGLPROGRAMBINARYPROC) load(userptr, "glProgramBinary"); + context->ProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC) load(userptr, "glProgramParameteri"); + context->ProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC) load(userptr, "glProgramUniform1d"); + context->ProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC) load(userptr, "glProgramUniform1dv"); + context->ProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC) load(userptr, "glProgramUniform1f"); + context->ProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC) load(userptr, "glProgramUniform1fv"); + context->ProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC) load(userptr, "glProgramUniform1i"); + context->ProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC) load(userptr, "glProgramUniform1iv"); + context->ProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC) load(userptr, "glProgramUniform1ui"); + context->ProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC) load(userptr, "glProgramUniform1uiv"); + context->ProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC) load(userptr, "glProgramUniform2d"); + context->ProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC) load(userptr, "glProgramUniform2dv"); + context->ProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC) load(userptr, "glProgramUniform2f"); + context->ProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC) load(userptr, "glProgramUniform2fv"); + context->ProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC) load(userptr, "glProgramUniform2i"); + context->ProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC) load(userptr, "glProgramUniform2iv"); + context->ProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC) load(userptr, "glProgramUniform2ui"); + context->ProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC) load(userptr, "glProgramUniform2uiv"); + context->ProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC) load(userptr, "glProgramUniform3d"); + context->ProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC) load(userptr, "glProgramUniform3dv"); + context->ProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC) load(userptr, "glProgramUniform3f"); + context->ProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC) load(userptr, "glProgramUniform3fv"); + context->ProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC) load(userptr, "glProgramUniform3i"); + context->ProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC) load(userptr, "glProgramUniform3iv"); + context->ProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC) load(userptr, "glProgramUniform3ui"); + context->ProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC) load(userptr, "glProgramUniform3uiv"); + context->ProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC) load(userptr, "glProgramUniform4d"); + context->ProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC) load(userptr, "glProgramUniform4dv"); + context->ProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC) load(userptr, "glProgramUniform4f"); + context->ProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC) load(userptr, "glProgramUniform4fv"); + context->ProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC) load(userptr, "glProgramUniform4i"); + context->ProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC) load(userptr, "glProgramUniform4iv"); + context->ProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC) load(userptr, "glProgramUniform4ui"); + context->ProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC) load(userptr, "glProgramUniform4uiv"); + context->ProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC) load(userptr, "glProgramUniformMatrix2dv"); + context->ProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC) load(userptr, "glProgramUniformMatrix2fv"); + context->ProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) load(userptr, "glProgramUniformMatrix2x3dv"); + context->ProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) load(userptr, "glProgramUniformMatrix2x3fv"); + context->ProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) load(userptr, "glProgramUniformMatrix2x4dv"); + context->ProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) load(userptr, "glProgramUniformMatrix2x4fv"); + context->ProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC) load(userptr, "glProgramUniformMatrix3dv"); + context->ProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC) load(userptr, "glProgramUniformMatrix3fv"); + context->ProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) load(userptr, "glProgramUniformMatrix3x2dv"); + context->ProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) load(userptr, "glProgramUniformMatrix3x2fv"); + context->ProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) load(userptr, "glProgramUniformMatrix3x4dv"); + context->ProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) load(userptr, "glProgramUniformMatrix3x4fv"); + context->ProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC) load(userptr, "glProgramUniformMatrix4dv"); + context->ProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC) load(userptr, "glProgramUniformMatrix4fv"); + context->ProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) load(userptr, "glProgramUniformMatrix4x2dv"); + context->ProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) load(userptr, "glProgramUniformMatrix4x2fv"); + context->ProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) load(userptr, "glProgramUniformMatrix4x3dv"); + context->ProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) load(userptr, "glProgramUniformMatrix4x3fv"); + context->ReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC) load(userptr, "glReleaseShaderCompiler"); + context->ScissorArrayv = (PFNGLSCISSORARRAYVPROC) load(userptr, "glScissorArrayv"); + context->ScissorIndexed = (PFNGLSCISSORINDEXEDPROC) load(userptr, "glScissorIndexed"); + context->ScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC) load(userptr, "glScissorIndexedv"); + context->ShaderBinary = (PFNGLSHADERBINARYPROC) load(userptr, "glShaderBinary"); + context->UseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC) load(userptr, "glUseProgramStages"); + context->ValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC) load(userptr, "glValidateProgramPipeline"); + context->VertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC) load(userptr, "glVertexAttribL1d"); + context->VertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC) load(userptr, "glVertexAttribL1dv"); + context->VertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC) load(userptr, "glVertexAttribL2d"); + context->VertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC) load(userptr, "glVertexAttribL2dv"); + context->VertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC) load(userptr, "glVertexAttribL3d"); + context->VertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC) load(userptr, "glVertexAttribL3dv"); + context->VertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC) load(userptr, "glVertexAttribL4d"); + context->VertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC) load(userptr, "glVertexAttribL4dv"); + context->VertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC) load(userptr, "glVertexAttribLPointer"); + context->ViewportArrayv = (PFNGLVIEWPORTARRAYVPROC) load(userptr, "glViewportArrayv"); + context->ViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC) load(userptr, "glViewportIndexedf"); + context->ViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC) load(userptr, "glViewportIndexedfv"); +} +static void glad_gl_load_GL_VERSION_4_2(GladGLContext *context, GLADuserptrloadfunc load, void* userptr) { + if(!context->VERSION_4_2) return; + context->BindImageTexture = (PFNGLBINDIMAGETEXTUREPROC) load(userptr, "glBindImageTexture"); + context->DrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawArraysInstancedBaseInstance"); + context->DrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseInstance"); + context->DrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) load(userptr, "glDrawElementsInstancedBaseVertexBaseInstance"); + context->DrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackInstanced"); + context->DrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) load(userptr, "glDrawTransformFeedbackStreamInstanced"); + context->GetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) load(userptr, "glGetActiveAtomicCounterBufferiv"); + context->GetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC) load(userptr, "glGetInternalformativ"); + context->MemoryBarrier = (PFNGLMEMORYBARRIERPROC) load(userptr, "glMemoryBarrier"); + context->TexStorage1D = (PFNGLTEXSTORAGE1DPROC) load(userptr, "glTexStorage1D"); + context->TexStorage2D = (PFNGLTEXSTORAGE2DPROC) load(userptr, "glTexStorage2D"); + context->TexStorage3D = (PFNGLTEXSTORAGE3DPROC) load(userptr, "glTexStorage3D"); +} +static void glad_gl_load_GL_VERSION_4_3(GladGLContext *context, GLADuserptrloadfunc load, void* userptr) { + if(!context->VERSION_4_3) return; + context->BindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC) load(userptr, "glBindVertexBuffer"); + context->ClearBufferData = (PFNGLCLEARBUFFERDATAPROC) load(userptr, "glClearBufferData"); + context->ClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC) load(userptr, "glClearBufferSubData"); + context->CopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC) load(userptr, "glCopyImageSubData"); + context->DebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC) load(userptr, "glDebugMessageCallback"); + context->DebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC) load(userptr, "glDebugMessageControl"); + context->DebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC) load(userptr, "glDebugMessageInsert"); + context->DispatchCompute = (PFNGLDISPATCHCOMPUTEPROC) load(userptr, "glDispatchCompute"); + context->DispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC) load(userptr, "glDispatchComputeIndirect"); + context->FramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC) load(userptr, "glFramebufferParameteri"); + context->GetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC) load(userptr, "glGetDebugMessageLog"); + context->GetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC) load(userptr, "glGetFramebufferParameteriv"); + context->GetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC) load(userptr, "glGetInternalformati64v"); + context->GetObjectLabel = (PFNGLGETOBJECTLABELPROC) load(userptr, "glGetObjectLabel"); + context->GetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC) load(userptr, "glGetObjectPtrLabel"); + context->GetPointerv = (PFNGLGETPOINTERVPROC) load(userptr, "glGetPointerv"); + context->GetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC) load(userptr, "glGetProgramInterfaceiv"); + context->GetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC) load(userptr, "glGetProgramResourceIndex"); + context->GetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC) load(userptr, "glGetProgramResourceLocation"); + context->GetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) load(userptr, "glGetProgramResourceLocationIndex"); + context->GetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC) load(userptr, "glGetProgramResourceName"); + context->GetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC) load(userptr, "glGetProgramResourceiv"); + context->InvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC) load(userptr, "glInvalidateBufferData"); + context->InvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC) load(userptr, "glInvalidateBufferSubData"); + context->InvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC) load(userptr, "glInvalidateFramebuffer"); + context->InvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC) load(userptr, "glInvalidateSubFramebuffer"); + context->InvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC) load(userptr, "glInvalidateTexImage"); + context->InvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC) load(userptr, "glInvalidateTexSubImage"); + context->MultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC) load(userptr, "glMultiDrawArraysIndirect"); + context->MultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC) load(userptr, "glMultiDrawElementsIndirect"); + context->ObjectLabel = (PFNGLOBJECTLABELPROC) load(userptr, "glObjectLabel"); + context->ObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC) load(userptr, "glObjectPtrLabel"); + context->PopDebugGroup = (PFNGLPOPDEBUGGROUPPROC) load(userptr, "glPopDebugGroup"); + context->PushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC) load(userptr, "glPushDebugGroup"); + context->ShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC) load(userptr, "glShaderStorageBlockBinding"); + context->TexBufferRange = (PFNGLTEXBUFFERRANGEPROC) load(userptr, "glTexBufferRange"); + context->TexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC) load(userptr, "glTexStorage2DMultisample"); + context->TexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC) load(userptr, "glTexStorage3DMultisample"); + context->TextureView = (PFNGLTEXTUREVIEWPROC) load(userptr, "glTextureView"); + context->VertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC) load(userptr, "glVertexAttribBinding"); + context->VertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC) load(userptr, "glVertexAttribFormat"); + context->VertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC) load(userptr, "glVertexAttribIFormat"); + context->VertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC) load(userptr, "glVertexAttribLFormat"); + context->VertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC) load(userptr, "glVertexBindingDivisor"); +} -#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) -#define GLAD_GL_IS_SOME_NEW_VERSION 1 -#else -#define GLAD_GL_IS_SOME_NEW_VERSION 0 -#endif - -static int glad_gl_get_extensions(GladGLContext *context, int version, const char **out_exts, unsigned int *out_num_exts_i, char ***out_exts_i) { -#if GLAD_GL_IS_SOME_NEW_VERSION - if(GLAD_VERSION_MAJOR(version) < 3) { -#else - GLAD_UNUSED(version); - GLAD_UNUSED(out_num_exts_i); - GLAD_UNUSED(out_exts_i); -#endif - if (context->GetString == NULL) { - return 0; +static void glad_gl_free_extensions(char **exts_i) { + if (exts_i != NULL) { + unsigned int index; + for(index = 0; exts_i[index]; index++) { + free((void *) (exts_i[index])); } - *out_exts = (const char *)context->GetString(GL_EXTENSIONS); -#if GLAD_GL_IS_SOME_NEW_VERSION - } else { + free((void *)exts_i); + exts_i = NULL; + } +} +static int glad_gl_get_extensions(GladGLContext *context, const char **out_exts, char ***out_exts_i) { +#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) + if (context->GetStringi != NULL && context->GetIntegerv != NULL) { unsigned int index = 0; unsigned int num_exts_i = 0; char **exts_i = NULL; - if (context->GetStringi == NULL || context->GetIntegerv == NULL) { - return 0; - } context->GetIntegerv(GL_NUM_EXTENSIONS, (int*) &num_exts_i); - if (num_exts_i > 0) { - exts_i = (char **) malloc(num_exts_i * (sizeof *exts_i)); - } + exts_i = (char **) malloc((num_exts_i + 1) * (sizeof *exts_i)); if (exts_i == NULL) { return 0; } @@ -452,31 +643,40 @@ static int glad_gl_get_extensions(GladGLContext *context, int version, const cha size_t len = strlen(gl_str_tmp) + 1; char *local_str = (char*) malloc(len * sizeof(char)); - if(local_str != NULL) { - memcpy(local_str, gl_str_tmp, len * sizeof(char)); + if(local_str == NULL) { + exts_i[index] = NULL; + glad_gl_free_extensions(exts_i); + return 0; } + memcpy(local_str, gl_str_tmp, len * sizeof(char)); exts_i[index] = local_str; } + exts_i[index] = NULL; - *out_num_exts_i = num_exts_i; *out_exts_i = exts_i; + + return 1; } +#else + GLAD_UNUSED(out_exts_i); #endif + if (context->GetString == NULL) { + return 0; + } + *out_exts = (const char *)context->GetString(GL_EXTENSIONS); return 1; } -static void glad_gl_free_extensions(char **exts_i, unsigned int num_exts_i) { - if (exts_i != NULL) { +static int glad_gl_has_extension(const char *exts, char **exts_i, const char *ext) { + if(exts_i) { unsigned int index; - for(index = 0; index < num_exts_i; index++) { - free((void *) (exts_i[index])); + for(index = 0; exts_i[index]; index++) { + const char *e = exts_i[index]; + if(strcmp(e, ext) == 0) { + return 1; + } } - free((void *)exts_i); - exts_i = NULL; - } -} -static int glad_gl_has_extension(int version, const char *exts, unsigned int num_exts_i, char **exts_i, const char *ext) { - if(GLAD_VERSION_MAJOR(version) < 3 || !GLAD_GL_IS_SOME_NEW_VERSION) { + } else { const char *extensions; const char *loc; const char *terminator; @@ -496,14 +696,6 @@ static int glad_gl_has_extension(int version, const char *exts, unsigned int num } extensions = terminator; } - } else { - unsigned int index; - for(index = 0; index < num_exts_i; index++) { - const char *e = exts_i[index]; - if(strcmp(e, ext) == 0) { - return 1; - } - } } return 0; } @@ -512,15 +704,14 @@ static GLADapiproc glad_gl_get_proc_from_userptr(void *userptr, const char* name return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); } -static int glad_gl_find_extensions_gl(GladGLContext *context, int version) { +static int glad_gl_find_extensions_gl(GladGLContext *context) { const char *exts = NULL; - unsigned int num_exts_i = 0; char **exts_i = NULL; - if (!glad_gl_get_extensions(context, version, &exts, &num_exts_i, &exts_i)) return 0; + if (!glad_gl_get_extensions(context, &exts, &exts_i)) return 0; - GLAD_UNUSED(glad_gl_has_extension); + GLAD_UNUSED(&glad_gl_has_extension); - glad_gl_free_extensions(exts_i, num_exts_i); + glad_gl_free_extensions(exts_i); return 1; } @@ -561,6 +752,10 @@ static int glad_gl_find_core_gl(GladGLContext *context) { context->VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; context->VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; context->VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; + context->VERSION_4_0 = (major == 4 && minor >= 0) || major > 4; + context->VERSION_4_1 = (major == 4 && minor >= 1) || major > 4; + context->VERSION_4_2 = (major == 4 && minor >= 2) || major > 4; + context->VERSION_4_3 = (major == 4 && minor >= 3) || major > 4; return GLAD_MAKE_VERSION(major, minor); } @@ -570,7 +765,6 @@ int gladLoadGLContextUserPtr(GladGLContext *context, GLADuserptrloadfunc load, v context->GetString = (PFNGLGETSTRINGPROC) load(userptr, "glGetString"); if(context->GetString == NULL) return 0; - if(context->GetString(GL_VERSION) == NULL) return 0; version = glad_gl_find_core_gl(context); glad_gl_load_GL_VERSION_1_0(context, load, userptr); @@ -585,8 +779,12 @@ int gladLoadGLContextUserPtr(GladGLContext *context, GLADuserptrloadfunc load, v glad_gl_load_GL_VERSION_3_1(context, load, userptr); glad_gl_load_GL_VERSION_3_2(context, load, userptr); glad_gl_load_GL_VERSION_3_3(context, load, userptr); + glad_gl_load_GL_VERSION_4_0(context, load, userptr); + glad_gl_load_GL_VERSION_4_1(context, load, userptr); + glad_gl_load_GL_VERSION_4_2(context, load, userptr); + glad_gl_load_GL_VERSION_4_3(context, load, userptr); - if (!glad_gl_find_extensions_gl(context, version)) return 0; + if (!glad_gl_find_extensions_gl(context)) return 0; From 371d62a82ce26a6dd7c61d0175759f2d53771065 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Mon, 16 Jun 2025 17:44:44 -0600 Subject: [PATCH 225/371] renderer: big rework, graphics API abstraction layers, unified logic This commit is very large, representing about a month of work with many interdependent changes that don't separate cleanly in to atomic commits. The main change here is unifying the renderer logic to a single generic renderer, implemented on top of an abstraction layer over OpenGL/Metal. I'll write a more complete summary of the changes in the description of the PR. --- .../Sources/Ghostty/SurfaceView_AppKit.swift | 9 - pkg/macos/animation.zig | 2 + pkg/macos/build.zig | 2 + pkg/macos/dispatch.zig | 10 + pkg/macos/foundation.zig | 1 + pkg/macos/foundation/type.zig | 1 + pkg/macos/iosurface.zig | 8 + pkg/macos/iosurface/c.zig | 1 + pkg/macos/iosurface/iosurface.zig | 136 + pkg/macos/main.zig | 3 + pkg/macos/video.zig | 2 + pkg/macos/video/pixel_format.zig | 171 + pkg/opengl/Buffer.zig | 7 +- pkg/opengl/Framebuffer.zig | 24 + pkg/opengl/Renderbuffer.zig | 56 + pkg/opengl/Texture.zig | 29 +- pkg/opengl/VertexArray.zig | 84 + pkg/opengl/draw.zig | 39 +- pkg/opengl/main.zig | 9 + pkg/opengl/primitives.zig | 18 + src/Surface.zig | 5 +- src/apprt/gtk/App.zig | 5 + src/apprt/gtk/Surface.zig | 20 +- src/config/Config.zig | 10 +- src/renderer.zig | 5 +- src/renderer/Metal.zig | 3441 ++--------------- src/renderer/OpenGL.zig | 2799 ++------------ src/renderer/Options.zig | 3 + src/renderer/Thread.zig | 32 +- src/renderer/generic.zig | 2866 ++++++++++++++ src/renderer/metal/Frame.zig | 137 + src/renderer/metal/IOSurfaceLayer.zig | 187 + src/renderer/metal/Pipeline.zig | 203 + src/renderer/metal/RenderPass.zig | 220 ++ src/renderer/metal/Target.zig | 110 + src/renderer/metal/Texture.zig | 196 + src/renderer/metal/api.zig | 18 +- src/renderer/metal/buffer.zig | 77 +- src/renderer/metal/image.zig | 98 +- src/renderer/metal/sampler.zig | 38 - src/renderer/metal/shaders.zig | 331 +- src/renderer/opengl/CellProgram.zig | 196 - src/renderer/opengl/Frame.zig | 75 + src/renderer/opengl/ImageProgram.zig | 134 - src/renderer/opengl/Pipeline.zig | 170 + src/renderer/opengl/RenderPass.zig | 141 + src/renderer/opengl/Target.zig | 62 + src/renderer/opengl/Texture.zig | 99 + src/renderer/opengl/buffer.zig | 127 + src/renderer/opengl/cell.zig | 220 ++ src/renderer/opengl/custom.zig | 310 -- src/renderer/opengl/image.zig | 49 +- src/renderer/opengl/shaders.zig | 310 ++ src/renderer/shaders/cell.f.glsl | 53 - src/renderer/shaders/cell.metal | 68 +- src/renderer/shaders/cell.v.glsl | 258 -- src/renderer/shaders/custom.v.glsl | 8 - src/renderer/shaders/glsl/cell_bg.f.glsl | 61 + src/renderer/shaders/glsl/cell_text.f.glsl | 109 + src/renderer/shaders/glsl/cell_text.v.glsl | 162 + src/renderer/shaders/glsl/common.glsl | 155 + src/renderer/shaders/glsl/full_screen.v.glsl | 24 + src/renderer/shaders/glsl/image.f.glsl | 21 + src/renderer/shaders/glsl/image.v.glsl | 46 + src/renderer/shaders/image.f.glsl | 29 - src/renderer/shaders/image.v.glsl | 44 - src/renderer/shaders/shadertoy_prefix.glsl | 30 +- src/renderer/shadertoy.zig | 25 +- 68 files changed, 7088 insertions(+), 7311 deletions(-) create mode 100644 pkg/macos/iosurface.zig create mode 100644 pkg/macos/iosurface/c.zig create mode 100644 pkg/macos/iosurface/iosurface.zig create mode 100644 pkg/macos/video/pixel_format.zig create mode 100644 pkg/opengl/Renderbuffer.zig create mode 100644 pkg/opengl/primitives.zig create mode 100644 src/renderer/generic.zig create mode 100644 src/renderer/metal/Frame.zig create mode 100644 src/renderer/metal/IOSurfaceLayer.zig create mode 100644 src/renderer/metal/Pipeline.zig create mode 100644 src/renderer/metal/RenderPass.zig create mode 100644 src/renderer/metal/Target.zig create mode 100644 src/renderer/metal/Texture.zig delete mode 100644 src/renderer/metal/sampler.zig delete mode 100644 src/renderer/opengl/CellProgram.zig create mode 100644 src/renderer/opengl/Frame.zig delete mode 100644 src/renderer/opengl/ImageProgram.zig create mode 100644 src/renderer/opengl/Pipeline.zig create mode 100644 src/renderer/opengl/RenderPass.zig create mode 100644 src/renderer/opengl/Target.zig create mode 100644 src/renderer/opengl/Texture.zig create mode 100644 src/renderer/opengl/buffer.zig create mode 100644 src/renderer/opengl/cell.zig delete mode 100644 src/renderer/opengl/custom.zig create mode 100644 src/renderer/opengl/shaders.zig delete mode 100644 src/renderer/shaders/cell.f.glsl delete mode 100644 src/renderer/shaders/cell.v.glsl delete mode 100644 src/renderer/shaders/custom.v.glsl create mode 100644 src/renderer/shaders/glsl/cell_bg.f.glsl create mode 100644 src/renderer/shaders/glsl/cell_text.f.glsl create mode 100644 src/renderer/shaders/glsl/cell_text.v.glsl create mode 100644 src/renderer/shaders/glsl/common.glsl create mode 100644 src/renderer/shaders/glsl/full_screen.v.glsl create mode 100644 src/renderer/shaders/glsl/image.f.glsl create mode 100644 src/renderer/shaders/glsl/image.v.glsl delete mode 100644 src/renderer/shaders/image.f.glsl delete mode 100644 src/renderer/shaders/image.v.glsl diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index a47dbdaca..7be249b1a 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -147,10 +147,6 @@ extension Ghostty { // We need to support being a first responder so that we can get input events override var acceptsFirstResponder: Bool { return true } - // I don't think we need this but this lets us know we should redraw our layer - // so we'll use that to tell ghostty to refresh. - override var wantsUpdateLayer: Bool { return true } - init(_ app: ghostty_app_t, baseConfig: SurfaceConfiguration? = nil, uuid: UUID? = nil) { self.markedText = NSMutableAttributedString() self.uuid = uuid ?? .init() @@ -703,11 +699,6 @@ extension Ghostty { setSurfaceSize(width: UInt32(fbFrame.size.width), height: UInt32(fbFrame.size.height)) } - override func updateLayer() { - guard let surface = self.surface else { return } - ghostty_surface_draw(surface); - } - override func mouseDown(with event: NSEvent) { guard let surface = self.surface else { return } let mods = Ghostty.ghosttyMods(event.modifierFlags) diff --git a/pkg/macos/animation.zig b/pkg/macos/animation.zig index 5c3c8fd30..247f97605 100644 --- a/pkg/macos/animation.zig +++ b/pkg/macos/animation.zig @@ -2,6 +2,8 @@ pub const c = @import("animation/c.zig").c; /// https://developer.apple.com/documentation/quartzcore/calayer/contents_gravity_values?language=objc pub extern "c" const kCAGravityTopLeft: *anyopaque; +pub extern "c" const kCAGravityBottomLeft: *anyopaque; +pub extern "c" const kCAGravityCenter: *anyopaque; test { @import("std").testing.refAllDecls(@This()); diff --git a/pkg/macos/build.zig b/pkg/macos/build.zig index df76da9b4..3e0a97d1a 100644 --- a/pkg/macos/build.zig +++ b/pkg/macos/build.zig @@ -33,6 +33,7 @@ pub fn build(b: *std.Build) !void { lib.linkFramework("CoreText"); lib.linkFramework("CoreVideo"); lib.linkFramework("QuartzCore"); + lib.linkFramework("IOSurface"); if (target.result.os.tag == .macos) { lib.linkFramework("Carbon"); module.linkFramework("Carbon", .{}); @@ -44,6 +45,7 @@ pub fn build(b: *std.Build) !void { module.linkFramework("CoreText", .{}); module.linkFramework("CoreVideo", .{}); module.linkFramework("QuartzCore", .{}); + module.linkFramework("IOSurface", .{}); try apple_sdk.addPaths(b, lib); } diff --git a/pkg/macos/dispatch.zig b/pkg/macos/dispatch.zig index 2bc7e8396..3add9c0e9 100644 --- a/pkg/macos/dispatch.zig +++ b/pkg/macos/dispatch.zig @@ -3,6 +3,16 @@ pub const data = @import("dispatch/data.zig"); pub const queue = @import("dispatch/queue.zig"); pub const Data = data.Data; +pub extern "c" fn dispatch_sync( + queue: *anyopaque, + block: *anyopaque, +) void; + +pub extern "c" fn dispatch_async( + queue: *anyopaque, + block: *anyopaque, +) void; + test { @import("std").testing.refAllDecls(@This()); } diff --git a/pkg/macos/foundation.zig b/pkg/macos/foundation.zig index 85562faf0..d4f634091 100644 --- a/pkg/macos/foundation.zig +++ b/pkg/macos/foundation.zig @@ -30,6 +30,7 @@ pub const stringGetSurrogatePairForLongCharacter = string.stringGetSurrogatePair pub const URL = url.URL; pub const URLPathStyle = url.URLPathStyle; pub const CFRelease = typepkg.CFRelease; +pub const CFRetain = typepkg.CFRetain; test { @import("std").testing.refAllDecls(@This()); diff --git a/pkg/macos/foundation/type.zig b/pkg/macos/foundation/type.zig index e3ee150f2..45bd09054 100644 --- a/pkg/macos/foundation/type.zig +++ b/pkg/macos/foundation/type.zig @@ -1 +1,2 @@ pub extern "c" fn CFRelease(*anyopaque) void; +pub extern "c" fn CFRetain(*anyopaque) void; diff --git a/pkg/macos/iosurface.zig b/pkg/macos/iosurface.zig new file mode 100644 index 000000000..9d2e750cf --- /dev/null +++ b/pkg/macos/iosurface.zig @@ -0,0 +1,8 @@ +const iosurface = @import("iosurface/iosurface.zig"); + +pub const c = @import("iosurface/c.zig").c; +pub const IOSurface = iosurface.IOSurface; + +test { + @import("std").testing.refAllDecls(@This()); +} diff --git a/pkg/macos/iosurface/c.zig b/pkg/macos/iosurface/c.zig new file mode 100644 index 000000000..1a7d1627e --- /dev/null +++ b/pkg/macos/iosurface/c.zig @@ -0,0 +1 @@ +pub const c = @import("../main.zig").c; diff --git a/pkg/macos/iosurface/iosurface.zig b/pkg/macos/iosurface/iosurface.zig new file mode 100644 index 000000000..37f8712ba --- /dev/null +++ b/pkg/macos/iosurface/iosurface.zig @@ -0,0 +1,136 @@ +const std = @import("std"); +const assert = std.debug.assert; +const Allocator = std.mem.Allocator; +const c = @import("c.zig").c; +const foundation = @import("../foundation.zig"); +const graphics = @import("../graphics.zig"); +const video = @import("../video.zig"); + +pub const IOSurface = opaque { + pub const Error = error{ + InvalidOperation, + }; + + pub const Properties = struct { + width: c_int, + height: c_int, + pixel_format: video.PixelFormat, + bytes_per_element: c_int, + colorspace: ?*graphics.ColorSpace, + }; + + pub fn init(properties: Properties) Allocator.Error!*IOSurface { + var w = try foundation.Number.create(.int, &properties.width); + defer w.release(); + var h = try foundation.Number.create(.int, &properties.height); + defer h.release(); + var pf = try foundation.Number.create(.int, &@as(c_int, @intFromEnum(properties.pixel_format))); + defer pf.release(); + var bpe = try foundation.Number.create(.int, &properties.bytes_per_element); + defer bpe.release(); + + var properties_dict = try foundation.Dictionary.create( + &[_]?*const anyopaque{ + c.kIOSurfaceWidth, + c.kIOSurfaceHeight, + c.kIOSurfacePixelFormat, + c.kIOSurfaceBytesPerElement, + }, + &[_]?*const anyopaque{ w, h, pf, bpe }, + ); + defer properties_dict.release(); + + var surface = @as(?*IOSurface, @ptrFromInt(@intFromPtr( + c.IOSurfaceCreate(@ptrCast(properties_dict)), + ))) orelse return error.OutOfMemory; + + if (properties.colorspace) |space| { + surface.setColorSpace(space); + } + + return surface; + } + + pub fn deinit(self: *IOSurface) void { + // We mark it purgeable so that it is immediately unloaded, so that we + // don't have to wait for CoreFoundation garbage collection to trigger. + _ = c.IOSurfaceSetPurgeable( + @ptrCast(self), + c.kIOSurfacePurgeableEmpty, + null, + ); + foundation.CFRelease(self); + } + + pub fn retain(self: *IOSurface) void { + foundation.CFRetain(self); + } + + pub fn release(self: *IOSurface) void { + foundation.CFRelease(self); + } + + pub fn setColorSpace(self: *IOSurface, colorspace: *graphics.ColorSpace) void { + const serialized_colorspace = graphics.c.CGColorSpaceCopyPropertyList( + @ptrCast(colorspace), + ).?; + defer foundation.CFRelease(@constCast(serialized_colorspace)); + + c.IOSurfaceSetValue( + @ptrCast(self), + c.kIOSurfaceColorSpace, + @ptrCast(serialized_colorspace), + ); + } + + pub inline fn lock(self: *IOSurface) void { + c.IOSurfaceLock( + @ptrCast(self), + 0, + null, + ); + } + pub inline fn unlock(self: *IOSurface) void { + c.IOSurfaceUnlock( + @ptrCast(self), + 0, + null, + ); + } + + pub inline fn getAllocSize(self: *IOSurface) usize { + return c.IOSurfaceGetAllocSize(@ptrCast(self)); + } + + pub inline fn getWidth(self: *IOSurface) usize { + return c.IOSurfaceGetWidth(@ptrCast(self)); + } + + pub inline fn getHeight(self: *IOSurface) usize { + return c.IOSurfaceGetHeight(@ptrCast(self)); + } + + pub inline fn getBytesPerElement(self: *IOSurface) usize { + return c.IOSurfaceGetBytesPerElement(@ptrCast(self)); + } + + pub inline fn getBytesPerRow(self: *IOSurface) usize { + return c.IOSurfaceGetBytesPerRow(@ptrCast(self)); + } + + pub inline fn getBaseAddress(self: *IOSurface) ?[*]u8 { + return @ptrCast(c.IOSurfaceGetBaseAddress(@ptrCast(self))); + } + + pub inline fn getElementWidth(self: *IOSurface) usize { + return c.IOSurfaceGetElementWidth(@ptrCast(self)); + } + + pub inline fn getElementHeight(self: *IOSurface) usize { + return c.IOSurfaceGetElementHeight(@ptrCast(self)); + } + + pub inline fn getPixelFormat(self: *IOSurface) video.PixelFormat { + return @enumFromInt(c.IOSurfaceGetPixelFormat(@ptrCast(self))); + } +}; diff --git a/pkg/macos/main.zig b/pkg/macos/main.zig index d094b987e..42253ba48 100644 --- a/pkg/macos/main.zig +++ b/pkg/macos/main.zig @@ -8,6 +8,7 @@ pub const graphics = @import("graphics.zig"); pub const os = @import("os.zig"); pub const text = @import("text.zig"); pub const video = @import("video.zig"); +pub const iosurface = @import("iosurface.zig"); // All of our C imports consolidated into one place. We used to // import them one by one in each package but Zig 0.14 has some @@ -17,7 +18,9 @@ pub const c = @cImport({ @cInclude("CoreGraphics/CoreGraphics.h"); @cInclude("CoreText/CoreText.h"); @cInclude("CoreVideo/CoreVideo.h"); + @cInclude("CoreVideo/CVPixelBuffer.h"); @cInclude("QuartzCore/CALayer.h"); + @cInclude("IOSurface/IOSurfaceRef.h"); @cInclude("dispatch/dispatch.h"); @cInclude("os/log.h"); diff --git a/pkg/macos/video.zig b/pkg/macos/video.zig index 0f5cbc4d6..d0b1125ab 100644 --- a/pkg/macos/video.zig +++ b/pkg/macos/video.zig @@ -1,7 +1,9 @@ const display_link = @import("video/display_link.zig"); +const pixel_format = @import("video/pixel_format.zig"); pub const c = @import("video/c.zig").c; pub const DisplayLink = display_link.DisplayLink; +pub const PixelFormat = pixel_format.PixelFormat; test { @import("std").testing.refAllDecls(@This()); diff --git a/pkg/macos/video/pixel_format.zig b/pkg/macos/video/pixel_format.zig new file mode 100644 index 000000000..30f11881e --- /dev/null +++ b/pkg/macos/video/pixel_format.zig @@ -0,0 +1,171 @@ +const c = @import("c.zig").c; + +pub const PixelFormat = enum(c_int) { + /// 1 bit indexed + @"1Monochrome" = c.kCVPixelFormatType_1Monochrome, + /// 2 bit indexed + @"2Indexed" = c.kCVPixelFormatType_2Indexed, + /// 4 bit indexed + @"4Indexed" = c.kCVPixelFormatType_4Indexed, + /// 8 bit indexed + @"8Indexed" = c.kCVPixelFormatType_8Indexed, + /// 1 bit indexed gray, white is zero + @"1IndexedGray_WhiteIsZero" = c.kCVPixelFormatType_1IndexedGray_WhiteIsZero, + /// 2 bit indexed gray, white is zero + @"2IndexedGray_WhiteIsZero" = c.kCVPixelFormatType_2IndexedGray_WhiteIsZero, + /// 4 bit indexed gray, white is zero + @"4IndexedGray_WhiteIsZero" = c.kCVPixelFormatType_4IndexedGray_WhiteIsZero, + /// 8 bit indexed gray, white is zero + @"8IndexedGray_WhiteIsZero" = c.kCVPixelFormatType_8IndexedGray_WhiteIsZero, + /// 16 bit BE RGB 555 + @"16BE555" = c.kCVPixelFormatType_16BE555, + /// 16 bit LE RGB 555 + @"16LE555" = c.kCVPixelFormatType_16LE555, + /// 16 bit LE RGB 5551 + @"16LE5551" = c.kCVPixelFormatType_16LE5551, + /// 16 bit BE RGB 565 + @"16BE565" = c.kCVPixelFormatType_16BE565, + /// 16 bit LE RGB 565 + @"16LE565" = c.kCVPixelFormatType_16LE565, + /// 24 bit RGB + @"24RGB" = c.kCVPixelFormatType_24RGB, + /// 24 bit BGR + @"24BGR" = c.kCVPixelFormatType_24BGR, + /// 32 bit ARGB + @"32ARGB" = c.kCVPixelFormatType_32ARGB, + /// 32 bit BGRA + @"32BGRA" = c.kCVPixelFormatType_32BGRA, + /// 32 bit ABGR + @"32ABGR" = c.kCVPixelFormatType_32ABGR, + /// 32 bit RGBA + @"32RGBA" = c.kCVPixelFormatType_32RGBA, + /// 64 bit ARGB, 16-bit big-endian samples + @"64ARGB" = c.kCVPixelFormatType_64ARGB, + /// 64 bit RGBA, 16-bit little-endian full-range (0-65535) samples + @"64RGBALE" = c.kCVPixelFormatType_64RGBALE, + /// 48 bit RGB, 16-bit big-endian samples + @"48RGB" = c.kCVPixelFormatType_48RGB, + /// 32 bit AlphaGray, 16-bit big-endian samples, black is zero + @"32AlphaGray" = c.kCVPixelFormatType_32AlphaGray, + /// 16 bit Grayscale, 16-bit big-endian samples, black is zero + @"16Gray" = c.kCVPixelFormatType_16Gray, + /// 30 bit RGB, 10-bit big-endian samples, 2 unused padding bits (at least significant end). + @"30RGB" = c.kCVPixelFormatType_30RGB, + /// 30 bit RGB, 10-bit big-endian samples, 2 unused padding bits (at most significant end), video-range (64-940). + @"30RGB_r210" = c.kCVPixelFormatType_30RGB_r210, + /// Component Y'CbCr 8-bit 4:2:2, ordered Cb Y'0 Cr Y'1 + @"422YpCbCr8" = c.kCVPixelFormatType_422YpCbCr8, + /// Component Y'CbCrA 8-bit 4:4:4:4, ordered Cb Y' Cr A + @"4444YpCbCrA8" = c.kCVPixelFormatType_4444YpCbCrA8, + /// Component Y'CbCrA 8-bit 4:4:4:4, rendering format. full range alpha, zero biased YUV, ordered A Y' Cb Cr + @"4444YpCbCrA8R" = c.kCVPixelFormatType_4444YpCbCrA8R, + /// Component Y'CbCrA 8-bit 4:4:4:4, ordered A Y' Cb Cr, full range alpha, video range Y'CbCr. + @"4444AYpCbCr8" = c.kCVPixelFormatType_4444AYpCbCr8, + /// Component Y'CbCrA 16-bit 4:4:4:4, ordered A Y' Cb Cr, full range alpha, video range Y'CbCr, 16-bit little-endian samples. + @"4444AYpCbCr16" = c.kCVPixelFormatType_4444AYpCbCr16, + /// Component AY'CbCr single precision floating-point 4:4:4:4 + @"4444AYpCbCrFloat" = c.kCVPixelFormatType_4444AYpCbCrFloat, + /// Component Y'CbCr 8-bit 4:4:4, ordered Cr Y' Cb, video range Y'CbCr + @"444YpCbCr8" = c.kCVPixelFormatType_444YpCbCr8, + /// Component Y'CbCr 10,12,14,16-bit 4:2:2 + @"422YpCbCr16" = c.kCVPixelFormatType_422YpCbCr16, + /// Component Y'CbCr 10-bit 4:2:2 + @"422YpCbCr10" = c.kCVPixelFormatType_422YpCbCr10, + /// Component Y'CbCr 10-bit 4:4:4 + @"444YpCbCr10" = c.kCVPixelFormatType_444YpCbCr10, + /// Planar Component Y'CbCr 8-bit 4:2:0. baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrPlanar struct + @"420YpCbCr8Planar" = c.kCVPixelFormatType_420YpCbCr8Planar, + /// Planar Component Y'CbCr 8-bit 4:2:0, full range. baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrPlanar struct + @"420YpCbCr8PlanarFullRange" = c.kCVPixelFormatType_420YpCbCr8PlanarFullRange, + /// First plane: Video-range Component Y'CbCr 8-bit 4:2:2, ordered Cb Y'0 Cr Y'1; second plane: alpha 8-bit 0-255 + @"422YpCbCr_4A_8BiPlanar" = c.kCVPixelFormatType_422YpCbCr_4A_8BiPlanar, + /// Bi-Planar Component Y'CbCr 8-bit 4:2:0, video-range (luma=[16,235] chroma=[16,240]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct + @"420YpCbCr8BiPlanarVideoRange" = c.kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, + /// Bi-Planar Component Y'CbCr 8-bit 4:2:0, full-range (luma=[0,255] chroma=[1,255]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct + @"420YpCbCr8BiPlanarFullRange" = c.kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, + /// Bi-Planar Component Y'CbCr 8-bit 4:2:2, video-range (luma=[16,235] chroma=[16,240]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct + @"422YpCbCr8BiPlanarVideoRange" = c.kCVPixelFormatType_422YpCbCr8BiPlanarVideoRange, + /// Bi-Planar Component Y'CbCr 8-bit 4:2:2, full-range (luma=[0,255] chroma=[1,255]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct + @"422YpCbCr8BiPlanarFullRange" = c.kCVPixelFormatType_422YpCbCr8BiPlanarFullRange, + /// Bi-Planar Component Y'CbCr 8-bit 4:4:4, video-range (luma=[16,235] chroma=[16,240]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct + @"444YpCbCr8BiPlanarVideoRange" = c.kCVPixelFormatType_444YpCbCr8BiPlanarVideoRange, + /// Bi-Planar Component Y'CbCr 8-bit 4:4:4, full-range (luma=[0,255] chroma=[1,255]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct + @"444YpCbCr8BiPlanarFullRange" = c.kCVPixelFormatType_444YpCbCr8BiPlanarFullRange, + /// Component Y'CbCr 8-bit 4:2:2, ordered Y'0 Cb Y'1 Cr + @"422YpCbCr8_yuvs" = c.kCVPixelFormatType_422YpCbCr8_yuvs, + /// Component Y'CbCr 8-bit 4:2:2, full range, ordered Y'0 Cb Y'1 Cr + @"422YpCbCr8FullRange" = c.kCVPixelFormatType_422YpCbCr8FullRange, + /// 8 bit one component, black is zero + @"OneComponent8" = c.kCVPixelFormatType_OneComponent8, + /// 8 bit two component, black is zero + @"TwoComponent8" = c.kCVPixelFormatType_TwoComponent8, + /// little-endian RGB101010, 2 MSB are ignored, wide-gamut (384-895) + @"30RGBLEPackedWideGamut" = c.kCVPixelFormatType_30RGBLEPackedWideGamut, + /// little-endian ARGB2101010 full-range ARGB + @"ARGB2101010LEPacked" = c.kCVPixelFormatType_ARGB2101010LEPacked, + /// little-endian ARGB10101010, each 10 bits in the MSBs of 16bits, wide-gamut (384-895, including alpha) + @"40ARGBLEWideGamut" = c.kCVPixelFormatType_40ARGBLEWideGamut, + /// little-endian ARGB10101010, each 10 bits in the MSBs of 16bits, wide-gamut (384-895, including alpha). Alpha premultiplied + @"40ARGBLEWideGamutPremultiplied" = c.kCVPixelFormatType_40ARGBLEWideGamutPremultiplied, + /// 10 bit little-endian one component, stored as 10 MSBs of 16 bits, black is zero + @"OneComponent10" = c.kCVPixelFormatType_OneComponent10, + /// 12 bit little-endian one component, stored as 12 MSBs of 16 bits, black is zero + @"OneComponent12" = c.kCVPixelFormatType_OneComponent12, + /// 16 bit little-endian one component, black is zero + @"OneComponent16" = c.kCVPixelFormatType_OneComponent16, + /// 16 bit little-endian two component, black is zero + @"TwoComponent16" = c.kCVPixelFormatType_TwoComponent16, + /// 16 bit one component IEEE half-precision float, 16-bit little-endian samples + @"OneComponent16Half" = c.kCVPixelFormatType_OneComponent16Half, + /// 32 bit one component IEEE float, 32-bit little-endian samples + @"OneComponent32Float" = c.kCVPixelFormatType_OneComponent32Float, + /// 16 bit two component IEEE half-precision float, 16-bit little-endian samples + @"TwoComponent16Half" = c.kCVPixelFormatType_TwoComponent16Half, + /// 32 bit two component IEEE float, 32-bit little-endian samples + @"TwoComponent32Float" = c.kCVPixelFormatType_TwoComponent32Float, + /// 64 bit RGBA IEEE half-precision float, 16-bit little-endian samples + @"64RGBAHalf" = c.kCVPixelFormatType_64RGBAHalf, + /// 128 bit RGBA IEEE float, 32-bit little-endian samples + @"128RGBAFloat" = c.kCVPixelFormatType_128RGBAFloat, + /// Bayer 14-bit Little-Endian, packed in 16-bits, ordered G R G R... alternating with B G B G... + @"14Bayer_GRBG" = c.kCVPixelFormatType_14Bayer_GRBG, + /// Bayer 14-bit Little-Endian, packed in 16-bits, ordered R G R G... alternating with G B G B... + @"14Bayer_RGGB" = c.kCVPixelFormatType_14Bayer_RGGB, + /// Bayer 14-bit Little-Endian, packed in 16-bits, ordered B G B G... alternating with G R G R... + @"14Bayer_BGGR" = c.kCVPixelFormatType_14Bayer_BGGR, + /// Bayer 14-bit Little-Endian, packed in 16-bits, ordered G B G B... alternating with R G R G... + @"14Bayer_GBRG" = c.kCVPixelFormatType_14Bayer_GBRG, + /// IEEE754-2008 binary16 (half float), describing the normalized shift when comparing two images. Units are 1/meters: ( pixelShift / (pixelFocalLength * baselineInMeters) ) + @"DisparityFloat16" = c.kCVPixelFormatType_DisparityFloat16, + /// IEEE754-2008 binary32 float, describing the normalized shift when comparing two images. Units are 1/meters: ( pixelShift / (pixelFocalLength * baselineInMeters) ) + @"DisparityFloat32" = c.kCVPixelFormatType_DisparityFloat32, + /// IEEE754-2008 binary16 (half float), describing the depth (distance to an object) in meters + @"DepthFloat16" = c.kCVPixelFormatType_DepthFloat16, + /// IEEE754-2008 binary32 float, describing the depth (distance to an object) in meters + @"DepthFloat32" = c.kCVPixelFormatType_DepthFloat32, + /// 2 plane YCbCr10 4:2:0, each 10 bits in the MSBs of 16bits, video-range (luma=[64,940] chroma=[64,960]) + @"420YpCbCr10BiPlanarVideoRange" = c.kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, + /// 2 plane YCbCr10 4:2:2, each 10 bits in the MSBs of 16bits, video-range (luma=[64,940] chroma=[64,960]) + @"422YpCbCr10BiPlanarVideoRange" = c.kCVPixelFormatType_422YpCbCr10BiPlanarVideoRange, + /// 2 plane YCbCr10 4:4:4, each 10 bits in the MSBs of 16bits, video-range (luma=[64,940] chroma=[64,960]) + @"444YpCbCr10BiPlanarVideoRange" = c.kCVPixelFormatType_444YpCbCr10BiPlanarVideoRange, + /// 2 plane YCbCr10 4:2:0, each 10 bits in the MSBs of 16bits, full-range (Y range 0-1023) + @"420YpCbCr10BiPlanarFullRange" = c.kCVPixelFormatType_420YpCbCr10BiPlanarFullRange, + /// 2 plane YCbCr10 4:2:2, each 10 bits in the MSBs of 16bits, full-range (Y range 0-1023) + @"422YpCbCr10BiPlanarFullRange" = c.kCVPixelFormatType_422YpCbCr10BiPlanarFullRange, + /// 2 plane YCbCr10 4:4:4, each 10 bits in the MSBs of 16bits, full-range (Y range 0-1023) + @"444YpCbCr10BiPlanarFullRange" = c.kCVPixelFormatType_444YpCbCr10BiPlanarFullRange, + /// first and second planes as per 420YpCbCr8BiPlanarVideoRange (420v), alpha 8 bits in third plane full-range. No CVPlanarPixelBufferInfo struct. + @"420YpCbCr8VideoRange_8A_TriPlanar" = c.kCVPixelFormatType_420YpCbCr8VideoRange_8A_TriPlanar, + /// Single plane Bayer 16-bit little-endian sensor element ("sensel".*) samples from full-size decoding of ProRes RAW images; Bayer pattern (sensel ordering) and other raw conversion information is described via buffer attachments + @"16VersatileBayer" = c.kCVPixelFormatType_16VersatileBayer, + /// Single plane 64-bit RGBA (16-bit little-endian samples) from downscaled decoding of ProRes RAW images; components--which may not be co-sited with one another--are sensel values and require raw conversion, information for which is described via buffer attachments + @"64RGBA_DownscaledProResRAW" = c.kCVPixelFormatType_64RGBA_DownscaledProResRAW, + /// 2 plane YCbCr16 4:2:2, video-range (luma=[4096,60160] chroma=[4096,61440]) + @"422YpCbCr16BiPlanarVideoRange" = c.kCVPixelFormatType_422YpCbCr16BiPlanarVideoRange, + /// 2 plane YCbCr16 4:4:4, video-range (luma=[4096,60160] chroma=[4096,61440]) + @"444YpCbCr16BiPlanarVideoRange" = c.kCVPixelFormatType_444YpCbCr16BiPlanarVideoRange, + /// 3 plane video-range YCbCr16 4:4:4 with 16-bit full-range alpha (luma=[4096,60160] chroma=[4096,61440] alpha=[0,65535]). No CVPlanarPixelBufferInfo struct. + @"444YpCbCr16VideoRange_16A_TriPlanar" = c.kCVPixelFormatType_444YpCbCr16VideoRange_16A_TriPlanar, + _, +}; diff --git a/pkg/opengl/Buffer.zig b/pkg/opengl/Buffer.zig index 3e55410b7..609342958 100644 --- a/pkg/opengl/Buffer.zig +++ b/pkg/opengl/Buffer.zig @@ -51,7 +51,7 @@ pub const Binding = struct { data: anytype, usage: Usage, ) !void { - const info = dataInfo(&data); + const info = dataInfo(data); glad.context.BufferData.?( @intFromEnum(b.target), info.size, @@ -136,10 +136,6 @@ pub const Binding = struct { }; } - pub fn enableAttribArray(_: Binding, idx: c.GLuint) !void { - glad.context.EnableVertexAttribArray.?(idx); - } - /// Shorthand for vertexAttribPointer that is specialized towards the /// common use case of specifying an array of homogeneous types that /// don't need normalization. This also enables the attribute at idx. @@ -230,6 +226,7 @@ pub const Target = enum(c_uint) { array = c.GL_ARRAY_BUFFER, element_array = c.GL_ELEMENT_ARRAY_BUFFER, uniform = c.GL_UNIFORM_BUFFER, + storage = c.GL_SHADER_STORAGE_BUFFER, _, }; diff --git a/pkg/opengl/Framebuffer.zig b/pkg/opengl/Framebuffer.zig index c5d659f98..ea1f0d2ba 100644 --- a/pkg/opengl/Framebuffer.zig +++ b/pkg/opengl/Framebuffer.zig @@ -5,6 +5,7 @@ const c = @import("c.zig").c; const errors = @import("errors.zig"); const glad = @import("glad.zig"); const Texture = @import("Texture.zig"); +const Renderbuffer = @import("Renderbuffer.zig"); id: c.GLuint, @@ -86,6 +87,29 @@ pub const Binding = struct { try errors.getError(); } + pub fn renderbuffer( + self: Binding, + attachment: Attachment, + buffer: Renderbuffer, + ) !void { + glad.context.FramebufferRenderbuffer.?( + @intFromEnum(self.target), + @intFromEnum(attachment), + c.GL_RENDERBUFFER, + buffer.id, + ); + try errors.getError(); + } + + pub fn drawBuffers( + self: Binding, + bufs: []Attachment, + ) !void { + _ = self; + glad.context.DrawBuffers.?(@intCast(bufs.len), bufs.ptr); + try errors.getError(); + } + pub fn checkStatus(self: Binding) Status { return @enumFromInt(glad.context.CheckFramebufferStatus.?(@intFromEnum(self.target))); } diff --git a/pkg/opengl/Renderbuffer.zig b/pkg/opengl/Renderbuffer.zig new file mode 100644 index 000000000..ef21287f7 --- /dev/null +++ b/pkg/opengl/Renderbuffer.zig @@ -0,0 +1,56 @@ +const Renderbuffer = @This(); + +const std = @import("std"); +const c = @import("c.zig").c; +const errors = @import("errors.zig"); +const glad = @import("glad.zig"); + +const Texture = @import("Texture.zig"); + +id: c.GLuint, + +/// Create a single buffer. +pub fn create() !Renderbuffer { + var rbo: c.GLuint = undefined; + glad.context.GenRenderbuffers.?(1, &rbo); + return .{ .id = rbo }; +} + +pub fn destroy(v: Renderbuffer) void { + glad.context.DeleteRenderbuffers.?(1, &v.id); +} + +pub fn bind(v: Renderbuffer) !Binding { + // Keep track of the previous binding so we can restore it in unbind. + var current: c.GLint = undefined; + glad.context.GetIntegerv.?(c.GL_RENDERBUFFER_BINDING, ¤t); + glad.context.BindRenderbuffer.?(c.GL_RENDERBUFFER, v.id); + return .{ .previous = @intCast(current) }; +} + +pub const Binding = struct { + previous: c.GLuint, + + pub fn unbind(self: Binding) void { + glad.context.BindRenderbuffer.?( + c.GL_RENDERBUFFER, + self.previous, + ); + } + + pub fn storage( + self: Binding, + format: Texture.InternalFormat, + width: c.GLsizei, + height: c.GLsizei, + ) !void { + _ = self; + glad.context.RenderbufferStorage.?( + c.GL_RENDERBUFFER, + @intCast(@intFromEnum(format)), + width, + height, + ); + try errors.getError(); + } +}; diff --git a/pkg/opengl/Texture.zig b/pkg/opengl/Texture.zig index fa5cf770b..833a9bb4d 100644 --- a/pkg/opengl/Texture.zig +++ b/pkg/opengl/Texture.zig @@ -7,8 +7,8 @@ const glad = @import("glad.zig"); id: c.GLuint, -pub fn active(target: c.GLenum) !void { - glad.context.ActiveTexture.?(target); +pub fn active(index: c_uint) !void { + glad.context.ActiveTexture.?(index + c.GL_TEXTURE0); try errors.getError(); } @@ -30,7 +30,7 @@ pub fn destroy(v: Texture) void { glad.context.DeleteTextures.?(1, &v.id); } -/// Enun for possible texture binding targets. +/// Enum for possible texture binding targets. pub const Target = enum(c_uint) { @"1D" = c.GL_TEXTURE_1D, @"2D" = c.GL_TEXTURE_2D, @@ -67,11 +67,11 @@ pub const Parameter = enum(c_uint) { /// Internal format enum for texture images. pub const InternalFormat = enum(c_int) { red = c.GL_RED, - rgb = c.GL_RGB, - rgba = c.GL_RGBA, + rgb = c.GL_RGB8, + rgba = c.GL_RGBA8, - srgb = c.GL_SRGB, - srgba = c.GL_SRGB_ALPHA, + srgb = c.GL_SRGB8, + srgba = c.GL_SRGB8_ALPHA8, // There are so many more that I haven't filled in. _, @@ -116,6 +116,7 @@ pub const Binding = struct { ), else => unreachable, } + try errors.getError(); } pub fn image2D( @@ -140,6 +141,7 @@ pub const Binding = struct { @intFromEnum(typ), data, ); + try errors.getError(); } pub fn subImage2D( @@ -164,6 +166,7 @@ pub const Binding = struct { @intFromEnum(typ), data, ); + try errors.getError(); } pub fn copySubImage2D( @@ -176,6 +179,16 @@ pub const Binding = struct { width: c.GLsizei, height: c.GLsizei, ) !void { - glad.context.CopyTexSubImage2D.?(@intFromEnum(b.target), level, xoffset, yoffset, x, y, width, height); + glad.context.CopyTexSubImage2D.?( + @intFromEnum(b.target), + level, + xoffset, + yoffset, + x, + y, + width, + height, + ); + try errors.getError(); } }; diff --git a/pkg/opengl/VertexArray.zig b/pkg/opengl/VertexArray.zig index 4a6a37576..44bf31621 100644 --- a/pkg/opengl/VertexArray.zig +++ b/pkg/opengl/VertexArray.zig @@ -29,4 +29,88 @@ pub const Binding = struct { _ = self; glad.context.BindVertexArray.?(0); } + + pub fn enableAttribArray(_: Binding, idx: c.GLuint) !void { + glad.context.EnableVertexAttribArray.?(idx); + try errors.getError(); + } + + pub fn bindingDivisor(_: Binding, idx: c.GLuint, divisor: c.GLuint) !void { + glad.context.VertexBindingDivisor.?(idx, divisor); + try errors.getError(); + } + + pub fn attributeBinding( + _: Binding, + attrib_idx: c.GLuint, + binding_idx: c.GLuint, + ) !void { + glad.context.VertexAttribBinding.?(attrib_idx, binding_idx); + try errors.getError(); + } + + pub fn attributeFormat( + _: Binding, + idx: c.GLuint, + size: c.GLint, + typ: c.GLenum, + normalized: bool, + offset: c.GLuint, + ) !void { + glad.context.VertexAttribFormat.?( + idx, + size, + typ, + @intCast(@intFromBool(normalized)), + offset, + ); + try errors.getError(); + } + + pub fn attributeIFormat( + _: Binding, + idx: c.GLuint, + size: c.GLint, + typ: c.GLenum, + offset: c.GLuint, + ) !void { + glad.context.VertexAttribIFormat.?( + idx, + size, + typ, + offset, + ); + try errors.getError(); + } + + pub fn attributeLFormat( + _: Binding, + idx: c.GLuint, + size: c.GLint, + offset: c.GLuint, + ) !void { + glad.context.VertexAttribLFormat.?( + idx, + size, + c.GL_DOUBLE, + offset, + ); + try errors.getError(); + } + + pub fn bindVertexBuffer( + _: Binding, + idx: c.GLuint, + buffer: c.GLuint, + offset: c.GLintptr, + stride: c.GLsizei, + ) !void { + glad.context.BindVertexBuffer.?( + idx, + buffer, + offset, + stride, + ); + try errors.getError(); + } }; diff --git a/pkg/opengl/draw.zig b/pkg/opengl/draw.zig index 866511c32..50110f605 100644 --- a/pkg/opengl/draw.zig +++ b/pkg/opengl/draw.zig @@ -1,6 +1,7 @@ const c = @import("c.zig").c; const errors = @import("errors.zig"); const glad = @import("glad.zig"); +const Primitive = @import("primitives.zig").Primitive; pub fn clearColor(r: f32, g: f32, b: f32, a: f32) void { glad.context.ClearColor.?(r, g, b, a); @@ -15,6 +16,21 @@ pub fn drawArrays(mode: c.GLenum, first: c.GLint, count: c.GLsizei) !void { try errors.getError(); } +pub fn drawArraysInstanced( + mode: Primitive, + first: c.GLint, + count: c.GLsizei, + primcount: c.GLsizei, +) !void { + glad.context.DrawArraysInstanced.?( + @intCast(@intFromEnum(mode)), + first, + count, + primcount, + ); + try errors.getError(); +} + pub fn drawElements(mode: c.GLenum, count: c.GLsizei, typ: c.GLenum, offset: usize) !void { const offsetPtr = if (offset == 0) null else @as(*const anyopaque, @ptrFromInt(offset)); glad.context.DrawElements.?(mode, count, typ, offsetPtr); @@ -25,9 +41,15 @@ pub fn drawElementsInstanced( mode: c.GLenum, count: c.GLsizei, typ: c.GLenum, - primcount: usize, + primcount: c.GLsizei, ) !void { - glad.context.DrawElementsInstanced.?(mode, count, typ, null, @intCast(primcount)); + glad.context.DrawElementsInstanced.?( + mode, + count, + typ, + null, + primcount, + ); try errors.getError(); } @@ -36,6 +58,11 @@ pub fn enable(cap: c.GLenum) !void { try errors.getError(); } +pub fn disable(cap: c.GLenum) !void { + glad.context.Disable.?(cap); + try errors.getError(); +} + pub fn frontFace(mode: c.GLenum) !void { glad.context.FrontFace.?(mode); try errors.getError(); @@ -57,3 +84,11 @@ pub fn pixelStore(mode: c.GLenum, value: anytype) !void { } try errors.getError(); } + +pub fn finish() void { + glad.context.Finish.?(); +} + +pub fn flush() void { + glad.context.Flush.?(); +} diff --git a/pkg/opengl/main.zig b/pkg/opengl/main.zig index 19cd750d0..7165ad3ab 100644 --- a/pkg/opengl/main.zig +++ b/pkg/opengl/main.zig @@ -16,20 +16,29 @@ pub const glad = @import("glad.zig"); pub const ext = @import("extensions.zig"); pub const Buffer = @import("Buffer.zig"); pub const Framebuffer = @import("Framebuffer.zig"); +pub const Renderbuffer = @import("Renderbuffer.zig"); pub const Program = @import("Program.zig"); pub const Shader = @import("Shader.zig"); pub const Texture = @import("Texture.zig"); pub const VertexArray = @import("VertexArray.zig"); +pub const errors = @import("errors.zig"); + +pub const Primitive = @import("primitives.zig").Primitive; + const draw = @import("draw.zig"); pub const blendFunc = draw.blendFunc; pub const clear = draw.clear; pub const clearColor = draw.clearColor; pub const drawArrays = draw.drawArrays; +pub const drawArraysInstanced = draw.drawArraysInstanced; pub const drawElements = draw.drawElements; pub const drawElementsInstanced = draw.drawElementsInstanced; pub const enable = draw.enable; +pub const disable = draw.disable; pub const frontFace = draw.frontFace; pub const pixelStore = draw.pixelStore; pub const viewport = draw.viewport; +pub const flush = draw.flush; +pub const finish = draw.finish; diff --git a/pkg/opengl/primitives.zig b/pkg/opengl/primitives.zig new file mode 100644 index 000000000..e12f51a66 --- /dev/null +++ b/pkg/opengl/primitives.zig @@ -0,0 +1,18 @@ +pub const c = @import("c.zig").c; + +pub const Primitive = enum(c_int) { + point = c.GL_POINTS, + line = c.GL_LINES, + line_strip = c.GL_LINE_STRIP, + triangle = c.GL_TRIANGLES, + triangle_strip = c.GL_TRIANGLE_STRIP, + + // Commented out primitive types are excluded for parity with Metal. + // + // line_loop = c.GL_LINE_LOOP, + // line_adjacency = c.GL_LINES_ADJACENCY, + // line_strip_adjacency = c.GL_LINE_STRIP_ADJACENCY, + // triangle_fan = c.GL_TRIANGLE_FAN, + // triangle_adjacency = c.GL_TRIANGLES_ADJACENCY, + // triangle_strip_adjacency = c.GL_TRIANGLE_STRIP_ADJACENCY, +}; diff --git a/src/Surface.zig b/src/Surface.zig index 41d40125a..a25b200f7 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -468,6 +468,7 @@ pub fn init( .size = size, .surface_mailbox = .{ .surface = self, .app = app_mailbox }, .rt_surface = rt_surface, + .thread = &self.renderer_thread, }); errdefer renderer_impl.deinit(); @@ -726,7 +727,9 @@ pub fn close(self: *Surface) void { /// is in the middle of animation (such as a resize, etc.) or when /// the render timer is managed manually by the apprt. pub fn draw(self: *Surface) !void { - try self.renderer_thread.draw_now.notify(); + // Renderers are required to support `drawFrame` being called from + // the main thread, so that they can update contents during resize. + try self.renderer.drawFrame(true); } /// Activate the inspector. This will begin collecting inspection data. diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 099a051a4..0299cc1ff 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -55,6 +55,11 @@ pub const c = @cImport({ const log = std.log.scoped(.gtk); +/// This is detected by the Renderer, in which case it sends a `redraw_surface` +/// message so that we can call `drawFrame` ourselves from the app thread, +/// because GTK's `GLArea` does not support drawing from a different thread. +pub const must_draw_from_app_thread = true; + pub const Options = struct {}; core_app: *CoreApp, diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 1e5b1bfe8..cf8d651dd 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -41,10 +41,6 @@ const adw_version = @import("adw_version.zig"); const log = std.log.scoped(.gtk_surface); -/// This is detected by the OpenGL renderer to move to a single-threaded -/// draw operation. This basically puts locks around our draw path. -pub const opengl_single_threaded_draw = true; - pub const Options = struct { /// The parent surface to inherit settings such as font size, working /// directory, etc. from. @@ -394,7 +390,10 @@ pub fn init(self: *Surface, app: *App, opts: Options) !void { // Various other GL properties gl_area_widget.setCursorFromName("text"); - gl_area.setRequiredVersion(3, 3); + gl_area.setRequiredVersion( + renderer.OpenGL.MIN_VERSION_MAJOR, + renderer.OpenGL.MIN_VERSION_MINOR, + ); gl_area.setHasStencilBuffer(0); gl_area.setHasDepthBuffer(0); gl_area.setUseEs(0); @@ -683,12 +682,13 @@ pub fn init(self: *Surface, app: *App, opts: Options) !void { fn realize(self: *Surface) !void { // If this surface has already been realized, then we don't need to - // reinitialize. This can happen if a surface is moved from one GDK surface - // to another (i.e. a tab is pulled out into a window). + // reinitialize. This can happen if a surface is moved from one GDK + // surface to another (i.e. a tab is pulled out into a window). if (self.realized) { // If we have no OpenGL state though, we do need to reinitialize. - // We allow the renderer to figure that out - try self.core_surface.renderer.displayRealize(); + // We allow the renderer to figure that out, and then queue a draw. + try self.core_surface.renderer.displayRealized(); + self.redraw(); return; } @@ -794,7 +794,7 @@ pub fn primaryWidget(self: *Surface) *gtk.Widget { } fn render(self: *Surface) !void { - try self.core_surface.renderer.drawFrame(self); + try self.core_surface.renderer.drawFrame(true); } /// Called by core surface to get the cgroup. diff --git a/src/config/Config.zig b/src/config/Config.zig index 2df66ba45..f7a197184 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -266,6 +266,9 @@ pub const renamed = std.StaticStringMap([]const u8).initComptime(&.{ /// This affects the appearance of text and of any images with transparency. /// Additionally, custom shaders will receive colors in the configured space. /// +/// On macOS the default is `native`, on all other platforms the default is +/// `linear-corrected`. +/// /// Valid values: /// /// * `native` - Perform alpha blending in the native color space for the OS. @@ -276,12 +279,15 @@ pub const renamed = std.StaticStringMap([]const u8).initComptime(&.{ /// when certain color combinations are used (e.g. red / green), but makes /// dark text look much thinner than normal and light text much thicker. /// This is also sometimes known as "gamma correction". -/// (Currently only supported on macOS. Has no effect on Linux.) /// /// * `linear-corrected` - Same as `linear`, but with a correction step applied /// for text that makes it look nearly or completely identical to `native`, /// but without any of the darkening artifacts. -@"alpha-blending": AlphaBlending = .native, +@"alpha-blending": AlphaBlending = + if (builtin.os.tag == .macos) + .native + else + .@"linear-corrected", /// All of the configurations behavior adjust various metrics determined by the /// font. The values can be integers (1, -1, etc.) or a percentage (20%, -15%, diff --git a/src/renderer.zig b/src/renderer.zig index 61d9a4e53..e3ed070b6 100644 --- a/src/renderer.zig +++ b/src/renderer.zig @@ -16,6 +16,7 @@ const cursor = @import("renderer/cursor.zig"); const message = @import("renderer/message.zig"); const size = @import("renderer/size.zig"); pub const shadertoy = @import("renderer/shadertoy.zig"); +pub const GenericRenderer = @import("renderer/generic.zig").Renderer; pub const Metal = @import("renderer/Metal.zig"); pub const OpenGL = @import("renderer/OpenGL.zig"); pub const WebGL = @import("renderer/WebGL.zig"); @@ -56,8 +57,8 @@ pub const Impl = enum { /// The implementation to use for the renderer. This is comptime chosen /// so that every build has exactly one renderer implementation. pub const Renderer = switch (build_config.renderer) { - .metal => Metal, - .opengl => OpenGL, + .metal => GenericRenderer(Metal), + .opengl => GenericRenderer(OpenGL), .webgl => WebGL, }; diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 639ef354b..766cbefa5 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -1,547 +1,80 @@ -//! Renderer implementation for Metal. -//! -//! Open questions: -//! +//! Graphics API wrapper for Metal. pub const Metal = @This(); const std = @import("std"); +const assert = std.debug.assert; +const Allocator = std.mem.Allocator; const builtin = @import("builtin"); const glfw = @import("glfw"); const objc = @import("objc"); const macos = @import("macos"); -const imgui = @import("imgui"); -const glslang = @import("glslang"); -const xev = @import("../global.zig").xev; -const apprt = @import("../apprt.zig"); -const configpkg = @import("../config.zig"); -const font = @import("../font/main.zig"); -const os = @import("../os/main.zig"); -const terminal = @import("../terminal/main.zig"); -const renderer = @import("../renderer.zig"); -const math = @import("../math.zig"); -const Surface = @import("../Surface.zig"); -const link = @import("link.zig"); const graphics = macos.graphics; -const fgMode = @import("cell.zig").fgMode; -const isCovering = @import("cell.zig").isCovering; +const apprt = @import("../apprt.zig"); +const font = @import("../font/main.zig"); +const configpkg = @import("../config.zig"); +const rendererpkg = @import("../renderer.zig"); +const Renderer = rendererpkg.GenericRenderer(Metal); const shadertoy = @import("shadertoy.zig"); -const assert = std.debug.assert; -const Allocator = std.mem.Allocator; -const ArenaAllocator = std.heap.ArenaAllocator; -const CFReleaseThread = os.CFReleaseThread; -const Terminal = terminal.Terminal; -const Health = renderer.Health; const mtl = @import("metal/api.zig"); -const mtl_buffer = @import("metal/buffer.zig"); -const mtl_cell = @import("metal/cell.zig"); -const mtl_image = @import("metal/image.zig"); -const mtl_sampler = @import("metal/sampler.zig"); -const mtl_shaders = @import("metal/shaders.zig"); -const Image = mtl_image.Image; -const ImageMap = mtl_image.ImageMap; -const Shaders = mtl_shaders.Shaders; +const IOSurfaceLayer = @import("metal/IOSurfaceLayer.zig"); -const ImageBuffer = mtl_buffer.Buffer(mtl_shaders.Image); -const InstanceBuffer = mtl_buffer.Buffer(u16); +pub const GraphicsAPI = Metal; +pub const Target = @import("metal/Target.zig"); +pub const Frame = @import("metal/Frame.zig"); +pub const RenderPass = @import("metal/RenderPass.zig"); +pub const Pipeline = @import("metal/Pipeline.zig"); +const bufferpkg = @import("metal/buffer.zig"); +pub const Buffer = bufferpkg.Buffer; +pub const Texture = @import("metal/Texture.zig"); +pub const shaders = @import("metal/shaders.zig"); -const ImagePlacementList = std.ArrayListUnmanaged(mtl_image.Placement); +pub const cellpkg = @import("metal/cell.zig"); +pub const imagepkg = @import("metal/image.zig"); -const DisplayLink = switch (builtin.os.tag) { - .macos => *macos.video.DisplayLink, - else => void, -}; +pub const custom_shader_target: shadertoy.Target = .msl; + +const log = std.log.scoped(.metal); // Get native API access on certain platforms so we can do more customization. const glfwNative = glfw.Native(.{ .cocoa = builtin.os.tag == .macos, }); -const log = std.log.scoped(.metal); +layer: IOSurfaceLayer, -/// Allocator that can be used -alloc: std.mem.Allocator, +/// MTLDevice +device: objc.Object, +/// MTLCommandQueue +queue: objc.Object, -/// The configuration we need derived from the main config. -config: DerivedConfig, +/// Alpha blending mode +blending: configpkg.Config.AlphaBlending, -/// The mailbox for communicating with the window. -surface_mailbox: apprt.surface.Mailbox, - -/// Current font metrics defining our grid. -grid_metrics: font.Metrics, - -/// The size of everything. -size: renderer.Size, - -/// True if the window is focused -focused: bool, - -/// The foreground color set by an OSC 10 sequence. If unset then -/// default_foreground_color is used. -foreground_color: ?terminal.color.RGB, - -/// Foreground color set in the user's config file. -default_foreground_color: terminal.color.RGB, - -/// The background color set by an OSC 11 sequence. If unset then -/// default_background_color is used. -background_color: ?terminal.color.RGB, - -/// Background color set in the user's config file. -default_background_color: terminal.color.RGB, - -/// The cursor color set by an OSC 12 sequence. If unset then -/// default_cursor_color is used. -cursor_color: ?terminal.color.RGB, - -/// Default cursor color when no color is set explicitly by an OSC 12 command. -/// This is cursor color as set in the user's config, if any. If no cursor color -/// is set in the user's config, then the cursor color is determined by the -/// current foreground color. -default_cursor_color: ?terminal.color.RGB, - -/// When `cursor_color` is null, swap the foreground and background colors of -/// the cell under the cursor for the cursor color. Otherwise, use the default -/// foreground color as the cursor color. -cursor_invert: bool, - -/// The current set of cells to render. This is rebuilt on every frame -/// but we keep this around so that we don't reallocate. Each set of -/// cells goes into a separate shader. -cells: mtl_cell.Contents, - -/// The last viewport that we based our rebuild off of. If this changes, -/// then we do a full rebuild of the cells. The pointer values in this pin -/// are NOT SAFE to read because they may be modified, freed, etc from the -/// termio thread. We treat the pointers as integers for comparison only. -cells_viewport: ?terminal.Pin = null, - -/// Set to true after rebuildCells is called. This can be used -/// to determine if any possible changes have been made to the -/// cells for the draw call. -cells_rebuilt: bool = false, - -/// The current GPU uniform values. -uniforms: mtl_shaders.Uniforms, - -/// The font structures. -font_grid: *font.SharedGrid, -font_shaper: font.Shaper, -font_shaper_cache: font.ShaperCache, - -/// The images that we may render. -images: ImageMap = .{}, -image_placements: ImagePlacementList = .{}, -image_bg_end: u32 = 0, -image_text_end: u32 = 0, -image_virtual: bool = false, - -/// Metal state -shaders: Shaders, // Compiled shaders - -/// Metal objects -layer: objc.Object, // CAMetalLayer - -/// The CVDisplayLink used to drive the rendering loop in sync -/// with the display. This is void on platforms that don't support -/// a display link. -display_link: ?DisplayLink = null, - -/// The `CGColorSpace` that represents our current terminal color space -terminal_colorspace: *graphics.ColorSpace, - -/// Custom shader state. This is only set if we have custom shaders. -custom_shader_state: ?CustomShaderState = null, - -/// Health of the last frame. Note that when we do double/triple buffering -/// this will have to be part of the frame state. -health: std.atomic.Value(Health) = .{ .raw = .healthy }, - -/// Our GPU state -gpu_state: GPUState, - -/// State we need for the GPU that is shared between all frames. -pub const GPUState = struct { - // The count of buffers we use for double/triple buffering. If - // this is one then we don't do any double+ buffering at all. This - // is comptime because there isn't a good reason to change this at - // runtime and there is a lot of complexity to support it. For comptime, - // this is useful for debugging. - const BufferCount = 3; - - /// The frame data, the current frame index, and the semaphore protecting - /// the frame data. This is used to implement double/triple/etc. buffering. - frames: [BufferCount]FrameState, - frame_index: std.math.IntFittingRange(0, BufferCount) = 0, - frame_sema: std.Thread.Semaphore = .{ .permits = BufferCount }, - - device: objc.Object, // MTLDevice - queue: objc.Object, // MTLCommandQueue - - /// This buffer is written exactly once so we can use it globally. - instance: InstanceBuffer, // MTLBuffer - - /// The default storage mode to use for resources created with our device. - /// - /// This is based on whether the device is a discrete GPU or not, since - /// discrete GPUs do not have unified memory and therefore do not support - /// the "shared" storage mode, instead we have to use the "managed" mode. - default_storage_mode: mtl.MTLResourceOptions.StorageMode, - - pub fn init() !GPUState { - const device = try chooseDevice(); - const queue = device.msgSend(objc.Object, objc.sel("newCommandQueue"), .{}); - errdefer queue.release(); - - // We determine whether our device is a discrete GPU based on these: - // - We're on macOS (iOS, iPadOS, etc. are guaranteed to be integrated). - // - We're not on aarch64 (Apple Silicon, therefore integrated). - // - The device reports that it does not have unified memory. - const is_discrete = - builtin.target.os.tag == .macos and - builtin.target.cpu.arch != .aarch64 and - !device.getProperty(bool, "hasUnifiedMemory"); - - const default_storage_mode: mtl.MTLResourceOptions.StorageMode = - if (is_discrete) .managed else .shared; - - var instance = try InstanceBuffer.initFill(device, &.{ - 0, 1, 3, // Top-left triangle - 1, 2, 3, // Bottom-right triangle - }, .{ .storage_mode = default_storage_mode }); - errdefer instance.deinit(); - - var result: GPUState = .{ - .device = device, - .queue = queue, - .instance = instance, - .frames = undefined, - .default_storage_mode = default_storage_mode, - }; - - // Initialize all of our frame state. - for (&result.frames) |*frame| { - frame.* = try FrameState.init(result.device, default_storage_mode); - } - - return result; - } - - fn chooseDevice() error{NoMetalDevice}!objc.Object { - var chosen_device: ?objc.Object = null; - - switch (comptime builtin.os.tag) { - .macos => { - const devices = objc.Object.fromId(mtl.MTLCopyAllDevices()); - defer devices.release(); - - var iter = devices.iterate(); - while (iter.next()) |device| { - // We want a GPU that’s connected to a display. - if (device.getProperty(bool, "isHeadless")) continue; - chosen_device = device; - // If the user has an eGPU plugged in, they probably want - // to use it. Otherwise, integrated GPUs are better for - // battery life and thermals. - if (device.getProperty(bool, "isRemovable") or - device.getProperty(bool, "isLowPower")) break; - } - }, - .ios => { - chosen_device = objc.Object.fromId(mtl.MTLCreateSystemDefaultDevice()); - }, - else => @compileError("unsupported target for Metal"), - } - - const device = chosen_device orelse return error.NoMetalDevice; - return device.retain(); - } - - pub fn deinit(self: *GPUState) void { - // Wait for all of our inflight draws to complete so that - // we can cleanly deinit our GPU state. - for (0..BufferCount) |_| self.frame_sema.wait(); - for (&self.frames) |*frame| frame.deinit(); - self.instance.deinit(); - self.queue.release(); - self.device.release(); - } - - /// Get the next frame state to draw to. This will wait on the - /// semaphore to ensure that the frame is available. This must - /// always be paired with a call to releaseFrame. - pub fn nextFrame(self: *GPUState) *FrameState { - self.frame_sema.wait(); - errdefer self.frame_sema.post(); - self.frame_index = (self.frame_index + 1) % BufferCount; - return &self.frames[self.frame_index]; - } - - /// This should be called when the frame has completed drawing. - pub fn releaseFrame(self: *GPUState) void { - self.frame_sema.post(); - } -}; - -/// State we need duplicated for every frame. Any state that could be -/// in a data race between the GPU and CPU while a frame is being -/// drawn should be in this struct. +/// The default storage mode to use for resources created with our device. /// -/// While a draw is in-process, we "lock" the state (via a semaphore) -/// and prevent the CPU from updating the state until Metal reports -/// that the frame is complete. -/// -/// This is used to implement double/triple buffering. -pub const FrameState = struct { - uniforms: UniformBuffer, - cells: CellTextBuffer, - cells_bg: CellBgBuffer, +/// This is based on whether the device is a discrete GPU or not, since +/// discrete GPUs do not have unified memory and therefore do not support +/// the "shared" storage mode, instead we have to use the "managed" mode. +default_storage_mode: mtl.MTLResourceOptions.StorageMode, - grayscale: objc.Object, // MTLTexture - grayscale_modified: usize = 0, - color: objc.Object, // MTLTexture - color_modified: usize = 0, - - /// A buffer containing the uniform data. - const UniformBuffer = mtl_buffer.Buffer(mtl_shaders.Uniforms); - const CellBgBuffer = mtl_buffer.Buffer(mtl_shaders.CellBg); - const CellTextBuffer = mtl_buffer.Buffer(mtl_shaders.CellText); - - pub fn init( - device: objc.Object, - /// Storage mode for buffers and textures. - storage_mode: mtl.MTLResourceOptions.StorageMode, - ) !FrameState { - // Uniform buffer contains exactly 1 uniform struct. The - // uniform data will be undefined so this must be set before - // a frame is drawn. - var uniforms = try UniformBuffer.init( - device, - 1, - .{ - // Indicate that the CPU writes to this resource but never reads it. - .cpu_cache_mode = .write_combined, - .storage_mode = storage_mode, - }, - ); - errdefer uniforms.deinit(); - - // Create the buffers for our vertex data. The preallocation size - // is likely too small but our first frame update will resize it. - var cells = try CellTextBuffer.init( - device, - 10 * 10, - .{ - // Indicate that the CPU writes to this resource but never reads it. - .cpu_cache_mode = .write_combined, - .storage_mode = storage_mode, - }, - ); - errdefer cells.deinit(); - var cells_bg = try CellBgBuffer.init( - device, - 10 * 10, - .{ - // Indicate that the CPU writes to this resource but never reads it. - .cpu_cache_mode = .write_combined, - .storage_mode = storage_mode, - }, - ); - - errdefer cells_bg.deinit(); - - // Initialize our textures for our font atlas. - const grayscale = try initAtlasTexture(device, &.{ - .data = undefined, - .size = 8, - .format = .grayscale, - }, storage_mode); - errdefer grayscale.release(); - const color = try initAtlasTexture(device, &.{ - .data = undefined, - .size = 8, - .format = .rgba, - }, storage_mode); - errdefer color.release(); - - return .{ - .uniforms = uniforms, - .cells = cells, - .cells_bg = cells_bg, - .grayscale = grayscale, - .color = color, - }; - } - - pub fn deinit(self: *FrameState) void { - self.uniforms.deinit(); - self.cells.deinit(); - self.cells_bg.deinit(); - self.grayscale.release(); - self.color.release(); - } -}; - -pub const CustomShaderState = struct { - /// When we have a custom shader state, we maintain a front - /// and back texture which we use as a swap chain to render - /// between when multiple custom shaders are defined. - front_texture: objc.Object, // MTLTexture - back_texture: objc.Object, // MTLTexture - - sampler: mtl_sampler.Sampler, - uniforms: mtl_shaders.PostUniforms, - - /// The first time a frame was drawn. - /// This is used to update the time uniform. - first_frame_time: std.time.Instant, - - /// The last time a frame was drawn. - /// This is used to update the time uniform. - last_frame_time: std.time.Instant, - - /// Swap the front and back textures. - pub fn swap(self: *CustomShaderState) void { - std.mem.swap(objc.Object, &self.front_texture, &self.back_texture); - } - - pub fn deinit(self: *CustomShaderState) void { - self.front_texture.release(); - self.back_texture.release(); - self.sampler.deinit(); - } -}; - -/// The configuration for this renderer that is derived from the main -/// configuration. This must be exported so that we don't need to -/// pass around Config pointers which makes memory management a pain. -pub const DerivedConfig = struct { - arena: ArenaAllocator, - - font_thicken: bool, - font_thicken_strength: u8, - font_features: std.ArrayListUnmanaged([:0]const u8), - font_styles: font.CodepointResolver.StyleStatus, - cursor_color: ?terminal.color.RGB, - cursor_invert: bool, - cursor_opacity: f64, - cursor_text: ?terminal.color.RGB, - background: terminal.color.RGB, - background_opacity: f64, - foreground: terminal.color.RGB, - selection_background: ?terminal.color.RGB, - selection_foreground: ?terminal.color.RGB, - invert_selection_fg_bg: bool, - bold_is_bright: bool, - min_contrast: f32, - padding_color: configpkg.WindowPaddingColor, - custom_shaders: configpkg.RepeatablePath, - links: link.Set, - vsync: bool, - colorspace: configpkg.Config.WindowColorspace, - blending: configpkg.Config.AlphaBlending, - - pub fn init( - alloc_gpa: Allocator, - config: *const configpkg.Config, - ) !DerivedConfig { - var arena = ArenaAllocator.init(alloc_gpa); - errdefer arena.deinit(); - const alloc = arena.allocator(); - - // Copy our shaders - const custom_shaders = try config.@"custom-shader".clone(alloc); - - // Copy our font features - const font_features = try config.@"font-feature".clone(alloc); - - // Get our font styles - var font_styles = font.CodepointResolver.StyleStatus.initFill(true); - font_styles.set(.bold, config.@"font-style-bold" != .false); - font_styles.set(.italic, config.@"font-style-italic" != .false); - font_styles.set(.bold_italic, config.@"font-style-bold-italic" != .false); - - // Our link configs - const links = try link.Set.fromConfig( - alloc, - config.link.links.items, - ); - - const cursor_invert = config.@"cursor-invert-fg-bg"; - - return .{ - .background_opacity = @max(0, @min(1, config.@"background-opacity")), - .font_thicken = config.@"font-thicken", - .font_thicken_strength = config.@"font-thicken-strength", - .font_features = font_features.list, - .font_styles = font_styles, - - .cursor_color = if (!cursor_invert and config.@"cursor-color" != null) - config.@"cursor-color".?.toTerminalRGB() - else - null, - - .cursor_invert = cursor_invert, - - .cursor_text = if (config.@"cursor-text") |txt| - txt.toTerminalRGB() - else - null, - - .cursor_opacity = @max(0, @min(1, config.@"cursor-opacity")), - - .background = config.background.toTerminalRGB(), - .foreground = config.foreground.toTerminalRGB(), - .invert_selection_fg_bg = config.@"selection-invert-fg-bg", - .bold_is_bright = config.@"bold-is-bright", - .min_contrast = @floatCast(config.@"minimum-contrast"), - .padding_color = config.@"window-padding-color", - - .selection_background = if (config.@"selection-background") |bg| - bg.toTerminalRGB() - else - null, - - .selection_foreground = if (config.@"selection-foreground") |bg| - bg.toTerminalRGB() - else - null, - - .custom_shaders = custom_shaders, - .links = links, - .vsync = config.@"window-vsync", - .colorspace = config.@"window-colorspace", - .blending = config.@"alpha-blending", - .arena = arena, - }; - } - - pub fn deinit(self: *DerivedConfig) void { - const alloc = self.arena.allocator(); - self.links.deinit(alloc); - self.arena.deinit(); - } -}; - -/// Returns the hints that we want for this -pub fn glfwWindowHints(config: *const configpkg.Config) glfw.Window.Hints { - return .{ - .client_api = .no_api, - .transparent_framebuffer = config.@"background-opacity" < 1, +pub fn init(alloc: Allocator, opts: rendererpkg.Options) !Metal { + comptime switch (builtin.os.tag) { + .macos, .ios => {}, + else => @compileError("unsupported platform for Metal"), }; -} -/// This is called early right after window creation to setup our -/// window surface as necessary. -pub fn surfaceInit(surface: *apprt.Surface) !void { - _ = surface; + _ = alloc; - // We don't do anything else here because we want to set everything - // else up during actual initialization. -} + // Choose our MTLDevice and create a MTLCommandQueue for that device. + const device = try chooseDevice(); + errdefer device.release(); + const queue = device.msgSend(objc.Object, objc.sel("newCommandQueue"), .{}); + errdefer queue.release(); + + const default_storage_mode: mtl.MTLResourceOptions.StorageMode = + if (device.getProperty(bool, "hasUnifiedMemory")) .shared else .managed; -pub fn init(alloc: Allocator, options: renderer.Options) !Metal { const ViewInfo = struct { view: objc.Object, scaleFactor: f64, @@ -553,7 +86,7 @@ pub fn init(alloc: Allocator, options: renderer.Options) !Metal { // Everything in glfw is window-oriented so we grab the backing // window, then derive everything from that. const nswindow = objc.Object.fromId(glfwNative.getCocoaWindow( - options.rt_surface.window, + opts.rt_surface.window, ).?); const contentView = objc.Object.fromId( @@ -571,8 +104,8 @@ pub fn init(alloc: Allocator, options: renderer.Options) !Metal { }, apprt.embedded => .{ - .scaleFactor = @floatCast(options.rt_surface.content_scale.x), - .view = switch (options.rt_surface.platform) { + .scaleFactor = @floatCast(opts.rt_surface.content_scale.x), + .view = switch (opts.rt_surface.platform) { .macos => |v| v.nsview, .ios => |v| v.uiview, }, @@ -581,2772 +114,236 @@ pub fn init(alloc: Allocator, options: renderer.Options) !Metal { else => @compileError("unsupported apprt for metal"), }; - // Initialize our metal stuff - var gpu_state = try GPUState.init(); - errdefer gpu_state.deinit(); + // Create an IOSurfaceLayer which we can assign to the view to make + // it in to a "layer-hosting view", so that we can manually control + // the layer contents. + var layer = try IOSurfaceLayer.init(); + errdefer layer.release(); - // Get our CAMetalLayer - const layer: objc.Object = switch (builtin.os.tag) { - .macos => layer: { - const CAMetalLayer = objc.getClass("CAMetalLayer").?; - break :layer CAMetalLayer.msgSend(objc.Object, objc.sel("layer"), .{}); + // Add our layer to the view. + // + // On macOS we do this by making the view "layer-hosting" + // by assigning it to the view's `layer` property BEFORE + // setting `wantsLayer` to `true`. + // + // On iOS, views are always layer-backed, and `layer` + // is readonly, so instead we add it as a sublayer. + switch (comptime builtin.os.tag) { + .macos => { + info.view.setProperty("layer", layer.layer.value); + info.view.setProperty("wantsLayer", true); }, - // iOS is always layer-backed so we don't need to do anything here. - .ios => info.view.getProperty(objc.Object, "layer"), + .ios => { + info.view.msgSend(void, objc.sel("addSublayer"), .{layer.layer.value}); + }, else => @compileError("unsupported target for Metal"), - }; - layer.setProperty("device", gpu_state.device.value); - layer.setProperty("opaque", options.config.background_opacity >= 1); - layer.setProperty("displaySyncEnabled", options.config.vsync); - - // Set our layer's pixel format appropriately. - layer.setProperty( - "pixelFormat", - // Using an `*_srgb` pixel format makes Metal gamma encode - // the pixels written to it *after* blending, which means - // we get linear alpha blending rather than gamma-incorrect - // blending. - if (options.config.blending.isLinear()) - @intFromEnum(mtl.MTLPixelFormat.bgra8unorm_srgb) - else - @intFromEnum(mtl.MTLPixelFormat.bgra8unorm), - ); - - // Set our layer's color space to Display P3. - // This allows us to have "Apple-style" alpha blending, - // since it seems to be the case that Apple apps like - // Terminal and TextEdit render text in the display's - // color space using converted colors, which reduces, - // but does not fully eliminate blending artifacts. - const colorspace = try graphics.ColorSpace.createNamed(.displayP3); - defer colorspace.release(); - layer.setProperty("colorspace", colorspace); - - // Create a colorspace the represents our terminal colors - // this will allow us to create e.g. `CGColor`s for things - // like the current background color. - const terminal_colorspace = try graphics.ColorSpace.createNamed( - switch (options.config.colorspace) { - .@"display-p3" => .displayP3, - .srgb => .sRGB, - }, - ); - errdefer terminal_colorspace.release(); - - // Make our view layer-backed with our Metal layer. On iOS views are - // always layer backed so we don't need to do this. But on iOS the - // caller MUST be sure to set the layerClass to CAMetalLayer. - if (comptime builtin.os.tag == .macos) { - info.view.setProperty("layer", layer.value); - info.view.setProperty("wantsLayer", true); - - // The layer gravity is set to top-left so that when we resize - // the view, the contents aren't stretched before a redraw. - layer.setProperty("contentsGravity", macos.animation.kCAGravityTopLeft); } - // Ensure that our metal layer has a content scale set to match the - // scale factor of the window. This avoids magnification issues leading - // to blurry rendering. - layer.setProperty("contentsScale", info.scaleFactor); + // Ensure that if our layer is oversized it + // does not overflow the bounds of the view. + info.view.setProperty("clipsToBounds", true); - // Create the font shaper. We initially create a shaper that can support - // a width of 160 which is a common width for modern screens to help - // avoid allocations later. - var font_shaper = try font.Shaper.init(alloc, .{ - .features = options.config.font_features.items, - }); - errdefer font_shaper.deinit(); + // Ensure that our layer has a content scale set to + // match the scale factor of the window. This avoids + // magnification issues leading to blurry rendering. + layer.layer.setProperty("contentsScale", info.scaleFactor); - // Initialize all the data that requires a critical font section. - const font_critical: struct { - metrics: font.Metrics, - } = font_critical: { - const grid = options.font_grid; - grid.lock.lockShared(); - defer grid.lock.unlockShared(); - break :font_critical .{ - .metrics = grid.metrics, - }; - }; + // This makes it so that our display callback will actually be called. + layer.layer.setProperty("needsDisplayOnBoundsChange", true); - const display_link: ?DisplayLink = switch (builtin.os.tag) { - .macos => if (options.config.vsync) - try macos.video.DisplayLink.createWithActiveCGDisplays() - else - null, - else => null, - }; - errdefer if (display_link) |v| v.release(); - - var result: Metal = .{ - .alloc = alloc, - .config = options.config, - .surface_mailbox = options.surface_mailbox, - .grid_metrics = font_critical.metrics, - .size = options.size, - .focused = true, - .foreground_color = null, - .default_foreground_color = options.config.foreground, - .background_color = null, - .default_background_color = options.config.background, - .cursor_color = null, - .default_cursor_color = options.config.cursor_color, - .cursor_invert = options.config.cursor_invert, - - // Render state - .cells = .{}, - .uniforms = .{ - .projection_matrix = undefined, - .cell_size = undefined, - .grid_size = undefined, - .grid_padding = undefined, - .padding_extend = .{}, - .min_contrast = options.config.min_contrast, - .cursor_pos = .{ std.math.maxInt(u16), std.math.maxInt(u16) }, - .cursor_color = undefined, - .bg_color = .{ - options.config.background.r, - options.config.background.g, - options.config.background.b, - @intFromFloat(@round(options.config.background_opacity * 255.0)), - }, - .cursor_wide = false, - .use_display_p3 = options.config.colorspace == .@"display-p3", - .use_linear_blending = options.config.blending.isLinear(), - .use_linear_correction = options.config.blending == .@"linear-corrected", - }, - - // Fonts - .font_grid = options.font_grid, - .font_shaper = font_shaper, - .font_shaper_cache = font.ShaperCache.init(), - - // Shaders (initialized below) - .shaders = undefined, - - // Metal stuff + return .{ .layer = layer, - .display_link = display_link, - .terminal_colorspace = terminal_colorspace, - .custom_shader_state = null, - .gpu_state = gpu_state, + .device = device, + .queue = queue, + .blending = opts.config.blending, + .default_storage_mode = default_storage_mode, }; - - try result.initShaders(); - - // Do an initialize screen size setup to ensure our undefined values - // above are initialized. - try result.setScreenSize(result.size); - - return result; } pub fn deinit(self: *Metal) void { - self.gpu_state.deinit(); + self.queue.release(); + self.device.release(); - if (DisplayLink != void) { - if (self.display_link) |display_link| { - display_link.stop() catch {}; - display_link.release(); - } - } - - self.terminal_colorspace.release(); - - self.cells.deinit(self.alloc); - - self.font_shaper.deinit(); - self.font_shaper_cache.deinit(self.alloc); - - self.config.deinit(); - - { - var it = self.images.iterator(); - while (it.next()) |kv| kv.value_ptr.image.deinit(self.alloc); - self.images.deinit(self.alloc); - } - self.image_placements.deinit(self.alloc); - - self.deinitShaders(); - - self.* = undefined; + // NOTE: We don't release the layer here because that should be taken + // care of automatically when the hosting view is destroyed. } -fn deinitShaders(self: *Metal) void { - if (self.custom_shader_state) |*state| state.deinit(); - - self.shaders.deinit(self.alloc); +pub fn loopEnter(self: *Metal) void { + const renderer: *align(1) Renderer = @fieldParentPtr("api", self); + self.layer.setDisplayCallback( + @ptrCast(&displayCallback), + @ptrCast(renderer), + ); } -fn initShaders(self: *Metal) !void { - var arena = ArenaAllocator.init(self.alloc); - defer arena.deinit(); - const arena_alloc = arena.allocator(); - - // Load our custom shaders - const custom_shaders: []const [:0]const u8 = shadertoy.loadFromFiles( - arena_alloc, - self.config.custom_shaders, - .msl, - ) catch |err| err: { - log.warn("error loading custom shaders err={}", .{err}); - break :err &.{}; +fn displayCallback(renderer: *Renderer) align(8) void { + renderer.drawFrame(true) catch |err| { + log.warn("Error drawing frame in display callback, err={}", .{err}); }; +} - var custom_shader_state: ?CustomShaderState = state: { - if (custom_shaders.len == 0) break :state null; - - // Build our sampler for our texture - var sampler = try mtl_sampler.Sampler.init(self.gpu_state.device); - errdefer sampler.deinit(); - - break :state .{ - // Resolution and screen textures will be fixed up by first - // call to setScreenSize. Draw calls will bail out early if - // the screen size hasn't been set yet, so it won't error. - .front_texture = undefined, - .back_texture = undefined, - .sampler = sampler, - .uniforms = .{ - .resolution = .{ 0, 0, 1 }, - .time = 1, - .time_delta = 1, - .frame_rate = 1, - .frame = 1, - .channel_time = [1][4]f32{.{ 0, 0, 0, 0 }} ** 4, - .channel_resolution = [1][4]f32{.{ 0, 0, 0, 0 }} ** 4, - .mouse = .{ 0, 0, 0, 0 }, - .date = .{ 0, 0, 0, 0 }, - .sample_rate = 1, - }, - - .first_frame_time = try std.time.Instant.now(), - .last_frame_time = try std.time.Instant.now(), - }; - }; - errdefer if (custom_shader_state) |*state| state.deinit(); - - var shaders = try Shaders.init( - self.alloc, - self.gpu_state.device, +pub fn initShaders( + self: *const Metal, + alloc: Allocator, + custom_shaders: []const [:0]const u8, +) !shaders.Shaders { + return try shaders.Shaders.init( + alloc, + self.device, custom_shaders, // Using an `*_srgb` pixel format makes Metal gamma encode // the pixels written to it *after* blending, which means // we get linear alpha blending rather than gamma-incorrect // blending. - if (self.config.blending.isLinear()) + if (self.blending.isLinear()) mtl.MTLPixelFormat.bgra8unorm_srgb else mtl.MTLPixelFormat.bgra8unorm, ); - errdefer shaders.deinit(self.alloc); - - self.shaders = shaders; - self.custom_shader_state = custom_shader_state; } -/// This is called just prior to spinning up the renderer thread for -/// final main thread setup requirements. -pub fn finalizeSurfaceInit(self: *Metal, surface: *apprt.Surface) !void { - _ = self; - _ = surface; - - // Metal doesn't have to do anything here. OpenGL has to do things - // like release the context but Metal doesn't have anything like that. -} - -/// Callback called by renderer.Thread when it begins. -pub fn threadEnter(self: *const Metal, surface: *apprt.Surface) !void { - _ = self; - _ = surface; - - // Metal requires no per-thread state. -} - -/// Callback called by renderer.Thread when it exits. -pub fn threadExit(self: *const Metal) void { - _ = self; - - // Metal requires no per-thread state. -} - -/// Called by renderer.Thread when it starts the main loop. -pub fn loopEnter(self: *Metal, thr: *renderer.Thread) !void { - // If we don't support a display link we have no work to do. - if (comptime DisplayLink == void) return; - - // This is when we know our "self" pointer is stable so we can - // setup the display link. To setup the display link we set our - // callback and we can start it immediately. - const display_link = self.display_link orelse return; - try display_link.setOutputCallback( - xev.Async, - &displayLinkCallback, - &thr.draw_now, - ); - display_link.start() catch {}; -} - -/// Called by renderer.Thread when it exits the main loop. -pub fn loopExit(self: *Metal) void { - // If we don't support a display link we have no work to do. - if (comptime DisplayLink == void) return; - - // Stop our display link. If this fails its okay it just means - // that we either never started it or the view its attached to - // is gone which is fine. - const display_link = self.display_link orelse return; - display_link.stop() catch {}; -} - -fn displayLinkCallback( - _: *macos.video.DisplayLink, - ud: ?*xev.Async, -) void { - const draw_now = ud orelse return; - draw_now.notify() catch |err| { - log.err("error notifying draw_now err={}", .{err}); +/// Get the current size of the runtime surface. +pub fn surfaceSize(self: *const Metal) !struct { width: u32, height: u32 } { + const bounds = self.layer.layer.getProperty(graphics.Rect, "bounds"); + const scale = self.layer.layer.getProperty(f64, "contentsScale"); + return .{ + .width = @intFromFloat(bounds.size.width * scale), + .height = @intFromFloat(bounds.size.height * scale), }; } -/// Mark the full screen as dirty so that we redraw everything. -pub fn markDirty(self: *Metal) void { - // This is how we force a full rebuild with metal. - self.cells_viewport = null; -} - -/// Called when we get an updated display ID for our display link. -pub fn setMacOSDisplayID(self: *Metal, id: u32) !void { - if (comptime DisplayLink == void) return; - const display_link = self.display_link orelse return; - log.info("updating display link display id={}", .{id}); - display_link.setCurrentCGDisplay(id) catch |err| { - log.warn("error setting display link display id err={}", .{err}); - }; -} - -/// True if our renderer has animations so that a higher frequency -/// timer is used. -pub fn hasAnimations(self: *const Metal) bool { - return self.custom_shader_state != null; -} - -/// True if our renderer is using vsync. If true, the renderer or apprt -/// is responsible for triggering draw_now calls to the render thread. That -/// is the only way to trigger a drawFrame. -pub fn hasVsync(self: *const Metal) bool { - if (comptime DisplayLink == void) return false; - const display_link = self.display_link orelse return false; - return display_link.isRunning(); -} - -/// Callback when the focus changes for the terminal this is rendering. -/// -/// Must be called on the render thread. -pub fn setFocus(self: *Metal, focus: bool) !void { - self.focused = focus; - - // If we're not focused, then we want to stop the display link - // because it is a waste of resources and we can move to pure - // change-driven updates. - if (comptime DisplayLink != void) link: { - const display_link = self.display_link orelse break :link; - if (focus) { - display_link.start() catch {}; - } else { - display_link.stop() catch {}; - } - } -} - -/// Callback when the window is visible or occluded. -/// -/// Must be called on the render thread. -pub fn setVisible(self: *Metal, visible: bool) void { - // If we're not visible, then we want to stop the display link - // because it is a waste of resources and we can move to pure - // change-driven updates. - if (comptime DisplayLink != void) link: { - const display_link = self.display_link orelse break :link; - if (visible and self.focused) { - display_link.start() catch {}; - } else { - display_link.stop() catch {}; - } - } -} - -/// Set the new font grid. -/// -/// Must be called on the render thread. -pub fn setFontGrid(self: *Metal, grid: *font.SharedGrid) void { - // Update our grid - self.font_grid = grid; - - // Update all our textures so that they sync on the next frame. - // We can modify this without a lock because the GPU does not - // touch this data. - for (&self.gpu_state.frames) |*frame| { - frame.grayscale_modified = 0; - frame.color_modified = 0; - } - - // Get our metrics from the grid. This doesn't require a lock because - // the metrics are never recalculated. - const metrics = grid.metrics; - self.grid_metrics = metrics; - - // Reset our shaper cache. If our font changed (not just the size) then - // the data in the shaper cache may be invalid and cannot be used, so we - // always clear the cache just in case. - const font_shaper_cache = font.ShaperCache.init(); - self.font_shaper_cache.deinit(self.alloc); - self.font_shaper_cache = font_shaper_cache; - - // Run a screen size update since this handles a lot of our uniforms - // that are grid size dependent and changing the font grid can change - // the grid size. - // - // If the screen size isn't set, it will be eventually so that'll call - // the setScreenSize automatically. - self.setScreenSize(self.size) catch |err| { - // The setFontGrid function can't fail but resizing our cell - // buffer definitely can fail. If it does, our renderer is probably - // screwed but let's just log it and continue until we can figure - // out a better way to handle this. - log.err("error resizing cells buffer err={}", .{err}); - }; - - // Reset our viewport to force a rebuild, since `setScreenSize` only - // does this when the number of cells changes, which isn't guaranteed. - self.cells_viewport = null; -} - -/// Update the frame data. -pub fn updateFrame( - self: *Metal, - surface: *apprt.Surface, - state: *renderer.State, - cursor_blink_visible: bool, -) !void { - _ = surface; - - // Data we extract out of the critical area. - const Critical = struct { - bg: terminal.color.RGB, - screen: terminal.Screen, - screen_type: terminal.ScreenType, - mouse: renderer.State.Mouse, - preedit: ?renderer.State.Preedit, - cursor_style: ?renderer.CursorStyle, - color_palette: terminal.color.Palette, - viewport_pin: terminal.Pin, - - /// If true, rebuild the full screen. - full_rebuild: bool, - }; - - // Update all our data as tightly as possible within the mutex. - var critical: Critical = critical: { - // const start = try std.time.Instant.now(); - // const start_micro = std.time.microTimestamp(); - // defer { - // const end = std.time.Instant.now() catch unreachable; - // // "[updateFrame critical time] \t" - // std.log.err("[updateFrame critical time] {}\t{}", .{start_micro, end.since(start) / std.time.ns_per_us}); - // } - - state.mutex.lock(); - defer state.mutex.unlock(); - - // If we're in a synchronized output state, we pause all rendering. - if (state.terminal.modes.get(.synchronized_output)) { - log.debug("synchronized output started, skipping render", .{}); - return; - } - - // Swap bg/fg if the terminal is reversed - const bg = self.background_color orelse self.default_background_color; - const fg = self.foreground_color orelse self.default_foreground_color; - defer { - if (self.background_color) |*c| { - c.* = bg; - } else { - self.default_background_color = bg; - } - - if (self.foreground_color) |*c| { - c.* = fg; - } else { - self.default_foreground_color = fg; - } - } - - if (state.terminal.modes.get(.reverse_colors)) { - if (self.background_color) |*c| { - c.* = fg; - } else { - self.default_background_color = fg; - } - - if (self.foreground_color) |*c| { - c.* = bg; - } else { - self.default_foreground_color = bg; - } - } - - // Get the viewport pin so that we can compare it to the current. - const viewport_pin = state.terminal.screen.pages.pin(.{ .viewport = .{} }).?; - - // We used to share terminal state, but we've since learned through - // analysis that it is faster to copy the terminal state than to - // hold the lock while rebuilding GPU cells. - var screen_copy = try state.terminal.screen.clone( - self.alloc, - .{ .viewport = .{} }, - null, - ); - errdefer screen_copy.deinit(); - - // Whether to draw our cursor or not. - const cursor_style = if (state.terminal.flags.password_input) - .lock +/// Initialize a new render target which can be presented by this API. +pub fn initTarget(self: *const Metal, width: usize, height: usize) !Target { + return Target.init(.{ + .device = self.device, + // Using an `*_srgb` pixel format makes Metal gamma encode the pixels + // written to it *after* blending, which means we get linear alpha + // blending rather than gamma-incorrect blending. + .pixel_format = if (self.blending.isLinear()) + .bgra8unorm_srgb else - renderer.cursorStyle( - state, - self.focused, - cursor_blink_visible, - ); - - // Get our preedit state - const preedit: ?renderer.State.Preedit = preedit: { - if (cursor_style == null) break :preedit null; - const p = state.preedit orelse break :preedit null; - break :preedit try p.clone(self.alloc); - }; - errdefer if (preedit) |p| p.deinit(self.alloc); - - // If we have Kitty graphics data, we enter a SLOW SLOW SLOW path. - // We only do this if the Kitty image state is dirty meaning only if - // it changes. - // - // If we have any virtual references, we must also rebuild our - // kitty state on every frame because any cell change can move - // an image. - if (state.terminal.screen.kitty_images.dirty or - self.image_virtual) - { - try self.prepKittyGraphics(state.terminal); - } - - // If we have any terminal dirty flags set then we need to rebuild - // the entire screen. This can be optimized in the future. - const full_rebuild: bool = rebuild: { - { - const Int = @typeInfo(terminal.Terminal.Dirty).@"struct".backing_integer.?; - const v: Int = @bitCast(state.terminal.flags.dirty); - if (v > 0) break :rebuild true; - } - { - const Int = @typeInfo(terminal.Screen.Dirty).@"struct".backing_integer.?; - const v: Int = @bitCast(state.terminal.screen.dirty); - if (v > 0) break :rebuild true; - } - - // If our viewport changed then we need to rebuild the entire - // screen because it means we scrolled. If we have no previous - // viewport then we must rebuild. - const prev_viewport = self.cells_viewport orelse break :rebuild true; - if (!prev_viewport.eql(viewport_pin)) break :rebuild true; - - break :rebuild false; - }; - - // Reset the dirty flags in the terminal and screen. We assume - // that our rebuild will be successful since so we optimize for - // success and reset while we hold the lock. This is much easier - // than coordinating row by row or as changes are persisted. - state.terminal.flags.dirty = .{}; - state.terminal.screen.dirty = .{}; - { - var it = state.terminal.screen.pages.pageIterator( - .right_down, - .{ .screen = .{} }, - null, - ); - while (it.next()) |chunk| { - var dirty_set = chunk.node.data.dirtyBitSet(); - dirty_set.unsetAll(); - } - } - - break :critical .{ - .bg = self.background_color orelse self.default_background_color, - .screen = screen_copy, - .screen_type = state.terminal.active_screen, - .mouse = state.mouse, - .preedit = preedit, - .cursor_style = cursor_style, - .color_palette = state.terminal.color_palette.colors, - .viewport_pin = viewport_pin, - .full_rebuild = full_rebuild, - }; - }; - defer { - critical.screen.deinit(); - if (critical.preedit) |p| p.deinit(self.alloc); - } - - // Build our GPU cells - try self.rebuildCells( - critical.full_rebuild, - &critical.screen, - critical.screen_type, - critical.mouse, - critical.preedit, - critical.cursor_style, - &critical.color_palette, - ); - - // Notify our shaper we're done for the frame. For some shapers like - // CoreText this triggers off-thread cleanup logic. - self.font_shaper.endFrame(); - - // Update our viewport pin - self.cells_viewport = critical.viewport_pin; - - // Update our background color - self.uniforms.bg_color = .{ - critical.bg.r, - critical.bg.g, - critical.bg.b, - @intFromFloat(@round(self.config.background_opacity * 255.0)), - }; - - // Update the background color on our layer - // - // TODO: Is this expensive? Should we be checking if our - // bg color has changed first before doing this work? - { - const color = graphics.c.CGColorCreate( - @ptrCast(self.terminal_colorspace), - &[4]f64{ - @as(f64, @floatFromInt(critical.bg.r)) / 255.0, - @as(f64, @floatFromInt(critical.bg.g)) / 255.0, - @as(f64, @floatFromInt(critical.bg.b)) / 255.0, - self.config.background_opacity, - }, - ); - defer graphics.c.CGColorRelease(color); - - // We use a CATransaction so that Core Animation knows that we - // updated the background color property. Otherwise it behaves - // weird, not updating the color until we resize. - const CATransaction = objc.getClass("CATransaction").?; - CATransaction.msgSend(void, "begin", .{}); - defer CATransaction.msgSend(void, "commit", .{}); - - self.layer.setProperty("backgroundColor", color); - } - - // Go through our images and see if we need to setup any textures. - { - var image_it = self.images.iterator(); - while (image_it.next()) |kv| { - switch (kv.value_ptr.image) { - .ready => {}, - - .pending_gray, - .pending_gray_alpha, - .pending_rgb, - .pending_rgba, - .replace_gray, - .replace_gray_alpha, - .replace_rgb, - .replace_rgba, - => try kv.value_ptr.image.upload( - self.alloc, - self.gpu_state.device, - self.gpu_state.default_storage_mode, - ), - - .unload_pending, - .unload_replace, - .unload_ready, - => { - kv.value_ptr.image.deinit(self.alloc); - self.images.removeByPtr(kv.key_ptr); - }, - } - } - } -} - -/// Draw the frame to the screen. -pub fn drawFrame(self: *Metal, surface: *apprt.Surface) !void { - _ = surface; - - // If we have no cells rebuilt we can usually skip drawing since there - // is no changed data. However, if we have active animations we still - // need to draw so that we can update the time uniform and render the - // changes. - if (!self.cells_rebuilt and !self.hasAnimations()) return; - self.cells_rebuilt = false; - - // Wait for a frame to be available. - const frame = self.gpu_state.nextFrame(); - errdefer self.gpu_state.releaseFrame(); - // log.debug("drawing frame index={}", .{self.gpu_state.frame_index}); - - // Setup our frame data - try frame.uniforms.sync(self.gpu_state.device, &.{self.uniforms}); - try frame.cells_bg.sync(self.gpu_state.device, self.cells.bg_cells); - const fg_count = try frame.cells.syncFromArrayLists(self.gpu_state.device, self.cells.fg_rows.lists); - - // If we have custom shaders, update the animation time. - if (self.custom_shader_state) |*state| { - const now = std.time.Instant.now() catch state.first_frame_time; - const since_ns: f32 = @floatFromInt(now.since(state.first_frame_time)); - const delta_ns: f32 = @floatFromInt(now.since(state.last_frame_time)); - state.uniforms.time = since_ns / std.time.ns_per_s; - state.uniforms.time_delta = delta_ns / std.time.ns_per_s; - state.last_frame_time = now; - } - - // @autoreleasepool {} - const pool = objc.AutoreleasePool.init(); - defer pool.deinit(); - - // Get our drawable (CAMetalDrawable) - const drawable = self.layer.msgSend(objc.Object, objc.sel("nextDrawable"), .{}); - - // Get our screen texture. If we don't have a dedicated screen texture - // then we just use the drawable texture. - const screen_texture = if (self.custom_shader_state) |state| - state.back_texture - else tex: { - const texture = drawable.msgSend(objc.c.id, objc.sel("texture"), .{}); - break :tex objc.Object.fromId(texture); - }; - - // If our font atlas changed, sync the texture data - texture: { - const modified = self.font_grid.atlas_grayscale.modified.load(.monotonic); - if (modified <= frame.grayscale_modified) break :texture; - self.font_grid.lock.lockShared(); - defer self.font_grid.lock.unlockShared(); - frame.grayscale_modified = self.font_grid.atlas_grayscale.modified.load(.monotonic); - try syncAtlasTexture( - self.gpu_state.device, - &self.font_grid.atlas_grayscale, - &frame.grayscale, - self.gpu_state.default_storage_mode, - ); - } - texture: { - const modified = self.font_grid.atlas_color.modified.load(.monotonic); - if (modified <= frame.color_modified) break :texture; - self.font_grid.lock.lockShared(); - defer self.font_grid.lock.unlockShared(); - frame.color_modified = self.font_grid.atlas_color.modified.load(.monotonic); - try syncAtlasTexture( - self.gpu_state.device, - &self.font_grid.atlas_color, - &frame.color, - self.gpu_state.default_storage_mode, - ); - } - - // Command buffer (MTLCommandBuffer) - const buffer = self.gpu_state.queue.msgSend(objc.Object, objc.sel("commandBuffer"), .{}); - - { - // MTLRenderPassDescriptor - const desc = desc: { - const MTLRenderPassDescriptor = objc.getClass("MTLRenderPassDescriptor").?; - const desc = MTLRenderPassDescriptor.msgSend( - objc.Object, - objc.sel("renderPassDescriptor"), - .{}, - ); - - // Set our color attachment to be our drawable surface. - const attachments = objc.Object.fromId(desc.getProperty(?*anyopaque, "colorAttachments")); - { - const attachment = attachments.msgSend( - objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, 0)}, - ); - - attachment.setProperty("loadAction", @intFromEnum(mtl.MTLLoadAction.clear)); - attachment.setProperty("storeAction", @intFromEnum(mtl.MTLStoreAction.store)); - attachment.setProperty("texture", screen_texture.value); - attachment.setProperty("clearColor", mtl.MTLClearColor{ - .red = 0.0, - .green = 0.0, - .blue = 0.0, - .alpha = 0.0, - }); - } - - break :desc desc; - }; - - // MTLRenderCommandEncoder - const encoder = buffer.msgSend( - objc.Object, - objc.sel("renderCommandEncoderWithDescriptor:"), - .{desc.value}, - ); - defer encoder.msgSend(void, objc.sel("endEncoding"), .{}); - - // Draw background images first - try self.drawImagePlacements(encoder, frame, self.image_placements.items[0..self.image_bg_end]); - - // Then draw background cells - try self.drawCellBgs(encoder, frame); - - // Then draw images under text - try self.drawImagePlacements(encoder, frame, self.image_placements.items[self.image_bg_end..self.image_text_end]); - - // Then draw fg cells - try self.drawCellFgs(encoder, frame, fg_count); - - // Then draw remaining images - try self.drawImagePlacements(encoder, frame, self.image_placements.items[self.image_text_end..]); - } - - // If we have custom shaders, then we render them. - if (self.custom_shader_state) |*state| { - // MTLRenderPassDescriptor - const desc = desc: { - const MTLRenderPassDescriptor = objc.getClass("MTLRenderPassDescriptor").?; - const desc = MTLRenderPassDescriptor.msgSend( - objc.Object, - objc.sel("renderPassDescriptor"), - .{}, - ); - - break :desc desc; - }; - - // Prepare our color attachment (output). - const attachments = objc.Object.fromId(desc.getProperty(?*anyopaque, "colorAttachments")); - const attachment = attachments.msgSend( - objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, 0)}, - ); - attachment.setProperty("loadAction", @intFromEnum(mtl.MTLLoadAction.clear)); - attachment.setProperty("storeAction", @intFromEnum(mtl.MTLStoreAction.store)); - attachment.setProperty("clearColor", mtl.MTLClearColor{ - .red = 0, - .green = 0, - .blue = 0, - .alpha = 1, - }); - - const post_len = self.shaders.post_pipelines.len; - - for (self.shaders.post_pipelines[0 .. post_len - 1]) |pipeline| { - // Set our color attachment to be our front texture. - attachment.setProperty("texture", state.front_texture.value); - - // MTLRenderCommandEncoder - const encoder = buffer.msgSend( - objc.Object, - objc.sel("renderCommandEncoderWithDescriptor:"), - .{desc.value}, - ); - defer encoder.msgSend(void, objc.sel("endEncoding"), .{}); - - // Draw shader - try self.drawPostShader(encoder, pipeline, state); - // Swap the front and back textures. - state.swap(); - } - - // Draw the final shader directly to the drawable. - { - // Set our color attachment to be our drawable. - // - // Texture is a property of CAMetalDrawable but if you run - // Ghostty in XCode in debug mode it returns a CaptureMTLDrawable - // which ironically doesn't implement CAMetalDrawable as a - // property so we just send a message. - const texture = drawable.msgSend(objc.c.id, objc.sel("texture"), .{}); - attachment.setProperty("texture", texture); - - // MTLRenderCommandEncoder - const encoder = buffer.msgSend( - objc.Object, - objc.sel("renderCommandEncoderWithDescriptor:"), - .{desc.value}, - ); - defer encoder.msgSend(void, objc.sel("endEncoding"), .{}); - - try self.drawPostShader( - encoder, - self.shaders.post_pipelines[post_len - 1], - state, - ); - } - } - - buffer.msgSend(void, objc.sel("presentDrawable:"), .{drawable.value}); - - // Create our block to register for completion updates. This is used - // so we can detect failures. The block is deallocated by the objC - // runtime on success. - const block = try CompletionBlock.init(.{ .self = self }, &bufferCompleted); - errdefer block.deinit(); - buffer.msgSend(void, objc.sel("addCompletedHandler:"), .{block.context}); - - buffer.msgSend(void, objc.sel("commit"), .{}); -} - -/// This is the block type used for the addCompletedHandler call.back. -const CompletionBlock = objc.Block(struct { self: *Metal }, .{ - objc.c.id, // MTLCommandBuffer -}, void); - -/// This is the callback called by the CompletionBlock invocation for -/// addCompletedHandler. -/// -/// Note: this is USUALLY called on a separate thread because the renderer -/// thread and the Apple event loop threads are usually different. Therefore, -/// we need to be mindful of thread safety here. -fn bufferCompleted( - block: *const CompletionBlock.Context, - buffer_id: objc.c.id, -) callconv(.c) void { - const self = block.self; - const buffer = objc.Object.fromId(buffer_id); - - // Get our command buffer status. If it is anything other than error - // then we don't care and just return right away. We're looking for - // errors so that we can log them. - const status = buffer.getProperty(mtl.MTLCommandBufferStatus, "status"); - const health: Health = switch (status) { - .@"error" => .unhealthy, - else => .healthy, - }; - - // If our health value hasn't changed, then we do nothing. We don't - // do a cmpxchg here because strict atomicity isn't important. - if (self.health.load(.seq_cst) != health) { - self.health.store(health, .seq_cst); - - // Our health value changed, so we notify the surface so that it - // can do something about it. - _ = self.surface_mailbox.push(.{ - .renderer_health = health, - }, .{ .forever = {} }); - } - - // Always release our semaphore - self.gpu_state.releaseFrame(); -} - -fn drawPostShader( - self: *Metal, - encoder: objc.Object, - pipeline: objc.Object, - state: *const CustomShaderState, -) !void { - _ = self; - - // Use our custom shader pipeline - encoder.msgSend( - void, - objc.sel("setRenderPipelineState:"), - .{pipeline.value}, - ); - - // Set our sampler - encoder.msgSend( - void, - objc.sel("setFragmentSamplerState:atIndex:"), - .{ state.sampler.sampler.value, @as(c_ulong, 0) }, - ); - - // Set our uniforms - encoder.msgSend( - void, - objc.sel("setFragmentBytes:length:atIndex:"), - .{ - @as(*const anyopaque, @ptrCast(&state.uniforms)), - @as(c_ulong, @sizeOf(@TypeOf(state.uniforms))), - @as(c_ulong, 0), - }, - ); - - // Screen texture - encoder.msgSend( - void, - objc.sel("setFragmentTexture:atIndex:"), - .{ - state.back_texture.value, - @as(c_ulong, 0), - }, - ); - - // Draw! - encoder.msgSend( - void, - objc.sel("drawPrimitives:vertexStart:vertexCount:"), - .{ - @intFromEnum(mtl.MTLPrimitiveType.triangle), - @as(c_ulong, 0), - @as(c_ulong, 3), - }, - ); -} - -fn drawImagePlacements( - self: *Metal, - encoder: objc.Object, - frame: *const FrameState, - placements: []const mtl_image.Placement, -) !void { - if (placements.len == 0) return; - - // Use our image shader pipeline - encoder.msgSend( - void, - objc.sel("setRenderPipelineState:"), - .{self.shaders.image_pipeline.value}, - ); - - // Set our uniforms - encoder.msgSend( - void, - objc.sel("setVertexBuffer:offset:atIndex:"), - .{ frame.uniforms.buffer.value, @as(c_ulong, 0), @as(c_ulong, 1) }, - ); - encoder.msgSend( - void, - objc.sel("setFragmentBuffer:offset:atIndex:"), - .{ frame.uniforms.buffer.value, @as(c_ulong, 0), @as(c_ulong, 1) }, - ); - - for (placements) |placement| { - try self.drawImagePlacement(encoder, placement); - } -} - -fn drawImagePlacement( - self: *Metal, - encoder: objc.Object, - p: mtl_image.Placement, -) !void { - // Look up the image - const image = self.images.get(p.image_id) orelse { - log.warn("image not found for placement image_id={}", .{p.image_id}); - return; - }; - - // Get the texture - const texture = switch (image.image) { - .ready => |t| t, - else => { - log.warn("image not ready for placement image_id={}", .{p.image_id}); - return; - }, - }; - - // Create our vertex buffer, which is always exactly one item. - // future(mitchellh): we can group rendering multiple instances of a single image - const Buffer = mtl_buffer.Buffer(mtl_shaders.Image); - var buf = try Buffer.initFill(self.gpu_state.device, &.{.{ - .grid_pos = .{ - @as(f32, @floatFromInt(p.x)), - @as(f32, @floatFromInt(p.y)), - }, - - .cell_offset = .{ - @as(f32, @floatFromInt(p.cell_offset_x)), - @as(f32, @floatFromInt(p.cell_offset_y)), - }, - - .source_rect = .{ - @as(f32, @floatFromInt(p.source_x)), - @as(f32, @floatFromInt(p.source_y)), - @as(f32, @floatFromInt(p.source_width)), - @as(f32, @floatFromInt(p.source_height)), - }, - - .dest_size = .{ - @as(f32, @floatFromInt(p.width)), - @as(f32, @floatFromInt(p.height)), - }, - }}, .{ - // Indicate that the CPU writes to this resource but never reads it. - .cpu_cache_mode = .write_combined, - .storage_mode = self.gpu_state.default_storage_mode, - }); - defer buf.deinit(); - - // Set our buffer - encoder.msgSend( - void, - objc.sel("setVertexBuffer:offset:atIndex:"), - .{ buf.buffer.value, @as(c_ulong, 0), @as(c_ulong, 0) }, - ); - - // Set our texture - encoder.msgSend( - void, - objc.sel("setVertexTexture:atIndex:"), - .{ - texture.value, - @as(c_ulong, 0), - }, - ); - encoder.msgSend( - void, - objc.sel("setFragmentTexture:atIndex:"), - .{ - texture.value, - @as(c_ulong, 0), - }, - ); - - // Draw! - encoder.msgSend( - void, - objc.sel("drawIndexedPrimitives:indexCount:indexType:indexBuffer:indexBufferOffset:instanceCount:"), - .{ - @intFromEnum(mtl.MTLPrimitiveType.triangle), - @as(c_ulong, 6), - @intFromEnum(mtl.MTLIndexType.uint16), - self.gpu_state.instance.buffer.value, - @as(c_ulong, 0), - @as(c_ulong, 1), - }, - ); - - // log.debug("drawImagePlacement: {}", .{p}); -} - -/// Draw the cell backgrounds. -fn drawCellBgs( - self: *Metal, - encoder: objc.Object, - frame: *const FrameState, -) !void { - // Use our shader pipeline - encoder.msgSend( - void, - objc.sel("setRenderPipelineState:"), - .{self.shaders.cell_bg_pipeline.value}, - ); - - // Set our buffers - encoder.msgSend( - void, - objc.sel("setVertexBuffer:offset:atIndex:"), - .{ frame.uniforms.buffer.value, @as(c_ulong, 0), @as(c_ulong, 1) }, - ); - encoder.msgSend( - void, - objc.sel("setFragmentBuffer:offset:atIndex:"), - .{ frame.cells_bg.buffer.value, @as(c_ulong, 0), @as(c_ulong, 0) }, - ); - encoder.msgSend( - void, - objc.sel("setFragmentBuffer:offset:atIndex:"), - .{ frame.uniforms.buffer.value, @as(c_ulong, 0), @as(c_ulong, 1) }, - ); - - encoder.msgSend( - void, - objc.sel("drawPrimitives:vertexStart:vertexCount:"), - .{ - @intFromEnum(mtl.MTLPrimitiveType.triangle), - @as(c_ulong, 0), - @as(c_ulong, 3), - }, - ); -} - -/// Draw the cell foregrounds using the text shader. -fn drawCellFgs( - self: *Metal, - encoder: objc.Object, - frame: *const FrameState, - len: usize, -) !void { - // This triggers an assertion in the Metal API if we try to draw - // with an instance count of 0 so just bail. - if (len == 0) return; - - // Use our shader pipeline - encoder.msgSend( - void, - objc.sel("setRenderPipelineState:"), - .{self.shaders.cell_text_pipeline.value}, - ); - - // Set our buffers - encoder.msgSend( - void, - objc.sel("setVertexBuffer:offset:atIndex:"), - .{ frame.cells.buffer.value, @as(c_ulong, 0), @as(c_ulong, 0) }, - ); - encoder.msgSend( - void, - objc.sel("setVertexBuffer:offset:atIndex:"), - .{ frame.uniforms.buffer.value, @as(c_ulong, 0), @as(c_ulong, 1) }, - ); - encoder.msgSend( - void, - objc.sel("setVertexBuffer:offset:atIndex:"), - .{ frame.cells_bg.buffer.value, @as(c_ulong, 0), @as(c_ulong, 2) }, - ); - encoder.msgSend( - void, - objc.sel("setFragmentTexture:atIndex:"), - .{ frame.grayscale.value, @as(c_ulong, 0) }, - ); - encoder.msgSend( - void, - objc.sel("setFragmentTexture:atIndex:"), - .{ frame.color.value, @as(c_ulong, 1) }, - ); - encoder.msgSend( - void, - objc.sel("setFragmentBuffer:offset:atIndex:"), - .{ frame.uniforms.buffer.value, @as(c_ulong, 0), @as(c_ulong, 2) }, - ); - - encoder.msgSend( - void, - objc.sel("drawIndexedPrimitives:indexCount:indexType:indexBuffer:indexBufferOffset:instanceCount:"), - .{ - @intFromEnum(mtl.MTLPrimitiveType.triangle), - @as(c_ulong, 6), - @intFromEnum(mtl.MTLIndexType.uint16), - self.gpu_state.instance.buffer.value, - @as(c_ulong, 0), - @as(c_ulong, len), - }, - ); -} - -/// This goes through the Kitty graphic placements and accumulates the -/// placements we need to render on our viewport. It also ensures that -/// the visible images are loaded on the GPU. -fn prepKittyGraphics( - self: *Metal, - t: *terminal.Terminal, -) !void { - const storage = &t.screen.kitty_images; - defer storage.dirty = false; - - // We always clear our previous placements no matter what because - // we rebuild them from scratch. - self.image_placements.clearRetainingCapacity(); - self.image_virtual = false; - - // Go through our known images and if there are any that are no longer - // in use then mark them to be freed. - // - // This never conflicts with the below because a placement can't - // reference an image that doesn't exist. - { - var it = self.images.iterator(); - while (it.next()) |kv| { - if (storage.imageById(kv.key_ptr.*) == null) { - kv.value_ptr.image.markForUnload(); - } - } - } - - // The top-left and bottom-right corners of our viewport in screen - // points. This lets us determine offsets and containment of placements. - const top = t.screen.pages.getTopLeft(.viewport); - const bot = t.screen.pages.getBottomRight(.viewport).?; - const top_y = t.screen.pages.pointFromPin(.screen, top).?.screen.y; - const bot_y = t.screen.pages.pointFromPin(.screen, bot).?.screen.y; - - // Go through the placements and ensure the image is loaded on the GPU. - var it = storage.placements.iterator(); - while (it.next()) |kv| { - const p = kv.value_ptr; - - // Special logic based on location - switch (p.location) { - .pin => {}, - .virtual => { - // We need to mark virtual placements on our renderer so that - // we know to rebuild in more scenarios since cell changes can - // now trigger placement changes. - self.image_virtual = true; - - // We also continue out because virtual placements are - // only triggered by the unicode placeholder, not by the - // placement itself. - continue; - }, - } - - // Get the image for the placement - const image = storage.imageById(kv.key_ptr.image_id) orelse { - log.warn( - "missing image for placement, ignoring image_id={}", - .{kv.key_ptr.image_id}, - ); - continue; - }; - - try self.prepKittyPlacement(t, top_y, bot_y, &image, p); - } - - // If we have virtual placements then we need to scan for placeholders. - if (self.image_virtual) { - var v_it = terminal.kitty.graphics.unicode.placementIterator(top, bot); - while (v_it.next()) |virtual_p| try self.prepKittyVirtualPlacement( - t, - &virtual_p, - ); - } - - // Sort the placements by their Z value. - std.mem.sortUnstable( - mtl_image.Placement, - self.image_placements.items, - {}, - struct { - fn lessThan( - ctx: void, - lhs: mtl_image.Placement, - rhs: mtl_image.Placement, - ) bool { - _ = ctx; - return lhs.z < rhs.z or (lhs.z == rhs.z and lhs.image_id < rhs.image_id); - } - }.lessThan, - ); - - // Find our indices. The values are sorted by z so we can find the - // first placement out of bounds to find the limits. - var bg_end: ?u32 = null; - var text_end: ?u32 = null; - const bg_limit = std.math.minInt(i32) / 2; - for (self.image_placements.items, 0..) |p, i| { - if (bg_end == null and p.z >= bg_limit) { - bg_end = @intCast(i); - } - if (text_end == null and p.z >= 0) { - text_end = @intCast(i); - } - } - - self.image_bg_end = bg_end orelse 0; - self.image_text_end = text_end orelse self.image_bg_end; -} - -fn prepKittyVirtualPlacement( - self: *Metal, - t: *terminal.Terminal, - p: *const terminal.kitty.graphics.unicode.Placement, -) !void { - const storage = &t.screen.kitty_images; - const image = storage.imageById(p.image_id) orelse { - log.warn( - "missing image for virtual placement, ignoring image_id={}", - .{p.image_id}, - ); - return; - }; - - const rp = p.renderPlacement( - storage, - &image, - self.grid_metrics.cell_width, - self.grid_metrics.cell_height, - ) catch |err| { - log.warn("error rendering virtual placement err={}", .{err}); - return; - }; - - // If our placement is zero sized then we don't do anything. - if (rp.dest_width == 0 or rp.dest_height == 0) return; - - const viewport: terminal.point.Point = t.screen.pages.pointFromPin( - .viewport, - rp.top_left, - ) orelse { - // This is unreachable with virtual placements because we should - // only ever be looking at virtual placements that are in our - // viewport in the renderer and virtual placements only ever take - // up one row. - unreachable; - }; - - // Send our image to the GPU and store the placement for rendering. - try self.prepKittyImage(&image); - try self.image_placements.append(self.alloc, .{ - .image_id = image.id, - .x = @intCast(rp.top_left.x), - .y = @intCast(viewport.viewport.y), - .z = -1, - .width = rp.dest_width, - .height = rp.dest_height, - .cell_offset_x = rp.offset_x, - .cell_offset_y = rp.offset_y, - .source_x = rp.source_x, - .source_y = rp.source_y, - .source_width = rp.source_width, - .source_height = rp.source_height, + .bgra8unorm, + .storage_mode = self.default_storage_mode, + .width = width, + .height = height, }); } -fn prepKittyPlacement( - self: *Metal, - t: *terminal.Terminal, - top_y: u32, - bot_y: u32, - image: *const terminal.kitty.graphics.Image, - p: *const terminal.kitty.graphics.ImageStorage.Placement, -) !void { - // Get the rect for the placement. If this placement doesn't have - // a rect then its virtual or something so skip it. - const rect = p.rect(image.*, t) orelse return; - - // This is expensive but necessary. - const img_top_y = t.screen.pages.pointFromPin(.screen, rect.top_left).?.screen.y; - const img_bot_y = t.screen.pages.pointFromPin(.screen, rect.bottom_right).?.screen.y; - - // If the selection isn't within our viewport then skip it. - if (img_top_y > bot_y) return; - if (img_bot_y < top_y) return; - - // We need to prep this image for upload if it isn't in the cache OR - // it is in the cache but the transmit time doesn't match meaning this - // image is different. - try self.prepKittyImage(image); - - // Calculate the dimensions of our image, taking in to - // account the rows / columns specified by the placement. - const dest_size = p.calculatedSize(image.*, t); - - // Calculate the source rectangle - const source_x = @min(image.width, p.source_x); - const source_y = @min(image.height, p.source_y); - const source_width = if (p.source_width > 0) - @min(image.width - source_x, p.source_width) - else - image.width; - const source_height = if (p.source_height > 0) - @min(image.height - source_y, p.source_height) - else - image.height; - - // Get the viewport-relative Y position of the placement. - const y_pos: i32 = @as(i32, @intCast(img_top_y)) - @as(i32, @intCast(top_y)); - - // Accumulate the placement - if (dest_size.width > 0 and dest_size.height > 0) { - try self.image_placements.append(self.alloc, .{ - .image_id = image.id, - .x = @intCast(rect.top_left.x), - .y = y_pos, - .z = p.z, - .width = dest_size.width, - .height = dest_size.height, - .cell_offset_x = p.x_offset, - .cell_offset_y = p.y_offset, - .source_x = source_x, - .source_y = source_y, - .source_width = source_width, - .source_height = source_height, - }); - } -} - -fn prepKittyImage( - self: *Metal, - image: *const terminal.kitty.graphics.Image, -) !void { - // If this image exists and its transmit time is the same we assume - // it is the identical image so we don't need to send it to the GPU. - const gop = try self.images.getOrPut(self.alloc, image.id); - if (gop.found_existing and - gop.value_ptr.transmit_time.order(image.transmit_time) == .eq) - { - return; - } - - // Copy the data into the pending state. - const data = try self.alloc.dupe(u8, image.data); - errdefer self.alloc.free(data); - - // Store it in the map - const pending: Image.Pending = .{ - .width = image.width, - .height = image.height, - .data = data.ptr, - }; - - const new_image: Image = switch (image.format) { - .gray => .{ .pending_gray = pending }, - .gray_alpha => .{ .pending_gray_alpha = pending }, - .rgb => .{ .pending_rgb = pending }, - .rgba => .{ .pending_rgba = pending }, - .png => unreachable, // should be decoded by now - }; - - if (!gop.found_existing) { - gop.value_ptr.* = .{ - .image = new_image, - .transmit_time = undefined, - }; +/// Present the provided target. +pub inline fn present(self: *Metal, target: Target, sync: bool) !void { + if (sync) { + self.layer.setSurfaceSync(target.surface); } else { - try gop.value_ptr.image.markForReplace( - self.alloc, - new_image, - ); - } - - gop.value_ptr.transmit_time = image.transmit_time; -} - -/// Update the configuration. -pub fn changeConfig(self: *Metal, config: *DerivedConfig) !void { - // We always redo the font shaper in case font features changed. We - // could check to see if there was an actual config change but this is - // easier and rare enough to not cause performance issues. - { - var font_shaper = try font.Shaper.init(self.alloc, .{ - .features = config.font_features.items, - }); - errdefer font_shaper.deinit(); - self.font_shaper.deinit(); - self.font_shaper = font_shaper; - } - - // We also need to reset the shaper cache so shaper info - // from the previous font isn't re-used for the new font. - const font_shaper_cache = font.ShaperCache.init(); - self.font_shaper_cache.deinit(self.alloc); - self.font_shaper_cache = font_shaper_cache; - - // Set our new minimum contrast - self.uniforms.min_contrast = config.min_contrast; - - // Set our new color space and blending - self.uniforms.use_display_p3 = config.colorspace == .@"display-p3"; - self.uniforms.use_linear_blending = config.blending.isLinear(); - self.uniforms.use_linear_correction = config.blending == .@"linear-corrected"; - - // Set our new colors - self.default_background_color = config.background; - self.default_foreground_color = config.foreground; - self.default_cursor_color = if (!config.cursor_invert) config.cursor_color else null; - self.cursor_invert = config.cursor_invert; - - // Update our layer's opaqueness and display sync in case they changed. - { - // We use a CATransaction so that Core Animation knows that we - // updated the opaque property. Otherwise it behaves weird, not - // properly going from opaque to transparent unless we resize. - const CATransaction = objc.getClass("CATransaction").?; - CATransaction.msgSend(void, "begin", .{}); - defer CATransaction.msgSend(void, "commit", .{}); - - self.layer.setProperty("opaque", config.background_opacity >= 1); - self.layer.setProperty("displaySyncEnabled", config.vsync); - } - - // Update our terminal colorspace if it changed - if (self.config.colorspace != config.colorspace) { - const terminal_colorspace = try graphics.ColorSpace.createNamed( - switch (config.colorspace) { - .@"display-p3" => .displayP3, - .srgb => .sRGB, - }, - ); - errdefer terminal_colorspace.release(); - self.terminal_colorspace.release(); - self.terminal_colorspace = terminal_colorspace; - } - - const old_blending = self.config.blending; - const old_custom_shaders = self.config.custom_shaders; - - self.config.deinit(); - self.config = config.*; - - // Reset our viewport to force a rebuild, in case of a font change. - self.cells_viewport = null; - - // We reinitialize our shaders if our - // blending or custom shaders changed. - if (old_blending != config.blending or - !old_custom_shaders.equal(config.custom_shaders)) - { - self.deinitShaders(); - try self.initShaders(); - // We call setScreenSize to reinitialize - // the textures used for custom shaders. - if (self.custom_shader_state != null) { - try self.setScreenSize(self.size); - } - // And we update our layer's pixel format appropriately. - self.layer.setProperty( - "pixelFormat", - if (config.blending.isLinear()) - @intFromEnum(mtl.MTLPixelFormat.bgra8unorm_srgb) - else - @intFromEnum(mtl.MTLPixelFormat.bgra8unorm), - ); + try self.layer.setSurface(target.surface); } } -/// Resize the screen. -pub fn setScreenSize( - self: *Metal, - size: renderer.Size, -) !void { - // Store our sizes - self.size = size; - const grid_size = size.grid(); - const terminal_size = size.terminal(); - - // Blank space around the grid. - const blank: renderer.Padding = size.screen.blankPadding( - size.padding, - grid_size, - size.cell, - ).add(size.padding); - - var padding_extend = self.uniforms.padding_extend; - switch (self.config.padding_color) { - .extend => { - // If padding extension is enabled, we extend left and right always - // because there is no downside to this. Up/down is dependent - // on some heuristics (see rebuildCells). - padding_extend.left = true; - padding_extend.right = true; - }, - - .@"extend-always" => { - padding_extend.up = true; - padding_extend.down = true; - padding_extend.left = true; - padding_extend.right = true; - }, - - .background => { - // Otherwise, disable all padding extension. - padding_extend = .{}; - }, - } - - // Set the size of the drawable surface to the bounds - self.layer.setProperty("drawableSize", graphics.Size{ - .width = @floatFromInt(size.screen.width), - .height = @floatFromInt(size.screen.height), - }); - - // Setup our uniforms - const old = self.uniforms; - self.uniforms = .{ - .projection_matrix = math.ortho2d( - -1 * @as(f32, @floatFromInt(size.padding.left)), - @floatFromInt(terminal_size.width + size.padding.right), - @floatFromInt(terminal_size.height + size.padding.bottom), - -1 * @as(f32, @floatFromInt(size.padding.top)), - ), - .cell_size = .{ - @floatFromInt(self.grid_metrics.cell_width), - @floatFromInt(self.grid_metrics.cell_height), - }, - .grid_size = .{ - grid_size.columns, - grid_size.rows, - }, - .grid_padding = .{ - @floatFromInt(blank.top), - @floatFromInt(blank.right), - @floatFromInt(blank.bottom), - @floatFromInt(blank.left), - }, - .padding_extend = padding_extend, - .min_contrast = old.min_contrast, - .cursor_pos = old.cursor_pos, - .cursor_color = old.cursor_color, - .bg_color = old.bg_color, - .cursor_wide = old.cursor_wide, - .use_display_p3 = old.use_display_p3, - .use_linear_blending = old.use_linear_blending, - .use_linear_correction = old.use_linear_correction, - }; - - // Reset our cell contents if our grid size has changed. - if (!self.cells.size.equals(grid_size)) { - try self.cells.resize(self.alloc, grid_size); - - // Reset our viewport to force a rebuild - self.cells_viewport = null; - } - - // If we have custom shaders then we update the state - if (self.custom_shader_state) |*state| { - // Only free our previous texture if this isn't our first - // time setting the custom shader state. - if (state.uniforms.resolution[0] > 0) { - state.front_texture.release(); - state.back_texture.release(); - } - - state.uniforms.resolution = .{ - @floatFromInt(size.screen.width), - @floatFromInt(size.screen.height), - 1, - }; - - state.front_texture = texture: { - // This texture is the size of our drawable but supports being a - // render target AND reading so that the custom shaders can read from it. - const desc = init: { - const Class = objc.getClass("MTLTextureDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - desc.setProperty( - "pixelFormat", - // Using an `*_srgb` pixel format makes Metal gamma encode - // the pixels written to it *after* blending, which means - // we get linear alpha blending rather than gamma-incorrect - // blending. - if (self.config.blending.isLinear()) - @intFromEnum(mtl.MTLPixelFormat.bgra8unorm_srgb) - else - @intFromEnum(mtl.MTLPixelFormat.bgra8unorm), - ); - desc.setProperty("width", @as(c_ulong, @intCast(size.screen.width))); - desc.setProperty("height", @as(c_ulong, @intCast(size.screen.height))); - desc.setProperty( - "usage", - mtl.MTLTextureUsage{ - .render_target = true, - .shader_read = true, - .shader_write = true, - }, - ); - - // If we fail to create the texture, then we just don't have a screen - // texture and our custom shaders won't run. - const id = self.gpu_state.device.msgSend( - ?*anyopaque, - objc.sel("newTextureWithDescriptor:"), - .{desc}, - ) orelse return error.MetalFailed; - - break :texture objc.Object.fromId(id); - }; - - state.back_texture = texture: { - // This texture is the size of our drawable but supports being a - // render target AND reading so that the custom shaders can read from it. - const desc = init: { - const Class = objc.getClass("MTLTextureDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - desc.setProperty( - "pixelFormat", - // Using an `*_srgb` pixel format makes Metal gamma encode - // the pixels written to it *after* blending, which means - // we get linear alpha blending rather than gamma-incorrect - // blending. - if (self.config.blending.isLinear()) - @intFromEnum(mtl.MTLPixelFormat.bgra8unorm_srgb) - else - @intFromEnum(mtl.MTLPixelFormat.bgra8unorm), - ); - desc.setProperty("width", @as(c_ulong, @intCast(size.screen.width))); - desc.setProperty("height", @as(c_ulong, @intCast(size.screen.height))); - desc.setProperty( - "usage", - mtl.MTLTextureUsage{ - .render_target = true, - .shader_read = true, - .shader_write = true, - }, - ); - - // If we fail to create the texture, then we just don't have a screen - // texture and our custom shaders won't run. - const id = self.gpu_state.device.msgSend( - ?*anyopaque, - objc.sel("newTextureWithDescriptor:"), - .{desc}, - ) orelse return error.MetalFailed; - - break :texture objc.Object.fromId(id); - }; - } - - log.debug("screen size size={}", .{size}); +/// Present the last presented target again. (noop for Metal) +pub inline fn repeat(self: *Metal) !void { + _ = self; } -/// Convert the terminal state to GPU cells stored in CPU memory. These -/// are then synced to the GPU in the next frame. This only updates CPU -/// memory and doesn't touch the GPU. -fn rebuildCells( - self: *Metal, - rebuild: bool, - screen: *terminal.Screen, - screen_type: terminal.ScreenType, - mouse: renderer.State.Mouse, - preedit: ?renderer.State.Preedit, - cursor_style_: ?renderer.CursorStyle, - color_palette: *const terminal.color.Palette, -) !void { - // const start = try std.time.Instant.now(); - // const start_micro = std.time.microTimestamp(); - // defer { - // const end = std.time.Instant.now() catch unreachable; - // // "[rebuildCells time] \t" - // std.log.warn("[rebuildCells time] {}\t{}", .{start_micro, end.since(start) / std.time.ns_per_us}); - // } - - _ = screen_type; // we might use this again later so not deleting it yet - - // Create an arena for all our temporary allocations while rebuilding - var arena = ArenaAllocator.init(self.alloc); - defer arena.deinit(); - const arena_alloc = arena.allocator(); - - // Create our match set for the links. - var link_match_set: link.MatchSet = if (mouse.point) |mouse_pt| try self.config.links.matchSet( - arena_alloc, - screen, - mouse_pt, - mouse.mods, - ) else .{}; - - // Determine our x/y range for preedit. We don't want to render anything - // here because we will render the preedit separately. - const preedit_range: ?struct { - y: terminal.size.CellCountInt, - x: [2]terminal.size.CellCountInt, - cp_offset: usize, - } = if (preedit) |preedit_v| preedit: { - const range = preedit_v.range(screen.cursor.x, screen.pages.cols - 1); - break :preedit .{ - .y = screen.cursor.y, - .x = .{ range.start, range.end }, - .cp_offset = range.cp_offset, - }; - } else null; - - if (rebuild) { - // If we are doing a full rebuild, then we clear the entire cell buffer. - self.cells.reset(); - - // We also reset our padding extension depending on the screen type - switch (self.config.padding_color) { - .background => {}, - - // For extension, assume we are extending in all directions. - // For "extend" this may be disabled due to heuristics below. - .extend, .@"extend-always" => { - self.uniforms.padding_extend = .{ - .up = true, - .down = true, - .left = true, - .right = true, - }; - }, - } - } - - // We rebuild the cells row-by-row because we - // do font shaping and dirty tracking by row. - var row_it = screen.pages.rowIterator(.left_up, .{ .viewport = .{} }, null); - // If our cell contents buffer is shorter than the screen viewport, - // we render the rows that fit, starting from the bottom. If instead - // the viewport is shorter than the cell contents buffer, we align - // the top of the viewport with the top of the contents buffer. - var y: terminal.size.CellCountInt = @min( - screen.pages.rows, - self.cells.size.rows, - ); - while (row_it.next()) |row| { - // The viewport may have more rows than our cell contents, - // so we need to break from the loop early if we hit y = 0. - if (y == 0) break; - - y -= 1; - - if (!rebuild) { - // Only rebuild if we are doing a full rebuild or this row is dirty. - if (!row.isDirty()) continue; - - // Clear the cells if the row is dirty - self.cells.clear(y); - } - - // True if we want to do font shaping around the cursor. We want to - // do font shaping as long as the cursor is enabled. - const shape_cursor = screen.viewportIsBottom() and - y == screen.cursor.y; - - // We need to get this row's selection if there is one for proper - // run splitting. - const row_selection = sel: { - const sel = screen.selection orelse break :sel null; - const pin = screen.pages.pin(.{ .viewport = .{ .y = y } }) orelse - break :sel null; - break :sel sel.containedRow(screen, pin) orelse null; - }; - - // On primary screen, we still apply vertical padding extension - // under certain conditions we feel are safe. This helps make some - // scenarios look better while avoiding scenarios we know do NOT look - // good. - switch (self.config.padding_color) { - // These already have the correct values set above. - .background, .@"extend-always" => {}, - - // Apply heuristics for padding extension. - .extend => if (y == 0) { - self.uniforms.padding_extend.up = !row.neverExtendBg( - color_palette, - self.background_color orelse self.default_background_color, - ); - } else if (y == self.cells.size.rows - 1) { - self.uniforms.padding_extend.down = !row.neverExtendBg( - color_palette, - self.background_color orelse self.default_background_color, - ); - }, - } - - // Iterator of runs for shaping. - var run_iter = self.font_shaper.runIterator( - self.font_grid, - screen, - row, - row_selection, - if (shape_cursor) screen.cursor.x else null, - ); - var shaper_run: ?font.shape.TextRun = try run_iter.next(self.alloc); - var shaper_cells: ?[]const font.shape.Cell = null; - var shaper_cells_i: usize = 0; - - const row_cells_all = row.cells(.all); - - // If our viewport is wider than our cell contents buffer, - // we still only process cells up to the width of the buffer. - const row_cells = row_cells_all[0..@min(row_cells_all.len, self.cells.size.columns)]; - - for (row_cells, 0..) |*cell, x| { - // If this cell falls within our preedit range then we - // skip this because preedits are setup separately. - if (preedit_range) |range| preedit: { - // We're not on the preedit line, no actions necessary. - if (range.y != y) break :preedit; - // We're before the preedit range, no actions necessary. - if (x < range.x[0]) break :preedit; - // We're in the preedit range, skip this cell. - if (x <= range.x[1]) continue; - // After exiting the preedit range we need to catch - // the run position up because of the missed cells. - // In all other cases, no action is necessary. - if (x != range.x[1] + 1) break :preedit; - - // Step the run iterator until we find a run that ends - // after the current cell, which will be the soonest run - // that might contain glyphs for our cell. - while (shaper_run) |run| { - if (run.offset + run.cells > x) break; - shaper_run = try run_iter.next(self.alloc); - shaper_cells = null; - shaper_cells_i = 0; - } - - const run = shaper_run orelse break :preedit; - - // If we haven't shaped this run, do so now. - shaper_cells = shaper_cells orelse - // Try to read the cells from the shaping cache if we can. - self.font_shaper_cache.get(run) orelse - cache: { - // Otherwise we have to shape them. - const cells = try self.font_shaper.shape(run); - - // Try to cache them. If caching fails for any reason we - // continue because it is just a performance optimization, - // not a correctness issue. - self.font_shaper_cache.put( - self.alloc, - run, - cells, - ) catch |err| { - log.warn( - "error caching font shaping results err={}", - .{err}, - ); - }; - - // The cells we get from direct shaping are always owned - // by the shaper and valid until the next shaping call so - // we can safely use them. - break :cache cells; - }; - - // Advance our index until we reach or pass - // our current x position in the shaper cells. - while (shaper_cells.?[shaper_cells_i].x < x) { - shaper_cells_i += 1; - } - } - - const wide = cell.wide; - - const style = row.style(cell); - - const cell_pin: terminal.Pin = cell: { - var copy = row; - copy.x = @intCast(x); - break :cell copy; - }; - - // True if this cell is selected - const selected: bool = if (screen.selection) |sel| - sel.contains(screen, .{ - .node = row.node, - .y = row.y, - .x = @intCast( - // Spacer tails should show the selection - // state of the wide cell they belong to. - if (wide == .spacer_tail) - x -| 1 - else - x, - ), - }) - else - false; - - const bg_style = style.bg(cell, color_palette); - const fg_style = style.fg(color_palette, self.config.bold_is_bright) orelse self.foreground_color orelse self.default_foreground_color; - - // The final background color for the cell. - const bg = bg: { - if (selected) { - break :bg if (self.config.invert_selection_fg_bg) - if (style.flags.inverse) - // Cell is selected with invert selection fg/bg - // enabled, and the cell has the inverse style - // flag, so they cancel out and we get the normal - // bg color. - bg_style - else - // If it doesn't have the inverse style - // flag then we use the fg color instead. - fg_style - else - // If we don't have invert selection fg/bg set then we - // just use the selection background if set, otherwise - // the default fg color. - break :bg self.config.selection_background orelse self.foreground_color orelse self.default_foreground_color; - } - - // Not selected - break :bg if (style.flags.inverse != isCovering(cell.codepoint())) - // Two cases cause us to invert (use the fg color as the bg) - // - The "inverse" style flag. - // - A "covering" glyph; we use fg for bg in that case to - // help make sure that padding extension works correctly. - // If one of these is true (but not the other) - // then we use the fg style color for the bg. - fg_style - else - // Otherwise they cancel out. - bg_style; - }; - - const fg = fg: { - if (selected and !self.config.invert_selection_fg_bg) { - // If we don't have invert selection fg/bg set - // then we just use the selection foreground if - // set, otherwise the default bg color. - break :fg self.config.selection_foreground orelse self.background_color orelse self.default_background_color; - } - - // Whether we need to use the bg color as our fg color: - // - Cell is inverted and not selected - // - Cell is selected and not inverted - // Note: if selected then invert sel fg / bg must be - // false since we separately handle it if true above. - break :fg if (style.flags.inverse != selected) - bg_style orelse self.background_color orelse self.default_background_color - else - fg_style; - }; - - // Foreground alpha for this cell. - const alpha: u8 = if (style.flags.faint) 175 else 255; - - // Set the cell's background color. - { - const rgb = bg orelse self.background_color orelse self.default_background_color; - - // Determine our background alpha. If we have transparency configured - // then this is dynamic depending on some situations. This is all - // in an attempt to make transparency look the best for various - // situations. See inline comments. - const bg_alpha: u8 = bg_alpha: { - const default: u8 = 255; - - if (self.config.background_opacity >= 1) break :bg_alpha default; - - // Cells that are selected should be fully opaque. - if (selected) break :bg_alpha default; - - // Cells that are reversed should be fully opaque. - if (style.flags.inverse) break :bg_alpha default; - - // Cells that have an explicit bg color should be fully opaque. - if (bg_style != null) { - break :bg_alpha default; - } - - // Otherwise, we use the configured background opacity. - break :bg_alpha @intFromFloat(@round(self.config.background_opacity * 255.0)); - }; - - self.cells.bgCell(y, x).* = .{ - rgb.r, rgb.g, rgb.b, bg_alpha, - }; - } - - // If the invisible flag is set on this cell then we - // don't need to render any foreground elements, so - // we just skip all glyphs with this x coordinate. - // - // NOTE: This behavior matches xterm. Some other terminal - // emulators, e.g. Alacritty, still render text decorations - // and only make the text itself invisible. The decision - // has been made here to match xterm's behavior for this. - if (style.flags.invisible) { - continue; - } - - // Give links a single underline, unless they already have - // an underline, in which case use a double underline to - // distinguish them. - const underline: terminal.Attribute.Underline = if (link_match_set.contains(screen, cell_pin)) - if (style.flags.underline == .single) - .double - else - .single - else - style.flags.underline; - - // We draw underlines first so that they layer underneath text. - // This improves readability when a colored underline is used - // which intersects parts of the text (descenders). - if (underline != .none) self.addUnderline( - @intCast(x), - @intCast(y), - underline, - style.underlineColor(color_palette) orelse fg, - alpha, - ) catch |err| { - log.warn( - "error adding underline to cell, will be invalid x={} y={}, err={}", - .{ x, y, err }, - ); - }; - - if (style.flags.overline) self.addOverline(@intCast(x), @intCast(y), fg, alpha) catch |err| { - log.warn( - "error adding overline to cell, will be invalid x={} y={}, err={}", - .{ x, y, err }, - ); - }; - - // If we're at or past the end of our shaper run then - // we need to get the next run from the run iterator. - if (shaper_cells != null and shaper_cells_i >= shaper_cells.?.len) { - shaper_run = try run_iter.next(self.alloc); - shaper_cells = null; - shaper_cells_i = 0; - } - - if (shaper_run) |run| glyphs: { - // If we haven't shaped this run yet, do so. - shaper_cells = shaper_cells orelse - // Try to read the cells from the shaping cache if we can. - self.font_shaper_cache.get(run) orelse - cache: { - // Otherwise we have to shape them. - const cells = try self.font_shaper.shape(run); - - // Try to cache them. If caching fails for any reason we - // continue because it is just a performance optimization, - // not a correctness issue. - self.font_shaper_cache.put( - self.alloc, - run, - cells, - ) catch |err| { - log.warn( - "error caching font shaping results err={}", - .{err}, - ); - }; - - // The cells we get from direct shaping are always owned - // by the shaper and valid until the next shaping call so - // we can safely use them. - break :cache cells; - }; - - const cells = shaper_cells orelse break :glyphs; - - // If there are no shaper cells for this run, ignore it. - // This can occur for runs of empty cells, and is fine. - if (cells.len == 0) break :glyphs; - - // If we encounter a shaper cell to the left of the current - // cell then we have some problems. This logic relies on x - // position monotonically increasing. - assert(cells[shaper_cells_i].x >= x); - - // NOTE: An assumption is made here that a single cell will never - // be present in more than one shaper run. If that assumption is - // violated, this logic breaks. - - while (shaper_cells_i < cells.len and cells[shaper_cells_i].x == x) : ({ - shaper_cells_i += 1; - }) { - self.addGlyph( - @intCast(x), - @intCast(y), - cell_pin, - cells[shaper_cells_i], - shaper_run.?, - fg, - alpha, - ) catch |err| { - log.warn( - "error adding glyph to cell, will be invalid x={} y={}, err={}", - .{ x, y, err }, - ); - }; - } - } - - // Finally, draw a strikethrough if necessary. - if (style.flags.strikethrough) self.addStrikethrough( - @intCast(x), - @intCast(y), - fg, - alpha, - ) catch |err| { - log.warn( - "error adding strikethrough to cell, will be invalid x={} y={}, err={}", - .{ x, y, err }, - ); - }; - } - } - - // Setup our cursor rendering information. - cursor: { - // By default, we don't handle cursor inversion on the shader. - self.cells.setCursor(null); - self.uniforms.cursor_pos = .{ - std.math.maxInt(u16), - std.math.maxInt(u16), - }; - - // If we have preedit text, we don't setup a cursor - if (preedit != null) break :cursor; - - // Prepare the cursor cell contents. - const style = cursor_style_ orelse break :cursor; - const cursor_color = self.cursor_color orelse self.default_cursor_color orelse color: { - if (self.cursor_invert) { - // Use the foreground color from the cell under the cursor, if any. - const sty = screen.cursor.page_pin.style(screen.cursor.page_cell); - break :color if (sty.flags.inverse) - // If the cell is reversed, use background color instead. - (sty.bg(screen.cursor.page_cell, color_palette) orelse self.background_color orelse self.default_background_color) - else - (sty.fg(color_palette, self.config.bold_is_bright) orelse self.foreground_color orelse self.default_foreground_color); - } else { - break :color self.foreground_color orelse self.default_foreground_color; - } - }; - - self.addCursor(screen, style, cursor_color); - - // If the cursor is visible then we set our uniforms. - if (style == .block and screen.viewportIsBottom()) { - const wide = screen.cursor.page_cell.wide; - - self.uniforms.cursor_pos = .{ - // If we are a spacer tail of a wide cell, our cursor needs - // to move back one cell. The saturate is to ensure we don't - // overflow but this shouldn't happen with well-formed input. - switch (wide) { - .narrow, .spacer_head, .wide => screen.cursor.x, - .spacer_tail => screen.cursor.x -| 1, - }, - screen.cursor.y, - }; - - self.uniforms.cursor_wide = switch (wide) { - .narrow, .spacer_head => false, - .wide, .spacer_tail => true, - }; - - const uniform_color = if (self.cursor_invert) blk: { - // Use the background color from the cell under the cursor, if any. - const sty = screen.cursor.page_pin.style(screen.cursor.page_cell); - break :blk if (sty.flags.inverse) - // If the cell is reversed, use foreground color instead. - (sty.fg(color_palette, self.config.bold_is_bright) orelse self.foreground_color orelse self.default_foreground_color) - else - (sty.bg(screen.cursor.page_cell, color_palette) orelse self.background_color orelse self.default_background_color); - } else if (self.config.cursor_text) |txt| - txt - else - self.background_color orelse self.default_background_color; - - self.uniforms.cursor_color = .{ - uniform_color.r, - uniform_color.g, - uniform_color.b, - 255, - }; - } - } - - // Setup our preedit text. - if (preedit) |preedit_v| { - const range = preedit_range.?; - var x = range.x[0]; - for (preedit_v.codepoints[range.cp_offset..]) |cp| { - self.addPreeditCell(cp, .{ .x = x, .y = range.y }) catch |err| { - log.warn("error building preedit cell, will be invalid x={} y={}, err={}", .{ - x, - range.y, - err, - }); - }; - - x += if (cp.wide) 2 else 1; - } - } - - // Update that our cells rebuilt - self.cells_rebuilt = true; - - // Log some things - // log.debug("rebuildCells complete cached_runs={}", .{ - // self.font_shaper_cache.count(), - // }); -} - -/// Add an underline decoration to the specified cell -fn addUnderline( - self: *Metal, - x: terminal.size.CellCountInt, - y: terminal.size.CellCountInt, - style: terminal.Attribute.Underline, - color: terminal.color.RGB, - alpha: u8, -) !void { - const sprite: font.Sprite = switch (style) { - .none => unreachable, - .single => .underline, - .double => .underline_double, - .dotted => .underline_dotted, - .dashed => .underline_dashed, - .curly => .underline_curly, - }; - - const render = try self.font_grid.renderGlyph( - self.alloc, - font.sprite_index, - @intFromEnum(sprite), - .{ - .cell_width = 1, - .grid_metrics = self.grid_metrics, - }, - ); - - try self.cells.add(self.alloc, .underline, .{ - .mode = .fg, - .grid_pos = .{ @intCast(x), @intCast(y) }, - .constraint_width = 1, - .color = .{ color.r, color.g, color.b, alpha }, - .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, - .glyph_size = .{ render.glyph.width, render.glyph.height }, - .bearings = .{ - @intCast(render.glyph.offset_x), - @intCast(render.glyph.offset_y), - }, - }); -} - -/// Add a overline decoration to the specified cell -fn addOverline( - self: *Metal, - x: terminal.size.CellCountInt, - y: terminal.size.CellCountInt, - color: terminal.color.RGB, - alpha: u8, -) !void { - const render = try self.font_grid.renderGlyph( - self.alloc, - font.sprite_index, - @intFromEnum(font.Sprite.overline), - .{ - .cell_width = 1, - .grid_metrics = self.grid_metrics, - }, - ); - - try self.cells.add(self.alloc, .overline, .{ - .mode = .fg, - .grid_pos = .{ @intCast(x), @intCast(y) }, - .constraint_width = 1, - .color = .{ color.r, color.g, color.b, alpha }, - .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, - .glyph_size = .{ render.glyph.width, render.glyph.height }, - .bearings = .{ - @intCast(render.glyph.offset_x), - @intCast(render.glyph.offset_y), - }, - }); -} - -/// Add a strikethrough decoration to the specified cell -fn addStrikethrough( - self: *Metal, - x: terminal.size.CellCountInt, - y: terminal.size.CellCountInt, - color: terminal.color.RGB, - alpha: u8, -) !void { - const render = try self.font_grid.renderGlyph( - self.alloc, - font.sprite_index, - @intFromEnum(font.Sprite.strikethrough), - .{ - .cell_width = 1, - .grid_metrics = self.grid_metrics, - }, - ); - - try self.cells.add(self.alloc, .strikethrough, .{ - .mode = .fg, - .grid_pos = .{ @intCast(x), @intCast(y) }, - .constraint_width = 1, - .color = .{ color.r, color.g, color.b, alpha }, - .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, - .glyph_size = .{ render.glyph.width, render.glyph.height }, - .bearings = .{ - @intCast(render.glyph.offset_x), - @intCast(render.glyph.offset_y), - }, - }); -} - -// Add a glyph to the specified cell. -fn addGlyph( - self: *Metal, - x: terminal.size.CellCountInt, - y: terminal.size.CellCountInt, - cell_pin: terminal.Pin, - shaper_cell: font.shape.Cell, - shaper_run: font.shape.TextRun, - color: terminal.color.RGB, - alpha: u8, -) !void { - const rac = cell_pin.rowAndCell(); - const cell = rac.cell; - - // Render - const render = try self.font_grid.renderGlyph( - self.alloc, - shaper_run.font_index, - shaper_cell.glyph_index, - .{ - .grid_metrics = self.grid_metrics, - .thicken = self.config.font_thicken, - .thicken_strength = self.config.font_thicken_strength, - }, - ); - - // If the glyph is 0 width or height, it will be invisible - // when drawn, so don't bother adding it to the buffer. - if (render.glyph.width == 0 or render.glyph.height == 0) { - return; - } - - const mode: mtl_shaders.CellText.Mode = switch (try fgMode( - render.presentation, - cell_pin, - )) { - .normal => .fg, - .color => .fg_color, - .constrained => .fg_constrained, - .powerline => .fg_powerline, - }; - - try self.cells.add(self.alloc, .text, .{ - .mode = mode, - .grid_pos = .{ @intCast(x), @intCast(y) }, - .constraint_width = cell.gridWidth(), - .color = .{ color.r, color.g, color.b, alpha }, - .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, - .glyph_size = .{ render.glyph.width, render.glyph.height }, - .bearings = .{ - @intCast(render.glyph.offset_x + shaper_cell.x_offset), - @intCast(render.glyph.offset_y + shaper_cell.y_offset), - }, - }); -} - -fn addCursor( - self: *Metal, - screen: *terminal.Screen, - cursor_style: renderer.CursorStyle, - cursor_color: terminal.color.RGB, -) void { - // Add the cursor. We render the cursor over the wide character if - // we're on the wide character tail. - const wide, const x = cell: { - // The cursor goes over the screen cursor position. - const cell = screen.cursor.page_cell; - if (cell.wide != .spacer_tail or screen.cursor.x == 0) - break :cell .{ cell.wide == .wide, screen.cursor.x }; - - // If we're part of a wide character, we move the cursor back to - // the actual character. - const prev_cell = screen.cursorCellLeft(1); - break :cell .{ prev_cell.wide == .wide, screen.cursor.x - 1 }; - }; - - const alpha: u8 = if (!self.focused) 255 else alpha: { - const alpha = 255 * self.config.cursor_opacity; - break :alpha @intFromFloat(@ceil(alpha)); - }; - - const render = switch (cursor_style) { - .block, - .block_hollow, - .bar, - .underline, - => render: { - const sprite: font.Sprite = switch (cursor_style) { - .block => .cursor_rect, - .block_hollow => .cursor_hollow_rect, - .bar => .cursor_bar, - .underline => .underline, - .lock => unreachable, - }; - - break :render self.font_grid.renderGlyph( - self.alloc, - font.sprite_index, - @intFromEnum(sprite), - .{ - .cell_width = if (wide) 2 else 1, - .grid_metrics = self.grid_metrics, - }, - ) catch |err| { - log.warn("error rendering cursor glyph err={}", .{err}); - return; - }; - }, - - .lock => self.font_grid.renderCodepoint( - self.alloc, - 0xF023, // lock symbol - .regular, - .text, - .{ - .cell_width = if (wide) 2 else 1, - .grid_metrics = self.grid_metrics, - }, - ) catch |err| { - log.warn("error rendering cursor glyph err={}", .{err}); - return; - } orelse { - // This should never happen because we embed nerd - // fonts so we just log and return instead of fallback. - log.warn("failed to find lock symbol for cursor codepoint=0xF023", .{}); - return; +/// Returns the options to use when constructing buffers. +pub inline fn bufferOptions(self: Metal) bufferpkg.Options { + return .{ + .device = self.device, + .resource_options = .{ + // Indicate that the CPU writes to this resource but never reads it. + .cpu_cache_mode = .write_combined, + .storage_mode = self.default_storage_mode, }, }; - - self.cells.setCursor(.{ - .mode = .cursor, - .grid_pos = .{ x, screen.cursor.y }, - .color = .{ cursor_color.r, cursor_color.g, cursor_color.b, alpha }, - .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, - .glyph_size = .{ render.glyph.width, render.glyph.height }, - .bearings = .{ - @intCast(render.glyph.offset_x), - @intCast(render.glyph.offset_y), - }, - }); } -fn addPreeditCell( - self: *Metal, - cp: renderer.State.Preedit.Codepoint, - coord: terminal.Coordinate, -) !void { - // Preedit is rendered inverted - const bg = self.foreground_color orelse self.default_foreground_color; - const fg = self.background_color orelse self.default_background_color; +pub const instanceBufferOptions = bufferOptions; +pub const uniformBufferOptions = bufferOptions; +pub const fgBufferOptions = bufferOptions; +pub const bgBufferOptions = bufferOptions; +pub const imageBufferOptions = bufferOptions; - // Render the glyph for our preedit text - const render_ = self.font_grid.renderCodepoint( - self.alloc, - @intCast(cp.codepoint), - .regular, - .text, - .{ .grid_metrics = self.grid_metrics }, - ) catch |err| { - log.warn("error rendering preedit glyph err={}", .{err}); - return; - }; - const render = render_ orelse { - log.warn("failed to find font for preedit codepoint={X}", .{cp.codepoint}); - return; - }; - - // Add our opaque background cell - self.cells.bgCell(coord.y, coord.x).* = .{ - bg.r, bg.g, bg.b, 255, - }; - if (cp.wide and coord.x < self.cells.size.columns - 1) { - self.cells.bgCell(coord.y, coord.x + 1).* = .{ - bg.r, bg.g, bg.b, 255, - }; - } - - // Add our text - try self.cells.add(self.alloc, .text, .{ - .mode = .fg, - .grid_pos = .{ @intCast(coord.x), @intCast(coord.y) }, - .color = .{ fg.r, fg.g, fg.b, 255 }, - .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, - .glyph_size = .{ render.glyph.width, render.glyph.height }, - .bearings = .{ - @intCast(render.glyph.offset_x), - @intCast(render.glyph.offset_y), +/// Returns the options to use when constructing textures. +pub inline fn textureOptions(self: Metal) Texture.Options { + return .{ + .device = self.device, + // Using an `*_srgb` pixel format makes Metal gamma encode the pixels + // written to it *after* blending, which means we get linear alpha + // blending rather than gamma-incorrect blending. + .pixel_format = if (self.blending.isLinear()) + .bgra8unorm_srgb + else + .bgra8unorm, + .resource_options = .{ + // Indicate that the CPU writes to this resource but never reads it. + .cpu_cache_mode = .write_combined, + .storage_mode = self.default_storage_mode, }, - }); + }; } -/// Sync the atlas data to the given texture. This copies the bytes -/// associated with the atlas to the given texture. If the atlas no longer -/// fits into the texture, the texture will be resized. -fn syncAtlasTexture( - device: objc.Object, - atlas: *const font.Atlas, - texture: *objc.Object, - /// Storage mode for the MTLTexture object - storage_mode: mtl.MTLResourceOptions.StorageMode, -) !void { - const width = texture.getProperty(c_ulong, "width"); - if (atlas.size > width) { - // Free our old texture - texture.*.release(); - - // Reallocate - texture.* = try initAtlasTexture(device, atlas, storage_mode); - } - - texture.msgSend( - void, - objc.sel("replaceRegion:mipmapLevel:withBytes:bytesPerRow:"), - .{ - mtl.MTLRegion{ - .origin = .{ .x = 0, .y = 0, .z = 0 }, - .size = .{ - .width = @intCast(atlas.size), - .height = @intCast(atlas.size), - .depth = 1, - }, - }, - @as(c_ulong, 0), - @as(*const anyopaque, atlas.data.ptr), - @as(c_ulong, atlas.format.depth() * atlas.size), - }, - ); -} - -/// Initialize a MTLTexture object for the given atlas. -fn initAtlasTexture( - device: objc.Object, - atlas: *const font.Atlas, - /// Storage mode for the MTLTexture object - storage_mode: mtl.MTLResourceOptions.StorageMode, -) !objc.Object { - // Determine our pixel format +/// Initializes a Texture suitable for the provided font atlas. +pub fn initAtlasTexture(self: *const Metal, atlas: *const font.Atlas) !Texture { const pixel_format: mtl.MTLPixelFormat = switch (atlas.format) { .grayscale => .r8unorm, .rgba => .bgra8unorm, else => @panic("unsupported atlas format for Metal texture"), }; - // Create our descriptor - const desc = init: { - const Class = objc.getClass("MTLTextureDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - - // Set our properties - desc.setProperty("pixelFormat", @intFromEnum(pixel_format)); - desc.setProperty("width", @as(c_ulong, @intCast(atlas.size))); - desc.setProperty("height", @as(c_ulong, @intCast(atlas.size))); - - desc.setProperty( - "resourceOptions", - mtl.MTLResourceOptions{ - // Indicate that the CPU writes to this resource but never reads it. - .cpu_cache_mode = .write_combined, - .storage_mode = storage_mode, + return Texture.init( + .{ + .device = self.device, + .pixel_format = pixel_format, + .resource_options = .{ + // Indicate that the CPU writes to this resource but never reads it. + .cpu_cache_mode = .write_combined, + .storage_mode = self.default_storage_mode, + }, }, + atlas.size, + atlas.size, + null, ); - - // Initialize - const id = device.msgSend( - ?*anyopaque, - objc.sel("newTextureWithDescriptor:"), - .{desc}, - ) orelse return error.MetalFailed; - - return objc.Object.fromId(id); } -test { - _ = mtl_cell; +/// Begin a frame. +pub inline fn beginFrame( + self: *const Metal, + /// Once the frame has been completed, the `frameCompleted` method + /// on the renderer is called with the health status of the frame. + renderer: *Renderer, + /// The target is presented via the provided renderer's API when completed. + target: *Target, +) !Frame { + return try Frame.begin(.{ .queue = self.queue }, renderer, target); +} + +fn chooseDevice() error{NoMetalDevice}!objc.Object { + var chosen_device: ?objc.Object = null; + + switch (comptime builtin.os.tag) { + .macos => { + const devices = objc.Object.fromId(mtl.MTLCopyAllDevices()); + defer devices.release(); + + var iter = devices.iterate(); + while (iter.next()) |device| { + // We want a GPU that’s connected to a display. + if (device.getProperty(bool, "isHeadless")) continue; + chosen_device = device; + // If the user has an eGPU plugged in, they probably want + // to use it. Otherwise, integrated GPUs are better for + // battery life and thermals. + if (device.getProperty(bool, "isRemovable") or + device.getProperty(bool, "isLowPower")) break; + } + }, + .ios => { + chosen_device = objc.Object.fromId(mtl.MTLCreateSystemDefaultDevice()); + }, + else => @compileError("unsupported target for Metal"), + } + + const device = chosen_device orelse return error.NoMetalDevice; + return device.retain(); } diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index d0222a390..c2f8bd652 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -1,452 +1,159 @@ -//! Rendering implementation for OpenGL. +//! Graphics API wrapper for OpenGL. pub const OpenGL = @This(); const std = @import("std"); +const assert = std.debug.assert; +const Allocator = std.mem.Allocator; const builtin = @import("builtin"); const glfw = @import("glfw"); -const assert = std.debug.assert; -const testing = std.testing; -const Allocator = std.mem.Allocator; -const ArenaAllocator = std.heap.ArenaAllocator; -const link = @import("link.zig"); -const isCovering = @import("cell.zig").isCovering; -const fgMode = @import("cell.zig").fgMode; +const gl = @import("opengl"); const shadertoy = @import("shadertoy.zig"); const apprt = @import("../apprt.zig"); -const configpkg = @import("../config.zig"); const font = @import("../font/main.zig"); -const imgui = @import("imgui"); -const renderer = @import("../renderer.zig"); -const terminal = @import("../terminal/main.zig"); -const Terminal = terminal.Terminal; -const gl = @import("opengl"); -const math = @import("../math.zig"); -const Surface = @import("../Surface.zig"); +const configpkg = @import("../config.zig"); +const rendererpkg = @import("../renderer.zig"); +const Renderer = rendererpkg.GenericRenderer(OpenGL); -const CellProgram = @import("opengl/CellProgram.zig"); -const ImageProgram = @import("opengl/ImageProgram.zig"); -const gl_image = @import("opengl/image.zig"); -const custom = @import("opengl/custom.zig"); -const Image = gl_image.Image; -const ImageMap = gl_image.ImageMap; -const ImagePlacementList = std.ArrayListUnmanaged(gl_image.Placement); +pub const GraphicsAPI = OpenGL; +pub const Target = @import("opengl/Target.zig"); +pub const Frame = @import("opengl/Frame.zig"); +pub const RenderPass = @import("opengl/RenderPass.zig"); +pub const Pipeline = @import("opengl/Pipeline.zig"); +const bufferpkg = @import("opengl/buffer.zig"); +pub const Buffer = bufferpkg.Buffer; +pub const Texture = @import("opengl/Texture.zig"); +pub const shaders = @import("opengl/shaders.zig"); -const log = std.log.scoped(.grid); +pub const cellpkg = @import("opengl/cell.zig"); +pub const imagepkg = @import("opengl/image.zig"); -/// The runtime can request a single-threaded draw by setting this boolean -/// to true. In this case, the renderer.draw() call is expected to be called -/// from the runtime. -pub const single_threaded_draw = if (@hasDecl(apprt.Surface, "opengl_single_threaded_draw")) - apprt.Surface.opengl_single_threaded_draw -else - false; -const DrawMutex = if (single_threaded_draw) std.Thread.Mutex else void; -const drawMutexZero: DrawMutex = if (DrawMutex == void) void{} else .{}; +pub const custom_shader_target: shadertoy.Target = .glsl; + +const log = std.log.scoped(.opengl); + +/// We require at least OpenGL 4.3 +pub const MIN_VERSION_MAJOR = 4; +pub const MIN_VERSION_MINOR = 3; alloc: std.mem.Allocator, -/// The configuration we need derived from the main config. -config: DerivedConfig, +/// Alpha blending mode +blending: configpkg.Config.AlphaBlending, -/// Current font metrics defining our grid. -grid_metrics: font.Metrics, +/// The most recently presented target, in case we need to present it again. +last_target: ?Target = null, -/// The size of everything. -size: renderer.Size, - -/// The current set of cells to render. Each set of cells goes into -/// a separate shader call. -cells_bg: std.ArrayListUnmanaged(CellProgram.Cell), -cells: std.ArrayListUnmanaged(CellProgram.Cell), - -/// The last viewport that we based our rebuild off of. If this changes, -/// then we do a full rebuild of the cells. The pointer values in this pin -/// are NOT SAFE to read because they may be modified, freed, etc from the -/// termio thread. We treat the pointers as integers for comparison only. -cells_viewport: ?terminal.Pin = null, - -/// The size of the cells list that was sent to the GPU. This is used -/// to detect when the cells array was reallocated/resized and handle that -/// accordingly. -gl_cells_size: usize = 0, - -/// The last length of the cells that was written to the GPU. This is used to -/// determine what data needs to be rewritten on the GPU. -gl_cells_written: usize = 0, - -/// Shader program for cell rendering. -gl_state: ?GLState = null, - -/// The font structures. -font_grid: *font.SharedGrid, -font_shaper: font.Shaper, -font_shaper_cache: font.ShaperCache, -texture_grayscale_modified: usize = 0, -texture_grayscale_resized: usize = 0, -texture_color_modified: usize = 0, -texture_color_resized: usize = 0, - -/// True if the window is focused -focused: bool, - -/// The foreground color set by an OSC 10 sequence. If unset then the default -/// value from the config file is used. -foreground_color: ?terminal.color.RGB, - -/// Foreground color set in the user's config file. -default_foreground_color: terminal.color.RGB, - -/// The background color set by an OSC 11 sequence. If unset then the default -/// value from the config file is used. -background_color: ?terminal.color.RGB, - -/// Background color set in the user's config file. -default_background_color: terminal.color.RGB, - -/// The cursor color set by an OSC 12 sequence. If unset then -/// default_cursor_color is used. -cursor_color: ?terminal.color.RGB, - -/// Default cursor color when no color is set explicitly by an OSC 12 command. -/// This is cursor color as set in the user's config, if any. If no cursor color -/// is set in the user's config, then the cursor color is determined by the -/// current foreground color. -default_cursor_color: ?terminal.color.RGB, - -/// When `cursor_color` is null, swap the foreground and background colors of -/// the cell under the cursor for the cursor color. Otherwise, use the default -/// foreground color as the cursor color. -cursor_invert: bool, - -/// The mailbox for communicating with the window. -surface_mailbox: apprt.surface.Mailbox, - -/// Deferred operations. This is used to apply changes to the OpenGL context. -/// Some runtimes (GTK) do not support multi-threading so to keep our logic -/// simple we apply all OpenGL context changes in the render() call. -deferred_screen_size: ?SetScreenSize = null, -deferred_font_size: ?SetFontSize = null, -deferred_config: ?SetConfig = null, - -/// If we're drawing with single threaded operations -draw_mutex: DrawMutex = drawMutexZero, - -/// Current background to draw. This may not match self.background if the -/// terminal is in reversed mode. -draw_background: terminal.color.RGB, - -/// Whether we're doing padding extension for vertical sides. -padding_extend_top: bool = true, -padding_extend_bottom: bool = true, - -/// The images that we may render. -images: ImageMap = .{}, -image_placements: ImagePlacementList = .{}, -image_bg_end: u32 = 0, -image_text_end: u32 = 0, -image_virtual: bool = false, - -/// Deferred OpenGL operation to update the screen size. -const SetScreenSize = struct { - size: renderer.Size, - - fn apply(self: SetScreenSize, r: *OpenGL) !void { - const gl_state: *GLState = if (r.gl_state) |*v| - v - else - return error.OpenGLUninitialized; - - // Apply our padding - const grid_size = self.size.grid(); - const terminal_size = self.size.terminal(); - - // Blank space around the grid. - const blank: renderer.Padding = switch (r.config.padding_color) { - // We can use zero padding because the background color is our - // clear color. - .background => .{}, - - .extend, .@"extend-always" => self.size.screen.blankPadding( - self.size.padding, - grid_size, - self.size.cell, - ).add(self.size.padding), - }; - - // Update our viewport for this context to be the entire window. - // OpenGL works in pixels, so we have to use the pixel size. - try gl.viewport( - 0, - 0, - @intCast(self.size.screen.width), - @intCast(self.size.screen.height), - ); - - // Update the projection uniform within our shader - inline for (.{ "cell_program", "image_program" }) |name| { - const program = @field(gl_state, name); - const bind = try program.program.use(); - defer bind.unbind(); - try program.program.setUniform( - "projection", - - // 2D orthographic projection with the full w/h - math.ortho2d( - -1 * @as(f32, @floatFromInt(self.size.padding.left)), - @floatFromInt(terminal_size.width + self.size.padding.right), - @floatFromInt(terminal_size.height + self.size.padding.bottom), - -1 * @as(f32, @floatFromInt(self.size.padding.top)), - ), - ); - } - - // Setup our grid padding - { - const program = gl_state.cell_program; - const bind = try program.program.use(); - defer bind.unbind(); - try program.program.setUniform( - "grid_padding", - @Vector(4, f32){ - @floatFromInt(blank.top), - @floatFromInt(blank.right), - @floatFromInt(blank.bottom), - @floatFromInt(blank.left), - }, - ); - try program.program.setUniform( - "grid_size", - @Vector(2, f32){ - @floatFromInt(grid_size.columns), - @floatFromInt(grid_size.rows), - }, - ); - } - - // Update our custom shader resolution - if (gl_state.custom) |*custom_state| { - try custom_state.setScreenSize(self.size); - } - } -}; - -const SetFontSize = struct { - metrics: font.Metrics, - - fn apply(self: SetFontSize, r: *const OpenGL) !void { - const gl_state = r.gl_state orelse return error.OpenGLUninitialized; - - inline for (.{ "cell_program", "image_program" }) |name| { - const program = @field(gl_state, name); - const bind = try program.program.use(); - defer bind.unbind(); - try program.program.setUniform( - "cell_size", - @Vector(2, f32){ - @floatFromInt(self.metrics.cell_width), - @floatFromInt(self.metrics.cell_height), - }, - ); - } - } -}; - -const SetConfig = struct { - fn apply(self: SetConfig, r: *const OpenGL) !void { - _ = self; - const gl_state = r.gl_state orelse return error.OpenGLUninitialized; - - const bind = try gl_state.cell_program.program.use(); - defer bind.unbind(); - try gl_state.cell_program.program.setUniform( - "min_contrast", - r.config.min_contrast, - ); - } -}; - -/// The configuration for this renderer that is derived from the main -/// configuration. This must be exported so that we don't need to -/// pass around Config pointers which makes memory management a pain. -pub const DerivedConfig = struct { - arena: ArenaAllocator, - - font_thicken: bool, - font_thicken_strength: u8, - font_features: std.ArrayListUnmanaged([:0]const u8), - font_styles: font.CodepointResolver.StyleStatus, - cursor_color: ?terminal.color.RGB, - cursor_invert: bool, - cursor_text: ?terminal.color.RGB, - cursor_opacity: f64, - background: terminal.color.RGB, - background_opacity: f64, - foreground: terminal.color.RGB, - selection_background: ?terminal.color.RGB, - selection_foreground: ?terminal.color.RGB, - invert_selection_fg_bg: bool, - bold_is_bright: bool, - min_contrast: f32, - padding_color: configpkg.WindowPaddingColor, - custom_shaders: configpkg.RepeatablePath, - links: link.Set, - - pub fn init( - alloc_gpa: Allocator, - config: *const configpkg.Config, - ) !DerivedConfig { - var arena = ArenaAllocator.init(alloc_gpa); - errdefer arena.deinit(); - const alloc = arena.allocator(); - - // Copy our shaders - const custom_shaders = try config.@"custom-shader".clone(alloc); - - // Copy our font features - const font_features = try config.@"font-feature".clone(alloc); - - // Get our font styles - var font_styles = font.CodepointResolver.StyleStatus.initFill(true); - font_styles.set(.bold, config.@"font-style-bold" != .false); - font_styles.set(.italic, config.@"font-style-italic" != .false); - font_styles.set(.bold_italic, config.@"font-style-bold-italic" != .false); - - // Our link configs - const links = try link.Set.fromConfig( - alloc, - config.link.links.items, - ); - - const cursor_invert = config.@"cursor-invert-fg-bg"; - - return .{ - .background_opacity = @max(0, @min(1, config.@"background-opacity")), - .font_thicken = config.@"font-thicken", - .font_thicken_strength = config.@"font-thicken-strength", - .font_features = font_features.list, - .font_styles = font_styles, - - .cursor_color = if (!cursor_invert and config.@"cursor-color" != null) - config.@"cursor-color".?.toTerminalRGB() - else - null, - - .cursor_invert = cursor_invert, - - .cursor_text = if (config.@"cursor-text") |txt| - txt.toTerminalRGB() - else - null, - - .cursor_opacity = @max(0, @min(1, config.@"cursor-opacity")), - - .background = config.background.toTerminalRGB(), - .foreground = config.foreground.toTerminalRGB(), - .invert_selection_fg_bg = config.@"selection-invert-fg-bg", - .bold_is_bright = config.@"bold-is-bright", - .min_contrast = @floatCast(config.@"minimum-contrast"), - .padding_color = config.@"window-padding-color", - - .selection_background = if (config.@"selection-background") |bg| - bg.toTerminalRGB() - else - null, - - .selection_foreground = if (config.@"selection-foreground") |bg| - bg.toTerminalRGB() - else - null, - - .custom_shaders = custom_shaders, - .links = links, - - .arena = arena, - }; - } - - pub fn deinit(self: *DerivedConfig) void { - const alloc = self.arena.allocator(); - self.links.deinit(alloc); - self.arena.deinit(); - } -}; - -pub fn init(alloc: Allocator, options: renderer.Options) !OpenGL { - // Create the initial font shaper - var shaper = try font.Shaper.init(alloc, .{ - .features = options.config.font_features.items, - }); - errdefer shaper.deinit(); - - // For the remainder of the setup we lock our font grid data because - // we're reading it. - const grid = options.font_grid; - grid.lock.lockShared(); - defer grid.lock.unlockShared(); - - var gl_state = try GLState.init(alloc, options.config, grid); - errdefer gl_state.deinit(); - - return OpenGL{ +pub fn init(alloc: Allocator, opts: rendererpkg.Options) !OpenGL { + return .{ .alloc = alloc, - .config = options.config, - .cells_bg = .{}, - .cells = .{}, - .grid_metrics = grid.metrics, - .size = options.size, - .gl_state = gl_state, - .font_grid = grid, - .font_shaper = shaper, - .font_shaper_cache = font.ShaperCache.init(), - .draw_background = options.config.background, - .focused = true, - .foreground_color = null, - .default_foreground_color = options.config.foreground, - .background_color = null, - .default_background_color = options.config.background, - .cursor_color = null, - .default_cursor_color = options.config.cursor_color, - .cursor_invert = options.config.cursor_invert, - .surface_mailbox = options.surface_mailbox, - .deferred_font_size = .{ .metrics = grid.metrics }, - .deferred_config = .{}, + .blending = opts.config.blending, }; } pub fn deinit(self: *OpenGL) void { - self.font_shaper.deinit(); - self.font_shaper_cache.deinit(self.alloc); - - { - var it = self.images.iterator(); - while (it.next()) |kv| kv.value_ptr.image.deinit(self.alloc); - self.images.deinit(self.alloc); - } - self.image_placements.deinit(self.alloc); - - if (self.gl_state) |*v| v.deinit(self.alloc); - - self.cells.deinit(self.alloc); - self.cells_bg.deinit(self.alloc); - - self.config.deinit(); - self.* = undefined; } /// Returns the hints that we want for this pub fn glfwWindowHints(config: *const configpkg.Config) glfw.Window.Hints { + _ = config; return .{ - .context_version_major = 3, - .context_version_minor = 3, + .context_version_major = MIN_VERSION_MAJOR, + .context_version_minor = MIN_VERSION_MINOR, .opengl_profile = .opengl_core_profile, .opengl_forward_compat = true, - .cocoa_graphics_switching = builtin.os.tag == .macos, - .cocoa_retina_framebuffer = true, - .transparent_framebuffer = config.@"background-opacity" < 1, + .transparent_framebuffer = true, }; } +fn glDebugMessageCallback( + src: gl.c.GLenum, + typ: gl.c.GLenum, + id: gl.c.GLuint, + severity: gl.c.GLenum, + len: gl.c.GLsizei, + msg: [*c]const gl.c.GLchar, + user_param: ?*const anyopaque, +) callconv(.c) void { + _ = user_param; + + const src_str: []const u8 = switch (src) { + gl.c.GL_DEBUG_SOURCE_API => "OpenGL API", + gl.c.GL_DEBUG_SOURCE_WINDOW_SYSTEM => "Window System", + gl.c.GL_DEBUG_SOURCE_SHADER_COMPILER => "Shader Compiler", + gl.c.GL_DEBUG_SOURCE_THIRD_PARTY => "Third Party", + gl.c.GL_DEBUG_SOURCE_APPLICATION => "User", + gl.c.GL_DEBUG_SOURCE_OTHER => "Other", + else => "Unknown", + }; + + const typ_str: []const u8 = switch (typ) { + gl.c.GL_DEBUG_TYPE_ERROR => "Error", + gl.c.GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR => "Deprecated Behavior", + gl.c.GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR => "Undefined Behavior", + gl.c.GL_DEBUG_TYPE_PORTABILITY => "Portability Issue", + gl.c.GL_DEBUG_TYPE_PERFORMANCE => "Performance Issue", + gl.c.GL_DEBUG_TYPE_MARKER => "Marker", + gl.c.GL_DEBUG_TYPE_PUSH_GROUP => "Group Push", + gl.c.GL_DEBUG_TYPE_POP_GROUP => "Group Pop", + gl.c.GL_DEBUG_TYPE_OTHER => "Other", + else => "Unknown", + }; + + const msg_str = msg[0..@intCast(len)]; + + (switch (severity) { + gl.c.GL_DEBUG_SEVERITY_HIGH => log.err( + "[{d}] ({s}: {s}) {s}", + .{ id, src_str, typ_str, msg_str }, + ), + gl.c.GL_DEBUG_SEVERITY_MEDIUM => log.warn( + "[{d}] ({s}: {s}) {s}", + .{ id, src_str, typ_str, msg_str }, + ), + gl.c.GL_DEBUG_SEVERITY_LOW => log.info( + "[{d}] ({s}: {s}) {s}", + .{ id, src_str, typ_str, msg_str }, + ), + gl.c.GL_DEBUG_SEVERITY_NOTIFICATION => log.debug( + "[{d}] ({s}: {s}) {s}", + .{ id, src_str, typ_str, msg_str }, + ), + else => log.warn( + "UNKNOWN SEVERITY [{d}] ({s}: {s}) {s}", + .{ id, src_str, typ_str, msg_str }, + ), + }); +} + +/// Prepares the provided GL context, loading it with glad. +fn prepareContext(getProcAddress: anytype) !void { + const version = try gl.glad.load(getProcAddress); + const major = gl.glad.versionMajor(@intCast(version)); + const minor = gl.glad.versionMinor(@intCast(version)); + errdefer gl.glad.unload(); + log.info("loaded OpenGL {}.{}", .{ major, minor }); + + // Enable debug output for the context. + try gl.enable(gl.c.GL_DEBUG_OUTPUT); + + // Register our debug message callback with the OpenGL context. + gl.glad.context.DebugMessageCallback.?(glDebugMessageCallback, null); + + // Enable SRGB framebuffer for linear blending support. + try gl.enable(gl.c.GL_FRAMEBUFFER_SRGB); + + if (major < MIN_VERSION_MAJOR or + (major == MIN_VERSION_MAJOR and minor < MIN_VERSION_MINOR)) + { + log.warn( + "OpenGL version is too old. Ghostty requires OpenGL {d}.{d}", + .{ MIN_VERSION_MAJOR, MIN_VERSION_MINOR }, + ); + return error.OpenGLOutdated; + } +} + /// This is called early right after surface creation. pub fn surfaceInit(surface: *apprt.Surface) !void { // Treat this like a thread entry @@ -455,20 +162,8 @@ pub fn surfaceInit(surface: *apprt.Surface) !void { switch (apprt.runtime) { else => @compileError("unsupported app runtime for OpenGL"), - apprt.gtk => { - // GTK uses global OpenGL context so we load from null. - const version = try gl.glad.load(null); - const major = gl.glad.versionMajor(@intCast(version)); - const minor = gl.glad.versionMinor(@intCast(version)); - errdefer gl.glad.unload(); - log.info("loaded OpenGL {}.{}", .{ major, minor }); - - // We require at least OpenGL 3.3 - if (major < 3 or (major == 3 and minor < 3)) { - log.warn("OpenGL version is too old. Ghostty requires OpenGL 3.3", .{}); - return error.OpenGLOutdated; - } - }, + // GTK uses global OpenGL context so we load from null. + apprt.gtk => try prepareContext(null), apprt.glfw => try self.threadEnter(surface), @@ -489,69 +184,19 @@ pub fn surfaceInit(surface: *apprt.Surface) !void { // } } -/// This is called just prior to spinning up the renderer thread for -/// final main thread setup requirements. +/// This is called just prior to spinning up the renderer +/// thread for final main thread setup requirements. pub fn finalizeSurfaceInit(self: *const OpenGL, surface: *apprt.Surface) !void { _ = self; _ = surface; - // For GLFW, we grabbed the OpenGL context in surfaceInit and we - // need to release it before we start the renderer thread. + // For GLFW, we grabbed the OpenGL context in surfaceInit and + // we need to release it before we start the renderer thread. if (apprt.runtime == apprt.glfw) { glfw.makeContextCurrent(null); } } -/// Called when the OpenGL context is made invalid, so we need to free -/// all previous resources and stop rendering. -pub fn displayUnrealized(self: *OpenGL) void { - if (single_threaded_draw) self.draw_mutex.lock(); - defer if (single_threaded_draw) self.draw_mutex.unlock(); - - if (self.gl_state) |*v| { - v.deinit(self.alloc); - self.gl_state = null; - } -} - -/// Called when the OpenGL is ready to be initialized. -pub fn displayRealize(self: *OpenGL) !void { - if (single_threaded_draw) self.draw_mutex.lock(); - defer if (single_threaded_draw) self.draw_mutex.unlock(); - - // Make our new state - var gl_state = gl_state: { - self.font_grid.lock.lockShared(); - defer self.font_grid.lock.unlockShared(); - break :gl_state try GLState.init( - self.alloc, - self.config, - self.font_grid, - ); - }; - errdefer gl_state.deinit(); - - // Unrealize if we have to - if (self.gl_state) |*v| v.deinit(self.alloc); - - // Set our new state - self.gl_state = gl_state; - - // Make sure we invalidate all the fields so that we - // reflush everything - self.gl_cells_size = 0; - self.gl_cells_written = 0; - self.texture_grayscale_modified = 0; - self.texture_color_modified = 0; - self.texture_grayscale_resized = 0; - self.texture_color_resized = 0; - - // We need to reset our uniforms - self.deferred_screen_size = .{ .size = self.size }; - self.deferred_font_size = .{ .metrics = self.grid_metrics }; - self.deferred_config = .{}; -} - /// Callback called by renderer.Thread when it begins. pub fn threadEnter(self: *const OpenGL, surface: *apprt.Surface) !void { _ = self; @@ -568,22 +213,17 @@ pub fn threadEnter(self: *const OpenGL, surface: *apprt.Surface) !void { apprt.glfw => { // We need to make the OpenGL context current. OpenGL requires - // that a single thread own the a single OpenGL context (if any). This - // ensures that the context switches over to our thread. Important: - // the prior thread MUST have detached the context prior to calling - // this entrypoint. + // that a single thread own the a single OpenGL context (if any). + // This ensures that the context switches over to our thread. + // Important: the prior thread MUST have detached the context + // prior to calling this entrypoint. glfw.makeContextCurrent(surface.window); errdefer glfw.makeContextCurrent(null); glfw.swapInterval(1); // Load OpenGL bindings. This API is context-aware so this sets // a threadlocal context for these pointers. - const version = try gl.glad.load(&glfw.getProcAddress); - errdefer gl.glad.unload(); - log.info("loaded OpenGL {}.{}", .{ - gl.glad.versionMajor(@intCast(version)), - gl.glad.versionMinor(@intCast(version)), - }); + try prepareContext(&glfw.getProcAddress); }, apprt.embedded => { @@ -617,2068 +257,149 @@ pub fn threadExit(self: *const OpenGL) void { } } -/// True if our renderer has animations so that a higher frequency -/// timer is used. -pub fn hasAnimations(self: *const OpenGL) bool { - const state = self.gl_state orelse return false; - return state.custom != null; -} - -/// See Metal -pub fn hasVsync(self: *const OpenGL) bool { +pub fn displayRealized(self: *const OpenGL) void { _ = self; - // OpenGL currently never has vsync - return false; -} - -/// See Metal. -pub fn markDirty(self: *OpenGL) void { - // Do nothing, we don't have dirty tracking yet. - _ = self; -} - -/// Callback when the focus changes for the terminal this is rendering. -/// -/// Must be called on the render thread. -pub fn setFocus(self: *OpenGL, focus: bool) !void { - self.focused = focus; -} - -/// Callback when the window is visible or occluded. -/// -/// Must be called on the render thread. -pub fn setVisible(self: *OpenGL, visible: bool) void { - _ = self; - _ = visible; -} - -/// Set the new font grid. -/// -/// Must be called on the render thread. -pub fn setFontGrid(self: *OpenGL, grid: *font.SharedGrid) void { - if (single_threaded_draw) self.draw_mutex.lock(); - defer if (single_threaded_draw) self.draw_mutex.unlock(); - - // Reset our font grid - self.font_grid = grid; - self.grid_metrics = grid.metrics; - self.texture_grayscale_modified = 0; - self.texture_grayscale_resized = 0; - self.texture_color_modified = 0; - self.texture_color_resized = 0; - - // Reset our shaper cache. If our font changed (not just the size) then - // the data in the shaper cache may be invalid and cannot be used, so we - // always clear the cache just in case. - const font_shaper_cache = font.ShaperCache.init(); - self.font_shaper_cache.deinit(self.alloc); - self.font_shaper_cache = font_shaper_cache; - - // Update our screen size because the font grid can affect grid - // metrics which update uniforms. - self.deferred_screen_size = .{ .size = self.size }; - - // Defer our GPU updates - self.deferred_font_size = .{ .metrics = grid.metrics }; -} - -/// The primary render callback that is completely thread-safe. -pub fn updateFrame( - self: *OpenGL, - surface: *apprt.Surface, - state: *renderer.State, - cursor_blink_visible: bool, -) !void { - _ = surface; - - // Data we extract out of the critical area. - const Critical = struct { - full_rebuild: bool, - gl_bg: terminal.color.RGB, - screen: terminal.Screen, - screen_type: terminal.ScreenType, - mouse: renderer.State.Mouse, - preedit: ?renderer.State.Preedit, - cursor_style: ?renderer.CursorStyle, - color_palette: terminal.color.Palette, - }; - - // Update all our data as tightly as possible within the mutex. - var critical: Critical = critical: { - state.mutex.lock(); - defer state.mutex.unlock(); - - // If we're in a synchronized output state, we pause all rendering. - if (state.terminal.modes.get(.synchronized_output)) { - log.debug("synchronized output started, skipping render", .{}); - return; - } - - // Swap bg/fg if the terminal is reversed - const bg = self.background_color orelse self.default_background_color; - const fg = self.foreground_color orelse self.default_foreground_color; - defer { - if (self.background_color) |*c| { - c.* = bg; - } else { - self.default_background_color = bg; - } - - if (self.foreground_color) |*c| { - c.* = fg; - } else { - self.default_foreground_color = fg; - } - } - - if (state.terminal.modes.get(.reverse_colors)) { - if (self.background_color) |*c| { - c.* = fg; - } else { - self.default_background_color = fg; - } - - if (self.foreground_color) |*c| { - c.* = bg; - } else { - self.default_foreground_color = bg; - } - } - - // Get the viewport pin so that we can compare it to the current. - const viewport_pin = state.terminal.screen.pages.pin(.{ .viewport = .{} }).?; - - // We used to share terminal state, but we've since learned through - // analysis that it is faster to copy the terminal state than to - // hold the lock while rebuilding GPU cells. - var screen_copy = try state.terminal.screen.clone( - self.alloc, - .{ .viewport = .{} }, - null, - ); - errdefer screen_copy.deinit(); - - // Whether to draw our cursor or not. - const cursor_style = if (state.terminal.flags.password_input) - .lock - else - renderer.cursorStyle( - state, - self.focused, - cursor_blink_visible, - ); - - // Get our preedit state - const preedit: ?renderer.State.Preedit = preedit: { - if (cursor_style == null) break :preedit null; - const p = state.preedit orelse break :preedit null; - break :preedit try p.clone(self.alloc); - }; - errdefer if (preedit) |p| p.deinit(self.alloc); - - // If we have Kitty graphics data, we enter a SLOW SLOW SLOW path. - // We only do this if the Kitty image state is dirty meaning only if - // it changes. - // - // If we have any virtual references, we must also rebuild our - // kitty state on every frame because any cell change can move - // an image. - if (state.terminal.screen.kitty_images.dirty or - self.image_virtual) - { - // prepKittyGraphics touches self.images which is also used - // in drawFrame so if we're drawing on a separate thread we need - // to lock this. - if (single_threaded_draw) self.draw_mutex.lock(); - defer if (single_threaded_draw) self.draw_mutex.unlock(); - try self.prepKittyGraphics(state.terminal); - } - - // If we have any terminal dirty flags set then we need to rebuild - // the entire screen. This can be optimized in the future. - const full_rebuild: bool = rebuild: { - { - const Int = @typeInfo(terminal.Terminal.Dirty).@"struct".backing_integer.?; - const v: Int = @bitCast(state.terminal.flags.dirty); - if (v > 0) break :rebuild true; - } - { - const Int = @typeInfo(terminal.Screen.Dirty).@"struct".backing_integer.?; - const v: Int = @bitCast(state.terminal.screen.dirty); - if (v > 0) break :rebuild true; - } - - // If our viewport changed then we need to rebuild the entire - // screen because it means we scrolled. If we have no previous - // viewport then we must rebuild. - const prev_viewport = self.cells_viewport orelse break :rebuild true; - if (!prev_viewport.eql(viewport_pin)) break :rebuild true; - - break :rebuild false; - }; - - // Reset the dirty flags in the terminal and screen. We assume - // that our rebuild will be successful since so we optimize for - // success and reset while we hold the lock. This is much easier - // than coordinating row by row or as changes are persisted. - state.terminal.flags.dirty = .{}; - state.terminal.screen.dirty = .{}; - { - var it = state.terminal.screen.pages.pageIterator( - .right_down, - .{ .screen = .{} }, - null, - ); - while (it.next()) |chunk| { - var dirty_set = chunk.node.data.dirtyBitSet(); - dirty_set.unsetAll(); - } - } - - // Update our viewport pin for dirty tracking - self.cells_viewport = viewport_pin; - - break :critical .{ - .full_rebuild = full_rebuild, - .gl_bg = self.background_color orelse self.default_background_color, - .screen = screen_copy, - .screen_type = state.terminal.active_screen, - .mouse = state.mouse, - .preedit = preedit, - .cursor_style = cursor_style, - .color_palette = state.terminal.color_palette.colors, - }; - }; - defer { - critical.screen.deinit(); - if (critical.preedit) |p| p.deinit(self.alloc); - } - - // Grab our draw mutex if we have it and update our data - { - if (single_threaded_draw) self.draw_mutex.lock(); - defer if (single_threaded_draw) self.draw_mutex.unlock(); - - // Set our draw data - self.draw_background = critical.gl_bg; - - // Build our GPU cells - try self.rebuildCells( - critical.full_rebuild, - &critical.screen, - critical.screen_type, - critical.mouse, - critical.preedit, - critical.cursor_style, - &critical.color_palette, - ); - - // Notify our shaper we're done for the frame. For some shapers like - // CoreText this triggers off-thread cleanup logic. - self.font_shaper.endFrame(); - } -} - -/// This goes through the Kitty graphic placements and accumulates the -/// placements we need to render on our viewport. It also ensures that -/// the visible images are loaded on the GPU. -fn prepKittyGraphics( - self: *OpenGL, - t: *terminal.Terminal, -) !void { - const storage = &t.screen.kitty_images; - defer storage.dirty = false; - - // We always clear our previous placements no matter what because - // we rebuild them from scratch. - self.image_placements.clearRetainingCapacity(); - self.image_virtual = false; - - // Go through our known images and if there are any that are no longer - // in use then mark them to be freed. - // - // This never conflicts with the below because a placement can't - // reference an image that doesn't exist. - { - var it = self.images.iterator(); - while (it.next()) |kv| { - if (storage.imageById(kv.key_ptr.*) == null) { - kv.value_ptr.image.markForUnload(); - } - } - } - - // The top-left and bottom-right corners of our viewport in screen - // points. This lets us determine offsets and containment of placements. - const top = t.screen.pages.getTopLeft(.viewport); - const bot = t.screen.pages.getBottomRight(.viewport).?; - const top_y = t.screen.pages.pointFromPin(.screen, top).?.screen.y; - const bot_y = t.screen.pages.pointFromPin(.screen, bot).?.screen.y; - - // Go through the placements and ensure the image is loaded on the GPU. - var it = storage.placements.iterator(); - while (it.next()) |kv| { - // Find the image in storage - const p = kv.value_ptr; - - // Special logic based on location - switch (p.location) { - .pin => {}, - .virtual => { - // We need to mark virtual placements on our renderer so that - // we know to rebuild in more scenarios since cell changes can - // now trigger placement changes. - self.image_virtual = true; - - // We also continue out because virtual placements are - // only triggered by the unicode placeholder, not by the - // placement itself. - continue; - }, - } - - const image = storage.imageById(kv.key_ptr.image_id) orelse { - log.warn( - "missing image for placement, ignoring image_id={}", - .{kv.key_ptr.image_id}, - ); - continue; - }; - - try self.prepKittyPlacement(t, top_y, bot_y, &image, p); - } - - // If we have virtual placements then we need to scan for placeholders. - if (self.image_virtual) { - var v_it = terminal.kitty.graphics.unicode.placementIterator(top, bot); - while (v_it.next()) |virtual_p| try self.prepKittyVirtualPlacement( - t, - &virtual_p, - ); - } - - // Sort the placements by their Z value. - std.mem.sortUnstable( - gl_image.Placement, - self.image_placements.items, - {}, - struct { - fn lessThan( - ctx: void, - lhs: gl_image.Placement, - rhs: gl_image.Placement, - ) bool { - _ = ctx; - return lhs.z < rhs.z or (lhs.z == rhs.z and lhs.image_id < rhs.image_id); - } - }.lessThan, - ); - - // Find our indices. The values are sorted by z so we can find the - // first placement out of bounds to find the limits. - var bg_end: ?u32 = null; - var text_end: ?u32 = null; - const bg_limit = std.math.minInt(i32) / 2; - for (self.image_placements.items, 0..) |p, i| { - if (bg_end == null and p.z >= bg_limit) { - bg_end = @intCast(i); - } - if (text_end == null and p.z >= 0) { - text_end = @intCast(i); - } - } - - self.image_bg_end = bg_end orelse 0; - self.image_text_end = text_end orelse self.image_bg_end; -} - -fn prepKittyVirtualPlacement( - self: *OpenGL, - t: *terminal.Terminal, - p: *const terminal.kitty.graphics.unicode.Placement, -) !void { - const storage = &t.screen.kitty_images; - const image = storage.imageById(p.image_id) orelse { - log.warn( - "missing image for virtual placement, ignoring image_id={}", - .{p.image_id}, - ); - return; - }; - - const rp = p.renderPlacement( - storage, - &image, - self.grid_metrics.cell_width, - self.grid_metrics.cell_height, - ) catch |err| { - log.warn("error rendering virtual placement err={}", .{err}); - return; - }; - - // If our placement is zero sized then we don't do anything. - if (rp.dest_width == 0 or rp.dest_height == 0) return; - - const viewport: terminal.point.Point = t.screen.pages.pointFromPin( - .viewport, - rp.top_left, - ) orelse { - // This is unreachable with virtual placements because we should - // only ever be looking at virtual placements that are in our - // viewport in the renderer and virtual placements only ever take - // up one row. - unreachable; - }; - - // Send our image to the GPU and store the placement for rendering. - try self.prepKittyImage(&image); - try self.image_placements.append(self.alloc, .{ - .image_id = image.id, - .x = @intCast(rp.top_left.x), - .y = @intCast(viewport.viewport.y), - .z = -1, - .width = rp.dest_width, - .height = rp.dest_height, - .cell_offset_x = rp.offset_x, - .cell_offset_y = rp.offset_y, - .source_x = rp.source_x, - .source_y = rp.source_y, - .source_width = rp.source_width, - .source_height = rp.source_height, - }); -} - -fn prepKittyPlacement( - self: *OpenGL, - t: *terminal.Terminal, - top_y: u32, - bot_y: u32, - image: *const terminal.kitty.graphics.Image, - p: *const terminal.kitty.graphics.ImageStorage.Placement, -) !void { - // Get the rect for the placement. If this placement doesn't have - // a rect then its virtual or something so skip it. - const rect = p.rect(image.*, t) orelse return; - - // This is expensive but necessary. - const img_top_y = t.screen.pages.pointFromPin(.screen, rect.top_left).?.screen.y; - const img_bot_y = t.screen.pages.pointFromPin(.screen, rect.bottom_right).?.screen.y; - - // If the selection isn't within our viewport then skip it. - if (img_top_y > bot_y) return; - if (img_bot_y < top_y) return; - - // We need to prep this image for upload if it isn't in the cache OR - // it is in the cache but the transmit time doesn't match meaning this - // image is different. - try self.prepKittyImage(image); - - // Calculate the dimensions of our image, taking in to - // account the rows / columns specified by the placement. - const dest_size = p.calculatedSize(image.*, t); - - // Calculate the source rectangle - const source_x = @min(image.width, p.source_x); - const source_y = @min(image.height, p.source_y); - const source_width = if (p.source_width > 0) - @min(image.width - source_x, p.source_width) - else - image.width; - const source_height = if (p.source_height > 0) - @min(image.height - source_y, p.source_height) - else - image.height; - - // Get the viewport-relative Y position of the placement. - const y_pos: i32 = @as(i32, @intCast(img_top_y)) - @as(i32, @intCast(top_y)); - - // Accumulate the placement - if (dest_size.width > 0 and dest_size.height > 0) { - try self.image_placements.append(self.alloc, .{ - .image_id = image.id, - .x = @intCast(rect.top_left.x), - .y = y_pos, - .z = p.z, - .width = dest_size.width, - .height = dest_size.height, - .cell_offset_x = p.x_offset, - .cell_offset_y = p.y_offset, - .source_x = source_x, - .source_y = source_y, - .source_width = source_width, - .source_height = source_height, - }); - } -} - -fn prepKittyImage( - self: *OpenGL, - image: *const terminal.kitty.graphics.Image, -) !void { - // We need to prep this image for upload if it isn't in the cache OR - // it is in the cache but the transmit time doesn't match meaning this - // image is different. - const gop = try self.images.getOrPut(self.alloc, image.id); - if (gop.found_existing and - gop.value_ptr.transmit_time.order(image.transmit_time) == .eq) - { - return; - } - - // Copy the data into the pending state. - const data = try self.alloc.dupe(u8, image.data); - errdefer self.alloc.free(data); - - // Store it in the map - const pending: Image.Pending = .{ - .width = image.width, - .height = image.height, - .data = data.ptr, - }; - - const new_image: Image = switch (image.format) { - .gray => .{ .pending_gray = pending }, - .gray_alpha => .{ .pending_gray_alpha = pending }, - .rgb => .{ .pending_rgb = pending }, - .rgba => .{ .pending_rgba = pending }, - .png => unreachable, // should be decoded by now - }; - - if (!gop.found_existing) { - gop.value_ptr.* = .{ - .image = new_image, - .transmit_time = undefined, - }; - } else { - try gop.value_ptr.image.markForReplace( - self.alloc, - new_image, - ); - } - - gop.value_ptr.transmit_time = image.transmit_time; -} - -/// rebuildCells rebuilds all the GPU cells from our CPU state. This is a -/// slow operation but ensures that the GPU state exactly matches the CPU state. -/// In steady-state operation, we use some GPU tricks to send down stale data -/// that is ignored. This accumulates more memory; rebuildCells clears it. -/// -/// Note this doesn't have to typically be manually called. Internally, -/// the renderer will do this when it needs more memory space. -pub fn rebuildCells( - self: *OpenGL, - rebuild: bool, - screen: *terminal.Screen, - screen_type: terminal.ScreenType, - mouse: renderer.State.Mouse, - preedit: ?renderer.State.Preedit, - cursor_style_: ?renderer.CursorStyle, - color_palette: *const terminal.color.Palette, -) !void { - _ = screen_type; - - // Bg cells at most will need space for the visible screen size - self.cells_bg.clearRetainingCapacity(); - self.cells.clearRetainingCapacity(); - - // Create an arena for all our temporary allocations while rebuilding - var arena = ArenaAllocator.init(self.alloc); - defer arena.deinit(); - const arena_alloc = arena.allocator(); - - // We've written no data to the GPU, refresh it all - self.gl_cells_written = 0; - - // Create our match set for the links. - var link_match_set: link.MatchSet = if (mouse.point) |mouse_pt| try self.config.links.matchSet( - arena_alloc, - screen, - mouse_pt, - mouse.mods, - ) else .{}; - - // Determine our x/y range for preedit. We don't want to render anything - // here because we will render the preedit separately. - const preedit_range: ?struct { - y: terminal.size.CellCountInt, - x: [2]terminal.size.CellCountInt, - cp_offset: usize, - } = if (preedit) |preedit_v| preedit: { - const range = preedit_v.range(screen.cursor.x, screen.pages.cols - 1); - break :preedit .{ - .y = screen.cursor.y, - .x = .{ range.start, range.end }, - .cp_offset = range.cp_offset, - }; - } else null; - - // These are all the foreground cells underneath the cursor. - // - // We keep track of these so that we can invert the colors and move them - // in front of the block cursor so that the character remains visible. - // - // We init with a capacity of 4 to account for decorations such - // as underline and strikethrough, as well as combining chars. - var cursor_cells = try std.ArrayListUnmanaged(CellProgram.Cell).initCapacity(arena_alloc, 4); - defer cursor_cells.deinit(arena_alloc); - - if (rebuild) { - switch (self.config.padding_color) { - .background => {}, - - .extend, .@"extend-always" => { - self.padding_extend_top = true; - self.padding_extend_bottom = true; - }, - } - } - - const grid_size = self.size.grid(); - - // We rebuild the cells row-by-row because we do font shaping by row. - var row_it = screen.pages.rowIterator(.left_up, .{ .viewport = .{} }, null); - // If our cell contents buffer is shorter than the screen viewport, - // we render the rows that fit, starting from the bottom. If instead - // the viewport is shorter than the cell contents buffer, we align - // the top of the viewport with the top of the contents buffer. - var y: terminal.size.CellCountInt = @min( - screen.pages.rows, - grid_size.rows, - ); - while (row_it.next()) |row| { - // The viewport may have more rows than our cell contents, - // so we need to break from the loop early if we hit y = 0. - if (y == 0) break; - - y -= 1; - - // True if we want to do font shaping around the cursor. We want to - // do font shaping as long as the cursor is enabled. - const shape_cursor = screen.viewportIsBottom() and - y == screen.cursor.y; - - // If this is the row with our cursor, then we may have to modify - // the cell with the cursor. - const start_i: usize = self.cells.items.len; - defer if (shape_cursor and cursor_style_ == .block) { - const x = screen.cursor.x; - const wide = row.cells(.all)[x].wide; - const min_x = switch (wide) { - .narrow, .spacer_head, .wide => x, - .spacer_tail => x -| 1, - }; - const max_x = switch (wide) { - .narrow, .spacer_head, .spacer_tail => x, - .wide => x +| 1, - }; - for (self.cells.items[start_i..]) |cell| { - if (cell.grid_col < min_x or cell.grid_col > max_x) continue; - if (cell.mode.isFg()) { - cursor_cells.append(arena_alloc, cell) catch { - // We silently ignore if this fails because - // worst case scenario some combining glyphs - // aren't visible under the cursor '\_('-')_/' - }; - } - } - }; - - // We need to get this row's selection if there is one for proper - // run splitting. - const row_selection = sel: { - const sel = screen.selection orelse break :sel null; - const pin = screen.pages.pin(.{ .viewport = .{ .y = y } }) orelse - break :sel null; - break :sel sel.containedRow(screen, pin) orelse null; - }; - - // On primary screen, we still apply vertical padding extension - // under certain conditions we feel are safe. This helps make some - // scenarios look better while avoiding scenarios we know do NOT look - // good. - switch (self.config.padding_color) { - // These already have the correct values set above. - .background, .@"extend-always" => {}, - - // Apply heuristics for padding extension. - .extend => if (y == 0) { - self.padding_extend_top = !row.neverExtendBg( - color_palette, - self.background_color orelse self.default_background_color, - ); - } else if (y == self.size.grid().rows - 1) { - self.padding_extend_bottom = !row.neverExtendBg( - color_palette, - self.background_color orelse self.default_background_color, - ); - }, - } - - // Iterator of runs for shaping. - var run_iter = self.font_shaper.runIterator( - self.font_grid, - screen, - row, - row_selection, - if (shape_cursor) screen.cursor.x else null, - ); - var shaper_run: ?font.shape.TextRun = try run_iter.next(self.alloc); - var shaper_cells: ?[]const font.shape.Cell = null; - var shaper_cells_i: usize = 0; - - const row_cells_all = row.cells(.all); - - // If our viewport is wider than our cell contents buffer, - // we still only process cells up to the width of the buffer. - const row_cells = row_cells_all[0..@min(row_cells_all.len, grid_size.columns)]; - - for (row_cells, 0..) |*cell, x| { - // If this cell falls within our preedit range then we - // skip this because preedits are setup separately. - if (preedit_range) |range| preedit: { - // We're not on the preedit line, no actions necessary. - if (range.y != y) break :preedit; - // We're before the preedit range, no actions necessary. - if (x < range.x[0]) break :preedit; - // We're in the preedit range, skip this cell. - if (x <= range.x[1]) continue; - // After exiting the preedit range we need to catch - // the run position up because of the missed cells. - // In all other cases, no action is necessary. - if (x != range.x[1] + 1) break :preedit; - - // Step the run iterator until we find a run that ends - // after the current cell, which will be the soonest run - // that might contain glyphs for our cell. - while (shaper_run) |run| { - if (run.offset + run.cells > x) break; - shaper_run = try run_iter.next(self.alloc); - shaper_cells = null; - shaper_cells_i = 0; - } - - const run = shaper_run orelse break :preedit; - - // If we haven't shaped this run, do so now. - shaper_cells = shaper_cells orelse - // Try to read the cells from the shaping cache if we can. - self.font_shaper_cache.get(run) orelse - cache: { - // Otherwise we have to shape them. - const cells = try self.font_shaper.shape(run); - - // Try to cache them. If caching fails for any reason we - // continue because it is just a performance optimization, - // not a correctness issue. - self.font_shaper_cache.put( - self.alloc, - run, - cells, - ) catch |err| { - log.warn( - "error caching font shaping results err={}", - .{err}, - ); - }; - - // The cells we get from direct shaping are always owned - // by the shaper and valid until the next shaping call so - // we can safely use them. - break :cache cells; - }; - - // Advance our index until we reach or pass - // our current x position in the shaper cells. - while (shaper_cells.?[shaper_cells_i].x < x) { - shaper_cells_i += 1; - } - } - - const wide = cell.wide; - - const style = row.style(cell); - - const cell_pin: terminal.Pin = cell: { - var copy = row; - copy.x = @intCast(x); - break :cell copy; - }; - - // True if this cell is selected - const selected: bool = if (screen.selection) |sel| - sel.contains(screen, .{ - .node = row.node, - .y = row.y, - .x = @intCast( - // Spacer tails should show the selection - // state of the wide cell they belong to. - if (wide == .spacer_tail) - x -| 1 - else - x, - ), - }) - else - false; - - const bg_style = style.bg(cell, color_palette); - const fg_style = style.fg(color_palette, self.config.bold_is_bright) orelse self.foreground_color orelse self.default_foreground_color; - - // The final background color for the cell. - const bg = bg: { - if (selected) { - break :bg if (self.config.invert_selection_fg_bg) - if (style.flags.inverse) - // Cell is selected with invert selection fg/bg - // enabled, and the cell has the inverse style - // flag, so they cancel out and we get the normal - // bg color. - bg_style - else - // If it doesn't have the inverse style - // flag then we use the fg color instead. - fg_style - else - // If we don't have invert selection fg/bg set then we - // just use the selection background if set, otherwise - // the default fg color. - break :bg self.config.selection_background orelse self.foreground_color orelse self.default_foreground_color; - } - - // Not selected - break :bg if (style.flags.inverse != isCovering(cell.codepoint())) - // Two cases cause us to invert (use the fg color as the bg) - // - The "inverse" style flag. - // - A "covering" glyph; we use fg for bg in that case to - // help make sure that padding extension works correctly. - // If one of these is true (but not the other) - // then we use the fg style color for the bg. - fg_style - else - // Otherwise they cancel out. - bg_style; - }; - - const fg = fg: { - if (selected and !self.config.invert_selection_fg_bg) { - // If we don't have invert selection fg/bg set - // then we just use the selection foreground if - // set, otherwise the default bg color. - break :fg self.config.selection_foreground orelse self.background_color orelse self.default_background_color; - } - - // Whether we need to use the bg color as our fg color: - // - Cell is inverted and not selected - // - Cell is selected and not inverted - // Note: if selected then invert sel fg / bg must be - // false since we separately handle it if true above. - break :fg if (style.flags.inverse != selected) - bg_style orelse self.background_color orelse self.default_background_color - else - fg_style; - }; - - // Foreground alpha for this cell. - const alpha: u8 = if (style.flags.faint) 175 else 255; - - // If the cell has a background color, set it. - const bg_color: [4]u8 = if (bg) |rgb| bg: { - // Determine our background alpha. If we have transparency configured - // then this is dynamic depending on some situations. This is all - // in an attempt to make transparency look the best for various - // situations. See inline comments. - const bg_alpha: u8 = bg_alpha: { - const default: u8 = 255; - - if (self.config.background_opacity >= 1) break :bg_alpha default; - - // If we're selected, we do not apply background opacity - if (selected) break :bg_alpha default; - - // If we're reversed, do not apply background opacity - if (style.flags.inverse) break :bg_alpha default; - - // If we have a background and its not the default background - // then we apply background opacity - if (style.bg(cell, color_palette) != null and !rgb.eql(self.background_color orelse self.default_background_color)) { - break :bg_alpha default; - } - - // We apply background opacity. - var bg_alpha: f64 = @floatFromInt(default); - bg_alpha *= self.config.background_opacity; - bg_alpha = @ceil(bg_alpha); - break :bg_alpha @intFromFloat(bg_alpha); - }; - - try self.cells_bg.append(self.alloc, .{ - .mode = .bg, - .grid_col = @intCast(x), - .grid_row = @intCast(y), - .grid_width = cell.gridWidth(), - .glyph_x = 0, - .glyph_y = 0, - .glyph_width = 0, - .glyph_height = 0, - .glyph_offset_x = 0, - .glyph_offset_y = 0, - .r = rgb.r, - .g = rgb.g, - .b = rgb.b, - .a = bg_alpha, - .bg_r = 0, - .bg_g = 0, - .bg_b = 0, - .bg_a = 0, - }); - - break :bg .{ - rgb.r, rgb.g, rgb.b, bg_alpha, - }; - } else .{ - self.draw_background.r, - self.draw_background.g, - self.draw_background.b, - @intFromFloat(@max(0, @min(255, @round(self.config.background_opacity * 255)))), - }; - - // If the invisible flag is set on this cell then we - // don't need to render any foreground elements, so - // we just skip all glyphs with this x coordinate. - // - // NOTE: This behavior matches xterm. Some other terminal - // emulators, e.g. Alacritty, still render text decorations - // and only make the text itself invisible. The decision - // has been made here to match xterm's behavior for this. - if (style.flags.invisible) { - continue; - } - - // Give links a single underline, unless they already have - // an underline, in which case use a double underline to - // distinguish them. - const underline: terminal.Attribute.Underline = if (link_match_set.contains(screen, cell_pin)) - if (style.flags.underline == .single) - .double - else - .single - else - style.flags.underline; - - // We draw underlines first so that they layer underneath text. - // This improves readability when a colored underline is used - // which intersects parts of the text (descenders). - if (underline != .none) self.addUnderline( - @intCast(x), - @intCast(y), - underline, - style.underlineColor(color_palette) orelse fg, - alpha, - bg_color, - ) catch |err| { - log.warn( - "error adding underline to cell, will be invalid x={} y={}, err={}", - .{ x, y, err }, - ); - }; - - if (style.flags.overline) self.addOverline( - @intCast(x), - @intCast(y), - fg, - alpha, - bg_color, - ) catch |err| { - log.warn( - "error adding overline to cell, will be invalid x={} y={}, err={}", - .{ x, y, err }, - ); - }; - - // If we're at or past the end of our shaper run then - // we need to get the next run from the run iterator. - if (shaper_cells != null and shaper_cells_i >= shaper_cells.?.len) { - shaper_run = try run_iter.next(self.alloc); - shaper_cells = null; - shaper_cells_i = 0; - } - - if (shaper_run) |run| glyphs: { - // If we haven't shaped this run yet, do so. - shaper_cells = shaper_cells orelse - // Try to read the cells from the shaping cache if we can. - self.font_shaper_cache.get(run) orelse - cache: { - // Otherwise we have to shape them. - const cells = try self.font_shaper.shape(run); - - // Try to cache them. If caching fails for any reason we - // continue because it is just a performance optimization, - // not a correctness issue. - self.font_shaper_cache.put( - self.alloc, - run, - cells, - ) catch |err| { - log.warn( - "error caching font shaping results err={}", - .{err}, - ); - }; - - // The cells we get from direct shaping are always owned - // by the shaper and valid until the next shaping call so - // we can safely use them. - break :cache cells; - }; - - const cells = shaper_cells orelse break :glyphs; - - // If there are no shaper cells for this run, ignore it. - // This can occur for runs of empty cells, and is fine. - if (cells.len == 0) break :glyphs; - - // If we encounter a shaper cell to the left of the current - // cell then we have some problems. This logic relies on x - // position monotonically increasing. - assert(cells[shaper_cells_i].x >= x); - - // NOTE: An assumption is made here that a single cell will never - // be present in more than one shaper run. If that assumption is - // violated, this logic breaks. - - while (shaper_cells_i < cells.len and cells[shaper_cells_i].x == x) : ({ - shaper_cells_i += 1; - }) { - self.addGlyph( - @intCast(x), - @intCast(y), - cell_pin, - cells[shaper_cells_i], - shaper_run.?, - fg, - alpha, - bg_color, - ) catch |err| { - log.warn( - "error adding glyph to cell, will be invalid x={} y={}, err={}", - .{ x, y, err }, - ); - }; - } - } - - // Finally, draw a strikethrough if necessary. - if (style.flags.strikethrough) self.addStrikethrough( - @intCast(x), - @intCast(y), - fg, - alpha, - bg_color, - ) catch |err| { - log.warn( - "error adding strikethrough to cell, will be invalid x={} y={}, err={}", - .{ x, y, err }, - ); - }; - } - } - - // Add the cursor at the end so that it overlays everything. If we have - // a cursor cell then we invert the colors on that and add it in so - // that we can always see it. - if (cursor_style_) |cursor_style| cursor_style: { - // If we have a preedit, we try to render the preedit text on top - // of the cursor. - if (preedit) |preedit_v| { - const range = preedit_range.?; - var x = range.x[0]; - for (preedit_v.codepoints[range.cp_offset..]) |cp| { - self.addPreeditCell(cp, x, range.y) catch |err| { - log.warn("error building preedit cell, will be invalid x={} y={}, err={}", .{ - x, - range.y, - err, - }); - }; - - x += if (cp.wide) 2 else 1; - } - - // Preedit hides the cursor - break :cursor_style; - } - - const cursor_color = self.cursor_color orelse self.default_cursor_color orelse color: { - if (self.cursor_invert) { - // Use the foreground color from the cell under the cursor, if any. - const sty = screen.cursor.page_pin.style(screen.cursor.page_cell); - break :color if (sty.flags.inverse) - // If the cell is reversed, use background color instead. - (sty.bg(screen.cursor.page_cell, color_palette) orelse self.background_color orelse self.default_background_color) - else - (sty.fg(color_palette, self.config.bold_is_bright) orelse self.foreground_color orelse self.default_foreground_color); - } else { - break :color self.foreground_color orelse self.default_foreground_color; - } - }; - - _ = try self.addCursor(screen, cursor_style, cursor_color); - for (cursor_cells.items) |*cell| { - if (cell.mode.isFg() and cell.mode != .fg_color) { - const cell_color = if (self.cursor_invert) blk: { - // Use the background color from the cell under the cursor, if any. - const sty = screen.cursor.page_pin.style(screen.cursor.page_cell); - break :blk if (sty.flags.inverse) - // If the cell is reversed, use foreground color instead. - (sty.fg(color_palette, self.config.bold_is_bright) orelse self.foreground_color orelse self.default_foreground_color) - else - (sty.bg(screen.cursor.page_cell, color_palette) orelse self.background_color orelse self.default_background_color); - } else if (self.config.cursor_text) |txt| - txt - else - self.background_color orelse self.default_background_color; - - cell.r = cell_color.r; - cell.g = cell_color.g; - cell.b = cell_color.b; - cell.a = 255; - } - try self.cells.append(self.alloc, cell.*); - } - } - - // Free up memory, generally in case where surface has shrunk. - // If more than half of the capacity is unused, remove all unused capacity. - if (self.cells.items.len * 2 < self.cells.capacity) { - self.cells.shrinkAndFree(self.alloc, self.cells.items.len); - } - if (self.cells_bg.items.len * 2 < self.cells_bg.capacity) { - self.cells_bg.shrinkAndFree(self.alloc, self.cells_bg.items.len); - } - - // Some debug mode safety checks - if (std.debug.runtime_safety) { - for (self.cells_bg.items) |cell| assert(cell.mode == .bg); - for (self.cells.items) |cell| assert(cell.mode != .bg); - } -} - -fn addPreeditCell( - self: *OpenGL, - cp: renderer.State.Preedit.Codepoint, - x: usize, - y: usize, -) !void { - // Preedit is rendered inverted - const bg = self.foreground_color orelse self.default_foreground_color; - const fg = self.background_color orelse self.default_background_color; - - // Render the glyph for our preedit text - const render_ = self.font_grid.renderCodepoint( - self.alloc, - @intCast(cp.codepoint), - .regular, - .text, - .{ .grid_metrics = self.grid_metrics }, - ) catch |err| { - log.warn("error rendering preedit glyph err={}", .{err}); - return; - }; - const render = render_ orelse { - log.warn("failed to find font for preedit codepoint={X}", .{cp.codepoint}); - return; - }; - - // Add our opaque background cell - try self.cells_bg.append(self.alloc, .{ - .mode = .bg, - .grid_col = @intCast(x), - .grid_row = @intCast(y), - .grid_width = if (cp.wide) 2 else 1, - .glyph_x = 0, - .glyph_y = 0, - .glyph_width = 0, - .glyph_height = 0, - .glyph_offset_x = 0, - .glyph_offset_y = 0, - .r = bg.r, - .g = bg.g, - .b = bg.b, - .a = 255, - .bg_r = 0, - .bg_g = 0, - .bg_b = 0, - .bg_a = 0, - }); - - // Add our text - try self.cells.append(self.alloc, .{ - .mode = .fg, - .grid_col = @intCast(x), - .grid_row = @intCast(y), - .grid_width = if (cp.wide) 2 else 1, - .glyph_x = render.glyph.atlas_x, - .glyph_y = render.glyph.atlas_y, - .glyph_width = render.glyph.width, - .glyph_height = render.glyph.height, - .glyph_offset_x = render.glyph.offset_x, - .glyph_offset_y = render.glyph.offset_y, - .r = fg.r, - .g = fg.g, - .b = fg.b, - .a = 255, - .bg_r = bg.r, - .bg_g = bg.g, - .bg_b = bg.b, - .bg_a = 255, - }); -} - -fn addCursor( - self: *OpenGL, - screen: *terminal.Screen, - cursor_style: renderer.CursorStyle, - cursor_color: terminal.color.RGB, -) !?*const CellProgram.Cell { - // Add the cursor. We render the cursor over the wide character if - // we're on the wide character tail. - const wide, const x = cell: { - // The cursor goes over the screen cursor position. - const cell = screen.cursor.page_cell; - if (cell.wide != .spacer_tail or screen.cursor.x == 0) - break :cell .{ cell.wide == .wide, screen.cursor.x }; - - // If we're part of a wide character, we move the cursor back to - // the actual character. - const prev_cell = screen.cursorCellLeft(1); - break :cell .{ prev_cell.wide == .wide, screen.cursor.x - 1 }; - }; - - const alpha: u8 = if (!self.focused) 255 else alpha: { - const alpha = 255 * self.config.cursor_opacity; - break :alpha @intFromFloat(@ceil(alpha)); - }; - - const render = switch (cursor_style) { - .block, - .block_hollow, - .bar, - .underline, - => render: { - const sprite: font.Sprite = switch (cursor_style) { - .block => .cursor_rect, - .block_hollow => .cursor_hollow_rect, - .bar => .cursor_bar, - .underline => .underline, - .lock => unreachable, - }; - - break :render self.font_grid.renderGlyph( - self.alloc, - font.sprite_index, - @intFromEnum(sprite), - .{ - .cell_width = if (wide) 2 else 1, - .grid_metrics = self.grid_metrics, - }, - ) catch |err| { - log.warn("error rendering cursor glyph err={}", .{err}); - return null; - }; - }, - - .lock => self.font_grid.renderCodepoint( - self.alloc, - 0xF023, // lock symbol - .regular, - .text, - .{ - .cell_width = if (wide) 2 else 1, - .grid_metrics = self.grid_metrics, - }, - ) catch |err| { - log.warn("error rendering cursor glyph err={}", .{err}); - return null; - } orelse { - // This should never happen because we embed nerd - // fonts so we just log and return instead of fallback. - log.warn("failed to find lock symbol for cursor codepoint=0xF023", .{}); - return null; - }, - }; - - try self.cells.append(self.alloc, .{ - .mode = .fg, - .grid_col = @intCast(x), - .grid_row = @intCast(screen.cursor.y), - .grid_width = if (wide) 2 else 1, - .r = cursor_color.r, - .g = cursor_color.g, - .b = cursor_color.b, - .a = alpha, - .bg_r = 0, - .bg_g = 0, - .bg_b = 0, - .bg_a = 0, - .glyph_x = render.glyph.atlas_x, - .glyph_y = render.glyph.atlas_y, - .glyph_width = render.glyph.width, - .glyph_height = render.glyph.height, - .glyph_offset_x = render.glyph.offset_x, - .glyph_offset_y = render.glyph.offset_y, - }); - - return &self.cells.items[self.cells.items.len - 1]; -} - -/// Add an underline decoration to the specified cell -fn addUnderline( - self: *OpenGL, - x: terminal.size.CellCountInt, - y: terminal.size.CellCountInt, - style: terminal.Attribute.Underline, - color: terminal.color.RGB, - alpha: u8, - bg: [4]u8, -) !void { - const sprite: font.Sprite = switch (style) { - .none => unreachable, - .single => .underline, - .double => .underline_double, - .dotted => .underline_dotted, - .dashed => .underline_dashed, - .curly => .underline_curly, - }; - - const render = try self.font_grid.renderGlyph( - self.alloc, - font.sprite_index, - @intFromEnum(sprite), - .{ - .cell_width = 1, - .grid_metrics = self.grid_metrics, - }, - ); - - try self.cells.append(self.alloc, .{ - .mode = .fg, - .grid_col = @intCast(x), - .grid_row = @intCast(y), - .grid_width = 1, - .glyph_x = render.glyph.atlas_x, - .glyph_y = render.glyph.atlas_y, - .glyph_width = render.glyph.width, - .glyph_height = render.glyph.height, - .glyph_offset_x = render.glyph.offset_x, - .glyph_offset_y = render.glyph.offset_y, - .r = color.r, - .g = color.g, - .b = color.b, - .a = alpha, - .bg_r = bg[0], - .bg_g = bg[1], - .bg_b = bg[2], - .bg_a = bg[3], - }); -} - -/// Add an overline decoration to the specified cell -fn addOverline( - self: *OpenGL, - x: terminal.size.CellCountInt, - y: terminal.size.CellCountInt, - color: terminal.color.RGB, - alpha: u8, - bg: [4]u8, -) !void { - const render = try self.font_grid.renderGlyph( - self.alloc, - font.sprite_index, - @intFromEnum(font.Sprite.overline), - .{ - .cell_width = 1, - .grid_metrics = self.grid_metrics, - }, - ); - - try self.cells.append(self.alloc, .{ - .mode = .fg, - .grid_col = @intCast(x), - .grid_row = @intCast(y), - .grid_width = 1, - .glyph_x = render.glyph.atlas_x, - .glyph_y = render.glyph.atlas_y, - .glyph_width = render.glyph.width, - .glyph_height = render.glyph.height, - .glyph_offset_x = render.glyph.offset_x, - .glyph_offset_y = render.glyph.offset_y, - .r = color.r, - .g = color.g, - .b = color.b, - .a = alpha, - .bg_r = bg[0], - .bg_g = bg[1], - .bg_b = bg[2], - .bg_a = bg[3], - }); -} - -/// Add a strikethrough decoration to the specified cell -fn addStrikethrough( - self: *OpenGL, - x: terminal.size.CellCountInt, - y: terminal.size.CellCountInt, - color: terminal.color.RGB, - alpha: u8, - bg: [4]u8, -) !void { - const render = try self.font_grid.renderGlyph( - self.alloc, - font.sprite_index, - @intFromEnum(font.Sprite.strikethrough), - .{ - .cell_width = 1, - .grid_metrics = self.grid_metrics, - }, - ); - - try self.cells.append(self.alloc, .{ - .mode = .fg, - .grid_col = @intCast(x), - .grid_row = @intCast(y), - .grid_width = 1, - .glyph_x = render.glyph.atlas_x, - .glyph_y = render.glyph.atlas_y, - .glyph_width = render.glyph.width, - .glyph_height = render.glyph.height, - .glyph_offset_x = render.glyph.offset_x, - .glyph_offset_y = render.glyph.offset_y, - .r = color.r, - .g = color.g, - .b = color.b, - .a = alpha, - .bg_r = bg[0], - .bg_g = bg[1], - .bg_b = bg[2], - .bg_a = bg[3], - }); -} - -// Add a glyph to the specified cell. -fn addGlyph( - self: *OpenGL, - x: terminal.size.CellCountInt, - y: terminal.size.CellCountInt, - cell_pin: terminal.Pin, - shaper_cell: font.shape.Cell, - shaper_run: font.shape.TextRun, - color: terminal.color.RGB, - alpha: u8, - bg: [4]u8, -) !void { - const rac = cell_pin.rowAndCell(); - const cell = rac.cell; - - // Render - const render = try self.font_grid.renderGlyph( - self.alloc, - shaper_run.font_index, - shaper_cell.glyph_index, - .{ - .cell_width = if (cell.wide == .wide) 2 else 1, - .grid_metrics = self.grid_metrics, - .thicken = self.config.font_thicken, - .thicken_strength = self.config.font_thicken_strength, - }, - ); - - // If the glyph is 0 width or height, it will be invisible - // when drawn, so don't bother adding it to the buffer. - if (render.glyph.width == 0 or render.glyph.height == 0) { - return; - } - - // If we're rendering a color font, we use the color atlas - const mode: CellProgram.CellMode = switch (try fgMode( - render.presentation, - cell_pin, - )) { - .normal => .fg, - .color => .fg_color, - .constrained => .fg_constrained, - .powerline => .fg_powerline, - }; - - try self.cells.append(self.alloc, .{ - .mode = mode, - .grid_col = @intCast(x), - .grid_row = @intCast(y), - .grid_width = cell.gridWidth(), - .glyph_x = render.glyph.atlas_x, - .glyph_y = render.glyph.atlas_y, - .glyph_width = render.glyph.width, - .glyph_height = render.glyph.height, - .glyph_offset_x = render.glyph.offset_x + shaper_cell.x_offset, - .glyph_offset_y = render.glyph.offset_y + shaper_cell.y_offset, - .r = color.r, - .g = color.g, - .b = color.b, - .a = alpha, - .bg_r = bg[0], - .bg_g = bg[1], - .bg_b = bg[2], - .bg_a = bg[3], - }); -} - -/// Update the configuration. -pub fn changeConfig(self: *OpenGL, config: *DerivedConfig) !void { - // We always redo the font shaper in case font features changed. We - // could check to see if there was an actual config change but this is - // easier and rare enough to not cause performance issues. - { - var font_shaper = try font.Shaper.init(self.alloc, .{ - .features = config.font_features.items, - }); - errdefer font_shaper.deinit(); - self.font_shaper.deinit(); - self.font_shaper = font_shaper; - } - - // We also need to reset the shaper cache so shaper info - // from the previous font isn't re-used for the new font. - const font_shaper_cache = font.ShaperCache.init(); - self.font_shaper_cache.deinit(self.alloc); - self.font_shaper_cache = font_shaper_cache; - - // Set our new colors - self.default_background_color = config.background; - self.default_foreground_color = config.foreground; - self.default_cursor_color = if (!config.cursor_invert) config.cursor_color else null; - self.cursor_invert = config.cursor_invert; - - // Update our uniforms - self.deferred_config = .{}; - - self.config.deinit(); - self.config = config.*; -} - -/// Set the screen size for rendering. This will update the projection -/// used for the shader so that the scaling of the grid is correct. -pub fn setScreenSize( - self: *OpenGL, - size: renderer.Size, -) !void { - if (single_threaded_draw) self.draw_mutex.lock(); - defer if (single_threaded_draw) self.draw_mutex.unlock(); - - // Store our screen size - self.size = size; - - // Defer our OpenGL updates - self.deferred_screen_size = .{ .size = size }; - - log.debug("screen size size={}", .{size}); -} - -/// Updates the font texture atlas if it is dirty. -fn flushAtlas(self: *OpenGL) !void { - const gl_state = self.gl_state orelse return; - try flushAtlasSingle( - &self.font_grid.lock, - gl_state.texture, - &self.font_grid.atlas_grayscale, - &self.texture_grayscale_modified, - &self.texture_grayscale_resized, - .red, - .red, - ); - try flushAtlasSingle( - &self.font_grid.lock, - gl_state.texture_color, - &self.font_grid.atlas_color, - &self.texture_color_modified, - &self.texture_color_resized, - .rgba, - .bgra, - ); -} - -/// Flush a single atlas, grabbing all necessary locks, checking for -/// changes, etc. -fn flushAtlasSingle( - lock: *std.Thread.RwLock, - texture: gl.Texture, - atlas: *font.Atlas, - modified: *usize, - resized: *usize, - internal_format: gl.Texture.InternalFormat, - format: gl.Texture.Format, -) !void { - // If the texture isn't modified we do nothing - const new_modified = atlas.modified.load(.monotonic); - if (new_modified <= modified.*) return; - - // If it is modified we need to grab a read-lock - lock.lockShared(); - defer lock.unlockShared(); - - var texbind = try texture.bind(.@"2D"); - defer texbind.unbind(); - - const new_resized = atlas.resized.load(.monotonic); - if (new_resized > resized.*) { - try texbind.image2D( - 0, - internal_format, - @intCast(atlas.size), - @intCast(atlas.size), - 0, - format, - .UnsignedByte, - atlas.data.ptr, - ); - - // Only update the resized number after successful resize - resized.* = new_resized; - } else { - try texbind.subImage2D( - 0, - 0, - 0, - @intCast(atlas.size), - @intCast(atlas.size), - format, - .UnsignedByte, - atlas.data.ptr, - ); - } - - // Update our modified tracker after successful update - modified.* = atlas.modified.load(.monotonic); -} - -/// Render renders the current cell state. This will not modify any of -/// the cells. -pub fn drawFrame(self: *OpenGL, surface: *apprt.Surface) !void { - // If we're in single-threaded more we grab a lock since we use shared data. - if (single_threaded_draw) self.draw_mutex.lock(); - defer if (single_threaded_draw) self.draw_mutex.unlock(); - const gl_state: *GLState = if (self.gl_state) |*v| v else return; - - // Go through our images and see if we need to setup any textures. - { - var image_it = self.images.iterator(); - while (image_it.next()) |kv| { - switch (kv.value_ptr.image) { - .ready => {}, - - .pending_gray, - .pending_gray_alpha, - .pending_rgb, - .pending_rgba, - .replace_gray, - .replace_gray_alpha, - .replace_rgb, - .replace_rgba, - => try kv.value_ptr.image.upload(self.alloc), - - .unload_pending, - .unload_replace, - .unload_ready, - => { - kv.value_ptr.image.deinit(self.alloc); - self.images.removeByPtr(kv.key_ptr); - }, - } - } - } - - // In the "OpenGL Programming Guide for Mac" it explains that: "When you - // use an NSOpenGLView object with OpenGL calls that are issued from a - // thread other than the main one, you must set up mutex locking." - // This locks the context and avoids crashes that can happen due to - // races with the underlying Metal layer that Apple is using to - // implement OpenGL. - const is_darwin = builtin.target.os.tag.isDarwin(); - const ogl = if (comptime is_darwin) @cImport({ - @cInclude("OpenGL/OpenGL.h"); - }) else {}; - const cgl_ctx = if (comptime is_darwin) ogl.CGLGetCurrentContext(); - if (comptime is_darwin) _ = ogl.CGLLockContext(cgl_ctx); - defer _ = if (comptime is_darwin) ogl.CGLUnlockContext(cgl_ctx); - - // If our viewport size doesn't match the saved screen size then - // we need to update it. We rely on this over setScreenSize because - // we can pull it directly from the OpenGL context instead of relying - // on the eventual message. - { - var viewport: [4]gl.c.GLint = undefined; - gl.glad.context.GetIntegerv.?(gl.c.GL_VIEWPORT, &viewport); - const screen: renderer.ScreenSize = .{ - .width = @intCast(viewport[2]), - .height = @intCast(viewport[3]), - }; - if (!screen.equals(self.size.screen)) { - self.size.screen = screen; - self.deferred_screen_size = .{ .size = self.size }; - } - } - - // Draw our terminal cells - try self.drawCellProgram(gl_state); - - // Draw our custom shaders - if (gl_state.custom) |*custom_state| { - try self.drawCustomPrograms(custom_state); - } - - // Swap our window buffers switch (apprt.runtime) { - apprt.glfw => surface.window.swapBuffers(), - apprt.gtk => {}, - apprt.embedded => {}, - else => @compileError("unsupported runtime"), + apprt.gtk => prepareContext(null) catch |err| { + log.warn( + "Error preparing GL context in displayRealized, err={}", + .{err}, + ); + }, + + else => @compileError("only GTK should be calling displayRealized"), } } -/// Draw the custom shaders. -fn drawCustomPrograms(self: *OpenGL, custom_state: *custom.State) !void { +pub fn initShaders( + self: *const OpenGL, + alloc: Allocator, + custom_shaders: []const [:0]const u8, +) !shaders.Shaders { + _ = alloc; + return try shaders.Shaders.init( + self.alloc, + custom_shaders, + ); +} + +/// Get the current size of the runtime surface. +pub fn surfaceSize(self: *const OpenGL) !struct { width: u32, height: u32 } { _ = self; - assert(custom_state.programs.len > 0); - - // Bind our state that is global to all custom shaders - const custom_bind = try custom_state.bind(); - defer custom_bind.unbind(); - - // Setup the new frame - try custom_state.newFrame(); - - // Go through each custom shader and draw it. - for (custom_state.programs) |program| { - const bind = try program.bind(); - defer bind.unbind(); - try bind.draw(); - try custom_state.copyFramebuffer(); - } -} - -/// Runs the cell program (shaders) to draw the terminal grid. -fn drawCellProgram( - self: *OpenGL, - gl_state: *const GLState, -) !void { - // Try to flush our atlas, this will only do something if there - // are changes to the atlas. - try self.flushAtlas(); - - // If we have custom shaders, then we draw to the custom - // shader framebuffer. - const fbobind: ?gl.Framebuffer.Binding = fbobind: { - const state = gl_state.custom orelse break :fbobind null; - break :fbobind try state.fbo.bind(.framebuffer); + var viewport: [4]gl.c.GLint = undefined; + gl.glad.context.GetIntegerv.?(gl.c.GL_VIEWPORT, &viewport); + return .{ + .width = @intCast(viewport[2]), + .height = @intCast(viewport[3]), }; - defer if (fbobind) |v| v.unbind(); +} - // Clear the surface - gl.clearColor( - @floatCast(@as(f32, @floatFromInt(self.draw_background.r)) / 255 * self.config.background_opacity), - @floatCast(@as(f32, @floatFromInt(self.draw_background.g)) / 255 * self.config.background_opacity), - @floatCast(@as(f32, @floatFromInt(self.draw_background.b)) / 255 * self.config.background_opacity), - @floatCast(self.config.background_opacity), - ); - gl.clear(gl.c.GL_COLOR_BUFFER_BIT); +/// Initialize a new render target which can be presented by this API. +pub fn initTarget(self: *const OpenGL, width: usize, height: usize) !Target { + return Target.init(.{ + .internal_format = if (self.blending.isLinear()) .srgba else .rgba, + .width = width, + .height = height, + }); +} - // If we have deferred operations, run them. - if (self.deferred_screen_size) |v| { - try v.apply(self); - self.deferred_screen_size = null; - } - if (self.deferred_font_size) |v| { - try v.apply(self); - self.deferred_font_size = null; - } - if (self.deferred_config) |v| { - try v.apply(self); - self.deferred_config = null; - } +/// Present the provided target. +pub fn present(self: *OpenGL, target: Target) !void { + // In order to present a target we blit it to the default framebuffer. - // Apply our padding extension fields - { - const program = gl_state.cell_program; - const bind = try program.program.use(); - defer bind.unbind(); - try program.program.setUniform( - "padding_vertical_top", - self.padding_extend_top, - ); - try program.program.setUniform( - "padding_vertical_bottom", - self.padding_extend_bottom, - ); - } + // We disable GL_FRAMEBUFFER_SRGB while doing this blit, otherwise the + // values may be linearized as they're copied, but even though the draw + // framebuffer has a linear internal format, the values in it should be + // sRGB, not linear! + try gl.disable(gl.c.GL_FRAMEBUFFER_SRGB); + defer gl.enable(gl.c.GL_FRAMEBUFFER_SRGB) catch |err| { + log.err("Error re-enabling GL_FRAMEBUFFER_SRGB, err={}", .{err}); + }; - // Draw background images first - try self.drawImages( - gl_state, - self.image_placements.items[0..self.image_bg_end], + // Bind the target for reading. + const fbobind = try target.framebuffer.bind(.read); + defer fbobind.unbind(); + + // Blit + gl.glad.context.BlitFramebuffer.?( + 0, + 0, + @intCast(target.width), + @intCast(target.height), + 0, + 0, + @intCast(target.width), + @intCast(target.height), + gl.c.GL_COLOR_BUFFER_BIT, + gl.c.GL_NEAREST, ); - // Draw our background - try self.drawCells(gl_state, self.cells_bg); + // Keep track of this target in case we need to repeat it. + self.last_target = target; +} - // Then draw images under text - try self.drawImages( - gl_state, - self.image_placements.items[self.image_bg_end..self.image_text_end], - ); +/// Present the last presented target again. +pub fn repeat(self: *OpenGL) !void { + if (self.last_target) |target| try self.present(target); +} - // Drag foreground - try self.drawCells(gl_state, self.cells); +/// Returns the options to use when constructing buffers. +pub inline fn bufferOptions(self: OpenGL) bufferpkg.Options { + _ = self; + return .{ + .target = .array, + .usage = .dynamic_draw, + }; +} - // Draw remaining images - try self.drawImages( - gl_state, - self.image_placements.items[self.image_text_end..], +pub const instanceBufferOptions = bufferOptions; +pub const uniformBufferOptions = bufferOptions; +pub const fgBufferOptions = bufferOptions; +pub const bgBufferOptions = bufferOptions; +pub const imageBufferOptions = bufferOptions; + +/// Returns the options to use when constructing textures. +pub inline fn textureOptions(self: OpenGL) Texture.Options { + _ = self; + return .{ + .format = .rgba, + .internal_format = .srgba, + .target = .@"2D", + }; +} + +/// Initializes a Texture suitable for the provided font atlas. +pub fn initAtlasTexture(self: *const OpenGL, atlas: *const font.Atlas) !Texture { + _ = self; + const format: gl.Texture.Format, const internal_format: gl.Texture.InternalFormat = + switch (atlas.format) { + .grayscale => .{ .red, .red }, + .rgba => .{ .rgba, .srgba }, + else => @panic("unsupported atlas format for OpenGL texture"), + }; + + return Texture.init( + .{ + .format = format, + .internal_format = internal_format, + .target = .Rectangle, + }, + atlas.size, + atlas.size, + null, ); } -/// Runs the image program to draw images. -fn drawImages( - self: *OpenGL, - gl_state: *const GLState, - placements: []const gl_image.Placement, -) !void { - if (placements.len == 0) return; - - // Bind our image program - const bind = try gl_state.image_program.bind(); - defer bind.unbind(); - - // For each placement we need to bind the texture - for (placements) |p| { - // Get the image and image texture - const image = self.images.get(p.image_id) orelse { - log.warn("image not found for placement image_id={}", .{p.image_id}); - continue; - }; - - const texture = switch (image.image) { - .ready => |t| t, - else => { - log.warn("image not ready for placement image_id={}", .{p.image_id}); - continue; - }, - }; - - // Bind the texture - try gl.Texture.active(gl.c.GL_TEXTURE0); - var texbind = try texture.bind(.@"2D"); - defer texbind.unbind(); - - // Setup our data - try bind.vbo.setData(ImageProgram.Input{ - .grid_col = p.x, - .grid_row = p.y, - .cell_offset_x = p.cell_offset_x, - .cell_offset_y = p.cell_offset_y, - .source_x = p.source_x, - .source_y = p.source_y, - .source_width = p.source_width, - .source_height = p.source_height, - .dest_width = p.width, - .dest_height = p.height, - }, .static_draw); - - try gl.drawElementsInstanced( - gl.c.GL_TRIANGLES, - 6, - gl.c.GL_UNSIGNED_BYTE, - 1, - ); - } +/// Begin a frame. +pub inline fn beginFrame( + self: *const OpenGL, + /// Once the frame has been completed, the `frameCompleted` method + /// on the renderer is called with the health status of the frame. + renderer: *Renderer, + /// The target is presented via the provided renderer's API when completed. + target: *Target, +) !Frame { + _ = self; + return try Frame.begin(.{}, renderer, target); } - -/// Loads some set of cell data into our buffer and issues a draw call. -/// This expects all the OpenGL state to be setup. -/// -/// Future: when we move to multiple shaders, this will go away and -/// we'll have a draw call per-shader. -fn drawCells( - self: *OpenGL, - gl_state: *const GLState, - cells: std.ArrayListUnmanaged(CellProgram.Cell), -) !void { - // If we have no cells to render, then we render nothing. - if (cells.items.len == 0) return; - - // Todo: get rid of this completely - self.gl_cells_written = 0; - - // Bind our cell program state, buffers - const bind = try gl_state.cell_program.bind(); - defer bind.unbind(); - - // Bind our textures - try gl.Texture.active(gl.c.GL_TEXTURE0); - var texbind = try gl_state.texture.bind(.@"2D"); - defer texbind.unbind(); - - try gl.Texture.active(gl.c.GL_TEXTURE1); - var texbind1 = try gl_state.texture_color.bind(.@"2D"); - defer texbind1.unbind(); - - // Our allocated buffer on the GPU is smaller than our capacity. - // We reallocate a new buffer with the full new capacity. - if (self.gl_cells_size < cells.capacity) { - log.info("reallocating GPU buffer old={} new={}", .{ - self.gl_cells_size, - cells.capacity, - }); - - try bind.vbo.setDataNullManual( - @sizeOf(CellProgram.Cell) * cells.capacity, - .static_draw, - ); - - self.gl_cells_size = cells.capacity; - self.gl_cells_written = 0; - } - - // If we have data to write to the GPU, send it. - if (self.gl_cells_written < cells.items.len) { - const data = cells.items[self.gl_cells_written..]; - // log.info("sending {} cells to GPU", .{data.len}); - try bind.vbo.setSubData(self.gl_cells_written * @sizeOf(CellProgram.Cell), data); - - self.gl_cells_written += data.len; - assert(data.len > 0); - assert(self.gl_cells_written <= cells.items.len); - } - - try gl.drawElementsInstanced( - gl.c.GL_TRIANGLES, - 6, - gl.c.GL_UNSIGNED_BYTE, - cells.items.len, - ); -} - -/// The OpenGL objects that are associated with a renderer. This makes it -/// easy to create/destroy these as a set in situations i.e. where the -/// OpenGL context is replaced. -const GLState = struct { - cell_program: CellProgram, - image_program: ImageProgram, - texture: gl.Texture, - texture_color: gl.Texture, - custom: ?custom.State, - - pub fn init( - alloc: Allocator, - config: DerivedConfig, - font_grid: *font.SharedGrid, - ) !GLState { - var arena = ArenaAllocator.init(alloc); - defer arena.deinit(); - const arena_alloc = arena.allocator(); - - // Load our custom shaders - const custom_state: ?custom.State = custom: { - const shaders: []const [:0]const u8 = shadertoy.loadFromFiles( - arena_alloc, - config.custom_shaders, - .glsl, - ) catch |err| err: { - log.warn("error loading custom shaders err={}", .{err}); - break :err &.{}; - }; - if (shaders.len == 0) break :custom null; - - break :custom custom.State.init( - alloc, - shaders, - ) catch |err| err: { - log.warn("error initializing custom shaders err={}", .{err}); - break :err null; - }; - }; - - // Blending for text. We use GL_ONE here because we should be using - // premultiplied alpha for all our colors in our fragment shaders. - // This avoids having a blurry border where transparency is expected on - // pixels. - try gl.enable(gl.c.GL_BLEND); - try gl.blendFunc(gl.c.GL_ONE, gl.c.GL_ONE_MINUS_SRC_ALPHA); - - // Build our texture - const tex = try gl.Texture.create(); - errdefer tex.destroy(); - { - const texbind = try tex.bind(.@"2D"); - try texbind.parameter(.WrapS, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.WrapT, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.MinFilter, gl.c.GL_LINEAR); - try texbind.parameter(.MagFilter, gl.c.GL_LINEAR); - try texbind.image2D( - 0, - .red, - @intCast(font_grid.atlas_grayscale.size), - @intCast(font_grid.atlas_grayscale.size), - 0, - .red, - .UnsignedByte, - font_grid.atlas_grayscale.data.ptr, - ); - } - - // Build our color texture - const tex_color = try gl.Texture.create(); - errdefer tex_color.destroy(); - { - const texbind = try tex_color.bind(.@"2D"); - try texbind.parameter(.WrapS, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.WrapT, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.MinFilter, gl.c.GL_LINEAR); - try texbind.parameter(.MagFilter, gl.c.GL_LINEAR); - try texbind.image2D( - 0, - .rgba, - @intCast(font_grid.atlas_color.size), - @intCast(font_grid.atlas_color.size), - 0, - .bgra, - .UnsignedByte, - font_grid.atlas_color.data.ptr, - ); - } - - // Build our cell renderer - const cell_program = try CellProgram.init(); - errdefer cell_program.deinit(); - - // Build our image renderer - const image_program = try ImageProgram.init(); - errdefer image_program.deinit(); - - return .{ - .cell_program = cell_program, - .image_program = image_program, - .texture = tex, - .texture_color = tex_color, - .custom = custom_state, - }; - } - - pub fn deinit(self: *GLState, alloc: Allocator) void { - if (self.custom) |v| v.deinit(alloc); - self.texture.destroy(); - self.texture_color.destroy(); - self.image_program.deinit(); - self.cell_program.deinit(); - } -}; diff --git a/src/renderer/Options.zig b/src/renderer/Options.zig index e7d9b3a42..85ff8e310 100644 --- a/src/renderer/Options.zig +++ b/src/renderer/Options.zig @@ -20,3 +20,6 @@ surface_mailbox: apprt.surface.Mailbox, /// The apprt surface. rt_surface: *apprt.Surface, + +/// The renderer thread. +thread: *renderer.Thread, diff --git a/src/renderer/Thread.zig b/src/renderer/Thread.zig index 52f599549..03ca7b5e1 100644 --- a/src/renderer/Thread.zig +++ b/src/renderer/Thread.zig @@ -20,6 +20,16 @@ const log = std.log.scoped(.renderer_thread); const DRAW_INTERVAL = 8; // 120 FPS const CURSOR_BLINK_INTERVAL = 600; +/// Whether calls to `drawFrame` must be done from the app thread. +/// +/// If this is `true` then we send a `redraw_surface` message to the apprt +/// whenever we need to draw instead of calling `drawFrame` directly. +const must_draw_from_app_thread = + if (@hasDecl(apprt.App, "must_draw_from_app_thread")) + apprt.App.must_draw_from_app_thread + else + false; + /// The type used for sending messages to the IO thread. For now this is /// hardcoded with a capacity. We can make this a comptime parameter in /// the future if we want it configurable. @@ -314,6 +324,16 @@ fn stopDrawTimer(self: *Thread) void { /// Drain the mailbox. fn drainMailbox(self: *Thread) !void { + // There's probably a more elegant way to do this... + // + // This is effectively an @autoreleasepool{} block, which we need in + // order to ensure that autoreleased objects are properly released. + const pool = if (builtin.os.tag.isDarwin()) + @import("objc").AutoreleasePool.init() + else + void; + defer if (builtin.os.tag.isDarwin()) pool.deinit(); + while (self.mailbox.pop()) |message| { log.debug("mailbox message={}", .{message}); switch (message) { @@ -432,7 +452,7 @@ fn drainMailbox(self: *Thread) !void { self.renderer.markDirty(); }, - .resize => |v| try self.renderer.setScreenSize(v), + .resize => {}, //|v| try self.renderer.setScreenSize(v), .change_config => |config| { defer config.alloc.destroy(config.thread); @@ -468,20 +488,16 @@ fn drawFrame(self: *Thread, now: bool) void { if (!self.flags.visible) return; // If the renderer is managing a vsync on its own, we only draw - // when we're forced to via now. + // when we're forced to via `now`. if (!now and self.renderer.hasVsync()) return; - // If we're doing single-threaded GPU calls then we just wake up the - // app thread to redraw at this point. - if (rendererpkg.Renderer == rendererpkg.OpenGL and - rendererpkg.OpenGL.single_threaded_draw) - { + if (must_draw_from_app_thread) { _ = self.app_mailbox.push( .{ .redraw_surface = self.surface }, .{ .instant = {} }, ); } else { - self.renderer.drawFrame(self.surface) catch |err| + self.renderer.drawFrame(false) catch |err| log.warn("error drawing err={}", .{err}); } } diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig new file mode 100644 index 000000000..359f5f1b3 --- /dev/null +++ b/src/renderer/generic.zig @@ -0,0 +1,2866 @@ +const std = @import("std"); +const builtin = @import("builtin"); +const glfw = @import("glfw"); +const xev = @import("xev"); +const apprt = @import("../apprt.zig"); +const configpkg = @import("../config.zig"); +const font = @import("../font/main.zig"); +const os = @import("../os/main.zig"); +const terminal = @import("../terminal/main.zig"); +const renderer = @import("../renderer.zig"); +const math = @import("../math.zig"); +const Surface = @import("../Surface.zig"); +const link = @import("link.zig"); +const fgMode = @import("cell.zig").fgMode; +const isCovering = @import("cell.zig").isCovering; +const shadertoy = @import("shadertoy.zig"); +const assert = std.debug.assert; +const Allocator = std.mem.Allocator; +const ArenaAllocator = std.heap.ArenaAllocator; +const Terminal = terminal.Terminal; +const Health = renderer.Health; + +const macos = switch (builtin.os.tag) { + .macos => @import("macos"), + else => void, +}; + +const DisplayLink = switch (builtin.os.tag) { + .macos => *macos.video.DisplayLink, + else => void, +}; + +const log = std.log.scoped(.generic_renderer); + +/// Create a renderer type with the provided graphics API wrapper. +/// +/// The graphics API wrapper must provide the interface outlined below. +/// Specific details for the interfaces are documented on the existing +/// implementations (`Metal` and `OpenGL`). +/// +/// Hierarchy of graphics abstractions: +/// +/// [ GraphicsAPI ] - Responsible for configuring the runtime surface +/// | | and providing render `Target`s that draw to it, +/// | | as well as `Frame`s and `Pipeline`s. +/// | V +/// | [ Target ] - Represents an abstract target for rendering, which +/// | could be a surface directly but is also used as an +/// | abstraction for off-screen frame buffers. +/// V +/// [ Frame ] - Represents the context for drawing a given frame, +/// | provides `RenderPass`es for issuing draw commands +/// | to, and reports the frame health when complete. +/// V +/// [ RenderPass ] - Represents a render pass in a frame, consisting of +/// : one or more `Step`s applied to the same target(s), +/// [ Step ] - - - - each describing the input buffers and textures and +/// : the vertex/fragment functions and geometry to use. +/// :_ _ _ _ _ _ _ _ _ _/ +/// v +/// [ Pipeline ] - Describes a vertex and fragment function to be used +/// for a `Step`; the `GraphicsAPI` is responsible for +/// these and they should be constructed and cached +/// ahead of time. +/// +/// [ Buffer ] - An abstraction over a GPU buffer. +/// +/// [ Texture ] - An abstraction over a GPU texture. +/// +pub fn Renderer(comptime GraphicsAPI: type) type { + const Target = GraphicsAPI.Target; + const Buffer = GraphicsAPI.Buffer; + const Texture = GraphicsAPI.Texture; + const RenderPass = GraphicsAPI.RenderPass; + const shaderpkg = GraphicsAPI.shaders; + + const cellpkg = GraphicsAPI.cellpkg; + const imagepkg = GraphicsAPI.imagepkg; + const Image = imagepkg.Image; + const ImageMap = imagepkg.ImageMap; + + const Shaders = shaderpkg.Shaders; + + const ImagePlacementList = std.ArrayListUnmanaged(imagepkg.Placement); + + return struct { + const Self = @This(); + + /// Allocator that can be used + alloc: std.mem.Allocator, + + /// This mutex must be held whenever any state used in `drawFrame` is + /// being modified, and also when it's being accessed in `drawFrame`. + draw_mutex: std.Thread.Mutex = .{}, + + /// The configuration we need derived from the main config. + config: DerivedConfig, + + /// The mailbox for communicating with the window. + surface_mailbox: apprt.surface.Mailbox, + + /// Current font metrics defining our grid. + grid_metrics: font.Metrics, + + /// The size of everything. + size: renderer.Size, + + /// True if the window is focused + focused: bool, + + /// The foreground color set by an OSC 10 sequence. If unset then + /// default_foreground_color is used. + foreground_color: ?terminal.color.RGB, + + /// Foreground color set in the user's config file. + default_foreground_color: terminal.color.RGB, + + /// The background color set by an OSC 11 sequence. If unset then + /// default_background_color is used. + background_color: ?terminal.color.RGB, + + /// Background color set in the user's config file. + default_background_color: terminal.color.RGB, + + /// The cursor color set by an OSC 12 sequence. If unset then + /// default_cursor_color is used. + cursor_color: ?terminal.color.RGB, + + /// Default cursor color when no color is set explicitly by an OSC 12 command. + /// This is cursor color as set in the user's config, if any. If no cursor color + /// is set in the user's config, then the cursor color is determined by the + /// current foreground color. + default_cursor_color: ?terminal.color.RGB, + + /// When `cursor_color` is null, swap the foreground and background colors of + /// the cell under the cursor for the cursor color. Otherwise, use the default + /// foreground color as the cursor color. + cursor_invert: bool, + + /// The current set of cells to render. This is rebuilt on every frame + /// but we keep this around so that we don't reallocate. Each set of + /// cells goes into a separate shader. + cells: cellpkg.Contents, + + /// The last viewport that we based our rebuild off of. If this changes, + /// then we do a full rebuild of the cells. The pointer values in this pin + /// are NOT SAFE to read because they may be modified, freed, etc from the + /// termio thread. We treat the pointers as integers for comparison only. + cells_viewport: ?terminal.Pin = null, + + /// Set to true after rebuildCells is called. This can be used + /// to determine if any possible changes have been made to the + /// cells for the draw call. + cells_rebuilt: bool = false, + + /// The current GPU uniform values. + uniforms: shaderpkg.Uniforms, + + /// The font structures. + font_grid: *font.SharedGrid, + font_shaper: font.Shaper, + font_shaper_cache: font.ShaperCache, + + /// The images that we may render. + images: ImageMap = .{}, + image_placements: ImagePlacementList = .{}, + image_bg_end: u32 = 0, + image_text_end: u32 = 0, + image_virtual: bool = false, + + /// Graphics API state. + api: GraphicsAPI, + + /// The CVDisplayLink used to drive the rendering loop in + /// sync with the display. This is void on platforms that + /// don't support a display link. + display_link: ?DisplayLink = null, + + /// Health of the most recently completed frame. + health: std.atomic.Value(Health) = .{ .raw = .healthy }, + + /// Our swap chain (multiple buffering) + swap_chain: SwapChain, + + /// This value is used to force-update swap chain targets in the + /// event of a config change that requires it (such as blending mode). + target_config_modified: usize = 0, + + /// If something happened that requires us to reinitialize our shaders, + /// this is set to true so that we can do that whenever possible. + reinitialize_shaders: bool = false, + + /// Whether or not we have custom shaders. + has_custom_shaders: bool = false, + + /// Our shader pipelines. + shaders: Shaders, + + /// Swap chain which maintains multiple copies of the state needed to + /// render a frame, so that we can start building the next frame while + /// the previous frame is still being processed on the GPU. + const SwapChain = struct { + // The count of buffers we use for double/triple buffering. + // If this is one then we don't do any double+ buffering at all. + // This is comptime because there isn't a good reason to change + // this at runtime and there is a lot of complexity to support it. + // For comptime, this is useful for debugging. + const buf_count = 3; + + /// `buf_count` structs that can hold the + /// data needed by the GPU to draw a frame. + frames: [buf_count]FrameState, + /// Index of the most recently used frame state struct. + frame_index: std.math.IntFittingRange(0, buf_count) = 0, + /// Semaphore that we wait on to make sure we have an available + /// frame state struct so we can start working on a new frame. + frame_sema: std.Thread.Semaphore = .{ .permits = buf_count }, + + /// Set to true when deinited, if you try to deinit a defunct + /// swap chain it will just be ignored, to prevent double-free. + defunct: bool = false, + + pub fn init(api: GraphicsAPI, custom_shaders: bool) !SwapChain { + var result: SwapChain = .{ .frames = undefined }; + + // Initialize all of our frame state. + for (&result.frames) |*frame| { + frame.* = try FrameState.init(api, custom_shaders); + } + + return result; + } + + pub fn deinit(self: *SwapChain) void { + if (self.defunct) return; + self.defunct = true; + + // Wait for all of our inflight draws to complete + // so that we can cleanly deinit our GPU state. + for (0..buf_count) |_| self.frame_sema.wait(); + for (&self.frames) |*frame| frame.deinit(); + } + + /// Get the next frame state to draw to. This will wait on the + /// semaphore to ensure that the frame is available. This must + /// always be paired with a call to releaseFrame. + pub fn nextFrame(self: *SwapChain) error{Defunct}!*FrameState { + if (self.defunct) return error.Defunct; + + self.frame_sema.wait(); + errdefer self.frame_sema.post(); + self.frame_index = (self.frame_index + 1) % buf_count; + return &self.frames[self.frame_index]; + } + + /// This should be called when the frame has completed drawing. + pub fn releaseFrame(self: *SwapChain) void { + self.frame_sema.post(); + } + }; + + /// State we need duplicated for every frame. Any state that could be + /// in a data race between the GPU and CPU while a frame is being drawn + /// should be in this struct. + /// + /// While a draw is in-process, we "lock" the state (via a semaphore) + /// and prevent the CPU from updating the state until our graphics API + /// reports that the frame is complete. + /// + /// This is used to implement double/triple buffering. + const FrameState = struct { + uniforms: UniformBuffer, + cells: CellTextBuffer, + cells_bg: CellBgBuffer, + + grayscale: Texture, + grayscale_modified: usize = 0, + color: Texture, + color_modified: usize = 0, + + target: Target, + /// See property of same name on Renderer for explanation. + target_config_modified: usize = 0, + + /// Custom shader state, this is null if we have no custom shaders. + custom_shader_state: ?CustomShaderState = null, + + /// A buffer containing the uniform data. + const UniformBuffer = Buffer(shaderpkg.Uniforms); + const CellBgBuffer = Buffer(shaderpkg.CellBg); + const CellTextBuffer = Buffer(shaderpkg.CellText); + + pub fn init(api: GraphicsAPI, custom_shaders: bool) !FrameState { + // Uniform buffer contains exactly 1 uniform struct. The + // uniform data will be undefined so this must be set before + // a frame is drawn. + var uniforms = try UniformBuffer.init(api.uniformBufferOptions(), 1); + errdefer uniforms.deinit(); + + // Create the buffers for our vertex data. The preallocation size + // is likely too small but our first frame update will resize it. + var cells = try CellTextBuffer.init(api.fgBufferOptions(), 10 * 10); + errdefer cells.deinit(); + var cells_bg = try CellBgBuffer.init(api.bgBufferOptions(), 10 * 10); + errdefer cells_bg.deinit(); + + // Initialize our textures for our font atlas. + const grayscale = try api.initAtlasTexture(&.{ + .data = undefined, + .size = 8, + .format = .grayscale, + }); + errdefer grayscale.deinit(); + const color = try api.initAtlasTexture(&.{ + .data = undefined, + .size = 8, + .format = .rgba, + }); + errdefer color.deinit(); + + var custom_shader_state = + if (custom_shaders) + try CustomShaderState.init(api) + else + null; + errdefer if (custom_shader_state) |*state| state.deinit(); + + // Initialize the target at 1x1 px, this is slightly + // wasteful but it's only done once so whatever. + const target = try api.initTarget(1, 1); + + return .{ + .uniforms = uniforms, + .cells = cells, + .cells_bg = cells_bg, + .grayscale = grayscale, + .color = color, + .target = target, + .custom_shader_state = custom_shader_state, + }; + } + + pub fn deinit(self: *FrameState) void { + self.uniforms.deinit(); + self.cells.deinit(); + self.cells_bg.deinit(); + self.grayscale.deinit(); + self.color.deinit(); + if (self.custom_shader_state) |*state| state.deinit(); + } + + pub fn resize( + self: *FrameState, + api: GraphicsAPI, + width: usize, + height: usize, + ) !void { + if (self.custom_shader_state) |*state| { + try state.resize(api, width, height); + } + const target = try api.initTarget(width, height); + self.target.deinit(); + self.target = target; + } + }; + + /// State relevant to our custom shaders if we have any. + const CustomShaderState = struct { + /// When we have a custom shader state, we maintain a front + /// and back texture which we use as a swap chain to render + /// between when multiple custom shaders are defined. + front_texture: Texture, + back_texture: Texture, + + uniforms: shaderpkg.PostUniforms, + + /// The first time a frame was drawn. + /// This is used to update the time uniform. + first_frame_time: std.time.Instant, + + /// The last time a frame was drawn. + /// This is used to update the time uniform. + last_frame_time: std.time.Instant, + + /// Swap the front and back textures. + pub fn swap(self: *CustomShaderState) void { + std.mem.swap(Texture, &self.front_texture, &self.back_texture); + } + + pub fn init(api: GraphicsAPI) !CustomShaderState { + // Initialize the front and back textures at 1x1 px, this + // is slightly wasteful but it's only done once so whatever. + const front_texture = try Texture.init( + api.textureOptions(), + 1, + 1, + null, + ); + errdefer front_texture.deinit(); + const back_texture = try Texture.init( + api.textureOptions(), + 1, + 1, + null, + ); + errdefer back_texture.deinit(); + return .{ + .front_texture = front_texture, + .back_texture = back_texture, + + .uniforms = .{ + .resolution = .{ 0, 0, 1 }, + .time = 1, + .time_delta = 1, + .frame_rate = 1, + .frame = 1, + .channel_time = @splat(@splat(0)), + .channel_resolution = @splat(@splat(0)), + .mouse = .{ 0, 0, 0, 0 }, + .date = .{ 0, 0, 0, 0 }, + .sample_rate = 1, + }, + + .first_frame_time = try std.time.Instant.now(), + .last_frame_time = try std.time.Instant.now(), + }; + } + + pub fn deinit(self: *CustomShaderState) void { + self.front_texture.deinit(); + self.back_texture.deinit(); + } + + pub fn resize( + self: *CustomShaderState, + api: GraphicsAPI, + width: usize, + height: usize, + ) !void { + const front_texture = try Texture.init( + api.textureOptions(), + @intCast(width), + @intCast(height), + null, + ); + errdefer front_texture.deinit(); + const back_texture = try Texture.init( + api.textureOptions(), + @intCast(width), + @intCast(height), + null, + ); + errdefer back_texture.deinit(); + + self.front_texture.deinit(); + self.back_texture.deinit(); + + self.front_texture = front_texture; + self.back_texture = back_texture; + + self.uniforms.resolution = .{ + @floatFromInt(width), + @floatFromInt(height), + 1, + }; + self.uniforms.channel_resolution[0] = .{ + @floatFromInt(width), + @floatFromInt(height), + 1, + 0, + }; + } + }; + + /// The configuration for this renderer that is derived from the main + /// configuration. This must be exported so that we don't need to + /// pass around Config pointers which makes memory management a pain. + pub const DerivedConfig = struct { + arena: ArenaAllocator, + + font_thicken: bool, + font_thicken_strength: u8, + font_features: std.ArrayListUnmanaged([:0]const u8), + font_styles: font.CodepointResolver.StyleStatus, + cursor_color: ?terminal.color.RGB, + cursor_invert: bool, + cursor_opacity: f64, + cursor_text: ?terminal.color.RGB, + background: terminal.color.RGB, + background_opacity: f64, + foreground: terminal.color.RGB, + selection_background: ?terminal.color.RGB, + selection_foreground: ?terminal.color.RGB, + invert_selection_fg_bg: bool, + bold_is_bright: bool, + min_contrast: f32, + padding_color: configpkg.WindowPaddingColor, + custom_shaders: configpkg.RepeatablePath, + links: link.Set, + vsync: bool, + colorspace: configpkg.Config.WindowColorspace, + blending: configpkg.Config.AlphaBlending, + + pub fn init( + alloc_gpa: Allocator, + config: *const configpkg.Config, + ) !DerivedConfig { + var arena = ArenaAllocator.init(alloc_gpa); + errdefer arena.deinit(); + const alloc = arena.allocator(); + + // Copy our shaders + const custom_shaders = try config.@"custom-shader".clone(alloc); + + // Copy our font features + const font_features = try config.@"font-feature".clone(alloc); + + // Get our font styles + var font_styles = font.CodepointResolver.StyleStatus.initFill(true); + font_styles.set(.bold, config.@"font-style-bold" != .false); + font_styles.set(.italic, config.@"font-style-italic" != .false); + font_styles.set(.bold_italic, config.@"font-style-bold-italic" != .false); + + // Our link configs + const links = try link.Set.fromConfig( + alloc, + config.link.links.items, + ); + + const cursor_invert = config.@"cursor-invert-fg-bg"; + + return .{ + .background_opacity = @max(0, @min(1, config.@"background-opacity")), + .font_thicken = config.@"font-thicken", + .font_thicken_strength = config.@"font-thicken-strength", + .font_features = font_features.list, + .font_styles = font_styles, + + .cursor_color = if (!cursor_invert and config.@"cursor-color" != null) + config.@"cursor-color".?.toTerminalRGB() + else + null, + + .cursor_invert = cursor_invert, + + .cursor_text = if (config.@"cursor-text") |txt| + txt.toTerminalRGB() + else + null, + + .cursor_opacity = @max(0, @min(1, config.@"cursor-opacity")), + + .background = config.background.toTerminalRGB(), + .foreground = config.foreground.toTerminalRGB(), + .invert_selection_fg_bg = config.@"selection-invert-fg-bg", + .bold_is_bright = config.@"bold-is-bright", + .min_contrast = @floatCast(config.@"minimum-contrast"), + .padding_color = config.@"window-padding-color", + + .selection_background = if (config.@"selection-background") |bg| + bg.toTerminalRGB() + else + null, + + .selection_foreground = if (config.@"selection-foreground") |bg| + bg.toTerminalRGB() + else + null, + + .custom_shaders = custom_shaders, + .links = links, + .vsync = config.@"window-vsync", + .colorspace = config.@"window-colorspace", + .blending = config.@"alpha-blending", + .arena = arena, + }; + } + + pub fn deinit(self: *DerivedConfig) void { + const alloc = self.arena.allocator(); + self.links.deinit(alloc); + self.arena.deinit(); + } + }; + + /// Returns the hints that we want for this window. + pub fn glfwWindowHints(config: *const configpkg.Config) glfw.Window.Hints { + // If our graphics API provides hints, use them, + // otherwise fall back to generic hints. + if (@hasDecl(GraphicsAPI, "glfwWindowHints")) { + return GraphicsAPI.glfwWindowHints(config); + } + + return .{ + .client_api = .no_api, + .transparent_framebuffer = config.@"background-opacity" < 1, + }; + } + + pub fn init(alloc: Allocator, options: renderer.Options) !Self { + // Initialize our graphics API wrapper, this will prepare the + // surface provided by the apprt and set up any API-specific + // GPU resources. + var api = try GraphicsAPI.init(alloc, options); + errdefer api.deinit(); + + const has_custom_shaders = options.config.custom_shaders.value.items.len > 0; + + // Prepare our swap chain + var swap_chain = try SwapChain.init( + api, + has_custom_shaders, + ); + errdefer swap_chain.deinit(); + + // Create the font shaper. + var font_shaper = try font.Shaper.init(alloc, .{ + .features = options.config.font_features.items, + }); + errdefer font_shaper.deinit(); + + // Initialize all the data that requires a critical font section. + const font_critical: struct { + metrics: font.Metrics, + } = font_critical: { + const grid = options.font_grid; + grid.lock.lockShared(); + defer grid.lock.unlockShared(); + break :font_critical .{ + .metrics = grid.metrics, + }; + }; + + const display_link: ?DisplayLink = switch (builtin.os.tag) { + .macos => if (options.config.vsync) + try macos.video.DisplayLink.createWithActiveCGDisplays() + else + null, + else => null, + }; + errdefer if (display_link) |v| v.release(); + + var result: Self = .{ + .alloc = alloc, + .config = options.config, + .surface_mailbox = options.surface_mailbox, + .grid_metrics = font_critical.metrics, + .size = options.size, + .focused = true, + .foreground_color = null, + .default_foreground_color = options.config.foreground, + .background_color = null, + .default_background_color = options.config.background, + .cursor_color = null, + .default_cursor_color = options.config.cursor_color, + .cursor_invert = options.config.cursor_invert, + + // Render state + .cells = .{}, + .uniforms = .{ + .projection_matrix = undefined, + .cell_size = undefined, + .grid_size = undefined, + .grid_padding = undefined, + .padding_extend = .{}, + .min_contrast = options.config.min_contrast, + .cursor_pos = .{ std.math.maxInt(u16), std.math.maxInt(u16) }, + .cursor_color = undefined, + .bg_color = .{ + options.config.background.r, + options.config.background.g, + options.config.background.b, + @intFromFloat(@round(options.config.background_opacity * 255.0)), + }, + .bools = .{ + .cursor_wide = false, + .use_display_p3 = options.config.colorspace == .@"display-p3", + .use_linear_blending = options.config.blending.isLinear(), + .use_linear_correction = options.config.blending == .@"linear-corrected", + }, + }, + + // Fonts + .font_grid = options.font_grid, + .font_shaper = font_shaper, + .font_shaper_cache = font.ShaperCache.init(), + + // Shaders (initialized below) + .shaders = undefined, + + // Graphics API stuff + .api = api, + .swap_chain = swap_chain, + .display_link = display_link, + }; + + try result.initShaders(); + + // Ensure our undefined values above are correctly initialized. + result.updateFontGridUniforms(); + result.updateScreenSizeUniforms(); + + return result; + } + + pub fn deinit(self: *Self) void { + self.swap_chain.deinit(); + + if (DisplayLink != void) { + if (self.display_link) |display_link| { + display_link.stop() catch {}; + display_link.release(); + } + } + + self.cells.deinit(self.alloc); + + self.font_shaper.deinit(); + self.font_shaper_cache.deinit(self.alloc); + + self.config.deinit(); + + { + var it = self.images.iterator(); + while (it.next()) |kv| kv.value_ptr.image.deinit(self.alloc); + self.images.deinit(self.alloc); + } + self.image_placements.deinit(self.alloc); + + self.deinitShaders(); + + self.api.deinit(); + + self.* = undefined; + } + + fn deinitShaders(self: *Self) void { + self.shaders.deinit(self.alloc); + } + + fn initShaders(self: *Self) !void { + var arena = ArenaAllocator.init(self.alloc); + defer arena.deinit(); + const arena_alloc = arena.allocator(); + + // Load our custom shaders + const custom_shaders: []const [:0]const u8 = shadertoy.loadFromFiles( + arena_alloc, + self.config.custom_shaders, + GraphicsAPI.custom_shader_target, + ) catch |err| err: { + log.warn("error loading custom shaders err={}", .{err}); + break :err &.{}; + }; + + const has_custom_shaders = custom_shaders.len > 0; + + var shaders = try self.api.initShaders( + self.alloc, + custom_shaders, + ); + errdefer shaders.deinit(self.alloc); + + self.shaders = shaders; + self.has_custom_shaders = has_custom_shaders; + } + + /// This is called early right after surface creation. + pub fn surfaceInit(surface: *apprt.Surface) !void { + // If our API has to do things here, let it. + if (@hasDecl(GraphicsAPI, "surfaceInit")) { + try GraphicsAPI.surfaceInit(surface); + } + } + + /// This is called just prior to spinning up the renderer thread for + /// final main thread setup requirements. + pub fn finalizeSurfaceInit(self: *Self, surface: *apprt.Surface) !void { + // If our API has to do things to finalize surface init, let it. + if (@hasDecl(GraphicsAPI, "finalizeSurfaceInit")) { + try self.api.finalizeSurfaceInit(surface); + } + } + + /// Callback called by renderer.Thread when it begins. + pub fn threadEnter(self: *const Self, surface: *apprt.Surface) !void { + // If our API has to do things on thread enter, let it. + if (@hasDecl(GraphicsAPI, "threadEnter")) { + try self.api.threadEnter(surface); + } + } + + /// Callback called by renderer.Thread when it exits. + pub fn threadExit(self: *const Self) void { + // If our API has to do things on thread exit, let it. + if (@hasDecl(GraphicsAPI, "threadExit")) { + self.api.threadExit(); + } + } + + /// Called by renderer.Thread when it starts the main loop. + pub fn loopEnter(self: *Self, thr: *renderer.Thread) !void { + // If our API has to do things on loop enter, let it. + if (@hasDecl(GraphicsAPI, "loopEnter")) { + self.api.loopEnter(); + } + + // If we don't support a display link we have no work to do. + if (comptime DisplayLink == void) return; + + // This is when we know our "self" pointer is stable so we can + // setup the display link. To setup the display link we set our + // callback and we can start it immediately. + const display_link = self.display_link orelse return; + try display_link.setOutputCallback( + xev.Async, + &displayLinkCallback, + &thr.draw_now, + ); + display_link.start() catch {}; + } + + /// Called by renderer.Thread when it exits the main loop. + pub fn loopExit(self: *Self) void { + // If our API has to do things on loop exit, let it. + if (@hasDecl(GraphicsAPI, "loopExit")) { + self.api.loopExit(); + } + + // If we don't support a display link we have no work to do. + if (comptime DisplayLink == void) return; + + // Stop our display link. If this fails its okay it just means + // that we either never started it or the view its attached to + // is gone which is fine. + const display_link = self.display_link orelse return; + display_link.stop() catch {}; + } + + /// This is called by the GTK apprt after the surface is + /// reinitialized due to any of the events mentioned in + /// the doc comment for `displayUnrealized`. + pub fn displayRealized(self: *Self) !void { + // If our API has to do things on realize, let it. + if (@hasDecl(GraphicsAPI, "displayRealized")) { + self.api.displayRealized(); + } + + // Lock the draw mutex so that we can + // safely reinitialize our GPU resources. + self.draw_mutex.lock(); + defer self.draw_mutex.unlock(); + + // We assume that the swap chain was deinited in + // `displayUnrealized`, in which case it should be + // marked defunct. If not, we have a problem. + assert(self.swap_chain.defunct); + + // We reinitialize our shaders and our swap chain. + try self.initShaders(); + self.swap_chain = try SwapChain.init( + self.api, + self.has_custom_shaders, + ); + self.reinitialize_shaders = false; + self.target_config_modified = 1; + } + + /// This is called by the GTK apprt when the surface is being destroyed. + /// This can happen because the surface is being closed but also when + /// moving the window between displays or splitting. + pub fn displayUnrealized(self: *Self) void { + // If our API has to do things on unrealize, let it. + if (@hasDecl(GraphicsAPI, "displayUnrealized")) { + self.api.displayUnrealized(); + } + + // Lock the draw mutex so that we can + // safely deinitialize our GPU resources. + self.draw_mutex.lock(); + defer self.draw_mutex.unlock(); + + // We deinit our swap chain and shaders. + // + // This will mark them as defunct so that they + // can't be double-freed or used in draw calls. + self.swap_chain.deinit(); + self.shaders.deinit(self.alloc); + } + + fn displayLinkCallback( + _: *macos.video.DisplayLink, + ud: ?*xev.Async, + ) void { + const draw_now = ud orelse return; + draw_now.notify() catch |err| { + log.err("error notifying draw_now err={}", .{err}); + }; + } + + /// Mark the full screen as dirty so that we redraw everything. + pub fn markDirty(self: *Self) void { + self.cells_viewport = null; + } + + /// Called when we get an updated display ID for our display link. + pub fn setMacOSDisplayID(self: *Self, id: u32) !void { + if (comptime DisplayLink == void) return; + const display_link = self.display_link orelse return; + log.info("updating display link display id={}", .{id}); + display_link.setCurrentCGDisplay(id) catch |err| { + log.warn("error setting display link display id err={}", .{err}); + }; + } + + /// True if our renderer has animations so that a higher frequency + /// timer is used. + pub fn hasAnimations(self: *const Self) bool { + return self.has_custom_shaders; + } + + /// True if our renderer is using vsync. If true, the renderer or apprt + /// is responsible for triggering draw_now calls to the render thread. + /// That is the only way to trigger a drawFrame. + pub fn hasVsync(self: *const Self) bool { + if (comptime DisplayLink == void) return false; + const display_link = self.display_link orelse return false; + return display_link.isRunning(); + } + + /// Callback when the focus changes for the terminal this is rendering. + /// + /// Must be called on the render thread. + pub fn setFocus(self: *Self, focus: bool) !void { + self.focused = focus; + + // If we're not focused, then we want to stop the display link + // because it is a waste of resources and we can move to pure + // change-driven updates. + if (comptime DisplayLink != void) link: { + const display_link = self.display_link orelse break :link; + if (focus) { + display_link.start() catch {}; + } else { + display_link.stop() catch {}; + } + } + } + + /// Callback when the window is visible or occluded. + /// + /// Must be called on the render thread. + pub fn setVisible(self: *Self, visible: bool) void { + // If we're not visible, then we want to stop the display link + // because it is a waste of resources and we can move to pure + // change-driven updates. + if (comptime DisplayLink != void) link: { + const display_link = self.display_link orelse break :link; + if (visible and self.focused) { + display_link.start() catch {}; + } else { + display_link.stop() catch {}; + } + } + } + + /// Set the new font grid. + /// + /// Must be called on the render thread. + pub fn setFontGrid(self: *Self, grid: *font.SharedGrid) void { + self.draw_mutex.lock(); + defer self.draw_mutex.unlock(); + + // Update our grid + self.font_grid = grid; + + // Update all our textures so that they sync on the next frame. + // We can modify this without a lock because the GPU does not + // touch this data. + for (&self.swap_chain.frames) |*frame| { + frame.grayscale_modified = 0; + frame.color_modified = 0; + } + + // Get our metrics from the grid. This doesn't require a lock because + // the metrics are never recalculated. + const metrics = grid.metrics; + self.grid_metrics = metrics; + + // Reset our shaper cache. If our font changed (not just the size) then + // the data in the shaper cache may be invalid and cannot be used, so we + // always clear the cache just in case. + const font_shaper_cache = font.ShaperCache.init(); + self.font_shaper_cache.deinit(self.alloc); + self.font_shaper_cache = font_shaper_cache; + + // Update cell size. + self.size.cell = .{ + .width = metrics.cell_width, + .height = metrics.cell_height, + }; + + // Update relevant uniforms + self.updateFontGridUniforms(); + } + + /// Update uniforms that are based on the font grid. + /// + /// Caller must hold the draw mutex. + fn updateFontGridUniforms(self: *Self) void { + self.uniforms.cell_size = .{ + @floatFromInt(self.grid_metrics.cell_width), + @floatFromInt(self.grid_metrics.cell_height), + }; + } + + /// Update the frame data. + pub fn updateFrame( + self: *Self, + surface: *apprt.Surface, + state: *renderer.State, + cursor_blink_visible: bool, + ) !void { + _ = surface; + + // Data we extract out of the critical area. + const Critical = struct { + bg: terminal.color.RGB, + screen: terminal.Screen, + screen_type: terminal.ScreenType, + mouse: renderer.State.Mouse, + preedit: ?renderer.State.Preedit, + cursor_style: ?renderer.CursorStyle, + color_palette: terminal.color.Palette, + + /// If true, rebuild the full screen. + full_rebuild: bool, + }; + + // Update all our data as tightly as possible within the mutex. + var critical: Critical = critical: { + // const start = try std.time.Instant.now(); + // const start_micro = std.time.microTimestamp(); + // defer { + // const end = std.time.Instant.now() catch unreachable; + // // "[updateFrame critical time] \t" + // std.log.err("[updateFrame critical time] {}\t{}", .{start_micro, end.since(start) / std.time.ns_per_us}); + // } + + state.mutex.lock(); + defer state.mutex.unlock(); + + // If we're in a synchronized output state, we pause all rendering. + if (state.terminal.modes.get(.synchronized_output)) { + log.debug("synchronized output started, skipping render", .{}); + return; + } + + // Swap bg/fg if the terminal is reversed + const bg = self.background_color orelse self.default_background_color; + const fg = self.foreground_color orelse self.default_foreground_color; + defer { + if (self.background_color) |*c| { + c.* = bg; + } else { + self.default_background_color = bg; + } + + if (self.foreground_color) |*c| { + c.* = fg; + } else { + self.default_foreground_color = fg; + } + } + + if (state.terminal.modes.get(.reverse_colors)) { + if (self.background_color) |*c| { + c.* = fg; + } else { + self.default_background_color = fg; + } + + if (self.foreground_color) |*c| { + c.* = bg; + } else { + self.default_foreground_color = bg; + } + } + + // Get the viewport pin so that we can compare it to the current. + const viewport_pin = state.terminal.screen.pages.pin(.{ .viewport = .{} }).?; + + // We used to share terminal state, but we've since learned through + // analysis that it is faster to copy the terminal state than to + // hold the lock while rebuilding GPU cells. + var screen_copy = try state.terminal.screen.clone( + self.alloc, + .{ .viewport = .{} }, + null, + ); + errdefer screen_copy.deinit(); + + // Whether to draw our cursor or not. + const cursor_style = if (state.terminal.flags.password_input) + .lock + else + renderer.cursorStyle( + state, + self.focused, + cursor_blink_visible, + ); + + // Get our preedit state + const preedit: ?renderer.State.Preedit = preedit: { + if (cursor_style == null) break :preedit null; + const p = state.preedit orelse break :preedit null; + break :preedit try p.clone(self.alloc); + }; + errdefer if (preedit) |p| p.deinit(self.alloc); + + // If we have Kitty graphics data, we enter a SLOW SLOW SLOW path. + // We only do this if the Kitty image state is dirty meaning only if + // it changes. + // + // If we have any virtual references, we must also rebuild our + // kitty state on every frame because any cell change can move + // an image. + if (state.terminal.screen.kitty_images.dirty or + self.image_virtual) + { + try self.prepKittyGraphics(state.terminal); + } + + // If we have any terminal dirty flags set then we need to rebuild + // the entire screen. This can be optimized in the future. + const full_rebuild: bool = rebuild: { + { + const Int = @typeInfo(terminal.Terminal.Dirty).@"struct".backing_integer.?; + const v: Int = @bitCast(state.terminal.flags.dirty); + if (v > 0) break :rebuild true; + } + { + const Int = @typeInfo(terminal.Screen.Dirty).@"struct".backing_integer.?; + const v: Int = @bitCast(state.terminal.screen.dirty); + if (v > 0) break :rebuild true; + } + + // If our viewport changed then we need to rebuild the entire + // screen because it means we scrolled. If we have no previous + // viewport then we must rebuild. + const prev_viewport = self.cells_viewport orelse break :rebuild true; + if (!prev_viewport.eql(viewport_pin)) break :rebuild true; + + break :rebuild false; + }; + + // Reset the dirty flags in the terminal and screen. We assume + // that our rebuild will be successful since so we optimize for + // success and reset while we hold the lock. This is much easier + // than coordinating row by row or as changes are persisted. + state.terminal.flags.dirty = .{}; + state.terminal.screen.dirty = .{}; + { + var it = state.terminal.screen.pages.pageIterator( + .right_down, + .{ .screen = .{} }, + null, + ); + while (it.next()) |chunk| { + var dirty_set = chunk.node.data.dirtyBitSet(); + dirty_set.unsetAll(); + } + } + + // Update our viewport pin + self.cells_viewport = viewport_pin; + + break :critical .{ + .bg = self.background_color orelse self.default_background_color, + .screen = screen_copy, + .screen_type = state.terminal.active_screen, + .mouse = state.mouse, + .preedit = preedit, + .cursor_style = cursor_style, + .color_palette = state.terminal.color_palette.colors, + .full_rebuild = full_rebuild, + }; + }; + defer { + critical.screen.deinit(); + if (critical.preedit) |p| p.deinit(self.alloc); + } + + // Build our GPU cells + try self.rebuildCells( + critical.full_rebuild, + &critical.screen, + critical.screen_type, + critical.mouse, + critical.preedit, + critical.cursor_style, + &critical.color_palette, + ); + + // Notify our shaper we're done for the frame. For some shapers, + // such as CoreText, this triggers off-thread cleanup logic. + self.font_shaper.endFrame(); + + // Acquire the draw mutex because we're modifying state here. + { + self.draw_mutex.lock(); + defer self.draw_mutex.unlock(); + + // Update our background color + self.uniforms.bg_color = .{ + critical.bg.r, + critical.bg.g, + critical.bg.b, + @intFromFloat(@round(self.config.background_opacity * 255.0)), + }; + } + } + + /// Draw the frame to the screen. + /// + /// If `sync` is true, this will synchronously block until + /// the frame is finished drawing and has been presented. + pub fn drawFrame( + self: *Self, + sync: bool, + ) !void { + // We hold a the draw mutex to prevent changes to any + // data we access while we're in the middle of drawing. + self.draw_mutex.lock(); + defer self.draw_mutex.unlock(); + + // There's probably a more elegant way to do this... + // + // This is effectively an @autoreleasepool{} block, which we need in + // order to ensure that autoreleased objects are properly released. + const pool = if (builtin.os.tag.isDarwin()) + @import("objc").AutoreleasePool.init() + else + void; + defer if (builtin.os.tag.isDarwin()) pool.deinit(); + + // Retrieve the most up-to-date surface size from the Graphics API + const surface_size = try self.api.surfaceSize(); + + // If either of our surface dimensions is zero + // then drawing is absurd, so we just return. + if (surface_size.width == 0 or surface_size.height == 0) return; + + const size_changed = + self.size.screen.width != surface_size.width or + self.size.screen.height != surface_size.height; + + // Conditions under which we need to draw the frame, otherwise we + // don't need to since the previous frame should be identical. + const needs_redraw = + size_changed or + self.cells_rebuilt or + self.hasAnimations() or + sync; + + if (!needs_redraw) { + // We still need to present the last target again, because the + // apprt may be swapping buffers and display an outdated frame + // if we don't draw something new. + try self.api.repeat(); + return; + } + self.cells_rebuilt = false; + + // Wait for a frame to be available. + const frame = try self.swap_chain.nextFrame(); + errdefer self.swap_chain.releaseFrame(); + // log.debug("drawing frame index={}", .{self.swap_chain.frame_index}); + + // If we need to reinitialize our shaders, do so. + if (self.reinitialize_shaders) { + self.reinitialize_shaders = false; + self.shaders.deinit(self.alloc); + try self.initShaders(); + } + + // Our shaders should not be defunct at this point. + assert(!self.shaders.defunct); + + // If we have custom shaders, make sure we have the + // custom shader state in our frame state, otherwise + // if we have a state but don't need it we remove it. + if (self.has_custom_shaders) { + if (frame.custom_shader_state == null) { + frame.custom_shader_state = try .init(self.api); + try frame.custom_shader_state.?.resize( + self.api, + surface_size.width, + surface_size.height, + ); + } + } else if (frame.custom_shader_state) |*state| { + state.deinit(); + frame.custom_shader_state = null; + } + + // If our stored size doesn't match the + // surface size we need to update it. + if (size_changed) { + self.size.screen = .{ + .width = surface_size.width, + .height = surface_size.height, + }; + self.updateScreenSizeUniforms(); + } + + // If this frame's target isn't the correct size, or the target + // config has changed (such as when the blending mode changes), + // remove it and replace it with a new one with the right values. + if (frame.target.width != self.size.screen.width or + frame.target.height != self.size.screen.height or + frame.target_config_modified != self.target_config_modified) + { + try frame.resize( + self.api, + self.size.screen.width, + self.size.screen.height, + ); + frame.target_config_modified = self.target_config_modified; + } + + // Upload images to the GPU as necessary. + { + var image_it = self.images.iterator(); + while (image_it.next()) |kv| { + switch (kv.value_ptr.image) { + .ready => {}, + + .pending_gray, + .pending_gray_alpha, + .pending_rgb, + .pending_rgba, + .replace_gray, + .replace_gray_alpha, + .replace_rgb, + .replace_rgba, + => try kv.value_ptr.image.upload(self.alloc, &self.api), + + .unload_pending, + .unload_replace, + .unload_ready, + => { + kv.value_ptr.image.deinit(self.alloc); + self.images.removeByPtr(kv.key_ptr); + }, + } + } + } + + // Setup our frame data + try frame.uniforms.sync(&.{self.uniforms}); + try frame.cells_bg.sync(self.cells.bg_cells); + const fg_count = try frame.cells.syncFromArrayLists(self.cells.fg_rows.lists); + + // If we have custom shaders, update the animation time. + if (frame.custom_shader_state) |*state| { + const now = std.time.Instant.now() catch state.first_frame_time; + const since_ns: f32 = @floatFromInt(now.since(state.first_frame_time)); + const delta_ns: f32 = @floatFromInt(now.since(state.last_frame_time)); + state.uniforms.time = since_ns / std.time.ns_per_s; + state.uniforms.time_delta = delta_ns / std.time.ns_per_s; + state.last_frame_time = now; + } + + // If our font atlas changed, sync the texture data + texture: { + const modified = self.font_grid.atlas_grayscale.modified.load(.monotonic); + if (modified <= frame.grayscale_modified) break :texture; + self.font_grid.lock.lockShared(); + defer self.font_grid.lock.unlockShared(); + frame.grayscale_modified = self.font_grid.atlas_grayscale.modified.load(.monotonic); + try self.syncAtlasTexture(&self.font_grid.atlas_grayscale, &frame.grayscale); + } + texture: { + const modified = self.font_grid.atlas_color.modified.load(.monotonic); + if (modified <= frame.color_modified) break :texture; + self.font_grid.lock.lockShared(); + defer self.font_grid.lock.unlockShared(); + frame.color_modified = self.font_grid.atlas_color.modified.load(.monotonic); + try self.syncAtlasTexture(&self.font_grid.atlas_color, &frame.color); + } + + // Get a frame context from the graphics API. + var frame_ctx = try self.api.beginFrame(self, &frame.target); + defer frame_ctx.complete(sync); + + { + var pass = frame_ctx.renderPass(&.{.{ + .target = if (frame.custom_shader_state) |state| + .{ .texture = state.back_texture } + else + .{ .target = frame.target }, + .clear_color = .{ 0.0, 0.0, 0.0, 0.0 }, + }}); + defer pass.complete(); + + // bg images + try self.drawImagePlacements(&pass, self.image_placements.items[0..self.image_bg_end]); + // bg + pass.step(.{ + .pipeline = self.shaders.cell_bg_pipeline, + .uniforms = frame.uniforms.buffer, + .buffers = &.{ null, frame.cells_bg.buffer }, + .draw = .{ + .type = .triangle, + .vertex_count = 3, + }, + }); + // mg images + try self.drawImagePlacements(&pass, self.image_placements.items[self.image_bg_end..self.image_text_end]); + // text + pass.step(.{ + .pipeline = self.shaders.cell_text_pipeline, + .uniforms = frame.uniforms.buffer, + .buffers = &.{ + frame.cells.buffer, + frame.cells_bg.buffer, + }, + .textures = &.{ + frame.grayscale, + frame.color, + }, + .draw = .{ + .type = .triangle_strip, + .vertex_count = 4, + .instance_count = fg_count, + }, + }); + // fg images + try self.drawImagePlacements(&pass, self.image_placements.items[self.image_text_end..]); + } + + // If we have custom shaders, then we render them. + if (frame.custom_shader_state) |*state| { + // We create a buffer on the GPU for our post uniforms. + // TODO: This should be a part of the frame state tbqh. + const PostBuffer = Buffer(shaderpkg.PostUniforms); + const uniform_buffer = try PostBuffer.initFill( + self.api.bufferOptions(), + &.{state.uniforms}, + ); + defer uniform_buffer.deinit(); + + for (self.shaders.post_pipelines, 0..) |pipeline, i| { + defer state.swap(); + + var pass = frame_ctx.renderPass(&.{.{ + .target = if (i < self.shaders.post_pipelines.len - 1) + .{ .texture = state.front_texture } + else + .{ .target = frame.target }, + .clear_color = .{ 0.0, 0.0, 0.0, 0.0 }, + }}); + defer pass.complete(); + + pass.step(.{ + .pipeline = pipeline, + .uniforms = uniform_buffer.buffer, + .textures = &.{state.back_texture}, + .draw = .{ + .type = .triangle, + .vertex_count = 3, + }, + }); + } + } + } + + // Callback from the graphics API when a frame is completed. + pub fn frameCompleted( + self: *Self, + health: Health, + ) void { + // If our health value hasn't changed, then we do nothing. We don't + // do a cmpxchg here because strict atomicity isn't important. + if (self.health.load(.seq_cst) != health) { + self.health.store(health, .seq_cst); + + // Our health value changed, so we notify the surface so that it + // can do something about it. + _ = self.surface_mailbox.push(.{ + .renderer_health = health, + }, .{ .forever = {} }); + } + + // Always release our semaphore + self.swap_chain.releaseFrame(); + } + + fn drawImagePlacements( + self: *Self, + pass: *RenderPass, + placements: []const imagepkg.Placement, + ) !void { + if (placements.len == 0) return; + + for (placements) |p| { + + // Look up the image + const image = self.images.get(p.image_id) orelse { + log.warn("image not found for placement image_id={}", .{p.image_id}); + return; + }; + + // Get the texture + const texture = switch (image.image) { + .ready => |t| t, + else => { + log.warn("image not ready for placement image_id={}", .{p.image_id}); + return; + }, + }; + + // Create our vertex buffer, which is always exactly one item. + // future(mitchellh): we can group rendering multiple instances of a single image + var buf = try Buffer(shaderpkg.Image).initFill( + self.api.imageBufferOptions(), + &.{.{ + .grid_pos = .{ + @as(f32, @floatFromInt(p.x)), + @as(f32, @floatFromInt(p.y)), + }, + + .cell_offset = .{ + @as(f32, @floatFromInt(p.cell_offset_x)), + @as(f32, @floatFromInt(p.cell_offset_y)), + }, + + .source_rect = .{ + @as(f32, @floatFromInt(p.source_x)), + @as(f32, @floatFromInt(p.source_y)), + @as(f32, @floatFromInt(p.source_width)), + @as(f32, @floatFromInt(p.source_height)), + }, + + .dest_size = .{ + @as(f32, @floatFromInt(p.width)), + @as(f32, @floatFromInt(p.height)), + }, + }}, + ); + defer buf.deinit(); + + pass.step(.{ + .pipeline = self.shaders.image_pipeline, + .buffers = &.{buf.buffer}, + .textures = &.{texture}, + .draw = .{ + .type = .triangle_strip, + .vertex_count = 4, + }, + }); + } + } + + /// This goes through the Kitty graphic placements and accumulates the + /// placements we need to render on our viewport. It also ensures that + /// the visible images are loaded on the GPU. + fn prepKittyGraphics( + self: *Self, + t: *terminal.Terminal, + ) !void { + self.draw_mutex.lock(); + defer self.draw_mutex.unlock(); + + const storage = &t.screen.kitty_images; + defer storage.dirty = false; + + // We always clear our previous placements no matter what because + // we rebuild them from scratch. + self.image_placements.clearRetainingCapacity(); + self.image_virtual = false; + + // Go through our known images and if there are any that are no longer + // in use then mark them to be freed. + // + // This never conflicts with the below because a placement can't + // reference an image that doesn't exist. + { + var it = self.images.iterator(); + while (it.next()) |kv| { + if (storage.imageById(kv.key_ptr.*) == null) { + kv.value_ptr.image.markForUnload(); + } + } + } + + // The top-left and bottom-right corners of our viewport in screen + // points. This lets us determine offsets and containment of placements. + const top = t.screen.pages.getTopLeft(.viewport); + const bot = t.screen.pages.getBottomRight(.viewport).?; + const top_y = t.screen.pages.pointFromPin(.screen, top).?.screen.y; + const bot_y = t.screen.pages.pointFromPin(.screen, bot).?.screen.y; + + // Go through the placements and ensure the image is loaded on the GPU. + var it = storage.placements.iterator(); + while (it.next()) |kv| { + const p = kv.value_ptr; + + // Special logic based on location + switch (p.location) { + .pin => {}, + .virtual => { + // We need to mark virtual placements on our renderer so that + // we know to rebuild in more scenarios since cell changes can + // now trigger placement changes. + self.image_virtual = true; + + // We also continue out because virtual placements are + // only triggered by the unicode placeholder, not by the + // placement itself. + continue; + }, + } + + // Get the image for the placement + const image = storage.imageById(kv.key_ptr.image_id) orelse { + log.warn( + "missing image for placement, ignoring image_id={}", + .{kv.key_ptr.image_id}, + ); + continue; + }; + + try self.prepKittyPlacement(t, top_y, bot_y, &image, p); + } + + // If we have virtual placements then we need to scan for placeholders. + if (self.image_virtual) { + var v_it = terminal.kitty.graphics.unicode.placementIterator(top, bot); + while (v_it.next()) |virtual_p| try self.prepKittyVirtualPlacement( + t, + &virtual_p, + ); + } + + // Sort the placements by their Z value. + std.mem.sortUnstable( + imagepkg.Placement, + self.image_placements.items, + {}, + struct { + fn lessThan( + ctx: void, + lhs: imagepkg.Placement, + rhs: imagepkg.Placement, + ) bool { + _ = ctx; + return lhs.z < rhs.z or (lhs.z == rhs.z and lhs.image_id < rhs.image_id); + } + }.lessThan, + ); + + // Find our indices. The values are sorted by z so we can find the + // first placement out of bounds to find the limits. + var bg_end: ?u32 = null; + var text_end: ?u32 = null; + const bg_limit = std.math.minInt(i32) / 2; + for (self.image_placements.items, 0..) |p, i| { + if (bg_end == null and p.z >= bg_limit) { + bg_end = @intCast(i); + } + if (text_end == null and p.z >= 0) { + text_end = @intCast(i); + } + } + + self.image_bg_end = bg_end orelse 0; + self.image_text_end = text_end orelse self.image_bg_end; + } + + fn prepKittyVirtualPlacement( + self: *Self, + t: *terminal.Terminal, + p: *const terminal.kitty.graphics.unicode.Placement, + ) !void { + const storage = &t.screen.kitty_images; + const image = storage.imageById(p.image_id) orelse { + log.warn( + "missing image for virtual placement, ignoring image_id={}", + .{p.image_id}, + ); + return; + }; + + const rp = p.renderPlacement( + storage, + &image, + self.grid_metrics.cell_width, + self.grid_metrics.cell_height, + ) catch |err| { + log.warn("error rendering virtual placement err={}", .{err}); + return; + }; + + // If our placement is zero sized then we don't do anything. + if (rp.dest_width == 0 or rp.dest_height == 0) return; + + const viewport: terminal.point.Point = t.screen.pages.pointFromPin( + .viewport, + rp.top_left, + ) orelse { + // This is unreachable with virtual placements because we should + // only ever be looking at virtual placements that are in our + // viewport in the renderer and virtual placements only ever take + // up one row. + unreachable; + }; + + // Send our image to the GPU and store the placement for rendering. + try self.prepKittyImage(&image); + try self.image_placements.append(self.alloc, .{ + .image_id = image.id, + .x = @intCast(rp.top_left.x), + .y = @intCast(viewport.viewport.y), + .z = -1, + .width = rp.dest_width, + .height = rp.dest_height, + .cell_offset_x = rp.offset_x, + .cell_offset_y = rp.offset_y, + .source_x = rp.source_x, + .source_y = rp.source_y, + .source_width = rp.source_width, + .source_height = rp.source_height, + }); + } + + fn prepKittyPlacement( + self: *Self, + t: *terminal.Terminal, + top_y: u32, + bot_y: u32, + image: *const terminal.kitty.graphics.Image, + p: *const terminal.kitty.graphics.ImageStorage.Placement, + ) !void { + // Get the rect for the placement. If this placement doesn't have + // a rect then its virtual or something so skip it. + const rect = p.rect(image.*, t) orelse return; + + // This is expensive but necessary. + const img_top_y = t.screen.pages.pointFromPin(.screen, rect.top_left).?.screen.y; + const img_bot_y = t.screen.pages.pointFromPin(.screen, rect.bottom_right).?.screen.y; + + // If the selection isn't within our viewport then skip it. + if (img_top_y > bot_y) return; + if (img_bot_y < top_y) return; + + // We need to prep this image for upload if it isn't in the cache OR + // it is in the cache but the transmit time doesn't match meaning this + // image is different. + try self.prepKittyImage(image); + + // Calculate the dimensions of our image, taking in to + // account the rows / columns specified by the placement. + const dest_size = p.calculatedSize(image.*, t); + + // Calculate the source rectangle + const source_x = @min(image.width, p.source_x); + const source_y = @min(image.height, p.source_y); + const source_width = if (p.source_width > 0) + @min(image.width - source_x, p.source_width) + else + image.width; + const source_height = if (p.source_height > 0) + @min(image.height - source_y, p.source_height) + else + image.height; + + // Get the viewport-relative Y position of the placement. + const y_pos: i32 = @as(i32, @intCast(img_top_y)) - @as(i32, @intCast(top_y)); + + // Accumulate the placement + if (dest_size.width > 0 and dest_size.height > 0) { + try self.image_placements.append(self.alloc, .{ + .image_id = image.id, + .x = @intCast(rect.top_left.x), + .y = y_pos, + .z = p.z, + .width = dest_size.width, + .height = dest_size.height, + .cell_offset_x = p.x_offset, + .cell_offset_y = p.y_offset, + .source_x = source_x, + .source_y = source_y, + .source_width = source_width, + .source_height = source_height, + }); + } + } + + fn prepKittyImage( + self: *Self, + image: *const terminal.kitty.graphics.Image, + ) !void { + // If this image exists and its transmit time is the same we assume + // it is the identical image so we don't need to send it to the GPU. + const gop = try self.images.getOrPut(self.alloc, image.id); + if (gop.found_existing and + gop.value_ptr.transmit_time.order(image.transmit_time) == .eq) + { + return; + } + + // Copy the data into the pending state. + const data = try self.alloc.dupe(u8, image.data); + errdefer self.alloc.free(data); + + // Store it in the map + const pending: Image.Pending = .{ + .width = image.width, + .height = image.height, + .data = data.ptr, + }; + + const new_image: Image = switch (image.format) { + .gray => .{ .pending_gray = pending }, + .gray_alpha => .{ .pending_gray_alpha = pending }, + .rgb => .{ .pending_rgb = pending }, + .rgba => .{ .pending_rgba = pending }, + .png => unreachable, // should be decoded by now + }; + + if (!gop.found_existing) { + gop.value_ptr.* = .{ + .image = new_image, + .transmit_time = undefined, + }; + } else { + try gop.value_ptr.image.markForReplace( + self.alloc, + new_image, + ); + } + + gop.value_ptr.transmit_time = image.transmit_time; + } + + /// Update the configuration. + pub fn changeConfig(self: *Self, config: *DerivedConfig) !void { + self.draw_mutex.lock(); + defer self.draw_mutex.unlock(); + + // We always redo the font shaper in case font features changed. We + // could check to see if there was an actual config change but this is + // easier and rare enough to not cause performance issues. + { + var font_shaper = try font.Shaper.init(self.alloc, .{ + .features = config.font_features.items, + }); + errdefer font_shaper.deinit(); + self.font_shaper.deinit(); + self.font_shaper = font_shaper; + } + + // We also need to reset the shaper cache so shaper info + // from the previous font isn't re-used for the new font. + const font_shaper_cache = font.ShaperCache.init(); + self.font_shaper_cache.deinit(self.alloc); + self.font_shaper_cache = font_shaper_cache; + + // Set our new minimum contrast + self.uniforms.min_contrast = config.min_contrast; + + // Set our new color space and blending + self.uniforms.bools.use_display_p3 = config.colorspace == .@"display-p3"; + self.uniforms.bools.use_linear_blending = config.blending.isLinear(); + self.uniforms.bools.use_linear_correction = config.blending == .@"linear-corrected"; + + // Set our new colors + self.default_background_color = config.background; + self.default_foreground_color = config.foreground; + self.default_cursor_color = if (!config.cursor_invert) config.cursor_color else null; + self.cursor_invert = config.cursor_invert; + + const old_blending = self.config.blending; + const custom_shaders_changed = !self.config.custom_shaders.equal(config.custom_shaders); + + self.config.deinit(); + self.config = config.*; + + // Reset our viewport to force a rebuild, in case of a font change. + self.cells_viewport = null; + + const blending_changed = old_blending != config.blending; + + if (blending_changed) { + // We update our API's blending mode. + self.api.blending = config.blending; + // And indicate that we need to reinitialize our shaders. + self.reinitialize_shaders = true; + // And indicate that our swap chain targets need to + // be re-created to account for the new blending mode. + self.target_config_modified +%= 1; + } + + if (custom_shaders_changed) { + self.reinitialize_shaders = true; + } + } + + /// Resize the screen. + pub fn setScreenSize( + self: *Self, + size: renderer.Size, + ) void { + self.draw_mutex.lock(); + defer self.draw_mutex.unlock(); + + // We only actually need the padding from this, + // everything else is derived elsewhere. + self.size.padding = size.padding; + + self.updateScreenSizeUniforms(); + + log.debug("screen size size={}", .{size}); + } + + /// Update uniforms that are based on the screen size. + /// + /// Caller must hold the draw mutex. + fn updateScreenSizeUniforms(self: *Self) void { + const terminal_size = self.size.terminal(); + + // Blank space around the grid. + const blank: renderer.Padding = self.size.screen.blankPadding( + self.size.padding, + .{ + .columns = self.cells.size.columns, + .rows = self.cells.size.rows, + }, + .{ + .width = self.grid_metrics.cell_width, + .height = self.grid_metrics.cell_height, + }, + ).add(self.size.padding); + + // Setup our uniforms + self.uniforms.projection_matrix = math.ortho2d( + -1 * @as(f32, @floatFromInt(self.size.padding.left)), + @floatFromInt(terminal_size.width + self.size.padding.right), + @floatFromInt(terminal_size.height + self.size.padding.bottom), + -1 * @as(f32, @floatFromInt(self.size.padding.top)), + ); + self.uniforms.grid_padding = .{ + @floatFromInt(blank.top), + @floatFromInt(blank.right), + @floatFromInt(blank.bottom), + @floatFromInt(blank.left), + }; + } + + /// Convert the terminal state to GPU cells stored in CPU memory. These + /// are then synced to the GPU in the next frame. This only updates CPU + /// memory and doesn't touch the GPU. + fn rebuildCells( + self: *Self, + wants_rebuild: bool, + screen: *terminal.Screen, + screen_type: terminal.ScreenType, + mouse: renderer.State.Mouse, + preedit: ?renderer.State.Preedit, + cursor_style_: ?renderer.CursorStyle, + color_palette: *const terminal.color.Palette, + ) !void { + self.draw_mutex.lock(); + defer self.draw_mutex.unlock(); + + // const start = try std.time.Instant.now(); + // const start_micro = std.time.microTimestamp(); + // defer { + // const end = std.time.Instant.now() catch unreachable; + // // "[rebuildCells time] \t" + // std.log.warn("[rebuildCells time] {}\t{}", .{start_micro, end.since(start) / std.time.ns_per_us}); + // } + + _ = screen_type; // we might use this again later so not deleting it yet + + // Create an arena for all our temporary allocations while rebuilding + var arena = ArenaAllocator.init(self.alloc); + defer arena.deinit(); + const arena_alloc = arena.allocator(); + + // Create our match set for the links. + var link_match_set: link.MatchSet = if (mouse.point) |mouse_pt| try self.config.links.matchSet( + arena_alloc, + screen, + mouse_pt, + mouse.mods, + ) else .{}; + + // Determine our x/y range for preedit. We don't want to render anything + // here because we will render the preedit separately. + const preedit_range: ?struct { + y: terminal.size.CellCountInt, + x: [2]terminal.size.CellCountInt, + cp_offset: usize, + } = if (preedit) |preedit_v| preedit: { + const range = preedit_v.range(screen.cursor.x, screen.pages.cols - 1); + break :preedit .{ + .y = screen.cursor.y, + .x = .{ range.start, range.end }, + .cp_offset = range.cp_offset, + }; + } else null; + + const grid_size_diff = + self.cells.size.rows != screen.pages.rows or + self.cells.size.columns != screen.pages.cols; + + if (grid_size_diff) { + var new_size = self.cells.size; + new_size.rows = screen.pages.rows; + new_size.columns = screen.pages.cols; + try self.cells.resize(self.alloc, new_size); + + // Update our uniforms accordingly, otherwise + // our background cells will be out of place. + self.uniforms.grid_size = .{ new_size.columns, new_size.rows }; + } + + const rebuild = wants_rebuild or grid_size_diff; + + if (rebuild) { + // If we are doing a full rebuild, then we clear the entire cell buffer. + self.cells.reset(); + + // We also reset our padding extension depending on the screen type + switch (self.config.padding_color) { + .background => {}, + + // For extension, assume we are extending in all directions. + // For "extend" this may be disabled due to heuristics below. + .extend, .@"extend-always" => { + self.uniforms.padding_extend = .{ + .up = true, + .down = true, + .left = true, + .right = true, + }; + }, + } + } + + // We rebuild the cells row-by-row because we + // do font shaping and dirty tracking by row. + var row_it = screen.pages.rowIterator(.left_up, .{ .viewport = .{} }, null); + // If our cell contents buffer is shorter than the screen viewport, + // we render the rows that fit, starting from the bottom. If instead + // the viewport is shorter than the cell contents buffer, we align + // the top of the viewport with the top of the contents buffer. + var y: terminal.size.CellCountInt = @min( + screen.pages.rows, + self.cells.size.rows, + ); + while (row_it.next()) |row| { + // The viewport may have more rows than our cell contents, + // so we need to break from the loop early if we hit y = 0. + if (y == 0) break; + + y -= 1; + + if (!rebuild) { + // Only rebuild if we are doing a full rebuild or this row is dirty. + if (!row.isDirty()) continue; + + // Clear the cells if the row is dirty + self.cells.clear(y); + } + + // True if we want to do font shaping around the cursor. + // We want to do font shaping as long as the cursor is enabled. + const shape_cursor = screen.viewportIsBottom() and + y == screen.cursor.y; + + // We need to get this row's selection, if + // there is one, for proper run splitting. + const row_selection = sel: { + const sel = screen.selection orelse break :sel null; + const pin = screen.pages.pin(.{ .viewport = .{ .y = y } }) orelse + break :sel null; + break :sel sel.containedRow(screen, pin) orelse null; + }; + + // On primary screen, we still apply vertical padding + // extension under certain conditions we feel are safe. + // + // This helps make some scenarios look better while + // avoiding scenarios we know do NOT look good. + switch (self.config.padding_color) { + // These already have the correct values set above. + .background, .@"extend-always" => {}, + + // Apply heuristics for padding extension. + .extend => if (y == 0) { + self.uniforms.padding_extend.up = !row.neverExtendBg( + color_palette, + self.background_color orelse self.default_background_color, + ); + } else if (y == self.cells.size.rows - 1) { + self.uniforms.padding_extend.down = !row.neverExtendBg( + color_palette, + self.background_color orelse self.default_background_color, + ); + }, + } + + // Iterator of runs for shaping. + var run_iter = self.font_shaper.runIterator( + self.font_grid, + screen, + row, + row_selection, + if (shape_cursor) screen.cursor.x else null, + ); + var shaper_run: ?font.shape.TextRun = try run_iter.next(self.alloc); + var shaper_cells: ?[]const font.shape.Cell = null; + var shaper_cells_i: usize = 0; + + const row_cells_all = row.cells(.all); + + // If our viewport is wider than our cell contents buffer, + // we still only process cells up to the width of the buffer. + const row_cells = row_cells_all[0..@min(row_cells_all.len, self.cells.size.columns)]; + + for (row_cells, 0..) |*cell, x| { + // If this cell falls within our preedit range then we + // skip this because preedits are setup separately. + if (preedit_range) |range| preedit: { + // We're not on the preedit line, no actions necessary. + if (range.y != y) break :preedit; + // We're before the preedit range, no actions necessary. + if (x < range.x[0]) break :preedit; + // We're in the preedit range, skip this cell. + if (x <= range.x[1]) continue; + // After exiting the preedit range we need to catch + // the run position up because of the missed cells. + // In all other cases, no action is necessary. + if (x != range.x[1] + 1) break :preedit; + + // Step the run iterator until we find a run that ends + // after the current cell, which will be the soonest run + // that might contain glyphs for our cell. + while (shaper_run) |run| { + if (run.offset + run.cells > x) break; + shaper_run = try run_iter.next(self.alloc); + shaper_cells = null; + shaper_cells_i = 0; + } + + const run = shaper_run orelse break :preedit; + + // If we haven't shaped this run, do so now. + shaper_cells = shaper_cells orelse + // Try to read the cells from the shaping cache if we can. + self.font_shaper_cache.get(run) orelse + cache: { + // Otherwise we have to shape them. + const cells = try self.font_shaper.shape(run); + + // Try to cache them. If caching fails for any reason we + // continue because it is just a performance optimization, + // not a correctness issue. + self.font_shaper_cache.put( + self.alloc, + run, + cells, + ) catch |err| { + log.warn( + "error caching font shaping results err={}", + .{err}, + ); + }; + + // The cells we get from direct shaping are always owned + // by the shaper and valid until the next shaping call so + // we can safely use them. + break :cache cells; + }; + + // Advance our index until we reach or pass + // our current x position in the shaper cells. + while (shaper_cells.?[shaper_cells_i].x < x) { + shaper_cells_i += 1; + } + } + + const wide = cell.wide; + + const style = row.style(cell); + + const cell_pin: terminal.Pin = cell: { + var copy = row; + copy.x = @intCast(x); + break :cell copy; + }; + + // True if this cell is selected + const selected: bool = if (screen.selection) |sel| + sel.contains(screen, .{ + .node = row.node, + .y = row.y, + .x = @intCast( + // Spacer tails should show the selection + // state of the wide cell they belong to. + if (wide == .spacer_tail) + x -| 1 + else + x, + ), + }) + else + false; + + const bg_style = style.bg(cell, color_palette); + const fg_style = style.fg(color_palette, self.config.bold_is_bright) orelse self.foreground_color orelse self.default_foreground_color; + + // The final background color for the cell. + const bg = bg: { + if (selected) { + break :bg if (self.config.invert_selection_fg_bg) + if (style.flags.inverse) + // Cell is selected with invert selection fg/bg + // enabled, and the cell has the inverse style + // flag, so they cancel out and we get the normal + // bg color. + bg_style + else + // If it doesn't have the inverse style + // flag then we use the fg color instead. + fg_style + else + // If we don't have invert selection fg/bg set then we + // just use the selection background if set, otherwise + // the default fg color. + break :bg self.config.selection_background orelse self.foreground_color orelse self.default_foreground_color; + } + + // Not selected + break :bg if (style.flags.inverse != isCovering(cell.codepoint())) + // Two cases cause us to invert (use the fg color as the bg) + // - The "inverse" style flag. + // - A "covering" glyph; we use fg for bg in that + // case to help make sure that padding extension + // works correctly. + // + // If one of these is true (but not the other) + // then we use the fg style color for the bg. + fg_style + else + // Otherwise they cancel out. + bg_style; + }; + + const fg = fg: { + if (selected and !self.config.invert_selection_fg_bg) { + // If we don't have invert selection fg/bg set + // then we just use the selection foreground if + // set, otherwise the default bg color. + break :fg self.config.selection_foreground orelse self.background_color orelse self.default_background_color; + } + + // Whether we need to use the bg color as our fg color: + // - Cell is inverted and not selected + // - Cell is selected and not inverted + // Note: if selected then invert sel fg / bg must be + // false since we separately handle it if true above. + break :fg if (style.flags.inverse != selected) + bg_style orelse self.background_color orelse self.default_background_color + else + fg_style; + }; + + // Foreground alpha for this cell. + const alpha: u8 = if (style.flags.faint) 175 else 255; + + // Set the cell's background color. + { + const rgb = bg orelse self.background_color orelse self.default_background_color; + + // Determine our background alpha. If we have transparency configured + // then this is dynamic depending on some situations. This is all + // in an attempt to make transparency look the best for various + // situations. See inline comments. + const bg_alpha: u8 = bg_alpha: { + const default: u8 = 255; + + if (self.config.background_opacity >= 1) break :bg_alpha default; + + // Cells that are selected should be fully opaque. + if (selected) break :bg_alpha default; + + // Cells that are reversed should be fully opaque. + if (style.flags.inverse) break :bg_alpha default; + + // Cells that have an explicit bg color should be fully opaque. + if (bg_style != null) { + break :bg_alpha default; + } + + // Otherwise, we use the configured background opacity. + break :bg_alpha @intFromFloat(@round(self.config.background_opacity * 255.0)); + }; + + self.cells.bgCell(y, x).* = .{ + rgb.r, rgb.g, rgb.b, bg_alpha, + }; + } + + // If the invisible flag is set on this cell then we + // don't need to render any foreground elements, so + // we just skip all glyphs with this x coordinate. + // + // NOTE: This behavior matches xterm. Some other terminal + // emulators, e.g. Alacritty, still render text decorations + // and only make the text itself invisible. The decision + // has been made here to match xterm's behavior for this. + if (style.flags.invisible) { + continue; + } + + // Give links a single underline, unless they already have + // an underline, in which case use a double underline to + // distinguish them. + const underline: terminal.Attribute.Underline = if (link_match_set.contains(screen, cell_pin)) + if (style.flags.underline == .single) + .double + else + .single + else + style.flags.underline; + + // We draw underlines first so that they layer underneath text. + // This improves readability when a colored underline is used + // which intersects parts of the text (descenders). + if (underline != .none) self.addUnderline( + @intCast(x), + @intCast(y), + underline, + style.underlineColor(color_palette) orelse fg, + alpha, + ) catch |err| { + log.warn( + "error adding underline to cell, will be invalid x={} y={}, err={}", + .{ x, y, err }, + ); + }; + + if (style.flags.overline) self.addOverline(@intCast(x), @intCast(y), fg, alpha) catch |err| { + log.warn( + "error adding overline to cell, will be invalid x={} y={}, err={}", + .{ x, y, err }, + ); + }; + + // If we're at or past the end of our shaper run then + // we need to get the next run from the run iterator. + if (shaper_cells != null and shaper_cells_i >= shaper_cells.?.len) { + shaper_run = try run_iter.next(self.alloc); + shaper_cells = null; + shaper_cells_i = 0; + } + + if (shaper_run) |run| glyphs: { + // If we haven't shaped this run yet, do so. + shaper_cells = shaper_cells orelse + // Try to read the cells from the shaping cache if we can. + self.font_shaper_cache.get(run) orelse + cache: { + // Otherwise we have to shape them. + const cells = try self.font_shaper.shape(run); + + // Try to cache them. If caching fails for any reason we + // continue because it is just a performance optimization, + // not a correctness issue. + self.font_shaper_cache.put( + self.alloc, + run, + cells, + ) catch |err| { + log.warn( + "error caching font shaping results err={}", + .{err}, + ); + }; + + // The cells we get from direct shaping are always owned + // by the shaper and valid until the next shaping call so + // we can safely use them. + break :cache cells; + }; + + const cells = shaper_cells orelse break :glyphs; + + // If there are no shaper cells for this run, ignore it. + // This can occur for runs of empty cells, and is fine. + if (cells.len == 0) break :glyphs; + + // If we encounter a shaper cell to the left of the current + // cell then we have some problems. This logic relies on x + // position monotonically increasing. + assert(cells[shaper_cells_i].x >= x); + + // NOTE: An assumption is made here that a single cell will never + // be present in more than one shaper run. If that assumption is + // violated, this logic breaks. + + while (shaper_cells_i < cells.len and cells[shaper_cells_i].x == x) : ({ + shaper_cells_i += 1; + }) { + self.addGlyph( + @intCast(x), + @intCast(y), + cell_pin, + cells[shaper_cells_i], + shaper_run.?, + fg, + alpha, + ) catch |err| { + log.warn( + "error adding glyph to cell, will be invalid x={} y={}, err={}", + .{ x, y, err }, + ); + }; + } + } + + // Finally, draw a strikethrough if necessary. + if (style.flags.strikethrough) self.addStrikethrough( + @intCast(x), + @intCast(y), + fg, + alpha, + ) catch |err| { + log.warn( + "error adding strikethrough to cell, will be invalid x={} y={}, err={}", + .{ x, y, err }, + ); + }; + } + } + + // Setup our cursor rendering information. + cursor: { + // By default, we don't handle cursor inversion on the shader. + self.cells.setCursor(null); + self.uniforms.cursor_pos = .{ + std.math.maxInt(u16), + std.math.maxInt(u16), + }; + + // If we have preedit text, we don't setup a cursor + if (preedit != null) break :cursor; + + // Prepare the cursor cell contents. + const style = cursor_style_ orelse break :cursor; + const cursor_color = self.cursor_color orelse self.default_cursor_color orelse color: { + if (self.cursor_invert) { + // Use the foreground color from the cell under the cursor, if any. + const sty = screen.cursor.page_pin.style(screen.cursor.page_cell); + break :color if (sty.flags.inverse) + // If the cell is reversed, use background color instead. + (sty.bg(screen.cursor.page_cell, color_palette) orelse self.background_color orelse self.default_background_color) + else + (sty.fg(color_palette, self.config.bold_is_bright) orelse self.foreground_color orelse self.default_foreground_color); + } else { + break :color self.foreground_color orelse self.default_foreground_color; + } + }; + + self.addCursor(screen, style, cursor_color); + + // If the cursor is visible then we set our uniforms. + if (style == .block and screen.viewportIsBottom()) { + const wide = screen.cursor.page_cell.wide; + + self.uniforms.cursor_pos = .{ + // If we are a spacer tail of a wide cell, our cursor needs + // to move back one cell. The saturate is to ensure we don't + // overflow but this shouldn't happen with well-formed input. + switch (wide) { + .narrow, .spacer_head, .wide => screen.cursor.x, + .spacer_tail => screen.cursor.x -| 1, + }, + screen.cursor.y, + }; + + self.uniforms.bools.cursor_wide = switch (wide) { + .narrow, .spacer_head => false, + .wide, .spacer_tail => true, + }; + + const uniform_color = if (self.cursor_invert) blk: { + // Use the background color from the cell under the cursor, if any. + const sty = screen.cursor.page_pin.style(screen.cursor.page_cell); + break :blk if (sty.flags.inverse) + // If the cell is reversed, use foreground color instead. + (sty.fg(color_palette, self.config.bold_is_bright) orelse self.foreground_color orelse self.default_foreground_color) + else + (sty.bg(screen.cursor.page_cell, color_palette) orelse self.background_color orelse self.default_background_color); + } else if (self.config.cursor_text) |txt| + txt + else + self.background_color orelse self.default_background_color; + + self.uniforms.cursor_color = .{ + uniform_color.r, + uniform_color.g, + uniform_color.b, + 255, + }; + } + } + + // Setup our preedit text. + if (preedit) |preedit_v| { + const range = preedit_range.?; + var x = range.x[0]; + for (preedit_v.codepoints[range.cp_offset..]) |cp| { + self.addPreeditCell(cp, .{ .x = x, .y = range.y }) catch |err| { + log.warn("error building preedit cell, will be invalid x={} y={}, err={}", .{ + x, + range.y, + err, + }); + }; + + x += if (cp.wide) 2 else 1; + } + } + + // Update that our cells rebuilt + self.cells_rebuilt = true; + + // Log some things + // log.debug("rebuildCells complete cached_runs={}", .{ + // self.font_shaper_cache.count(), + // }); + } + + /// Add an underline decoration to the specified cell + fn addUnderline( + self: *Self, + x: terminal.size.CellCountInt, + y: terminal.size.CellCountInt, + style: terminal.Attribute.Underline, + color: terminal.color.RGB, + alpha: u8, + ) !void { + const sprite: font.Sprite = switch (style) { + .none => unreachable, + .single => .underline, + .double => .underline_double, + .dotted => .underline_dotted, + .dashed => .underline_dashed, + .curly => .underline_curly, + }; + + const render = try self.font_grid.renderGlyph( + self.alloc, + font.sprite_index, + @intFromEnum(sprite), + .{ + .cell_width = 1, + .grid_metrics = self.grid_metrics, + }, + ); + + try self.cells.add(self.alloc, .underline, .{ + .mode = .fg, + .grid_pos = .{ @intCast(x), @intCast(y) }, + .constraint_width = 1, + .color = .{ color.r, color.g, color.b, alpha }, + .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, + .glyph_size = .{ render.glyph.width, render.glyph.height }, + .bearings = .{ + @intCast(render.glyph.offset_x), + @intCast(render.glyph.offset_y), + }, + }); + } + + /// Add a overline decoration to the specified cell + fn addOverline( + self: *Self, + x: terminal.size.CellCountInt, + y: terminal.size.CellCountInt, + color: terminal.color.RGB, + alpha: u8, + ) !void { + const render = try self.font_grid.renderGlyph( + self.alloc, + font.sprite_index, + @intFromEnum(font.Sprite.overline), + .{ + .cell_width = 1, + .grid_metrics = self.grid_metrics, + }, + ); + + try self.cells.add(self.alloc, .overline, .{ + .mode = .fg, + .grid_pos = .{ @intCast(x), @intCast(y) }, + .constraint_width = 1, + .color = .{ color.r, color.g, color.b, alpha }, + .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, + .glyph_size = .{ render.glyph.width, render.glyph.height }, + .bearings = .{ + @intCast(render.glyph.offset_x), + @intCast(render.glyph.offset_y), + }, + }); + } + + /// Add a strikethrough decoration to the specified cell + fn addStrikethrough( + self: *Self, + x: terminal.size.CellCountInt, + y: terminal.size.CellCountInt, + color: terminal.color.RGB, + alpha: u8, + ) !void { + const render = try self.font_grid.renderGlyph( + self.alloc, + font.sprite_index, + @intFromEnum(font.Sprite.strikethrough), + .{ + .cell_width = 1, + .grid_metrics = self.grid_metrics, + }, + ); + + try self.cells.add(self.alloc, .strikethrough, .{ + .mode = .fg, + .grid_pos = .{ @intCast(x), @intCast(y) }, + .constraint_width = 1, + .color = .{ color.r, color.g, color.b, alpha }, + .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, + .glyph_size = .{ render.glyph.width, render.glyph.height }, + .bearings = .{ + @intCast(render.glyph.offset_x), + @intCast(render.glyph.offset_y), + }, + }); + } + + // Add a glyph to the specified cell. + fn addGlyph( + self: *Self, + x: terminal.size.CellCountInt, + y: terminal.size.CellCountInt, + cell_pin: terminal.Pin, + shaper_cell: font.shape.Cell, + shaper_run: font.shape.TextRun, + color: terminal.color.RGB, + alpha: u8, + ) !void { + const rac = cell_pin.rowAndCell(); + const cell = rac.cell; + + // Render + const render = try self.font_grid.renderGlyph( + self.alloc, + shaper_run.font_index, + shaper_cell.glyph_index, + .{ + .grid_metrics = self.grid_metrics, + .thicken = self.config.font_thicken, + .thicken_strength = self.config.font_thicken_strength, + }, + ); + + // If the glyph is 0 width or height, it will be invisible + // when drawn, so don't bother adding it to the buffer. + if (render.glyph.width == 0 or render.glyph.height == 0) { + return; + } + + const mode: shaderpkg.CellText.Mode = switch (try fgMode( + render.presentation, + cell_pin, + )) { + .normal => .fg, + .color => .fg_color, + .constrained => .fg_constrained, + .powerline => .fg_powerline, + }; + + try self.cells.add(self.alloc, .text, .{ + .mode = mode, + .grid_pos = .{ @intCast(x), @intCast(y) }, + .constraint_width = cell.gridWidth(), + .color = .{ color.r, color.g, color.b, alpha }, + .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, + .glyph_size = .{ render.glyph.width, render.glyph.height }, + .bearings = .{ + @intCast(render.glyph.offset_x + shaper_cell.x_offset), + @intCast(render.glyph.offset_y + shaper_cell.y_offset), + }, + }); + } + + fn addCursor( + self: *Self, + screen: *terminal.Screen, + cursor_style: renderer.CursorStyle, + cursor_color: terminal.color.RGB, + ) void { + // Add the cursor. We render the cursor over the wide character if + // we're on the wide character tail. + const wide, const x = cell: { + // The cursor goes over the screen cursor position. + const cell = screen.cursor.page_cell; + if (cell.wide != .spacer_tail or screen.cursor.x == 0) + break :cell .{ cell.wide == .wide, screen.cursor.x }; + + // If we're part of a wide character, we move the cursor back to + // the actual character. + const prev_cell = screen.cursorCellLeft(1); + break :cell .{ prev_cell.wide == .wide, screen.cursor.x - 1 }; + }; + + const alpha: u8 = if (!self.focused) 255 else alpha: { + const alpha = 255 * self.config.cursor_opacity; + break :alpha @intFromFloat(@ceil(alpha)); + }; + + const render = switch (cursor_style) { + .block, + .block_hollow, + .bar, + .underline, + => render: { + const sprite: font.Sprite = switch (cursor_style) { + .block => .cursor_rect, + .block_hollow => .cursor_hollow_rect, + .bar => .cursor_bar, + .underline => .underline, + .lock => unreachable, + }; + + break :render self.font_grid.renderGlyph( + self.alloc, + font.sprite_index, + @intFromEnum(sprite), + .{ + .cell_width = if (wide) 2 else 1, + .grid_metrics = self.grid_metrics, + }, + ) catch |err| { + log.warn("error rendering cursor glyph err={}", .{err}); + return; + }; + }, + + .lock => self.font_grid.renderCodepoint( + self.alloc, + 0xF023, // lock symbol + .regular, + .text, + .{ + .cell_width = if (wide) 2 else 1, + .grid_metrics = self.grid_metrics, + }, + ) catch |err| { + log.warn("error rendering cursor glyph err={}", .{err}); + return; + } orelse { + // This should never happen because we embed nerd + // fonts so we just log and return instead of fallback. + log.warn("failed to find lock symbol for cursor codepoint=0xF023", .{}); + return; + }, + }; + + self.cells.setCursor(.{ + .mode = .cursor, + .grid_pos = .{ x, screen.cursor.y }, + .color = .{ cursor_color.r, cursor_color.g, cursor_color.b, alpha }, + .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, + .glyph_size = .{ render.glyph.width, render.glyph.height }, + .bearings = .{ + @intCast(render.glyph.offset_x), + @intCast(render.glyph.offset_y), + }, + }); + } + + fn addPreeditCell( + self: *Self, + cp: renderer.State.Preedit.Codepoint, + coord: terminal.Coordinate, + ) !void { + // Preedit is rendered inverted + const bg = self.foreground_color orelse self.default_foreground_color; + const fg = self.background_color orelse self.default_background_color; + + // Render the glyph for our preedit text + const render_ = self.font_grid.renderCodepoint( + self.alloc, + @intCast(cp.codepoint), + .regular, + .text, + .{ .grid_metrics = self.grid_metrics }, + ) catch |err| { + log.warn("error rendering preedit glyph err={}", .{err}); + return; + }; + const render = render_ orelse { + log.warn("failed to find font for preedit codepoint={X}", .{cp.codepoint}); + return; + }; + + // Add our opaque background cell + self.cells.bgCell(coord.y, coord.x).* = .{ + bg.r, bg.g, bg.b, 255, + }; + if (cp.wide and coord.x < self.cells.size.columns - 1) { + self.cells.bgCell(coord.y, coord.x + 1).* = .{ + bg.r, bg.g, bg.b, 255, + }; + } + + // Add our text + try self.cells.add(self.alloc, .text, .{ + .mode = .fg, + .grid_pos = .{ @intCast(coord.x), @intCast(coord.y) }, + .color = .{ fg.r, fg.g, fg.b, 255 }, + .glyph_pos = .{ render.glyph.atlas_x, render.glyph.atlas_y }, + .glyph_size = .{ render.glyph.width, render.glyph.height }, + .bearings = .{ + @intCast(render.glyph.offset_x), + @intCast(render.glyph.offset_y), + }, + }); + } + + /// Sync the atlas data to the given texture. This copies the bytes + /// associated with the atlas to the given texture. If the atlas no + /// longer fits into the texture, the texture will be resized. + fn syncAtlasTexture( + self: *const Self, + atlas: *const font.Atlas, + texture: *Texture, + ) !void { + if (atlas.size > texture.width) { + // Free our old texture + texture.*.deinit(); + + // Reallocate + texture.* = try self.api.initAtlasTexture(atlas); + } + + try texture.replaceRegion(0, 0, atlas.size, atlas.size, atlas.data); + } + }; +} diff --git a/src/renderer/metal/Frame.zig b/src/renderer/metal/Frame.zig new file mode 100644 index 000000000..81b38e7b6 --- /dev/null +++ b/src/renderer/metal/Frame.zig @@ -0,0 +1,137 @@ +//! Wrapper for handling render passes. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +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; + +const log = std.log.scoped(.metal); + +/// Options for beginning a frame. +pub const Options = struct { + /// MTLCommandQueue + queue: objc.Object, +}; + +/// MTLCommandBuffer +buffer: objc.Object, + +block: CompletionBlock, + +/// Begin encoding a frame. +pub fn begin( + opts: Options, + /// Once the frame has been completed, the `frameCompleted` method + /// on the renderer is called with the health status of the frame. + renderer: *Renderer, + /// The target is presented via the provided renderer's API when completed. + target: *Target, +) !Self { + const buffer = opts.queue.msgSend( + objc.Object, + objc.sel("commandBuffer"), + .{}, + ); + + // Create our block to register for completion updates. + // The block is deallocated by the objC runtime on success. + const block = try CompletionBlock.init( + .{ + .renderer = renderer, + .target = target, + .sync = false, + }, + &bufferCompleted, + ); + errdefer block.deinit(); + + return .{ .buffer = buffer, .block = block }; +} + +/// This is the block type used for the addCompletedHandler callback. +const CompletionBlock = objc.Block(struct { + renderer: *Renderer, + target: *Target, + sync: bool, +}, .{ + objc.c.id, // MTLCommandBuffer +}, void); + +fn bufferCompleted( + block: *const CompletionBlock.Context, + buffer_id: objc.c.id, +) callconv(.c) void { + const buffer = objc.Object.fromId(buffer_id); + + // Get our command buffer status to pass back to the generic renderer. + const status = buffer.getProperty(mtl.MTLCommandBufferStatus, "status"); + const health: Health = switch (status) { + .@"error" => .unhealthy, + else => .healthy, + }; + + // If the frame is healthy, present it. + if (health == .healthy) { + block.renderer.api.present( + block.target.*, + block.sync, + ) catch |err| { + log.err("Failed to present render target: err={}", .{err}); + }; + } + + block.renderer.frameCompleted(health); +} + +/// Add a render pass to this frame with the provided attachments. +/// Returns a RenderPass which allows render steps to be added. +pub inline fn renderPass( + self: *const Self, + attachments: []const RenderPass.Options.Attachment, +) RenderPass { + return RenderPass.begin(.{ + .attachments = attachments, + .command_buffer = self.buffer, + }); +} + +/// Complete this frame and present the target. +/// +/// If `sync` is true, this will block until the frame is presented. +pub inline fn complete(self: *Self, sync: bool) void { + // If we don't need to complete synchronously, + // we add our block as a completion handler. + // + // It will be deallocated by the objc runtime on success. + if (!sync) { + self.buffer.msgSend( + void, + objc.sel("addCompletedHandler:"), + .{self.block.context}, + ); + } + + self.buffer.msgSend(void, objc.sel("commit"), .{}); + + // If we need to complete synchronously, we wait until + // the buffer is completed and call the callback directly, + // deiniting the block after we're done. + if (sync) { + self.buffer.msgSend(void, "waitUntilCompleted", .{}); + self.block.context.sync = true; + bufferCompleted(self.block.context, self.buffer.value); + self.block.deinit(); + } +} diff --git a/src/renderer/metal/IOSurfaceLayer.zig b/src/renderer/metal/IOSurfaceLayer.zig new file mode 100644 index 000000000..4c51a55c2 --- /dev/null +++ b/src/renderer/metal/IOSurfaceLayer.zig @@ -0,0 +1,187 @@ +//! A wrapper around a CALayer with a utility method +//! for settings its `contents` to an IOSurface. +const IOSurfaceLayer = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const builtin = @import("builtin"); +const objc = @import("objc"); +const macos = @import("macos"); + +const IOSurface = macos.iosurface.IOSurface; + +const log = std.log.scoped(.IOSurfaceLayer); + +/// We subclass CALayer with a custom display handler, we only need +/// to make the subclass once, and then we can use it as a singleton. +var Subclass: ?objc.Class = null; + +/// The underlying CALayer +layer: objc.Object, + +pub fn init() !IOSurfaceLayer { + const layer = (try getSubclass()).msgSend( + objc.Object, + objc.sel("layer"), + .{}, + ); + errdefer layer.release(); + + // The layer gravity is set to top-left so that the contents aren't + // stretched during resize operations before a new frame has been drawn. + layer.setProperty("contentsGravity", macos.animation.kCAGravityTopLeft); + + layer.setInstanceVariable("display_cb", .{ .value = null }); + layer.setInstanceVariable("display_ctx", .{ .value = null }); + + return .{ .layer = layer }; +} + +pub fn release(self: *IOSurfaceLayer) void { + self.layer.release(); +} + +/// Sets the layer's `contents` to the provided IOSurface. +/// +/// Makes sure to do so on the main thread to avoid visual artifacts. +pub inline fn setSurface(self: *IOSurfaceLayer, surface: *IOSurface) !void { + // We retain the surface to make sure it's not GC'd + // before we can set it as the contents of the layer. + // + // We release in the callback after setting the contents. + surface.retain(); + // We also need to retain the layer itself to make sure it + // isn't destroyed before the callback completes, since if + // that happens it will try to interact with a deallocated + // object. + _ = self.layer.retain(); + + var block = try SetSurfaceBlock.init(.{ + .layer = self.layer.value, + .surface = surface, + }, &setSurfaceCallback); + + // We check if we're on the main thread and run the block directly if so. + const NSThread = objc.getClass("NSThread").?; + if (NSThread.msgSend(bool, "isMainThread", .{})) { + setSurfaceCallback(block.context); + block.deinit(); + } else { + // NOTE: The block will automatically be deallocated by the objc + // runtime once it's executed, so there's no need to deinit it. + + macos.dispatch.dispatch_async( + @ptrCast(macos.dispatch.queue.getMain()), + @ptrCast(block.context), + ); + } +} + +/// Sets the layer's `contents` to the provided IOSurface. +/// +/// Does not ensure this happens on the main thread. +pub inline fn setSurfaceSync(self: *IOSurfaceLayer, surface: *IOSurface) void { + self.layer.setProperty("contents", surface); +} + +const SetSurfaceBlock = objc.Block(struct { + layer: objc.c.id, + surface: *IOSurface, +}, .{}, void); + +fn setSurfaceCallback( + block: *const SetSurfaceBlock.Context, +) callconv(.c) void { + const layer = objc.Object.fromId(block.layer); + const surface: *IOSurface = block.surface; + + // See explanation of why we retain and release in `setSurface`. + defer { + surface.release(); + layer.release(); + } + + // We check to see if the surface is the appropriate size for + // the layer, if it's not then we discard it. This is because + // asynchronously drawn frames can sometimes finish just after + // a synchronously drawn frame during a resize, and if we don't + // discard the improperly sized surface it creates jank. + const bounds = layer.getProperty(macos.graphics.Rect, "bounds"); + const scale = layer.getProperty(f64, "contentsScale"); + const width: usize = @intFromFloat(bounds.size.width * scale); + const height: usize = @intFromFloat(bounds.size.height * scale); + if (width != surface.getWidth() or height != surface.getHeight()) { + log.debug( + "setSurfaceCallback(): surface is wrong size for layer, discarding. surface = {d}x{d}, layer = {d}x{d}", + .{ surface.getWidth(), surface.getHeight(), width, height }, + ); + return; + } + + layer.setProperty("contents", surface); +} + +pub const DisplayCallback = ?*align(8) const fn (?*anyopaque) void; + +pub fn setDisplayCallback( + self: *IOSurfaceLayer, + display_cb: DisplayCallback, + display_ctx: ?*anyopaque, +) void { + self.layer.setInstanceVariable( + "display_cb", + objc.Object.fromId(@constCast(display_cb)), + ); + self.layer.setInstanceVariable( + "display_ctx", + objc.Object.fromId(display_ctx), + ); +} + +fn getSubclass() error{ObjCFailed}!objc.Class { + if (Subclass) |c| return c; + + const CALayer = + objc.getClass("CALayer") orelse return error.ObjCFailed; + + var subclass = + objc.allocateClassPair(CALayer, "IOSurfaceLayer") orelse return error.ObjCFailed; + errdefer objc.disposeClassPair(subclass); + + if (!subclass.addIvar("display_cb")) return error.ObjCFailed; + if (!subclass.addIvar("display_ctx")) return error.ObjCFailed; + + subclass.replaceMethod("display", struct { + fn display(target: objc.c.id, sel: objc.c.SEL) callconv(.c) void { + _ = sel; + const self = objc.Object.fromId(target); + const display_cb: DisplayCallback = @ptrFromInt(@intFromPtr( + self.getInstanceVariable("display_cb").value, + )); + if (display_cb) |cb| cb( + @ptrCast(self.getInstanceVariable("display_ctx").value), + ); + } + }.display); + + // Disable all animations for this layer by returning null for all actions. + subclass.replaceMethod("actionForKey:", struct { + fn actionForKey( + target: objc.c.id, + sel: objc.c.SEL, + key: objc.c.id, + ) callconv(.c) objc.c.id { + _ = target; + _ = sel; + _ = key; + return objc.getClass("NSNull").?.msgSend(objc.c.id, "null", .{}); + } + }.actionForKey); + + objc.registerClassPair(subclass); + + Subclass = subclass; + + return subclass; +} diff --git a/src/renderer/metal/Pipeline.zig b/src/renderer/metal/Pipeline.zig new file mode 100644 index 000000000..f72aeb2e1 --- /dev/null +++ b/src/renderer/metal/Pipeline.zig @@ -0,0 +1,203 @@ +//! Wrapper for handling render pipelines. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +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); + +/// Options for initializing a render pipeline. +pub const Options = struct { + /// MTLDevice + device: objc.Object, + + /// Name of the vertex function + vertex_fn: []const u8, + /// Name of the fragment function + fragment_fn: []const u8, + + /// MTLLibrary to get the vertex function from + vertex_library: objc.Object, + /// MTLLibrary to get the fragment function from + fragment_library: objc.Object, + + /// Vertex step function + step_fn: mtl.MTLVertexStepFunction = .per_vertex, + + /// Info about the color attachments used by this render pipeline. + attachments: []const Attachment, + + /// Describes a color attachment. + pub const Attachment = struct { + pixel_format: mtl.MTLPixelFormat, + blending_enabled: bool = true, + }; +}; + +/// MTLRenderPipelineState +state: objc.Object, + +pub fn init(comptime VertexAttributes: ?type, opts: Options) !Self { + // Create our descriptor + const desc = init: { + const Class = objc.getClass("MTLRenderPipelineDescriptor").?; + const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); + const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); + break :init id_init; + }; + defer desc.msgSend(void, objc.sel("release"), .{}); + + // Get our vertex and fragment functions and add them to the descriptor. + { + const str = try macos.foundation.String.createWithBytes( + opts.vertex_fn, + .utf8, + false, + ); + defer str.release(); + + const ptr = opts.vertex_library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); + const func_vert = objc.Object.fromId(ptr.?); + defer func_vert.msgSend(void, objc.sel("release"), .{}); + + desc.setProperty("vertexFunction", func_vert); + } + { + const str = try macos.foundation.String.createWithBytes( + opts.fragment_fn, + .utf8, + false, + ); + defer str.release(); + + const ptr = opts.fragment_library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); + const func_frag = objc.Object.fromId(ptr.?); + defer func_frag.msgSend(void, objc.sel("release"), .{}); + + desc.setProperty("fragmentFunction", func_frag); + } + + // If we have vertex attributes, create and add a vertex descriptor. + if (VertexAttributes) |V| { + const vertex_desc = init: { + const Class = objc.getClass("MTLVertexDescriptor").?; + const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); + const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); + break :init id_init; + }; + defer vertex_desc.msgSend(void, objc.sel("release"), .{}); + + // Our attributes are the fields of the input + const attrs = objc.Object.fromId(vertex_desc.getProperty(?*anyopaque, "attributes")); + autoAttribute(V, attrs); + + // The layout describes how and when we fetch the next vertex input. + const layouts = objc.Object.fromId(vertex_desc.getProperty(?*anyopaque, "layouts")); + { + const layout = layouts.msgSend( + objc.Object, + objc.sel("objectAtIndexedSubscript:"), + .{@as(c_ulong, 0)}, + ); + + layout.setProperty("stepFunction", @intFromEnum(opts.step_fn)); + layout.setProperty("stride", @as(c_ulong, @sizeOf(V))); + } + + desc.setProperty("vertexDescriptor", vertex_desc); + } + + // Set our color attachment + const attachments = objc.Object.fromId(desc.getProperty(?*anyopaque, "colorAttachments")); + for (opts.attachments, 0..) |at, i| { + const attachment = attachments.msgSend( + objc.Object, + objc.sel("objectAtIndexedSubscript:"), + .{@as(c_ulong, i)}, + ); + + attachment.setProperty("pixelFormat", @intFromEnum(at.pixel_format)); + + attachment.setProperty("blendingEnabled", at.blending_enabled); + // We always use premultiplied alpha blending for now. + if (at.blending_enabled) { + attachment.setProperty("rgbBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); + attachment.setProperty("alphaBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); + attachment.setProperty("sourceRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); + attachment.setProperty("sourceAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); + attachment.setProperty("destinationRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); + attachment.setProperty("destinationAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); + } + } + + // Make our state + var err: ?*anyopaque = null; + const pipeline_state = opts.device.msgSend( + objc.Object, + objc.sel("newRenderPipelineStateWithDescriptor:error:"), + .{ desc, &err }, + ); + try checkError(err); + errdefer pipeline_state.release(); + + return .{ .state = pipeline_state }; +} + +pub fn deinit(self: *const Self) void { + self.state.release(); +} + +fn autoAttribute(T: type, attrs: objc.Object) void { + inline for (@typeInfo(T).@"struct".fields, 0..) |field, i| { + const offset = @offsetOf(T, field.name); + + const FT = switch (@typeInfo(field.type)) { + .@"enum" => |e| e.tag_type, + else => field.type, + }; + + // Very incomplete list, expand as necessary. + const format = switch (FT) { + [4]u8 => mtl.MTLVertexFormat.uchar4, + [2]u16 => mtl.MTLVertexFormat.ushort2, + [2]i16 => mtl.MTLVertexFormat.short2, + [2]f32 => mtl.MTLVertexFormat.float2, + [4]f32 => mtl.MTLVertexFormat.float4, + [2]i32 => mtl.MTLVertexFormat.int2, + u32 => mtl.MTLVertexFormat.uint, + [2]u32 => mtl.MTLVertexFormat.uint2, + [4]u32 => mtl.MTLVertexFormat.uint4, + u8 => mtl.MTLVertexFormat.uchar, + else => comptime unreachable, + }; + + const attr = attrs.msgSend( + objc.Object, + objc.sel("objectAtIndexedSubscript:"), + .{@as(c_ulong, i)}, + ); + + attr.setProperty("format", @intFromEnum(format)); + attr.setProperty("offset", @as(c_ulong, offset)); + attr.setProperty("bufferIndex", @as(c_ulong, 0)); + } +} + +fn checkError(err_: ?*anyopaque) !void { + const nserr = objc.Object.fromId(err_ orelse return); + const str = @as( + *macos.foundation.String, + @ptrCast(nserr.getProperty(?*anyopaque, "localizedDescription").?), + ); + + log.err("metal error={s}", .{str.cstringPtr(.ascii).?}); + return error.MetalFailed; +} diff --git a/src/renderer/metal/RenderPass.zig b/src/renderer/metal/RenderPass.zig new file mode 100644 index 000000000..e48bc4c00 --- /dev/null +++ b/src/renderer/metal/RenderPass.zig @@ -0,0 +1,220 @@ +//! Wrapper for handling render passes. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const builtin = @import("builtin"); +const objc = @import("objc"); + +const mtl = @import("api.zig"); +const Pipeline = @import("Pipeline.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); + +/// Options for beginning a render pass. +pub const Options = struct { + /// MTLCommandBuffer + command_buffer: objc.Object, + /// Color attachments for this render pass. + attachments: []const Attachment, + + /// Describes a color attachment. + pub const Attachment = struct { + target: union(enum) { + texture: Texture, + target: Target, + }, + clear_color: ?[4]f64 = null, + }; +}; + +/// Describes a step in a render pass. +pub const Step = struct { + pipeline: Pipeline, + /// MTLBuffer + uniforms: ?objc.Object = null, + /// MTLBuffer + buffers: []const ?objc.Object = &.{}, + textures: []const ?Texture = &.{}, + draw: Draw, + + /// Describes the draw call for this step. + pub const Draw = struct { + type: mtl.MTLPrimitiveType, + vertex_count: usize, + instance_count: usize = 1, + }; +}; + +/// MTLRenderCommandEncoder +encoder: objc.Object, + +/// Begin a render pass. +pub fn begin( + opts: Options, +) Self { + // Create a pass descriptor + const desc = desc: { + const MTLRenderPassDescriptor = objc.getClass("MTLRenderPassDescriptor").?; + const desc = MTLRenderPassDescriptor.msgSend( + objc.Object, + objc.sel("renderPassDescriptor"), + .{}, + ); + + // Set our color attachment to be our drawable surface. + const attachments = objc.Object.fromId( + desc.getProperty(?*anyopaque, "colorAttachments"), + ); + for (opts.attachments, 0..) |at, i| { + const attachment = attachments.msgSend( + objc.Object, + objc.sel("objectAtIndexedSubscript:"), + .{@as(c_ulong, i)}, + ); + + attachment.setProperty( + "loadAction", + @intFromEnum(@as( + mtl.MTLLoadAction, + if (at.clear_color != null) + .clear + else + .load, + )), + ); + attachment.setProperty( + "storeAction", + @intFromEnum(mtl.MTLStoreAction.store), + ); + attachment.setProperty("texture", switch (at.target) { + .texture => |t| t.texture.value, + .target => |t| t.texture.value, + }); + if (at.clear_color) |c| attachment.setProperty( + "clearColor", + mtl.MTLClearColor{ + .red = c[0], + .green = c[1], + .blue = c[2], + .alpha = c[3], + }, + ); + } + + break :desc desc; + }; + + // MTLRenderCommandEncoder + const encoder = opts.command_buffer.msgSend( + objc.Object, + objc.sel("renderCommandEncoderWithDescriptor:"), + .{desc.value}, + ); + + return .{ .encoder = encoder }; +} + +/// Add a step to this render pass. +pub fn step(self: *const Self, s: Step) void { + if (s.draw.instance_count == 0) return; + + // Set pipeline state + self.encoder.msgSend( + void, + objc.sel("setRenderPipelineState:"), + .{s.pipeline.state.value}, + ); + + if (s.buffers.len > 0) { + // We reserve index 0 for the vertex buffer, this isn't very + // flexible but it lines up with the API we have for OpenGL. + if (s.buffers[0]) |buf| { + self.encoder.msgSend( + void, + objc.sel("setVertexBuffer:offset:atIndex:"), + .{ buf.value, @as(c_ulong, 0), @as(c_ulong, 0) }, + ); + self.encoder.msgSend( + void, + objc.sel("setFragmentBuffer:offset:atIndex:"), + .{ buf.value, @as(c_ulong, 0), @as(c_ulong, 0) }, + ); + } + + // Set the rest of the buffers starting at index 2, this is + // so that we can use index 1 for the uniforms if present. + // + // Also, we set buffers (and textures) for both stages. + // + // Again, not very flexible, but it's consistent and predictable, + // and we need to treat the uniforms as special because of OpenGL. + // + // TODO: Maybe in the future add info to the pipeline struct which + // allows it to define a mapping between provided buffers and + // what index they get set at for the vertex / fragment stage. + for (s.buffers[1..], 2..) |b, i| if (b) |buf| { + self.encoder.msgSend( + void, + objc.sel("setVertexBuffer:offset:atIndex:"), + .{ buf.value, @as(c_ulong, 0), @as(c_ulong, i) }, + ); + self.encoder.msgSend( + void, + objc.sel("setFragmentBuffer:offset:atIndex:"), + .{ buf.value, @as(c_ulong, 0), @as(c_ulong, i) }, + ); + }; + } + + // Set the uniforms as buffer index 1 if present. + if (s.uniforms) |buf| { + self.encoder.msgSend( + void, + objc.sel("setVertexBuffer:offset:atIndex:"), + .{ buf.value, @as(c_ulong, 0), @as(c_ulong, 1) }, + ); + self.encoder.msgSend( + void, + objc.sel("setFragmentBuffer:offset:atIndex:"), + .{ buf.value, @as(c_ulong, 0), @as(c_ulong, 1) }, + ); + } + + // Set textures. + for (s.textures, 0..) |t, i| if (t) |tex| { + self.encoder.msgSend( + void, + objc.sel("setVertexTexture:atIndex:"), + .{ tex.texture.value, @as(c_ulong, i) }, + ); + self.encoder.msgSend( + void, + objc.sel("setFragmentTexture:atIndex:"), + .{ tex.texture.value, @as(c_ulong, i) }, + ); + }; + + // Draw! + self.encoder.msgSend( + void, + objc.sel("drawPrimitives:vertexStart:vertexCount:instanceCount:"), + .{ + @intFromEnum(s.draw.type), + @as(c_ulong, 0), + @as(c_ulong, s.draw.vertex_count), + @as(c_ulong, s.draw.instance_count), + }, + ); +} + +/// Complete this render pass. +/// This struct can no longer be used after calling this. +pub fn complete(self: *const Self) void { + self.encoder.msgSend(void, objc.sel("endEncoding"), .{}); +} diff --git a/src/renderer/metal/Target.zig b/src/renderer/metal/Target.zig new file mode 100644 index 000000000..fa62d3014 --- /dev/null +++ b/src/renderer/metal/Target.zig @@ -0,0 +1,110 @@ +//! Represents a render target. +//! +//! In this case, an IOSurface-backed MTLTexture. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const builtin = @import("builtin"); +const objc = @import("objc"); +const macos = @import("macos"); +const graphics = macos.graphics; +const IOSurface = macos.iosurface.IOSurface; + +const mtl = @import("api.zig"); + +const log = std.log.scoped(.metal); + +/// Options for initializing a Target +pub const Options = struct { + /// MTLDevice + device: objc.Object, + + /// Desired width + width: usize, + /// Desired height + height: usize, + + /// Pixel format for the MTLTexture + pixel_format: mtl.MTLPixelFormat, + /// Storage mode for the MTLTexture + storage_mode: mtl.MTLResourceOptions.StorageMode, +}; + +/// The underlying IOSurface. +surface: *IOSurface, + +/// The underlying MTLTexture. +texture: objc.Object, + +/// Current width of this target. +width: usize, +/// Current height of this target. +height: usize, + +pub fn init(opts: Options) !Self { + // We set our surface's color space to Display P3. + // This allows us to have "Apple-style" alpha blending, + // since it seems to be the case that Apple apps like + // Terminal and TextEdit render text in the display's + // color space using converted colors, which reduces, + // but does not fully eliminate blending artifacts. + const colorspace = try graphics.ColorSpace.createNamed(.displayP3); + defer colorspace.release(); + + const surface = try IOSurface.init(.{ + .width = @intCast(opts.width), + .height = @intCast(opts.height), + .pixel_format = .@"32BGRA", + .bytes_per_element = 4, + .colorspace = colorspace, + }); + + // Create our descriptor + const desc = init: { + const Class = objc.getClass("MTLTextureDescriptor").?; + const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); + const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); + break :init id_init; + }; + errdefer desc.msgSend(void, objc.sel("release"), .{}); + + // Set our properties + desc.setProperty("width", @as(c_ulong, @intCast(opts.width))); + desc.setProperty("height", @as(c_ulong, @intCast(opts.height))); + desc.setProperty("pixelFormat", @intFromEnum(opts.pixel_format)); + desc.setProperty("usage", mtl.MTLTextureUsage{ .render_target = true }); + desc.setProperty( + "resourceOptions", + mtl.MTLResourceOptions{ + // Indicate that the CPU writes to this resource but never reads it. + .cpu_cache_mode = .write_combined, + .storage_mode = opts.storage_mode, + }, + ); + + const id = opts.device.msgSend( + ?*anyopaque, + objc.sel("newTextureWithDescriptor:iosurface:plane:"), + .{ + desc, + surface, + @as(c_ulong, 0), + }, + ) orelse return error.MetalFailed; + + const texture = objc.Object.fromId(id); + + return .{ + .surface = surface, + .texture = texture, + .width = opts.width, + .height = opts.height, + }; +} + +pub fn deinit(self: *Self) void { + self.surface.deinit(); + self.texture.release(); +} diff --git a/src/renderer/metal/Texture.zig b/src/renderer/metal/Texture.zig new file mode 100644 index 000000000..6e3ae78c7 --- /dev/null +++ b/src/renderer/metal/Texture.zig @@ -0,0 +1,196 @@ +//! Wrapper for handling textures. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const builtin = @import("builtin"); +const objc = @import("objc"); + +const mtl = @import("api.zig"); +const Metal = @import("../Metal.zig"); + +const log = std.log.scoped(.metal); + +/// Options for initializing a texture. +pub const Options = struct { + /// MTLDevice + device: objc.Object, + pixel_format: mtl.MTLPixelFormat, + resource_options: mtl.MTLResourceOptions, +}; + +/// The underlying MTLTexture Object. +texture: objc.Object, + +/// The width of this texture. +width: usize, +/// The height of this texture. +height: usize, + +/// Bytes per pixel for this texture. +bpp: usize, + +/// Initialize a texture +pub fn init( + opts: Options, + width: usize, + height: usize, + data: ?[]const u8, +) !Self { + // Create our descriptor + const desc = init: { + const Class = objc.getClass("MTLTextureDescriptor").?; + const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); + const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); + break :init id_init; + }; + errdefer desc.msgSend(void, objc.sel("release"), .{}); + + // Set our properties + desc.setProperty("pixelFormat", @intFromEnum(opts.pixel_format)); + desc.setProperty("width", @as(c_ulong, width)); + desc.setProperty("height", @as(c_ulong, height)); + desc.setProperty("resourceOptions", opts.resource_options); + + // Initialize + const id = opts.device.msgSend( + ?*anyopaque, + objc.sel("newTextureWithDescriptor:"), + .{desc}, + ) orelse return error.MetalFailed; + + const self: Self = .{ + .texture = objc.Object.fromId(id), + .width = width, + .height = height, + .bpp = bppOf(opts.pixel_format), + }; + + // If we have data, we set it here. + if (data) |d| { + assert(d.len == width * height * self.bpp); + try self.replaceRegion(0, 0, width, height, d); + } + + return self; +} + +pub fn deinit(self: Self) void { + self.texture.release(); +} + +/// Replace a region of the texture with the provided data. +/// +/// Does NOT check the dimensions of the data to ensure correctness. +pub fn replaceRegion( + self: Self, + x: usize, + y: usize, + width: usize, + height: usize, + data: []const u8, +) !void { + self.texture.msgSend( + void, + objc.sel("replaceRegion:mipmapLevel:withBytes:bytesPerRow:"), + .{ + mtl.MTLRegion{ + .origin = .{ .x = x, .y = y, .z = 0 }, + .size = .{ + .width = @intCast(width), + .height = @intCast(height), + .depth = 1, + }, + }, + @as(c_ulong, 0), + @as(*const anyopaque, data.ptr), + @as(c_ulong, self.bpp * width), + }, + ); +} + +/// Returns the bytes per pixel for the provided pixel format +fn bppOf(pixel_format: mtl.MTLPixelFormat) usize { + return switch (pixel_format) { + // Invalid + .invalid => @panic("invalid pixel format"), + + // Weird formats I was too lazy to get the sizes of + else => @panic("pixel format size unknown (unlikely that this format was actually used, could be memory corruption)"), + + // 8-bit pixel formats + .a8unorm, + .r8unorm, + .r8unorm_srgb, + .r8snorm, + .r8uint, + .r8sint, + .rg8unorm, + .rg8unorm_srgb, + .rg8snorm, + .rg8uint, + .rg8sint, + .stencil8, + => 1, + + // 16-bit pixel formats + .r16unorm, + .r16snorm, + .r16uint, + .r16sint, + .r16float, + .rg16unorm, + .rg16snorm, + .rg16uint, + .rg16sint, + .rg16float, + .b5g6r5unorm, + .a1bgr5unorm, + .abgr4unorm, + .bgr5a1unorm, + .depth16unorm, + => 2, + + // 32-bit pixel formats + .rgba8unorm, + .rgba8unorm_srgb, + .rgba8snorm, + .rgba8uint, + .rgba8sint, + .bgra8unorm, + .bgra8unorm_srgb, + .rgb10a2unorm, + .rgb10a2uint, + .rg11b10float, + .rgb9e5float, + .bgr10a2unorm, + .bgr10_xr, + .bgr10_xr_srgb, + .r32uint, + .r32sint, + .r32float, + .depth32float, + .depth24unorm_stencil8, + => 4, + + // 64-bit pixel formats + .rg32uint, + .rg32sint, + .rg32float, + .rgba16unorm, + .rgba16snorm, + .rgba16uint, + .rgba16sint, + .rgba16float, + .bgra10_xr, + .bgra10_xr_srgb, + => 8, + + // 128-bit pixel formats, + .rgba32uint, + .rgba32sint, + .rgba32float, + => 128, + }; +} diff --git a/src/renderer/metal/api.zig b/src/renderer/metal/api.zig index 90a1a65ab..e1daa6848 100644 --- a/src/renderer/metal/api.zig +++ b/src/renderer/metal/api.zig @@ -366,7 +366,7 @@ pub const MTLTextureUsage = packed struct(c_ulong) { /// https://developer.apple.com/documentation/metal/mtltextureusage/shaderatomic?language=objc shader_atomic: bool = false, // TextureUsageShaderAtomic = 32, - __reserved: @Type(.{ .Int = .{ + __reserved: @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(c_ulong) - 6, } }) = 0, @@ -375,6 +375,22 @@ pub const MTLTextureUsage = packed struct(c_ulong) { const unknown: MTLTextureUsage = @bitCast(0); // TextureUsageUnknown = 0, }; +/// https://developer.apple.com/documentation/metal/mtlbarrierscope?language=objc +pub const MTLBarrierScope = enum(c_ulong) { + buffers = 1, + textures = 2, + render_targets = 4, +}; + +/// https://developer.apple.com/documentation/metal/mtlrenderstages?language=objc +pub const MTLRenderStage = enum(c_ulong) { + vertex = 1, + fragment = 2, + tile = 4, + object = 8, + mesh = 16, +}; + pub const MTLClearColor = extern struct { red: f64, green: f64, diff --git a/src/renderer/metal/buffer.zig b/src/renderer/metal/buffer.zig index 4128e297b..43320a60b 100644 --- a/src/renderer/metal/buffer.zig +++ b/src/renderer/metal/buffer.zig @@ -5,9 +5,17 @@ const objc = @import("objc"); const macos = @import("macos"); const mtl = @import("api.zig"); +const Metal = @import("../Metal.zig"); const log = std.log.scoped(.metal); +/// Options for initializing a buffer. +pub const Options = struct { + /// MTLDevice + device: objc.Object, + resource_options: mtl.MTLResourceOptions, +}; + /// Metal data storage for a certain set of equal types. This is usually /// used for vertex buffers, etc. This helpful wrapper makes it easy to /// prealloc, shrink, grow, sync, buffers with Metal. @@ -15,74 +23,57 @@ pub fn Buffer(comptime T: type) type { return struct { const Self = @This(); - /// The resource options for this buffer. - options: mtl.MTLResourceOptions, + /// The options this buffer was initialized with. + opts: Options, - buffer: objc.Object, // MTLBuffer + /// The underlying MTLBuffer object. + buffer: objc.Object, + + /// The allocated length of the buffer. + /// Note that this is the number + /// of `T`s not the size in bytes. + len: usize, /// Initialize a buffer with the given length pre-allocated. - pub fn init( - device: objc.Object, - len: usize, - options: mtl.MTLResourceOptions, - ) !Self { - const buffer = device.msgSend( + pub fn init(opts: Options, len: usize) !Self { + const buffer = opts.device.msgSend( objc.Object, objc.sel("newBufferWithLength:options:"), .{ @as(c_ulong, @intCast(len * @sizeOf(T))), - options, + opts.resource_options, }, ); - return .{ .buffer = buffer, .options = options }; + return .{ .buffer = buffer, .opts = opts, .len = len }; } /// Init the buffer filled with the given data. - pub fn initFill( - device: objc.Object, - data: []const T, - options: mtl.MTLResourceOptions, - ) !Self { - const buffer = device.msgSend( + pub fn initFill(opts: Options, data: []const T) !Self { + const buffer = opts.device.msgSend( objc.Object, objc.sel("newBufferWithBytes:length:options:"), .{ @as(*const anyopaque, @ptrCast(data.ptr)), @as(c_ulong, @intCast(data.len * @sizeOf(T))), - options, + opts.resource_options, }, ); - return .{ .buffer = buffer, .options = options }; + return .{ .buffer = buffer, .opts = opts, .len = data.len }; } - pub fn deinit(self: *Self) void { + pub fn deinit(self: *const Self) void { self.buffer.msgSend(void, objc.sel("release"), .{}); } - /// Get the buffer contents as a slice of T. The contents are - /// mutable. The contents may or may not be automatically synced - /// depending on the buffer storage mode. See the Metal docs. - pub fn contents(self: *Self) ![]T { - const len_bytes = self.buffer.getProperty(c_ulong, "length"); - assert(@mod(len_bytes, @sizeOf(T)) == 0); - const len = @divExact(len_bytes, @sizeOf(T)); - const ptr = self.buffer.msgSend( - ?[*]T, - objc.sel("contents"), - .{}, - ).?; - return ptr[0..len]; - } - /// Sync new contents to the buffer. The data is expected to be the /// complete contents of the buffer. If the amount of data is larger /// than the buffer length, the buffer will be reallocated. /// /// If the amount of data is smaller than the buffer length, the /// remaining data in the buffer is left untouched. - pub fn sync(self: *Self, device: objc.Object, data: []const T) !void { + pub fn sync(self: *Self, data: []const T) !void { // If we need more bytes than our buffer has, we need to reallocate. const req_bytes = data.len * @sizeOf(T); const avail_bytes = self.buffer.getProperty(c_ulong, "length"); @@ -92,12 +83,12 @@ pub fn Buffer(comptime T: type) type { // Allocate a new buffer with enough to hold double what we require. const size = req_bytes * 2; - self.buffer = device.msgSend( + self.buffer = self.opts.device.msgSend( objc.Object, objc.sel("newBufferWithLength:options:"), .{ @as(c_ulong, @intCast(size * @sizeOf(T))), - self.options, + self.opts.resource_options, }, ); } @@ -123,7 +114,7 @@ pub fn Buffer(comptime T: type) type { // we need to signal Metal to synchronize the buffer data. // // Ref: https://developer.apple.com/documentation/metal/synchronizing-a-managed-resource-in-macos?language=objc - if (self.options.storage_mode == .managed) { + if (self.opts.resource_options.storage_mode == .managed) { self.buffer.msgSend( void, "didModifyRange:", @@ -134,7 +125,7 @@ pub fn Buffer(comptime T: type) type { /// Like Buffer.sync but takes data from an array of ArrayLists, /// rather than a single array. Returns the number of items synced. - pub fn syncFromArrayLists(self: *Self, device: objc.Object, lists: []std.ArrayListUnmanaged(T)) !usize { + pub fn syncFromArrayLists(self: *Self, lists: []const std.ArrayListUnmanaged(T)) !usize { var total_len: usize = 0; for (lists) |list| { total_len += list.items.len; @@ -149,12 +140,12 @@ pub fn Buffer(comptime T: type) type { // Allocate a new buffer with enough to hold double what we require. const size = req_bytes * 2; - self.buffer = device.msgSend( + self.buffer = self.opts.device.msgSend( objc.Object, objc.sel("newBufferWithLength:options:"), .{ @as(c_ulong, @intCast(size * @sizeOf(T))), - self.options, + self.opts.resource_options, }, ); } @@ -181,7 +172,7 @@ pub fn Buffer(comptime T: type) type { // we need to signal Metal to synchronize the buffer data. // // Ref: https://developer.apple.com/documentation/metal/synchronizing-a-managed-resource-in-macos?language=objc - if (self.options.storage_mode == .managed) { + if (self.opts.resource_options.storage_mode == .managed) { self.buffer.msgSend( void, "didModifyRange:", diff --git a/src/renderer/metal/image.zig b/src/renderer/metal/image.zig index 7d2599308..1bfa3c621 100644 --- a/src/renderer/metal/image.zig +++ b/src/renderer/metal/image.zig @@ -4,6 +4,9 @@ const assert = std.debug.assert; const objc = @import("objc"); const wuffs = @import("wuffs"); +const Metal = @import("../Metal.zig"); +const Texture = Metal.Texture; + const mtl = @import("api.zig"); /// Represents a single image placement on the grid. A placement is a @@ -61,15 +64,15 @@ pub const Image = union(enum) { replace_rgba: Replace, /// The image is uploaded and ready to be used. - ready: objc.Object, // MTLTexture + ready: Texture, /// The image is uploaded but is scheduled to be unloaded. unload_pending: []u8, - unload_ready: objc.Object, // MTLTexture - unload_replace: struct { []u8, objc.Object }, + unload_ready: Texture, + unload_replace: struct { []u8, Texture }, pub const Replace = struct { - texture: objc.Object, + texture: Texture, pending: Pending, }; @@ -101,32 +104,32 @@ pub const Image = union(enum) { .replace_gray => |r| { alloc.free(r.pending.dataSlice(1)); - r.texture.msgSend(void, objc.sel("release"), .{}); + r.texture.deinit(); }, .replace_gray_alpha => |r| { alloc.free(r.pending.dataSlice(2)); - r.texture.msgSend(void, objc.sel("release"), .{}); + r.texture.deinit(); }, .replace_rgb => |r| { alloc.free(r.pending.dataSlice(3)); - r.texture.msgSend(void, objc.sel("release"), .{}); + r.texture.deinit(); }, .replace_rgba => |r| { alloc.free(r.pending.dataSlice(4)); - r.texture.msgSend(void, objc.sel("release"), .{}); + r.texture.deinit(); }, .unload_replace => |r| { alloc.free(r[0]); - r[1].msgSend(void, objc.sel("release"), .{}); + r[1].deinit(); }, .ready, .unload_ready, - => |obj| obj.msgSend(void, objc.sel("release"), .{}), + => |t| t.deinit(), } } @@ -170,7 +173,7 @@ pub const Image = union(enum) { // Get our existing texture. This switch statement will also handle // scenarios where there is no existing texture and we can modify // the self pointer directly. - const existing: objc.Object = switch (self.*) { + const existing: Texture = switch (self.*) { // For pending, we can free the old data and become pending // ourselves. .pending_gray => |p| { @@ -357,10 +360,11 @@ pub const Image = union(enum) { pub fn upload( self: *Image, alloc: Allocator, - device: objc.Object, - /// Storage mode for the MTLTexture object - storage_mode: mtl.MTLResourceOptions.StorageMode, + metal: *const Metal, ) !void { + const device = metal.device; + const storage_mode = metal.default_storage_mode; + // Convert our data if we have to try self.convert(alloc); @@ -368,27 +372,19 @@ pub const Image = union(enum) { const p = self.pending().?; // Create our texture - const texture = try initTexture(p, device, storage_mode); - errdefer texture.msgSend(void, objc.sel("release"), .{}); - - // Upload our data - const d = self.depth(); - texture.msgSend( - void, - objc.sel("replaceRegion:mipmapLevel:withBytes:bytesPerRow:"), + const texture = try Texture.init( .{ - mtl.MTLRegion{ - .origin = .{ .x = 0, .y = 0, .z = 0 }, - .size = .{ - .width = @intCast(p.width), - .height = @intCast(p.height), - .depth = 1, - }, + .device = device, + .pixel_format = .rgba8unorm_srgb, + .resource_options = .{ + // Indicate that the CPU writes to this resource but never reads it. + .cpu_cache_mode = .write_combined, + .storage_mode = storage_mode, }, - @as(c_ulong, 0), - @as(*const anyopaque, p.data), - @as(c_ulong, d * p.width), }, + @intCast(p.width), + @intCast(p.height), + p.data[0 .. p.width * p.height * self.depth()], ); // Uploaded. We can now clear our data and change our state. @@ -425,42 +421,4 @@ pub const Image = union(enum) { else => null, }; } - - fn initTexture( - p: Pending, - device: objc.Object, - /// Storage mode for the MTLTexture object - storage_mode: mtl.MTLResourceOptions.StorageMode, - ) !objc.Object { - // Create our descriptor - const desc = init: { - const Class = objc.getClass("MTLTextureDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - - // Set our properties - desc.setProperty("pixelFormat", @intFromEnum(mtl.MTLPixelFormat.rgba8unorm_srgb)); - desc.setProperty("width", @as(c_ulong, @intCast(p.width))); - desc.setProperty("height", @as(c_ulong, @intCast(p.height))); - - desc.setProperty( - "resourceOptions", - mtl.MTLResourceOptions{ - // Indicate that the CPU writes to this resource but never reads it. - .cpu_cache_mode = .write_combined, - .storage_mode = storage_mode, - }, - ); - - // Initialize - const id = device.msgSend( - ?*anyopaque, - objc.sel("newTextureWithDescriptor:"), - .{desc}, - ) orelse return error.MetalFailed; - - return objc.Object.fromId(id); - } }; diff --git a/src/renderer/metal/sampler.zig b/src/renderer/metal/sampler.zig deleted file mode 100644 index c7a04df3a..000000000 --- a/src/renderer/metal/sampler.zig +++ /dev/null @@ -1,38 +0,0 @@ -const std = @import("std"); -const Allocator = std.mem.Allocator; -const assert = std.debug.assert; -const objc = @import("objc"); - -const mtl = @import("api.zig"); - -pub const Sampler = struct { - sampler: objc.Object, - - pub fn init(device: objc.Object) !Sampler { - const desc = init: { - const Class = objc.getClass("MTLSamplerDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - defer desc.msgSend(void, objc.sel("release"), .{}); - desc.setProperty("rAddressMode", @intFromEnum(mtl.MTLSamplerAddressMode.clamp_to_edge)); - desc.setProperty("sAddressMode", @intFromEnum(mtl.MTLSamplerAddressMode.clamp_to_edge)); - desc.setProperty("tAddressMode", @intFromEnum(mtl.MTLSamplerAddressMode.clamp_to_edge)); - desc.setProperty("minFilter", @intFromEnum(mtl.MTLSamplerMinMagFilter.linear)); - desc.setProperty("magFilter", @intFromEnum(mtl.MTLSamplerMinMagFilter.linear)); - - const sampler = device.msgSend( - objc.Object, - objc.sel("newSamplerStateWithDescriptor:"), - .{desc}, - ); - errdefer sampler.msgSend(void, objc.sel("release"), .{}); - - return .{ .sampler = sampler }; - } - - pub fn deinit(self: *Sampler) void { - self.sampler.msgSend(void, objc.sel("release"), .{}); - } -}; diff --git a/src/renderer/metal/shaders.zig b/src/renderer/metal/shaders.zig index ff5f1e6bd..68994882e 100644 --- a/src/renderer/metal/shaders.zig +++ b/src/renderer/metal/shaders.zig @@ -6,6 +6,7 @@ const objc = @import("objc"); const math = @import("../../math.zig"); const mtl = @import("api.zig"); +const Pipeline = @import("Pipeline.zig"); const log = std.log.scoped(.metal); @@ -14,20 +15,24 @@ pub const Shaders = struct { library: objc.Object, /// Renders cell foreground elements (text, decorations). - cell_text_pipeline: objc.Object, + cell_text_pipeline: Pipeline, /// The cell background shader is the shader used to render the /// background of terminal cells. - cell_bg_pipeline: objc.Object, + cell_bg_pipeline: Pipeline, /// The image shader is the shader used to render images for things /// like the Kitty image protocol. - image_pipeline: objc.Object, + image_pipeline: Pipeline, /// Custom shaders to run against the final drawable texture. This /// can be used to apply a lot of effects. Each shader is run in sequence /// against the output of the previous shader. - post_pipelines: []const objc.Object, + post_pipelines: []const Pipeline, + + /// Set to true when deinited, if you try to deinit a defunct set + /// of shaders it will just be ignored, to prevent double-free. + defunct: bool = false, /// Initialize our shader set. /// @@ -44,15 +49,15 @@ pub const Shaders = struct { errdefer library.msgSend(void, objc.sel("release"), .{}); const cell_text_pipeline = try initCellTextPipeline(device, library, pixel_format); - errdefer cell_text_pipeline.msgSend(void, objc.sel("release"), .{}); + errdefer cell_text_pipeline.deinit(); const cell_bg_pipeline = try initCellBgPipeline(device, library, pixel_format); - errdefer cell_bg_pipeline.msgSend(void, objc.sel("release"), .{}); + errdefer cell_bg_pipeline.deinit(); const image_pipeline = try initImagePipeline(device, library, pixel_format); - errdefer image_pipeline.msgSend(void, objc.sel("release"), .{}); + errdefer image_pipeline.deinit(); - const post_pipelines: []const objc.Object = initPostPipelines( + const post_pipelines: []const Pipeline = initPostPipelines( alloc, device, library, @@ -66,7 +71,7 @@ pub const Shaders = struct { break :err &.{}; }; errdefer if (post_pipelines.len > 0) { - for (post_pipelines) |pipeline| pipeline.msgSend(void, objc.sel("release"), .{}); + for (post_pipelines) |pipeline| pipeline.deinit(); alloc.free(post_pipelines); }; @@ -80,16 +85,19 @@ pub const Shaders = struct { } pub fn deinit(self: *Shaders, alloc: Allocator) void { + if (self.defunct) return; + self.defunct = true; + // Release our primary shaders - self.cell_text_pipeline.msgSend(void, objc.sel("release"), .{}); - self.cell_bg_pipeline.msgSend(void, objc.sel("release"), .{}); - self.image_pipeline.msgSend(void, objc.sel("release"), .{}); + self.cell_text_pipeline.deinit(); + self.cell_bg_pipeline.deinit(); + self.image_pipeline.deinit(); self.library.msgSend(void, objc.sel("release"), .{}); // Release our postprocess shaders if (self.post_pipelines.len > 0) { for (self.post_pipelines) |pipeline| { - pipeline.msgSend(void, objc.sel("release"), .{}); + pipeline.deinit(); } alloc.free(self.post_pipelines); } @@ -140,25 +148,30 @@ pub const Uniforms = extern struct { /// The background color for the whole surface. bg_color: [4]u8 align(4), - /// Whether the cursor is 2 cells wide. - cursor_wide: bool align(1), + /// Various booleans. + /// + /// TODO: Maybe put these in a packed struct, like for OpenGL. + bools: extern struct { + /// Whether the cursor is 2 cells wide. + cursor_wide: bool align(1), - /// Indicates that colors provided to the shader are already in - /// the P3 color space, so they don't need to be converted from - /// sRGB. - use_display_p3: bool align(1), + /// Indicates that colors provided to the shader are already in + /// the P3 color space, so they don't need to be converted from + /// sRGB. + use_display_p3: bool align(1), - /// Indicates that the color attachments for the shaders have - /// an `*_srgb` pixel format, which means the shaders need to - /// output linear RGB colors rather than gamma encoded colors, - /// since blending will be performed in linear space and then - /// Metal itself will re-encode the colors for storage. - use_linear_blending: bool align(1), + /// Indicates that the color attachments for the shaders have + /// an `*_srgb` pixel format, which means the shaders need to + /// output linear RGB colors rather than gamma encoded colors, + /// since blending will be performed in linear space and then + /// Metal itself will re-encode the colors for storage. + use_linear_blending: bool align(1), - /// Enables a weight correction step that makes text rendered - /// with linear alpha blending have a similar apparent weight - /// (thickness) to gamma-incorrect blending. - use_linear_correction: bool align(1) = false, + /// Enables a weight correction step that makes text rendered + /// with linear alpha blending have a similar apparent weight + /// (thickness) to gamma-incorrect blending. + use_linear_correction: bool align(1) = false, + }, const PaddingExtend = packed struct(u8) { left: bool = false, @@ -214,15 +227,16 @@ fn initLibrary(device: objc.Object) !objc.Object { return library; } -/// Initialize our custom shader pipelines. The shaders argument is a -/// set of shader source code, not file paths. +/// Initialize our custom shader pipelines. +/// +/// The shaders argument is a set of shader source code, not file paths. fn initPostPipelines( alloc: Allocator, device: objc.Object, library: objc.Object, shaders: []const [:0]const u8, pixel_format: mtl.MTLPixelFormat, -) ![]const objc.Object { +) ![]const Pipeline { // If we have no shaders, do nothing. if (shaders.len == 0) return &.{}; @@ -230,10 +244,10 @@ fn initPostPipelines( var i: usize = 0; // Initialize our result set. If any error happens, we undo everything. - var pipelines = try alloc.alloc(objc.Object, shaders.len); + var pipelines = try alloc.alloc(Pipeline, shaders.len); errdefer { for (pipelines[0..i]) |pipeline| { - pipeline.msgSend(void, objc.sel("release"), .{}); + pipeline.deinit(); } alloc.free(pipelines); } @@ -259,7 +273,7 @@ fn initPostPipeline( library: objc.Object, data: [:0]const u8, pixel_format: mtl.MTLPixelFormat, -) !objc.Object { +) !Pipeline { // Create our library which has the shader source const post_library = library: { const source = try macos.foundation.String.createWithBytes( @@ -282,16 +296,19 @@ fn initPostPipeline( }; defer post_library.msgSend(void, objc.sel("release"), .{}); - return (Pipeline{ + return try Pipeline.init(null, .{ + .device = device, .vertex_fn = "full_screen_vertex", .fragment_fn = "main0", - .blending_enabled = false, - }).init( - device, - library, - post_library, - pixel_format, - ); + .vertex_library = library, + .fragment_library = post_library, + .attachments = &.{ + .{ + .pixel_format = pixel_format, + .blending_enabled = false, + }, + }, + }); } /// This is a single parameter for the terminal cell shader. @@ -324,19 +341,21 @@ fn initCellTextPipeline( device: objc.Object, library: objc.Object, pixel_format: mtl.MTLPixelFormat, -) !objc.Object { - return (Pipeline{ +) !Pipeline { + return try Pipeline.init(CellText, .{ + .device = device, .vertex_fn = "cell_text_vertex", .fragment_fn = "cell_text_fragment", - .Vertex = CellText, + .vertex_library = library, + .fragment_library = library, .step_fn = .per_instance, - .blending_enabled = true, - }).init( - device, - library, - library, - pixel_format, - ); + .attachments = &.{ + .{ + .pixel_format = pixel_format, + .blending_enabled = true, + }, + }, + }); } /// This is a single parameter for the cell bg shader. @@ -347,17 +366,20 @@ fn initCellBgPipeline( device: objc.Object, library: objc.Object, pixel_format: mtl.MTLPixelFormat, -) !objc.Object { - return (Pipeline{ +) !Pipeline { + return try Pipeline.init(null, .{ + .device = device, .vertex_fn = "cell_bg_vertex", .fragment_fn = "cell_bg_fragment", - .blending_enabled = false, - }).init( - device, - library, - library, - pixel_format, - ); + .vertex_library = library, + .fragment_library = library, + .attachments = &.{ + .{ + .pixel_format = pixel_format, + .blending_enabled = false, + }, + }, + }); } /// Initialize the image render pipeline for our shader library. @@ -365,182 +387,21 @@ fn initImagePipeline( device: objc.Object, library: objc.Object, pixel_format: mtl.MTLPixelFormat, -) !objc.Object { - return (Pipeline{ +) !Pipeline { + return try Pipeline.init(Image, .{ + .device = device, .vertex_fn = "image_vertex", .fragment_fn = "image_fragment", - .Vertex = Image, + .vertex_library = library, + .fragment_library = library, .step_fn = .per_instance, - .blending_enabled = true, - }).init( - device, - library, - library, - pixel_format, - ); -} - -/// A struct with all the necessary info to initialize a pipeline. -const Pipeline = struct { - /// Name of the vertex function - vertex_fn: []const u8, - /// Name of the fragment function - fragment_fn: []const u8, - - /// Vertex attribute struct - Vertex: ?type = null, - /// Vertex step function - step_fn: mtl.MTLVertexStepFunction = .per_vertex, - - /// Whether blending is enabled for the color attachment - blending_enabled: bool = true, - - fn init( - self: *const Pipeline, - device: objc.Object, - vertex_library: objc.Object, - fragment_library: objc.Object, - pixel_format: mtl.MTLPixelFormat, - ) !objc.Object { - // Create our descriptor - const desc = init: { - const Class = objc.getClass("MTLRenderPipelineDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - defer desc.msgSend(void, objc.sel("release"), .{}); - - // Get our vertex and fragment functions and add them to the descriptor. - { - const str = try macos.foundation.String.createWithBytes( - self.vertex_fn, - .utf8, - false, - ); - defer str.release(); - - const ptr = vertex_library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - const func_vert = objc.Object.fromId(ptr.?); - defer func_vert.msgSend(void, objc.sel("release"), .{}); - - desc.setProperty("vertexFunction", func_vert); - } - { - const str = try macos.foundation.String.createWithBytes( - self.fragment_fn, - .utf8, - false, - ); - defer str.release(); - - const ptr = fragment_library.msgSend(?*anyopaque, objc.sel("newFunctionWithName:"), .{str}); - const func_frag = objc.Object.fromId(ptr.?); - defer func_frag.msgSend(void, objc.sel("release"), .{}); - - desc.setProperty("fragmentFunction", func_frag); - } - - // If we have vertex attributes, create and add a vertex descriptor. - if (self.Vertex) |V| { - const vertex_desc = init: { - const Class = objc.getClass("MTLVertexDescriptor").?; - const id_alloc = Class.msgSend(objc.Object, objc.sel("alloc"), .{}); - const id_init = id_alloc.msgSend(objc.Object, objc.sel("init"), .{}); - break :init id_init; - }; - defer vertex_desc.msgSend(void, objc.sel("release"), .{}); - - // Our attributes are the fields of the input - const attrs = objc.Object.fromId(vertex_desc.getProperty(?*anyopaque, "attributes")); - autoAttribute(V, attrs); - - // The layout describes how and when we fetch the next vertex input. - const layouts = objc.Object.fromId(vertex_desc.getProperty(?*anyopaque, "layouts")); - { - const layout = layouts.msgSend( - objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, 0)}, - ); - - layout.setProperty("stepFunction", @intFromEnum(self.step_fn)); - layout.setProperty("stride", @as(c_ulong, @sizeOf(V))); - } - - desc.setProperty("vertexDescriptor", vertex_desc); - } - - // Set our color attachment - const attachments = objc.Object.fromId(desc.getProperty(?*anyopaque, "colorAttachments")); - { - const attachment = attachments.msgSend( - objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, 0)}, - ); - - attachment.setProperty("pixelFormat", @intFromEnum(pixel_format)); - - attachment.setProperty("blendingEnabled", self.blending_enabled); - // We always use premultiplied alpha blending for now. - if (self.blending_enabled) { - attachment.setProperty("rgbBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); - attachment.setProperty("alphaBlendOperation", @intFromEnum(mtl.MTLBlendOperation.add)); - attachment.setProperty("sourceRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); - attachment.setProperty("sourceAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one)); - attachment.setProperty("destinationRGBBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); - attachment.setProperty("destinationAlphaBlendFactor", @intFromEnum(mtl.MTLBlendFactor.one_minus_source_alpha)); - } - } - - // Make our state - var err: ?*anyopaque = null; - const pipeline_state = device.msgSend( - objc.Object, - objc.sel("newRenderPipelineStateWithDescriptor:error:"), - .{ desc, &err }, - ); - try checkError(err); - errdefer pipeline_state.msgSend(void, objc.sel("release"), .{}); - - return pipeline_state; - } -}; - -fn autoAttribute(T: type, attrs: objc.Object) void { - inline for (@typeInfo(T).@"struct".fields, 0..) |field, i| { - const offset = @offsetOf(T, field.name); - - const FT = switch (@typeInfo(field.type)) { - .@"enum" => |e| e.tag_type, - else => field.type, - }; - - const format = switch (FT) { - [4]u8 => mtl.MTLVertexFormat.uchar4, - [2]u16 => mtl.MTLVertexFormat.ushort2, - [2]i16 => mtl.MTLVertexFormat.short2, - [2]f32 => mtl.MTLVertexFormat.float2, - [4]f32 => mtl.MTLVertexFormat.float4, - [2]i32 => mtl.MTLVertexFormat.int2, - u32 => mtl.MTLVertexFormat.uint, - [2]u32 => mtl.MTLVertexFormat.uint2, - [4]u32 => mtl.MTLVertexFormat.uint4, - u8 => mtl.MTLVertexFormat.uchar, - else => comptime unreachable, - }; - - const attr = attrs.msgSend( - objc.Object, - objc.sel("objectAtIndexedSubscript:"), - .{@as(c_ulong, i)}, - ); - - attr.setProperty("format", @intFromEnum(format)); - attr.setProperty("offset", @as(c_ulong, offset)); - attr.setProperty("bufferIndex", @as(c_ulong, 0)); - } + .attachments = &.{ + .{ + .pixel_format = pixel_format, + .blending_enabled = true, + }, + }, + }); } fn checkError(err_: ?*anyopaque) !void { diff --git a/src/renderer/opengl/CellProgram.zig b/src/renderer/opengl/CellProgram.zig deleted file mode 100644 index c4da8e233..000000000 --- a/src/renderer/opengl/CellProgram.zig +++ /dev/null @@ -1,196 +0,0 @@ -/// The OpenGL program for rendering terminal cells. -const CellProgram = @This(); - -const std = @import("std"); -const gl = @import("opengl"); - -program: gl.Program, -vao: gl.VertexArray, -ebo: gl.Buffer, -vbo: gl.Buffer, - -/// The raw structure that maps directly to the buffer sent to the vertex shader. -/// This must be "extern" so that the field order is not reordered by the -/// Zig compiler. -pub const Cell = extern struct { - /// vec2 grid_coord - grid_col: u16, - grid_row: u16, - - /// vec2 glyph_pos - glyph_x: u32 = 0, - glyph_y: u32 = 0, - - /// vec2 glyph_size - glyph_width: u32 = 0, - glyph_height: u32 = 0, - - /// vec2 glyph_offset - glyph_offset_x: i32 = 0, - glyph_offset_y: i32 = 0, - - /// vec4 color_in - r: u8, - g: u8, - b: u8, - a: u8, - - /// vec4 bg_color_in - bg_r: u8, - bg_g: u8, - bg_b: u8, - bg_a: u8, - - /// uint mode - mode: CellMode, - - /// The width in grid cells that a rendering takes. - grid_width: u8, -}; - -pub const CellMode = enum(u8) { - bg = 1, - fg = 2, - fg_constrained = 3, - fg_color = 7, - fg_powerline = 15, - - // Non-exhaustive because masks change it - _, - - /// Apply a mask to the mode. - pub fn mask(self: CellMode, m: CellMode) CellMode { - return @enumFromInt(@intFromEnum(self) | @intFromEnum(m)); - } - - pub fn isFg(self: CellMode) bool { - // Since we use bit tricks below, we want to ensure the enum - // doesn't change without us looking at this logic again. - comptime { - const info = @typeInfo(CellMode).@"enum"; - std.debug.assert(info.fields.len == 5); - } - - return @intFromEnum(self) & @intFromEnum(@as(CellMode, .fg)) != 0; - } -}; - -pub fn init() !CellProgram { - // Load and compile our shaders. - const program = try gl.Program.createVF( - @embedFile("../shaders/cell.v.glsl"), - @embedFile("../shaders/cell.f.glsl"), - ); - errdefer program.destroy(); - - // Set our cell dimensions - const pbind = try program.use(); - defer pbind.unbind(); - - // Set all of our texture indexes - try program.setUniform("text", 0); - try program.setUniform("text_color", 1); - - // Setup our VAO - const vao = try gl.VertexArray.create(); - errdefer vao.destroy(); - const vaobind = try vao.bind(); - defer vaobind.unbind(); - - // Element buffer (EBO) - const ebo = try gl.Buffer.create(); - errdefer ebo.destroy(); - var ebobind = try ebo.bind(.element_array); - defer ebobind.unbind(); - try ebobind.setData([6]u8{ - 0, 1, 3, // Top-left triangle - 1, 2, 3, // Bottom-right triangle - }, .static_draw); - - // Vertex buffer (VBO) - const vbo = try gl.Buffer.create(); - errdefer vbo.destroy(); - var vbobind = try vbo.bind(.array); - defer vbobind.unbind(); - var offset: usize = 0; - try vbobind.attributeAdvanced(0, 2, gl.c.GL_UNSIGNED_SHORT, false, @sizeOf(Cell), offset); - offset += 2 * @sizeOf(u16); - try vbobind.attributeAdvanced(1, 2, gl.c.GL_UNSIGNED_INT, false, @sizeOf(Cell), offset); - offset += 2 * @sizeOf(u32); - try vbobind.attributeAdvanced(2, 2, gl.c.GL_UNSIGNED_INT, false, @sizeOf(Cell), offset); - offset += 2 * @sizeOf(u32); - try vbobind.attributeAdvanced(3, 2, gl.c.GL_INT, false, @sizeOf(Cell), offset); - offset += 2 * @sizeOf(i32); - try vbobind.attributeAdvanced(4, 4, gl.c.GL_UNSIGNED_BYTE, false, @sizeOf(Cell), offset); - offset += 4 * @sizeOf(u8); - try vbobind.attributeAdvanced(5, 4, gl.c.GL_UNSIGNED_BYTE, false, @sizeOf(Cell), offset); - offset += 4 * @sizeOf(u8); - try vbobind.attributeIAdvanced(6, 1, gl.c.GL_UNSIGNED_BYTE, @sizeOf(Cell), offset); - offset += 1 * @sizeOf(u8); - try vbobind.attributeIAdvanced(7, 1, gl.c.GL_UNSIGNED_BYTE, @sizeOf(Cell), offset); - try vbobind.enableAttribArray(0); - try vbobind.enableAttribArray(1); - try vbobind.enableAttribArray(2); - try vbobind.enableAttribArray(3); - try vbobind.enableAttribArray(4); - try vbobind.enableAttribArray(5); - try vbobind.enableAttribArray(6); - try vbobind.enableAttribArray(7); - try vbobind.attributeDivisor(0, 1); - try vbobind.attributeDivisor(1, 1); - try vbobind.attributeDivisor(2, 1); - try vbobind.attributeDivisor(3, 1); - try vbobind.attributeDivisor(4, 1); - try vbobind.attributeDivisor(5, 1); - try vbobind.attributeDivisor(6, 1); - try vbobind.attributeDivisor(7, 1); - - return .{ - .program = program, - .vao = vao, - .ebo = ebo, - .vbo = vbo, - }; -} - -pub fn bind(self: CellProgram) !Binding { - const program = try self.program.use(); - errdefer program.unbind(); - - const vao = try self.vao.bind(); - errdefer vao.unbind(); - - const ebo = try self.ebo.bind(.element_array); - errdefer ebo.unbind(); - - const vbo = try self.vbo.bind(.array); - errdefer vbo.unbind(); - - return .{ - .program = program, - .vao = vao, - .ebo = ebo, - .vbo = vbo, - }; -} - -pub fn deinit(self: CellProgram) void { - self.vbo.destroy(); - self.ebo.destroy(); - self.vao.destroy(); - self.program.destroy(); -} - -pub const Binding = struct { - program: gl.Program.Binding, - vao: gl.VertexArray.Binding, - ebo: gl.Buffer.Binding, - vbo: gl.Buffer.Binding, - - pub fn unbind(self: Binding) void { - self.vbo.unbind(); - self.ebo.unbind(); - self.vao.unbind(); - self.program.unbind(); - } -}; diff --git a/src/renderer/opengl/Frame.zig b/src/renderer/opengl/Frame.zig new file mode 100644 index 000000000..4c23fe106 --- /dev/null +++ b/src/renderer/opengl/Frame.zig @@ -0,0 +1,75 @@ +//! Wrapper for handling render passes. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +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; + +const log = std.log.scoped(.opengl); + +/// Options for beginning a frame. +pub const Options = struct {}; + +renderer: *Renderer, +target: *Target, + +/// Begin encoding a frame. +pub fn begin( + opts: Options, + /// Once the frame has been completed, the `frameCompleted` method + /// on the renderer is called with the health status of the frame. + renderer: *Renderer, + /// The target is presented via the provided renderer's API when completed. + target: *Target, +) !Self { + _ = opts; + + return .{ + .renderer = renderer, + .target = target, + }; +} + +/// Add a render pass to this frame with the provided attachments. +/// Returns a RenderPass which allows render steps to be added. +pub inline fn renderPass( + self: *const Self, + attachments: []const RenderPass.Options.Attachment, +) RenderPass { + _ = self; + return RenderPass.begin(.{ .attachments = attachments }); +} + +/// Complete this frame and present the target. +/// +/// If `sync` is true, this will block until the frame is presented. +/// +/// NOTE: For OpenGL, `sync` is ignored and we always block. +pub fn complete(self: *const Self, sync: bool) void { + _ = sync; + gl.finish(); + + // If there are any GL errors, consider the frame unhealthy. + const health: Health = if (gl.errors.getError()) .healthy else |_| .unhealthy; + + // If the frame is healthy, present it. + if (health == .healthy) { + self.renderer.api.present(self.target.*) catch |err| { + log.err("Failed to present render target: err={}", .{err}); + }; + } + + // Report the health to the renderer. + self.renderer.frameCompleted(health); +} diff --git a/src/renderer/opengl/ImageProgram.zig b/src/renderer/opengl/ImageProgram.zig deleted file mode 100644 index ff6794085..000000000 --- a/src/renderer/opengl/ImageProgram.zig +++ /dev/null @@ -1,134 +0,0 @@ -/// The OpenGL program for rendering terminal cells. -const ImageProgram = @This(); - -const std = @import("std"); -const gl = @import("opengl"); - -program: gl.Program, -vao: gl.VertexArray, -ebo: gl.Buffer, -vbo: gl.Buffer, - -pub const Input = extern struct { - /// vec2 grid_coord - grid_col: i32, - grid_row: i32, - - /// vec2 cell_offset - cell_offset_x: u32 = 0, - cell_offset_y: u32 = 0, - - /// vec4 source_rect - source_x: u32 = 0, - source_y: u32 = 0, - source_width: u32 = 0, - source_height: u32 = 0, - - /// vec2 dest_size - dest_width: u32 = 0, - dest_height: u32 = 0, -}; - -pub fn init() !ImageProgram { - // Load and compile our shaders. - const program = try gl.Program.createVF( - @embedFile("../shaders/image.v.glsl"), - @embedFile("../shaders/image.f.glsl"), - ); - errdefer program.destroy(); - - // Set our program uniforms - const pbind = try program.use(); - defer pbind.unbind(); - - // Set all of our texture indexes - try program.setUniform("image", 0); - - // Setup our VAO - const vao = try gl.VertexArray.create(); - errdefer vao.destroy(); - const vaobind = try vao.bind(); - defer vaobind.unbind(); - - // Element buffer (EBO) - const ebo = try gl.Buffer.create(); - errdefer ebo.destroy(); - var ebobind = try ebo.bind(.element_array); - defer ebobind.unbind(); - try ebobind.setData([6]u8{ - 0, 1, 3, // Top-left triangle - 1, 2, 3, // Bottom-right triangle - }, .static_draw); - - // Vertex buffer (VBO) - const vbo = try gl.Buffer.create(); - errdefer vbo.destroy(); - var vbobind = try vbo.bind(.array); - defer vbobind.unbind(); - var offset: usize = 0; - try vbobind.attributeAdvanced(0, 2, gl.c.GL_INT, false, @sizeOf(Input), offset); - offset += 2 * @sizeOf(i32); - try vbobind.attributeAdvanced(1, 2, gl.c.GL_UNSIGNED_INT, false, @sizeOf(Input), offset); - offset += 2 * @sizeOf(u32); - try vbobind.attributeAdvanced(2, 4, gl.c.GL_UNSIGNED_INT, false, @sizeOf(Input), offset); - offset += 4 * @sizeOf(u32); - try vbobind.attributeAdvanced(3, 2, gl.c.GL_UNSIGNED_INT, false, @sizeOf(Input), offset); - offset += 2 * @sizeOf(u32); - try vbobind.enableAttribArray(0); - try vbobind.enableAttribArray(1); - try vbobind.enableAttribArray(2); - try vbobind.enableAttribArray(3); - try vbobind.attributeDivisor(0, 1); - try vbobind.attributeDivisor(1, 1); - try vbobind.attributeDivisor(2, 1); - try vbobind.attributeDivisor(3, 1); - - return .{ - .program = program, - .vao = vao, - .ebo = ebo, - .vbo = vbo, - }; -} - -pub fn bind(self: ImageProgram) !Binding { - const program = try self.program.use(); - errdefer program.unbind(); - - const vao = try self.vao.bind(); - errdefer vao.unbind(); - - const ebo = try self.ebo.bind(.element_array); - errdefer ebo.unbind(); - - const vbo = try self.vbo.bind(.array); - errdefer vbo.unbind(); - - return .{ - .program = program, - .vao = vao, - .ebo = ebo, - .vbo = vbo, - }; -} - -pub fn deinit(self: ImageProgram) void { - self.vbo.destroy(); - self.ebo.destroy(); - self.vao.destroy(); - self.program.destroy(); -} - -pub const Binding = struct { - program: gl.Program.Binding, - vao: gl.VertexArray.Binding, - ebo: gl.Buffer.Binding, - vbo: gl.Buffer.Binding, - - pub fn unbind(self: Binding) void { - self.vbo.unbind(); - self.ebo.unbind(); - self.vao.unbind(); - self.program.unbind(); - } -}; diff --git a/src/renderer/opengl/Pipeline.zig b/src/renderer/opengl/Pipeline.zig new file mode 100644 index 000000000..127d689f5 --- /dev/null +++ b/src/renderer/opengl/Pipeline.zig @@ -0,0 +1,170 @@ +//! Wrapper for handling render pipelines. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +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. +pub const Options = struct { + /// GLSL source of the vertex function + vertex_fn: [:0]const u8, + /// GLSL source of the fragment function + fragment_fn: [:0]const u8, + + /// Vertex step function + step_fn: StepFunction = .per_vertex, + + /// Whether to enable blending. + blending_enabled: bool = true, + + pub const StepFunction = enum { + constant, + per_vertex, + per_instance, + }; + +}; + +program: gl.Program, + +fbo: gl.Framebuffer, + +vao: gl.VertexArray, + +stride: usize, + +blending_enabled: bool, + +pub fn init(comptime VertexAttributes: ?type, opts: Options) !Self { + // Load and compile our shaders. + const program = try gl.Program.createVF( + opts.vertex_fn, + opts.fragment_fn, + ); + errdefer program.destroy(); + + const pbind = try program.use(); + defer pbind.unbind(); + + const fbo = try gl.Framebuffer.create(); + errdefer fbo.destroy(); + const fbobind = try fbo.bind(.framebuffer); + defer fbobind.unbind(); + + const vao = try gl.VertexArray.create(); + errdefer vao.destroy(); + const vaobind = try vao.bind(); + defer vaobind.unbind(); + + if (VertexAttributes) |VA| try autoAttribute(VA, vaobind, opts.step_fn); + + return .{ + .program = program, + .fbo = fbo, + .vao = vao, + .stride = if (VertexAttributes) |VA| @sizeOf(VA) else 0, + .blending_enabled = opts.blending_enabled, + }; +} + +pub fn deinit(self: *const Self) void { + self.program.destroy(); +} + +fn autoAttribute( + T: type, + vaobind: gl.VertexArray.Binding, + step_fn: Options.StepFunction, +) !void { + const divisor: gl.c.GLuint = switch (step_fn) { + .per_vertex => 0, + .per_instance => 1, + .constant => std.math.maxInt(gl.c.GLuint), + }; + + inline for (@typeInfo(T).@"struct".fields, 0..) |field, i| { + try vaobind.enableAttribArray(i); + try vaobind.attributeBinding(i, 0); + try vaobind.bindingDivisor(i, divisor); + + const offset = @offsetOf(T, field.name); + + const FT = switch (@typeInfo(field.type)) { + .@"enum" => |e| e.tag_type, + else => field.type, + }; + + const size, const IT = switch (@typeInfo(FT)) { + .array => |a| .{ a.len, a.child }, + else => .{ 1, FT }, + }; + + try switch (IT) { + u8 => vaobind.attributeIFormat( + i, + size, + gl.c.GL_UNSIGNED_BYTE, + offset, + ), + u16 => vaobind.attributeIFormat( + i, + size, + gl.c.GL_UNSIGNED_SHORT, + offset, + ), + u32 => vaobind.attributeIFormat( + i, + size, + gl.c.GL_UNSIGNED_INT, + offset, + ), + i8 => vaobind.attributeIFormat( + i, + size, + gl.c.GL_BYTE, + offset, + ), + i16 => vaobind.attributeIFormat( + i, + size, + gl.c.GL_SHORT, + offset, + ), + i32 => vaobind.attributeIFormat( + i, + size, + gl.c.GL_INT, + offset, + ), + f16 => vaobind.attributeFormat( + i, + size, + gl.c.GL_HALF_FLOAT, + false, + offset, + ), + f32 => vaobind.attributeFormat( + i, + size, + gl.c.GL_FLOAT, + false, + offset, + ), + f64 => vaobind.attributeLFormat( + i, + size, + offset, + ), + else => unreachable, + }; + } +} diff --git a/src/renderer/opengl/RenderPass.zig b/src/renderer/opengl/RenderPass.zig new file mode 100644 index 000000000..0f5bd89e7 --- /dev/null +++ b/src/renderer/opengl/RenderPass.zig @@ -0,0 +1,141 @@ +//! Wrapper for handling render passes. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const builtin = @import("builtin"); +const gl = @import("opengl"); + +const OpenGL = @import("../OpenGL.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. +pub const Options = struct { + /// Color attachments for this render pass. + attachments: []const Attachment, + + /// Describes a color attachment. + pub const Attachment = struct { + target: union(enum) { + texture: Texture, + target: Target, + }, + clear_color: ?[4]f32 = null, + }; +}; + +/// Describes a step in a render pass. +pub const Step = struct { + pipeline: Pipeline, + uniforms: ?gl.Buffer = null, + buffers: []const ?gl.Buffer = &.{}, + textures: []const ?Texture = &.{}, + draw: Draw, + + /// Describes the draw call for this step. + pub const Draw = struct { + type: gl.Primitive, + vertex_count: usize, + instance_count: usize = 1, + }; +}; + +attachments: []const Options.Attachment, + +step_number: usize = 0, + +/// Begin a render pass. +pub fn begin( + opts: Options, +) Self { + return .{ + .attachments = opts.attachments, + }; +} + +/// Add a step to this render pass. +/// +/// TODO: Errors are silently ignored in this function, maybe they shouldn't be? +pub fn step(self: *Self, s: Step) void { + if (s.draw.instance_count == 0) return; + + const pbind = s.pipeline.program.use() catch return; + defer pbind.unbind(); + + const vaobind = s.pipeline.vao.bind() catch return; + defer vaobind.unbind(); + + const fbobind = switch (self.attachments[0].target) { + .target => |t| t.framebuffer.bind(.framebuffer) catch return, + .texture => |t| bind: { + const fbobind = s.pipeline.fbo.bind(.framebuffer) catch return; + fbobind.texture2D(.color0, t.target, t.texture, 0) catch { + fbobind.unbind(); + return; + }; + break :bind fbobind; + }, + }; + defer fbobind.unbind(); + + defer self.step_number += 1; + + // If we have a clear color and this is the + // first step in the pass, go ahead and clear. + if (self.step_number == 0) if (self.attachments[0].clear_color) |c| { + gl.clearColor(c[0], c[1], c[2], c[3]); + gl.clear(gl.c.GL_COLOR_BUFFER_BIT); + }; + + // Bind the uniform buffer we bind at index 1 to align with Metal. + if (s.uniforms) |ubo| { + _ = ubo.bindBase(.uniform, 1) catch return; + } + + // Bind relevant texture units. + for (s.textures, 0..) |t, i| if (t) |tex| { + gl.Texture.active(@intCast(i)) catch return; + _ = tex.texture.bind(tex.target) catch return; + }; + + // Bind 0th buffer as the vertex buffer, + // and bind the rest as storage buffers. + if (s.buffers.len > 0) { + if (s.buffers[0]) |vbo| vaobind.bindVertexBuffer( + 0, + vbo.id, + 0, + @intCast(s.pipeline.stride), + ) catch return; + + for (s.buffers[1..], 1..) |b, i| if (b) |buf| { + _ = buf.bindBase(.storage, @intCast(i)) catch return; + }; + } + + if (s.pipeline.blending_enabled) { + gl.enable(gl.c.GL_BLEND) catch return; + gl.blendFunc(gl.c.GL_ONE, gl.c.GL_ONE_MINUS_SRC_ALPHA) catch return; + } else { + gl.disable(gl.c.GL_BLEND) catch return; + } + + gl.drawArraysInstanced( + s.draw.type, + 0, + @intCast(s.draw.vertex_count), + @intCast(s.draw.instance_count), + ) catch return; +} + +/// Complete this render pass. +/// This struct can no longer be used after calling this. +pub fn complete(self: *const Self) void { + _ = self; + gl.flush(); +} diff --git a/src/renderer/opengl/Target.zig b/src/renderer/opengl/Target.zig new file mode 100644 index 000000000..1b3a13ed0 --- /dev/null +++ b/src/renderer/opengl/Target.zig @@ -0,0 +1,62 @@ +//! Represents a render target. +//! +//! In this case, an OpenGL renderbuffer-backed framebuffer. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const builtin = @import("builtin"); +const gl = @import("opengl"); + +const log = std.log.scoped(.opengl); + +/// Options for initializing a Target +pub const Options = struct { + /// Desired width + width: usize, + /// Desired height + height: usize, + + /// Internal format for the renderbuffer. + internal_format: gl.Texture.InternalFormat, +}; + +/// The underlying `gl.Framebuffer` instance. +framebuffer: gl.Framebuffer, + +/// The underlying `gl.Renderbuffer` instance. +renderbuffer: gl.Renderbuffer, + +/// Current width of this target. +width: usize, +/// Current height of this target. +height: usize, + +pub fn init(opts: Options) !Self { + const rbo = try gl.Renderbuffer.create(); + const bound_rbo = try rbo.bind(); + defer bound_rbo.unbind(); + try bound_rbo.storage( + opts.internal_format, + @intCast(opts.width), + @intCast(opts.height), + ); + + const fbo = try gl.Framebuffer.create(); + const bound_fbo = try fbo.bind(.framebuffer); + defer bound_fbo.unbind(); + try bound_fbo.renderbuffer(.color0, rbo); + + return .{ + .framebuffer = fbo, + .renderbuffer = rbo, + .width = opts.width, + .height = opts.height, + }; +} + +pub fn deinit(self: *Self) void { + self.framebuffer.destroy(); + self.renderbuffer.destroy(); +} diff --git a/src/renderer/opengl/Texture.zig b/src/renderer/opengl/Texture.zig new file mode 100644 index 000000000..84a1ae9bc --- /dev/null +++ b/src/renderer/opengl/Texture.zig @@ -0,0 +1,99 @@ +//! Wrapper for handling textures. +const Self = @This(); + +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const builtin = @import("builtin"); +const gl = @import("opengl"); + +const OpenGL = @import("../OpenGL.zig"); + +const log = std.log.scoped(.opengl); + +/// Options for initializing a texture. +pub const Options = struct { + format: gl.Texture.Format, + internal_format: gl.Texture.InternalFormat, + target: gl.Texture.Target, +}; + +texture: gl.Texture, + +/// The width of this texture. +width: usize, +/// The height of this texture. +height: usize, + +/// Format for this texture. +format: gl.Texture.Format, + +/// Target for this texture. +target: gl.Texture.Target, + +/// Initialize a texture +pub fn init( + opts: Options, + width: usize, + height: usize, + data: ?[]const u8, +) !Self { + const tex = try gl.Texture.create(); + errdefer tex.destroy(); + { + const texbind = try tex.bind(opts.target); + defer texbind.unbind(); + try texbind.parameter(.WrapS, gl.c.GL_CLAMP_TO_EDGE); + try texbind.parameter(.WrapT, gl.c.GL_CLAMP_TO_EDGE); + try texbind.parameter(.MinFilter, gl.c.GL_LINEAR); + try texbind.parameter(.MagFilter, gl.c.GL_LINEAR); + try texbind.image2D( + 0, + opts.internal_format, + @intCast(width), + @intCast(height), + 0, + opts.format, + .UnsignedByte, + if (data) |d| @ptrCast(d.ptr) else null, + ); + } + + return .{ + .texture = tex, + .width = width, + .height = height, + .format = opts.format, + .target = opts.target, + }; +} + +pub fn deinit(self: Self) void { + self.texture.destroy(); +} + +/// Replace a region of the texture with the provided data. +/// +/// Does NOT check the dimensions of the data to ensure correctness. +pub fn replaceRegion( + self: Self, + x: usize, + y: usize, + width: usize, + height: usize, + data: []const u8, +) !void { + const texbind = try self.texture.bind(self.target); + defer texbind.unbind(); + try texbind.subImage2D( + 0, + @intCast(x), + @intCast(y), + @intCast(width), + @intCast(height), + self.format, + .UnsignedByte, + data.ptr, + ); +} + diff --git a/src/renderer/opengl/buffer.zig b/src/renderer/opengl/buffer.zig new file mode 100644 index 000000000..48b6f410e --- /dev/null +++ b/src/renderer/opengl/buffer.zig @@ -0,0 +1,127 @@ +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const gl = @import("opengl"); + +const OpenGL = @import("../OpenGL.zig"); + +const log = std.log.scoped(.opengl); + +/// Options for initializing a buffer. +pub const Options = struct { + target: gl.Buffer.Target = .array, + usage: gl.Buffer.Usage = .dynamic_draw, +}; + +/// OpenGL data storage for a certain set of equal types. This is usually +/// used for vertex buffers, etc. This helpful wrapper makes it easy to +/// prealloc, shrink, grow, sync, buffers with OpenGL. +pub fn Buffer(comptime T: type) type { + return struct { + const Self = @This(); + + /// Underlying `gl.Buffer` instance. + buffer: gl.Buffer, + + /// Options this buffer was allocated with. + opts: Options, + + /// Current allocated length of the data store. + /// Note this is the number of `T`s, not the size in bytes. + len: usize, + + /// Initialize a buffer with the given length pre-allocated. + pub fn init(opts: Options, len: usize) !Self { + const buffer = try gl.Buffer.create(); + errdefer buffer.destroy(); + + const binding = try buffer.bind(opts.target); + defer binding.unbind(); + + try binding.setDataNullManual(len * @sizeOf(T), opts.usage); + + return .{ + .buffer = buffer, + .opts = opts, + .len = len, + }; + } + + /// Init the buffer filled with the given data. + pub fn initFill(opts: Options, data: []const T) !Self { + const buffer = try gl.Buffer.create(); + errdefer buffer.destroy(); + + const binding = try buffer.bind(opts.target); + defer binding.unbind(); + + try binding.setData(data, opts.usage); + + return .{ + .buffer = buffer, + .opts = opts, + .len = data.len * @sizeOf(T), + }; + } + + pub fn deinit(self: Self) void { + self.buffer.destroy(); + } + + /// Sync new contents to the buffer. The data is expected to be the + /// complete contents of the buffer. If the amount of data is larger + /// than the buffer length, the buffer will be reallocated. + /// + /// If the amount of data is smaller than the buffer length, the + /// remaining data in the buffer is left untouched. + pub fn sync(self: *Self, data: []const T) !void { + const binding = try self.buffer.bind(self.opts.target); + defer binding.unbind(); + + // If we need more space than our buffer has, we need to reallocate. + if (data.len > self.len) { + // Reallocate the buffer to hold double what we require. + self.len = data.len * 2; + try binding.setDataNullManual( + self.len * @sizeOf(T), + self.opts.usage, + ); + } + + // We can fit within the buffer so we can just replace bytes. + try binding.setSubData(0, data); + } + + /// Like Buffer.sync but takes data from an array of ArrayLists, + /// rather than a single array. Returns the number of items synced. + pub fn syncFromArrayLists(self: *Self, lists: []const std.ArrayListUnmanaged(T)) !usize { + const binding = try self.buffer.bind(self.opts.target); + defer binding.unbind(); + + var total_len: usize = 0; + for (lists) |list| { + total_len += list.items.len; + } + + // If we need more space than our buffer has, we need to reallocate. + if (total_len > self.len) { + // Reallocate the buffer to hold double what we require. + self.len = total_len * 2; + try binding.setDataNullManual( + self.len * @sizeOf(T), + self.opts.usage, + ); + } + + // We can fit within the buffer so we can just replace bytes. + var i: usize = 0; + + for (lists) |list| { + try binding.setSubData(i, list.items); + i += list.items.len * @sizeOf(T); + } + + return total_len; + } + }; +} diff --git a/src/renderer/opengl/cell.zig b/src/renderer/opengl/cell.zig new file mode 100644 index 000000000..abdbaa0e8 --- /dev/null +++ b/src/renderer/opengl/cell.zig @@ -0,0 +1,220 @@ +const std = @import("std"); +const assert = std.debug.assert; +const Allocator = std.mem.Allocator; + +const renderer = @import("../../renderer.zig"); +const terminal = @import("../../terminal/main.zig"); +const shaderpkg = @import("shaders.zig"); + +/// The possible cell content keys that exist. +pub const Key = enum { + bg, + text, + underline, + strikethrough, + overline, + + /// Returns the GPU vertex type for this key. + pub fn CellType(self: Key) type { + return switch (self) { + .bg => shaderpkg.CellBg, + + .text, + .underline, + .strikethrough, + .overline, + => shaderpkg.CellText, + }; + } +}; + +/// A pool of ArrayLists with methods for bulk operations. +fn ArrayListPool(comptime T: type) type { + return struct { + const Self = ArrayListPool(T); + const ArrayListT = std.ArrayListUnmanaged(T); + + // An array containing the lists that belong to this pool. + lists: []ArrayListT = &[_]ArrayListT{}, + + // The pool will be initialized with empty ArrayLists. + pub fn init(alloc: Allocator, list_count: usize, initial_capacity: usize) !Self { + const self: Self = .{ + .lists = try alloc.alloc(ArrayListT, list_count), + }; + + for (self.lists) |*list| { + list.* = try ArrayListT.initCapacity(alloc, initial_capacity); + } + + return self; + } + + pub fn deinit(self: *Self, alloc: Allocator) void { + for (self.lists) |*list| { + list.deinit(alloc); + } + alloc.free(self.lists); + } + + /// Clear all lists in the pool. + pub fn reset(self: *Self) void { + for (self.lists) |*list| { + list.clearRetainingCapacity(); + } + } + }; +} + +/// The contents of all the cells in the terminal. +/// +/// The goal of this data structure is to allow for efficient row-wise +/// clearing of data from the GPU buffers, to allow for row-wise dirty +/// tracking to eliminate the overhead of rebuilding the GPU buffers +/// each frame. +/// +/// Must be initialized by resizing before calling any operations. +pub const Contents = struct { + size: renderer.GridSize = .{ .rows = 0, .columns = 0 }, + + /// Flat array containing cell background colors for the terminal grid. + /// + /// Indexed as `bg_cells[row * size.columns + col]`. + /// + /// Prefer accessing with `Contents.bgCell(row, col).*` instead + /// of directly indexing in order to avoid integer size bugs. + bg_cells: []shaderpkg.CellBg = undefined, + + /// The ArrayListPool which holds all of the foreground cells. When sized + /// with Contents.resize the individual ArrayLists are given enough room + /// that they can hold a single row with #cols glyphs, underlines, and + /// strikethroughs; however, appendAssumeCapacity MUST NOT be used since + /// it is possible to exceed this with combining glyphs that add a glyph + /// but take up no column since they combine with the previous one, as + /// well as with fonts that perform multi-substitutions for glyphs, which + /// can result in a similar situation where multiple glyphs reside in the + /// same column. + /// + /// Allocations should nevertheless be exceedingly rare since hitting the + /// initial capacity of a list would require a row filled with underlined + /// struck through characters, at least one of which is a multi-glyph + /// composite. + /// + /// Rows are indexed as Contents.fg_rows[y + 1], because the first list in + /// the pool is reserved for the cursor, which must be the first item in + /// the buffer. + /// + /// Must be initialized by calling resize on the Contents struct before + /// calling any operations. + fg_rows: ArrayListPool(shaderpkg.CellText) = .{}, + + pub fn deinit(self: *Contents, alloc: Allocator) void { + alloc.free(self.bg_cells); + self.fg_rows.deinit(alloc); + } + + /// Resize the cell contents for the given grid size. This will + /// always invalidate the entire cell contents. + pub fn resize( + self: *Contents, + alloc: Allocator, + size: renderer.GridSize, + ) !void { + self.size = size; + + const cell_count = @as(usize, size.columns) * @as(usize, size.rows); + + const bg_cells = try alloc.alloc(shaderpkg.CellBg, cell_count); + errdefer alloc.free(bg_cells); + + @memset(bg_cells, .{ 0, 0, 0, 0 }); + + // The foreground lists can hold 3 types of items: + // - Glyphs + // - Underlines + // - Strikethroughs + // So we give them an initial capacity of size.columns * 3, which will + // avoid any further allocations in the vast majority of cases. Sadly + // we can not assume capacity though, since with combining glyphs that + // form a single grapheme, and multi-substitutions in fonts, the number + // of glyphs in a row is theoretically unlimited. + // + // We have size.rows + 1 lists because index 0 is used for a special + // list containing the cursor cell which needs to be first in the buffer. + var fg_rows = try ArrayListPool(shaderpkg.CellText).init(alloc, size.rows + 1, size.columns * 3); + errdefer fg_rows.deinit(alloc); + + alloc.free(self.bg_cells); + self.fg_rows.deinit(alloc); + + self.bg_cells = bg_cells; + self.fg_rows = fg_rows; + + // We don't need 3*cols worth of cells for the cursor list, so we can + // replace it with a smaller list. This is technically a tiny bit of + // extra work but resize is not a hot function so it's worth it to not + // waste the memory. + self.fg_rows.lists[0].deinit(alloc); + self.fg_rows.lists[0] = try std.ArrayListUnmanaged(shaderpkg.CellText).initCapacity(alloc, 1); + } + + /// Reset the cell contents to an empty state without resizing. + pub fn reset(self: *Contents) void { + @memset(self.bg_cells, .{ 0, 0, 0, 0 }); + self.fg_rows.reset(); + } + + /// Set the cursor value. If the value is null then the cursor is hidden. + pub fn setCursor(self: *Contents, v: ?shaderpkg.CellText) void { + self.fg_rows.lists[0].clearRetainingCapacity(); + + if (v) |cell| { + self.fg_rows.lists[0].appendAssumeCapacity(cell); + } + } + + /// Access a background cell. Prefer this function over direct indexing + /// of `bg_cells` in order to avoid integer size bugs causing overflows. + pub inline fn bgCell(self: *Contents, row: usize, col: usize) *shaderpkg.CellBg { + return &self.bg_cells[row * self.size.columns + col]; + } + + /// Add a cell to the appropriate list. Adding the same cell twice will + /// result in duplication in the vertex buffer. The caller should clear + /// the corresponding row with Contents.clear to remove old cells first. + pub fn add( + self: *Contents, + alloc: Allocator, + comptime key: Key, + cell: key.CellType(), + ) !void { + const y = cell.grid_pos[1]; + + assert(y < self.size.rows); + + switch (key) { + .bg => comptime unreachable, + + .text, + .underline, + .strikethrough, + .overline, + // We have a special list containing the cursor cell at the start + // of our fg row pool, so we need to add 1 to the y to get the + // correct index. + => try self.fg_rows.lists[y + 1].append(alloc, cell), + } + } + + /// Clear all of the cell contents for a given row. + pub fn clear(self: *Contents, y: terminal.size.CellCountInt) void { + assert(y < self.size.rows); + + @memset(self.bg_cells[@as(usize, y) * self.size.columns ..][0..self.size.columns], .{ 0, 0, 0, 0 }); + + // We have a special list containing the cursor cell at the start + // of our fg row pool, so we need to add 1 to the y to get the + // correct index. + self.fg_rows.lists[y + 1].clearRetainingCapacity(); + } +}; diff --git a/src/renderer/opengl/custom.zig b/src/renderer/opengl/custom.zig deleted file mode 100644 index 859277ce5..000000000 --- a/src/renderer/opengl/custom.zig +++ /dev/null @@ -1,310 +0,0 @@ -const std = @import("std"); -const Allocator = std.mem.Allocator; -const gl = @import("opengl"); -const Size = @import("../size.zig").Size; - -const log = std.log.scoped(.opengl_custom); - -/// The "INDEX" is the index into the global GL state and the -/// "BINDING" is the binding location in the shader. -const UNIFORM_INDEX: gl.c.GLuint = 0; -const UNIFORM_BINDING: gl.c.GLuint = 0; - -/// Global uniforms for custom shaders. -pub const Uniforms = extern struct { - resolution: [3]f32 align(16) = .{ 0, 0, 0 }, - time: f32 align(4) = 1, - time_delta: f32 align(4) = 1, - frame_rate: f32 align(4) = 1, - frame: i32 align(4) = 1, - channel_time: [4][4]f32 align(16) = [1][4]f32{.{ 0, 0, 0, 0 }} ** 4, - channel_resolution: [4][4]f32 align(16) = [1][4]f32{.{ 0, 0, 0, 0 }} ** 4, - mouse: [4]f32 align(16) = .{ 0, 0, 0, 0 }, - date: [4]f32 align(16) = .{ 0, 0, 0, 0 }, - sample_rate: f32 align(4) = 1, -}; - -/// The state associated with custom shaders. This should only be initialized -/// if there is at least one custom shader. -/// -/// To use this, the main terminal shader should render to the framebuffer -/// specified by "fbo". The resulting "fb_texture" will contain the color -/// attachment. This is then used as the iChannel0 input to the custom -/// shader. -pub const State = struct { - /// The uniform data - uniforms: Uniforms, - - /// The OpenGL buffers - fbo: gl.Framebuffer, - ubo: gl.Buffer, - vao: gl.VertexArray, - ebo: gl.Buffer, - fb_texture: gl.Texture, - - /// The set of programs for the custom shaders. - programs: []const Program, - - /// The first time a frame was drawn. This is used to update - /// the time uniform. - first_frame_time: std.time.Instant, - - /// The last time a frame was drawn. This is used to update - /// the time uniform. - last_frame_time: std.time.Instant, - - pub fn init( - alloc: Allocator, - srcs: []const [:0]const u8, - ) !State { - if (srcs.len == 0) return error.OneCustomShaderRequired; - - // Create our programs - var programs = std.ArrayList(Program).init(alloc); - defer programs.deinit(); - errdefer for (programs.items) |p| p.deinit(); - for (srcs) |src| { - try programs.append(try Program.init(src)); - } - - // Create the texture for the framebuffer - const fb_tex = try gl.Texture.create(); - errdefer fb_tex.destroy(); - { - const texbind = try fb_tex.bind(.@"2D"); - try texbind.parameter(.WrapS, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.WrapT, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.MinFilter, gl.c.GL_LINEAR); - try texbind.parameter(.MagFilter, gl.c.GL_LINEAR); - try texbind.image2D( - 0, - .rgb, - 1, - 1, - 0, - .rgb, - .UnsignedByte, - null, - ); - } - - // Create our framebuffer for rendering off screen. - // The shader prior to custom shaders should use this - // framebuffer. - const fbo = try gl.Framebuffer.create(); - errdefer fbo.destroy(); - const fbbind = try fbo.bind(.framebuffer); - defer fbbind.unbind(); - try fbbind.texture2D(.color0, .@"2D", fb_tex, 0); - const fbstatus = fbbind.checkStatus(); - if (fbstatus != .complete) { - log.warn( - "framebuffer is not complete state={}", - .{fbstatus}, - ); - return error.InvalidFramebuffer; - } - - // Create our uniform buffer that is shared across all - // custom shaders - const ubo = try gl.Buffer.create(); - errdefer ubo.destroy(); - { - var ubobind = try ubo.bind(.uniform); - defer ubobind.unbind(); - try ubobind.setDataNull(Uniforms, .static_draw); - } - - // Setup our VAO for the custom shader. - const vao = try gl.VertexArray.create(); - errdefer vao.destroy(); - const vaobind = try vao.bind(); - defer vaobind.unbind(); - - // Element buffer (EBO) - const ebo = try gl.Buffer.create(); - errdefer ebo.destroy(); - var ebobind = try ebo.bind(.element_array); - defer ebobind.unbind(); - try ebobind.setData([6]u8{ - 0, 1, 3, // Top-left triangle - 1, 2, 3, // Bottom-right triangle - }, .static_draw); - - return .{ - .programs = try programs.toOwnedSlice(), - .uniforms = .{}, - .fbo = fbo, - .ubo = ubo, - .vao = vao, - .ebo = ebo, - .fb_texture = fb_tex, - .first_frame_time = try std.time.Instant.now(), - .last_frame_time = try std.time.Instant.now(), - }; - } - - pub fn deinit(self: *const State, alloc: Allocator) void { - for (self.programs) |p| p.deinit(); - alloc.free(self.programs); - self.ubo.destroy(); - self.ebo.destroy(); - self.vao.destroy(); - self.fb_texture.destroy(); - self.fbo.destroy(); - } - - pub fn setScreenSize(self: *State, size: Size) !void { - // Update our uniforms - self.uniforms.resolution = .{ - @floatFromInt(size.screen.width), - @floatFromInt(size.screen.height), - 1, - }; - try self.syncUniforms(); - - // Update our texture - const texbind = try self.fb_texture.bind(.@"2D"); - try texbind.image2D( - 0, - .rgb, - @intCast(size.screen.width), - @intCast(size.screen.height), - 0, - .rgb, - .UnsignedByte, - null, - ); - } - - /// Call this prior to drawing a frame to update the time - /// and synchronize the uniforms. This synchronizes uniforms - /// so you should make changes to uniforms prior to calling - /// this. - pub fn newFrame(self: *State) !void { - // Update our frame time - const now = std.time.Instant.now() catch self.first_frame_time; - const since_ns: f32 = @floatFromInt(now.since(self.first_frame_time)); - const delta_ns: f32 = @floatFromInt(now.since(self.last_frame_time)); - self.uniforms.time = since_ns / std.time.ns_per_s; - self.uniforms.time_delta = delta_ns / std.time.ns_per_s; - self.last_frame_time = now; - - // Sync our uniform changes - try self.syncUniforms(); - } - - fn syncUniforms(self: *State) !void { - var ubobind = try self.ubo.bind(.uniform); - defer ubobind.unbind(); - try ubobind.setData(self.uniforms, .static_draw); - } - - /// Call this to bind all the necessary OpenGL resources for - /// all custom shaders. Each individual shader needs to be bound - /// one at a time too. - pub fn bind(self: *const State) !Binding { - // Move our uniform buffer into proper global index. Note that - // in theory we can do this globally once and never worry about - // it again. I don't think we're high-performance enough at all - // to worry about that and this makes it so you can just move - // around CustomProgram usage without worrying about clobbering - // the global state. - try self.ubo.bindBase(.uniform, UNIFORM_INDEX); - - // Bind our texture that is shared amongst all - try gl.Texture.active(gl.c.GL_TEXTURE0); - var texbind = try self.fb_texture.bind(.@"2D"); - errdefer texbind.unbind(); - - const vao = try self.vao.bind(); - errdefer vao.unbind(); - - const ebo = try self.ebo.bind(.element_array); - errdefer ebo.unbind(); - - return .{ - .vao = vao, - .ebo = ebo, - .fb_texture = texbind, - }; - } - - /// Copy the fbo's attached texture to the backbuffer. - pub fn copyFramebuffer(self: *State) !void { - const texbind = try self.fb_texture.bind(.@"2D"); - errdefer texbind.unbind(); - try texbind.copySubImage2D( - 0, - 0, - 0, - 0, - 0, - @intFromFloat(self.uniforms.resolution[0]), - @intFromFloat(self.uniforms.resolution[1]), - ); - } - - pub const Binding = struct { - vao: gl.VertexArray.Binding, - ebo: gl.Buffer.Binding, - fb_texture: gl.Texture.Binding, - - pub fn unbind(self: Binding) void { - self.ebo.unbind(); - self.vao.unbind(); - self.fb_texture.unbind(); - } - }; -}; - -/// A single OpenGL program (combined shaders) for custom shaders. -pub const Program = struct { - program: gl.Program, - - pub fn init(src: [:0]const u8) !Program { - const program = try gl.Program.createVF( - @embedFile("../shaders/custom.v.glsl"), - src, - ); - errdefer program.destroy(); - - // Map our uniform buffer to the global GL state - try program.uniformBlockBinding(UNIFORM_INDEX, UNIFORM_BINDING); - - return .{ .program = program }; - } - - pub fn deinit(self: *const Program) void { - self.program.destroy(); - } - - /// Bind the program for use. This should be called so that draw can - /// be called. - pub fn bind(self: *const Program) !Binding { - const program = try self.program.use(); - errdefer program.unbind(); - - return .{ - .program = program, - }; - } - - pub const Binding = struct { - program: gl.Program.Binding, - - pub fn unbind(self: Binding) void { - self.program.unbind(); - } - - pub fn draw(self: Binding) !void { - _ = self; - try gl.drawElementsInstanced( - gl.c.GL_TRIANGLES, - 6, - gl.c.GL_UNSIGNED_BYTE, - 1, - ); - } - }; -}; diff --git a/src/renderer/opengl/image.zig b/src/renderer/opengl/image.zig index 26cd90736..77779fb8a 100644 --- a/src/renderer/opengl/image.zig +++ b/src/renderer/opengl/image.zig @@ -3,6 +3,8 @@ const Allocator = std.mem.Allocator; const assert = std.debug.assert; const gl = @import("opengl"); const wuffs = @import("wuffs"); +const OpenGL = @import("../OpenGL.zig"); +const Texture = OpenGL.Texture; /// Represents a single image placement on the grid. A placement is a /// request to render an instance of an image. @@ -59,15 +61,15 @@ pub const Image = union(enum) { replace_rgba: Replace, /// The image is uploaded and ready to be used. - ready: gl.Texture, + ready: Texture, /// The image is uploaded but is scheduled to be unloaded. unload_pending: []u8, - unload_ready: gl.Texture, - unload_replace: struct { []u8, gl.Texture }, + unload_ready: Texture, + unload_replace: struct { []u8, Texture }, pub const Replace = struct { - texture: gl.Texture, + texture: Texture, pending: Pending, }; @@ -99,32 +101,32 @@ pub const Image = union(enum) { .replace_gray => |r| { alloc.free(r.pending.dataSlice(1)); - r.texture.destroy(); + r.texture.deinit(); }, .replace_gray_alpha => |r| { alloc.free(r.pending.dataSlice(2)); - r.texture.destroy(); + r.texture.deinit(); }, .replace_rgb => |r| { alloc.free(r.pending.dataSlice(3)); - r.texture.destroy(); + r.texture.deinit(); }, .replace_rgba => |r| { alloc.free(r.pending.dataSlice(4)); - r.texture.destroy(); + r.texture.deinit(); }, .unload_replace => |r| { alloc.free(r[0]); - r[1].destroy(); + r[1].deinit(); }, .ready, .unload_ready, - => |tex| tex.destroy(), + => |tex| tex.deinit(), } } @@ -168,7 +170,7 @@ pub const Image = union(enum) { // Get our existing texture. This switch statement will also handle // scenarios where there is no existing texture and we can modify // the self pointer directly. - const existing: gl.Texture = switch (self.*) { + const existing: Texture = switch (self.*) { // For pending, we can free the old data and become pending ourselves. .pending_gray => |p| { alloc.free(p.dataSlice(1)); @@ -356,7 +358,10 @@ pub const Image = union(enum) { pub fn upload( self: *Image, alloc: Allocator, + opengl: *const OpenGL, ) !void { + _ = opengl; + // Convert our data if we have to try self.convert(alloc); @@ -374,23 +379,15 @@ pub const Image = union(enum) { }; // Create our texture - const tex = try gl.Texture.create(); - errdefer tex.destroy(); - - const texbind = try tex.bind(.@"2D"); - try texbind.parameter(.WrapS, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.WrapT, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.MinFilter, gl.c.GL_LINEAR); - try texbind.parameter(.MagFilter, gl.c.GL_LINEAR); - try texbind.image2D( - 0, - formats.internal, + const tex = try Texture.init( + .{ + .format = formats.format, + .internal_format = formats.internal, + .target = .Rectangle, + }, @intCast(p.width), @intCast(p.height), - 0, - formats.format, - .UnsignedByte, - p.data, + p.data[0 .. p.width * p.height * self.depth()], ); // Uploaded. We can now clear our data and change our state. diff --git a/src/renderer/opengl/shaders.zig b/src/renderer/opengl/shaders.zig new file mode 100644 index 000000000..253ae8719 --- /dev/null +++ b/src/renderer/opengl/shaders.zig @@ -0,0 +1,310 @@ +const std = @import("std"); +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const math = @import("../../math.zig"); + +const Pipeline = @import("Pipeline.zig"); + +const log = std.log.scoped(.opengl); + +/// This contains the state for the shaders used by the Metal renderer. +pub const Shaders = struct { + /// Renders cell foreground elements (text, decorations). + cell_text_pipeline: Pipeline, + + /// The cell background shader is the shader used to render the + /// background of terminal cells. + cell_bg_pipeline: Pipeline, + + /// The image shader is the shader used to render images for things + /// like the Kitty image protocol. + image_pipeline: Pipeline, + + /// Custom shaders to run against the final drawable texture. This + /// can be used to apply a lot of effects. Each shader is run in sequence + /// against the output of the previous shader. + post_pipelines: []const Pipeline, + + /// Set to true when deinited, if you try to deinit a defunct set + /// of shaders it will just be ignored, to prevent double-free. + defunct: bool = false, + + /// Initialize our shader set. + /// + /// "post_shaders" is an optional list of postprocess shaders to run + /// against the final drawable texture. This is an array of shader source + /// code, not file paths. + pub fn init( + alloc: Allocator, + post_shaders: []const [:0]const u8, + ) !Shaders { + const cell_text_pipeline = try initCellTextPipeline(); + errdefer cell_text_pipeline.deinit(); + + const cell_bg_pipeline = try initCellBgPipeline(); + errdefer cell_bg_pipeline.deinit(); + + const image_pipeline = try initImagePipeline(); + errdefer image_pipeline.deinit(); + + const post_pipelines: []const Pipeline = initPostPipelines( + alloc, + post_shaders, + ) catch |err| err: { + // If an error happens while building postprocess shaders we + // want to just not use any postprocess shaders since we don't + // want to block Ghostty from working. + log.warn("error initializing postprocess shaders err={}", .{err}); + break :err &.{}; + }; + errdefer if (post_pipelines.len > 0) { + for (post_pipelines) |pipeline| pipeline.deinit(); + alloc.free(post_pipelines); + }; + + return .{ + .cell_text_pipeline = cell_text_pipeline, + .cell_bg_pipeline = cell_bg_pipeline, + .image_pipeline = image_pipeline, + .post_pipelines = post_pipelines, + }; + } + + pub fn deinit(self: *Shaders, alloc: Allocator) void { + if (self.defunct) return; + self.defunct = true; + + // Release our primary shaders + self.cell_text_pipeline.deinit(); + self.cell_bg_pipeline.deinit(); + self.image_pipeline.deinit(); + + // Release our postprocess shaders + if (self.post_pipelines.len > 0) { + for (self.post_pipelines) |pipeline| { + pipeline.deinit(); + } + alloc.free(self.post_pipelines); + } + } +}; + +/// Single parameter for the image shader. See shader for field details. +pub const Image = extern struct { + grid_pos: [2]f32 align(8), + cell_offset: [2]f32 align(8), + source_rect: [4]f32 align(16), + dest_size: [2]f32 align(8), +}; + +/// The uniforms that are passed to the terminal cell shader. +pub const Uniforms = extern struct { + /// The projection matrix for turning world coordinates to normalized. + /// This is calculated based on the size of the screen. + projection_matrix: math.Mat align(16), + + /// Size of a single cell in pixels, unscaled. + cell_size: [2]f32 align(8), + + /// Size of the grid in columns and rows. + grid_size: [2]u16 align(4), + + /// The padding around the terminal grid in pixels. In order: + /// top, right, bottom, left. + grid_padding: [4]f32 align(16), + + /// Bit mask defining which directions to + /// extend cell colors in to the padding. + /// Order, LSB first: left, right, up, down + padding_extend: PaddingExtend align(4), + + /// The minimum contrast ratio for text. The contrast ratio is calculated + /// according to the WCAG 2.0 spec. + min_contrast: f32 align(4), + + /// The cursor position and color. + cursor_pos: [2]u16 align(4), + cursor_color: [4]u8 align(4), + + /// The background color for the whole surface. + bg_color: [4]u8 align(4), + + /// Various booleans, in a packed struct for space efficiency. + bools: Bools align(4), + + const Bools = packed struct(u32) { + /// Whether the cursor is 2 cells wide. + cursor_wide: bool, + + /// Indicates that colors provided to the shader are already in + /// the P3 color space, so they don't need to be converted from + /// sRGB. + use_display_p3: bool, + + /// Indicates that the color attachments for the shaders have + /// an `*_srgb` pixel format, which means the shaders need to + /// output linear RGB colors rather than gamma encoded colors, + /// since blending will be performed in linear space and then + /// Metal itself will re-encode the colors for storage. + use_linear_blending: bool, + + /// Enables a weight correction step that makes text rendered + /// with linear alpha blending have a similar apparent weight + /// (thickness) to gamma-incorrect blending. + use_linear_correction: bool = false, + + _padding: u28 = 0, + }; + + const PaddingExtend = packed struct(u32) { + left: bool = false, + right: bool = false, + up: bool = false, + down: bool = false, + _padding: u28 = 0, + }; +}; + +/// The uniforms used for custom postprocess shaders. +pub const PostUniforms = extern struct { + resolution: [3]f32 align(16), + time: f32 align(4), + time_delta: f32 align(4), + frame_rate: f32 align(4), + frame: i32 align(4), + channel_time: [4][4]f32 align(16), + channel_resolution: [4][4]f32 align(16), + mouse: [4]f32 align(16), + date: [4]f32 align(16), + sample_rate: f32 align(4), +}; + +/// Initialize our custom shader pipelines. The shaders argument is a +/// set of shader source code, not file paths. +fn initPostPipelines( + alloc: Allocator, + shaders: []const [:0]const u8, +) ![]const Pipeline { + // If we have no shaders, do nothing. + if (shaders.len == 0) return &.{}; + + // Keeps track of how many shaders we successfully wrote. + var i: usize = 0; + + // Initialize our result set. If any error happens, we undo everything. + var pipelines = try alloc.alloc(Pipeline, shaders.len); + errdefer { + for (pipelines[0..i]) |pipeline| { + pipeline.deinit(); + } + alloc.free(pipelines); + } + + // Build each shader. Note we don't use "0.." to build our index + // because we need to keep track of our length to clean up above. + for (shaders) |source| { + pipelines[i] = try initPostPipeline(source); + i += 1; + } + + return pipelines; +} + +/// Initialize a single custom shader pipeline from shader source. +fn initPostPipeline(data: [:0]const u8) !Pipeline { + return try Pipeline.init(null, .{ + .vertex_fn = loadShaderCode("../shaders/glsl/full_screen.v.glsl"), + .fragment_fn = data, + }); +} + +/// This is a single parameter for the terminal cell shader. +pub const CellText = extern struct { + glyph_pos: [2]u32 align(8) = .{ 0, 0 }, + glyph_size: [2]u32 align(8) = .{ 0, 0 }, + bearings: [2]i16 align(4) = .{ 0, 0 }, + grid_pos: [2]u16 align(4), + color: [4]u8 align(4), + mode: Mode align(4), + constraint_width: u32 align(4) = 0, + + pub const Mode = enum(u32) { + fg = 1, + fg_constrained = 2, + fg_color = 3, + cursor = 4, + fg_powerline = 5, + }; + + // test { + // // Minimizing the size of this struct is important, + // // so we test it in order to be aware of any changes. + // try std.testing.expectEqual(32, @sizeOf(CellText)); + // } +}; + +/// Initialize the cell render pipeline. +fn initCellTextPipeline() !Pipeline { + return try Pipeline.init(CellText, .{ + .vertex_fn = loadShaderCode("../shaders/glsl/cell_text.v.glsl"), + .fragment_fn = loadShaderCode("../shaders/glsl/cell_text.f.glsl"), + .step_fn = .per_instance, + }); +} + +/// This is a single parameter for the cell bg shader. +pub const CellBg = [4]u8; + +/// Initialize the cell background render pipeline. +fn initCellBgPipeline() !Pipeline { + return try Pipeline.init(null, .{ + .vertex_fn = loadShaderCode("../shaders/glsl/full_screen.v.glsl"), + .fragment_fn = loadShaderCode("../shaders/glsl/cell_bg.f.glsl"), + }); +} + +/// Initialize the image render pipeline. +fn initImagePipeline() !Pipeline { + return try Pipeline.init(Image, .{ + .vertex_fn = loadShaderCode("../shaders/glsl/image.v.glsl"), + .fragment_fn = loadShaderCode("../shaders/glsl/image.f.glsl"), + .step_fn = .per_instance, + }); +} + +/// Load shader code from the target path, processing `#include` directives. +/// +/// Comptime only for now, this code is really sloppy and makes a bunch of +/// assumptions about things being well formed and file names not containing +/// quote marks. If we ever want to process `#include`s for custom shaders +/// then we need to write something better than this for it. +fn loadShaderCode(comptime path: []const u8) [:0]const u8 { + return comptime processIncludes(@embedFile(path), std.fs.path.dirname(path).?); +} + +/// Used by loadShaderCode +fn processIncludes(contents: [:0]const u8, basedir: []const u8) [:0]const u8 { + @setEvalBranchQuota(100_000); + var i: usize = 0; + while (i < contents.len) { + if (std.mem.startsWith(u8, contents[i..], "#include")) { + assert(std.mem.startsWith(u8, contents[i..], "#include \"")); + const start = i + "#include \"".len; + const end = std.mem.indexOfScalarPos(u8, contents, start, '"').?; + return std.fmt.comptimePrint( + "{s}{s}{s}", + .{ + contents[0..i], + @embedFile(basedir ++ .{std.fs.path.sep} ++ contents[start..end]), + processIncludes(contents[end + 1 ..], basedir), + }, + ); + } + if (std.mem.indexOfPos(u8, contents, i, "\n#")) |j| { + i = (j + 1); + } else { + break; + } + } + return contents; +} diff --git a/src/renderer/shaders/cell.f.glsl b/src/renderer/shaders/cell.f.glsl deleted file mode 100644 index f9c1ce2b1..000000000 --- a/src/renderer/shaders/cell.f.glsl +++ /dev/null @@ -1,53 +0,0 @@ -#version 330 core - -in vec2 glyph_tex_coords; -flat in uint mode; - -// The color for this cell. If this is a background pass this is the -// background color. Otherwise, this is the foreground color. -flat in vec4 color; - -// The position of the cells top-left corner. -flat in vec2 screen_cell_pos; - -// Position the fragment coordinate to the upper left -layout(origin_upper_left) in vec4 gl_FragCoord; - -// Must declare this output for some versions of OpenGL. -layout(location = 0) out vec4 out_FragColor; - -// Font texture -uniform sampler2D text; -uniform sampler2D text_color; - -// Dimensions of the cell -uniform vec2 cell_size; - -// See vertex shader -const uint MODE_BG = 1u; -const uint MODE_FG = 2u; -const uint MODE_FG_CONSTRAINED = 3u; -const uint MODE_FG_COLOR = 7u; -const uint MODE_FG_POWERLINE = 15u; - -void main() { - float a; - - switch (mode) { - case MODE_BG: - out_FragColor = color; - break; - - case MODE_FG: - case MODE_FG_CONSTRAINED: - case MODE_FG_POWERLINE: - a = texture(text, glyph_tex_coords).r; - vec3 premult = color.rgb * color.a; - out_FragColor = vec4(premult.rgb*a, a); - break; - - case MODE_FG_COLOR: - out_FragColor = texture(text_color, glyph_tex_coords); - break; - } -} diff --git a/src/renderer/shaders/cell.metal b/src/renderer/shaders/cell.metal index 5b3875221..039c600ed 100644 --- a/src/renderer/shaders/cell.metal +++ b/src/renderer/shaders/cell.metal @@ -249,20 +249,12 @@ vertex CellBgVertexOut cell_bg_vertex( fragment float4 cell_bg_fragment( CellBgVertexOut in [[stage_in]], - constant uchar4 *cells [[buffer(0)]], - constant Uniforms& uniforms [[buffer(1)]] + constant Uniforms& uniforms [[buffer(1)]], + constant uchar4 *cells [[buffer(2)]] ) { int2 grid_pos = int2(floor((in.position.xy - uniforms.grid_padding.wx) / uniforms.cell_size)); - float4 bg = float4(0.0); - // If we have any background transparency then we render bg-colored cells as - // fully transparent, since the background is handled by the layer bg color - // and we don't want to double up our bg color, but if our bg color is fully - // opaque then our layer is opaque and can't handle transparency, so we need - // to return the bg color directly instead. - if (uniforms.bg_color.a == 255) { - bg = in.bg_color; - } + float4 bg = in.bg_color; // Clamp x position, extends edge bg colors in to padding on sides. if (grid_pos.x < 0) { @@ -374,19 +366,23 @@ vertex CellTextVertexOut cell_text_vertex( // Convert the grid x, y into world space x, y by accounting for cell size float2 cell_pos = uniforms.cell_size * float2(in.grid_pos); - // Turn the cell position into a vertex point depending on the - // vertex ID. Since we use instanced drawing, we have 4 vertices - // for each corner of the cell. We can use vertex ID to determine - // which one we're looking at. Using this, we can use 1 or 0 to keep - // or discard the value for the vertex. + // We use a triangle strip with 4 vertices to render quads, + // so we determine which corner of the cell this vertex is in + // based on the vertex ID. // - // 0 = top-right - // 1 = bot-right - // 2 = bot-left - // 3 = top-left + // 0 --> 1 + // | .'| + // | / | + // | L | + // 2 --> 3 + // + // 0 = top-left (0, 0) + // 1 = top-right (1, 0) + // 2 = bot-left (0, 1) + // 3 = bot-right (1, 1) float2 corner; - corner.x = (vid == 0 || vid == 1) ? 1.0f : 0.0f; - corner.y = (vid == 0 || vid == 3) ? 0.0f : 1.0f; + corner.x = float(vid == 1 || vid == 3); + corner.y = float(vid == 2 || vid == 3); CellTextVertexOut out; out.mode = in.mode; @@ -502,7 +498,7 @@ fragment float4 cell_text_fragment( CellTextVertexOut in [[stage_in]], texture2d textureGrayscale [[texture(0)]], texture2d textureColor [[texture(1)]], - constant Uniforms& uniforms [[buffer(2)]] + constant Uniforms& uniforms [[buffer(1)]] ) { constexpr sampler textureSampler( coord::pixel, @@ -621,19 +617,23 @@ vertex ImageVertexOut image_vertex( texture2d image [[texture(0)]], constant Uniforms& uniforms [[buffer(1)]] ) { - // Turn the image position into a vertex point depending on the - // vertex ID. Since we use instanced drawing, we have 4 vertices - // for each corner of the cell. We can use vertex ID to determine - // which one we're looking at. Using this, we can use 1 or 0 to keep - // or discard the value for the vertex. + // We use a triangle strip with 4 vertices to render quads, + // so we determine which corner of the cell this vertex is in + // based on the vertex ID. // - // 0 = top-right - // 1 = bot-right - // 2 = bot-left - // 3 = top-left + // 0 --> 1 + // | .'| + // | / | + // | L | + // 2 --> 3 + // + // 0 = top-left (0, 0) + // 1 = top-right (1, 0) + // 2 = bot-left (0, 1) + // 3 = bot-right (1, 1) float2 corner; - corner.x = (vid == 0 || vid == 1) ? 1.0f : 0.0f; - corner.y = (vid == 0 || vid == 3) ? 0.0f : 1.0f; + corner.x = float(vid == 1 || vid == 3); + corner.y = float(vid == 2 || vid == 3); // The texture coordinates start at our source x/y // and add the width/height depending on the corner. diff --git a/src/renderer/shaders/cell.v.glsl b/src/renderer/shaders/cell.v.glsl deleted file mode 100644 index f37e69adc..000000000 --- a/src/renderer/shaders/cell.v.glsl +++ /dev/null @@ -1,258 +0,0 @@ -#version 330 core - -// These are the possible modes that "mode" can be set to. This is -// used to multiplex multiple render modes into a single shader. -// -// NOTE: this must be kept in sync with the fragment shader -const uint MODE_BG = 1u; -const uint MODE_FG = 2u; -const uint MODE_FG_CONSTRAINED = 3u; -const uint MODE_FG_COLOR = 7u; -const uint MODE_FG_POWERLINE = 15u; - -// The grid coordinates (x, y) where x < columns and y < rows -layout (location = 0) in vec2 grid_coord; - -// Position of the glyph in the texture. -layout (location = 1) in vec2 glyph_pos; - -// Width/height of the glyph -layout (location = 2) in vec2 glyph_size; - -// Offset of the top-left corner of the glyph when rendered in a rect. -layout (location = 3) in vec2 glyph_offset; - -// The color for this cell in RGBA (0 to 1.0). Background or foreground -// depends on mode. -layout (location = 4) in vec4 color_in; - -// Only set for MODE_FG, this is the background color of the FG text. -// This is used to detect minimal contrast for the text. -layout (location = 5) in vec4 bg_color_in; - -// The mode of this shader. The mode determines what fields are used, -// what the output will be, etc. This shader is capable of executing in -// multiple "modes" so that we can share some logic and so that we can draw -// the entire terminal grid in a single GPU pass. -layout (location = 6) in uint mode_in; - -// The width in cells of this item. -layout (location = 7) in uint grid_width; - -// The background or foreground color for the fragment, depending on -// whether this is a background or foreground pass. -flat out vec4 color; - -// The x/y coordinate for the glyph representing the font. -out vec2 glyph_tex_coords; - -// The position of the cell top-left corner in screen cords. z and w -// are width and height. -flat out vec2 screen_cell_pos; - -// Pass the mode forward to the fragment shader. -flat out uint mode; - -uniform sampler2D text; -uniform sampler2D text_color; -uniform vec2 cell_size; -uniform vec2 grid_size; -uniform vec4 grid_padding; -uniform bool padding_vertical_top; -uniform bool padding_vertical_bottom; -uniform mat4 projection; -uniform float min_contrast; - -/******************************************************************** - * Modes - * - *------------------------------------------------------------------- - * MODE_BG - * - * In MODE_BG, this shader renders only the background color for the - * cell. This is a simple mode where we generate a simple rectangle - * made up of 4 vertices and then it is filled. In this mode, the output - * "color" is the fill color for the bg. - * - *------------------------------------------------------------------- - * MODE_FG - * - * In MODE_FG, the shader renders the glyph onto this cell and utilizes - * the glyph texture "text". In this mode, the output "color" is the - * fg color to use for the glyph. - * - */ - -//------------------------------------------------------------------- -// Color Functions -//------------------------------------------------------------------- - -// https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef -float luminance_component(float c) { - if (c <= 0.03928) { - return c / 12.92; - } else { - return pow((c + 0.055) / 1.055, 2.4); - } -} - -float relative_luminance(vec3 color) { - vec3 color_adjusted = vec3( - luminance_component(color.r), - luminance_component(color.g), - luminance_component(color.b) - ); - - vec3 weights = vec3(0.2126, 0.7152, 0.0722); - return dot(color_adjusted, weights); -} - -// https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef -float contrast_ratio(vec3 color1, vec3 color2) { - float luminance1 = relative_luminance(color1) + 0.05; - float luminance2 = relative_luminance(color2) + 0.05; - return max(luminance1, luminance2) / min(luminance1, luminance2); -} - -// Return the fg if the contrast ratio is greater than min, otherwise -// return a color that satisfies the contrast ratio. Currently, the color -// is always white or black, whichever has the highest contrast ratio. -vec4 contrasted_color(float min_ratio, vec4 fg, vec4 bg) { - vec3 fg_premult = fg.rgb * fg.a; - vec3 bg_premult = bg.rgb * bg.a; - float ratio = contrast_ratio(fg_premult, bg_premult); - if (ratio < min_ratio) { - float white_ratio = contrast_ratio(vec3(1.0, 1.0, 1.0), bg_premult); - float black_ratio = contrast_ratio(vec3(0.0, 0.0, 0.0), bg_premult); - if (white_ratio > black_ratio) { - return vec4(1.0, 1.0, 1.0, fg.a); - } else { - return vec4(0.0, 0.0, 0.0, fg.a); - } - } - - return fg; -} - -//------------------------------------------------------------------- -// Main -//------------------------------------------------------------------- - -void main() { - // We always forward our mode unmasked because the fragment - // shader doesn't use any of the masks. - mode = mode_in; - - // Top-left cell coordinates converted to world space - // Example: (1,0) with a 30 wide cell is converted to (30,0) - vec2 cell_pos = cell_size * grid_coord; - - // Our Z value. For now we just use grid_z directly but we pull it - // out here so the variable name is more uniform to our cell_pos and - // in case we want to do any other math later. - float cell_z = 0.0; - - // Turn the cell position into a vertex point depending on the - // gl_VertexID. Since we use instanced drawing, we have 4 vertices - // for each corner of the cell. We can use gl_VertexID to determine - // which one we're looking at. Using this, we can use 1 or 0 to keep - // or discard the value for the vertex. - // - // 0 = top-right - // 1 = bot-right - // 2 = bot-left - // 3 = top-left - vec2 position; - position.x = (gl_VertexID == 0 || gl_VertexID == 1) ? 1. : 0.; - position.y = (gl_VertexID == 0 || gl_VertexID == 3) ? 0. : 1.; - - // Scaled for wide chars - vec2 cell_size_scaled = cell_size; - cell_size_scaled.x = cell_size_scaled.x * grid_width; - - switch (mode) { - case MODE_BG: - // If we're at the edge of the grid, we add our padding to the background - // to extend it. Note: grid_padding is top/right/bottom/left. - if (grid_coord.y == 0 && padding_vertical_top) { - cell_pos.y -= grid_padding.r; - cell_size_scaled.y += grid_padding.r; - } else if (grid_coord.y == grid_size.y - 1 && padding_vertical_bottom) { - cell_size_scaled.y += grid_padding.b; - } - if (grid_coord.x == 0) { - cell_pos.x -= grid_padding.a; - cell_size_scaled.x += grid_padding.a; - } else if (grid_coord.x == grid_size.x - 1) { - cell_size_scaled.x += grid_padding.g; - } - - // Calculate the final position of our cell in world space. - // We have to add our cell size since our vertices are offset - // one cell up and to the left. (Do the math to verify yourself) - cell_pos = cell_pos + cell_size_scaled * position; - - gl_Position = projection * vec4(cell_pos, cell_z, 1.0); - color = color_in / 255.0; - break; - - case MODE_FG: - case MODE_FG_CONSTRAINED: - case MODE_FG_COLOR: - case MODE_FG_POWERLINE: - vec2 glyph_offset_calc = glyph_offset; - - // The glyph_offset.y is the y bearing, a y value that when added - // to the baseline is the offset (+y is up). Our grid goes down. - // So we flip it with `cell_size.y - glyph_offset.y`. - glyph_offset_calc.y = cell_size_scaled.y - glyph_offset_calc.y; - - // If this is a constrained mode, we need to constrain it! - vec2 glyph_size_calc = glyph_size; - if (mode == MODE_FG_CONSTRAINED) { - if (glyph_size.x > cell_size_scaled.x) { - float new_y = glyph_size.y * (cell_size_scaled.x / glyph_size.x); - glyph_offset_calc.y = glyph_offset_calc.y + ((glyph_size.y - new_y) / 2); - glyph_size_calc.y = new_y; - glyph_size_calc.x = cell_size_scaled.x; - } - } - - // Calculate the final position of the cell. - cell_pos = cell_pos + (glyph_size_calc * position) + glyph_offset_calc; - gl_Position = projection * vec4(cell_pos, cell_z, 1.0); - - // We need to convert our texture position and size to normalized - // device coordinates (0 to 1.0) by dividing by the size of the texture. - ivec2 text_size; - switch(mode) { - case MODE_FG_CONSTRAINED: - case MODE_FG_POWERLINE: - case MODE_FG: - text_size = textureSize(text, 0); - break; - - case MODE_FG_COLOR: - text_size = textureSize(text_color, 0); - break; - } - vec2 glyph_tex_pos = glyph_pos / text_size; - vec2 glyph_tex_size = glyph_size / text_size; - glyph_tex_coords = glyph_tex_pos + glyph_tex_size * position; - - // If we have a minimum contrast, we need to check if we need to - // change the color of the text to ensure it has enough contrast - // with the background. - // We only apply this adjustment to "normal" text with MODE_FG, - // since we want color glyphs to appear in their original color - // and Powerline glyphs to be unaffected (else parts of the line would - // have different colors as some parts are displayed via background colors). - vec4 color_final = color_in / 255.0; - if (min_contrast > 1.0 && mode == MODE_FG) { - vec4 bg_color = bg_color_in / 255.0; - color_final = contrasted_color(min_contrast, color_final, bg_color); - } - color = color_final; - break; - } -} diff --git a/src/renderer/shaders/custom.v.glsl b/src/renderer/shaders/custom.v.glsl deleted file mode 100644 index 653e1800e..000000000 --- a/src/renderer/shaders/custom.v.glsl +++ /dev/null @@ -1,8 +0,0 @@ -#version 330 core - -void main(){ - vec2 position; - position.x = (gl_VertexID == 0 || gl_VertexID == 1) ? -1. : 1.; - position.y = (gl_VertexID == 0 || gl_VertexID == 3) ? 1. : -1.; - gl_Position = vec4(position.xy, 0.0f, 1.0f); -} diff --git a/src/renderer/shaders/glsl/cell_bg.f.glsl b/src/renderer/shaders/glsl/cell_bg.f.glsl new file mode 100644 index 000000000..cfd598f95 --- /dev/null +++ b/src/renderer/shaders/glsl/cell_bg.f.glsl @@ -0,0 +1,61 @@ +#include "common.glsl" + +// Position the origin to the upper left +layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; + +// Must declare this output for some versions of OpenGL. +layout(location = 0) out vec4 out_FragColor; + +layout(binding = 1, std430) readonly buffer bg_cells { + uint cells[]; +}; + +vec4 cell_bg() { + uvec2 grid_size = unpack2u16(grid_size_packed_2u16); + ivec2 grid_pos = ivec2(floor((gl_FragCoord.xy - grid_padding.wx) / cell_size)); + bool use_linear_blending = (bools & USE_LINEAR_BLENDING) != 0; + + vec4 bg = load_color(unpack4u8(bg_color_packed_4u8), use_linear_blending); + + // Clamp x position, extends edge bg colors in to padding on sides. + if (grid_pos.x < 0) { + if ((padding_extend & EXTEND_LEFT) != 0) { + grid_pos.x = 0; + } else { + return bg; + } + } else if (grid_pos.x > grid_size.x - 1) { + if ((padding_extend & EXTEND_RIGHT) != 0) { + grid_pos.x = int(grid_size.x) - 1; + } else { + return bg; + } + } + + // Clamp y position if we should extend, otherwise discard if out of bounds. + if (grid_pos.y < 0) { + if ((padding_extend & EXTEND_UP) != 0) { + grid_pos.y = 0; + } else { + return bg; + } + } else if (grid_pos.y > grid_size.y - 1) { + if ((padding_extend & EXTEND_DOWN) != 0) { + grid_pos.y = int(grid_size.y) - 1; + } else { + return bg; + } + } + + // Load the color for the cell. + vec4 cell_color = load_color( + unpack4u8(cells[grid_pos.y * grid_size.x + grid_pos.x]), + use_linear_blending + ); + + return cell_color; +} + +void main() { + out_FragColor = cell_bg(); +} diff --git a/src/renderer/shaders/glsl/cell_text.f.glsl b/src/renderer/shaders/glsl/cell_text.f.glsl new file mode 100644 index 000000000..fda552424 --- /dev/null +++ b/src/renderer/shaders/glsl/cell_text.f.glsl @@ -0,0 +1,109 @@ +#include "common.glsl" + +layout(binding = 0) uniform sampler2DRect atlas_grayscale; +layout(binding = 1) uniform sampler2DRect atlas_color; + +in CellTextVertexOut { + flat uint mode; + flat vec4 color; + flat vec4 bg_color; + vec2 tex_coord; +} in_data; + +// These are the possible modes that "mode" can be set to. This is +// used to multiplex multiple render modes into a single shader. +// +// NOTE: this must be kept in sync with the fragment shader +const uint MODE_TEXT = 1u; +const uint MODE_TEXT_CONSTRAINED = 2u; +const uint MODE_TEXT_COLOR = 3u; +const uint MODE_TEXT_CURSOR = 4u; +const uint MODE_TEXT_POWERLINE = 5u; + +// Must declare this output for some versions of OpenGL. +layout(location = 0) out vec4 out_FragColor; + +void main() { + bool use_linear_blending = (bools & USE_LINEAR_BLENDING) != 0; + bool use_linear_correction = (bools & USE_LINEAR_CORRECTION) != 0; + + switch (in_data.mode) { + default: + case MODE_TEXT_CURSOR: + case MODE_TEXT_CONSTRAINED: + case MODE_TEXT_POWERLINE: + case MODE_TEXT: + { + // Our input color is always linear. + vec4 color = in_data.color; + + // If we're not doing linear blending, then we need to + // re-apply the gamma encoding to our color manually. + // + // Since the alpha is premultiplied, we need to divide + // it out before unlinearizing and re-multiply it after. + if (!use_linear_blending) { + color.rgb /= vec3(color.a); + color = unlinearize(color); + color.rgb *= vec3(color.a); + } + + // Fetch our alpha mask for this pixel. + float a = texture(atlas_grayscale, in_data.tex_coord).r; + + // Linear blending weight correction corrects the alpha value to + // produce blending results which match gamma-incorrect blending. + if (use_linear_correction) { + // Short explanation of how this works: + // + // We get the luminances of the foreground and background colors, + // and then unlinearize them and perform blending on them. This + // gives us our desired luminance, which we derive our new alpha + // value from by mapping the range [bg_l, fg_l] to [0, 1], since + // our final blend will be a linear interpolation from bg to fg. + // + // This yields virtually identical results for grayscale blending, + // and very similar but non-identical results for color blending. + vec4 bg = in_data.bg_color; + float fg_l = luminance(color.rgb); + float bg_l = luminance(bg.rgb); + // To avoid numbers going haywire, we don't apply correction + // when the bg and fg luminances are within 0.001 of each other. + if (abs(fg_l - bg_l) > 0.001) { + float blend_l = linearize(unlinearize(fg_l) * a + unlinearize(bg_l) * (1.0 - a)); + a = clamp((blend_l - bg_l) / (fg_l - bg_l), 0.0, 1.0); + } + } + + // Multiply our whole color by the alpha mask. + // Since we use premultiplied alpha, this is + // the correct way to apply the mask. + color *= a; + + out_FragColor = color; + return; + } + + case MODE_TEXT_COLOR: + { + // For now, we assume that color glyphs + // are already premultiplied sRGB colors. + vec4 color = texture(atlas_color, in_data.tex_coord); + + // If we aren't doing linear blending, we can return this right away. + if (!use_linear_blending) { + out_FragColor = color; + return; + } + + // Otherwise we need to linearize the color. Since the alpha is + // premultiplied, we need to divide it out before linearizing. + color.rgb /= vec3(color.a); + color = linearize(color); + color.rgb *= vec3(color.a); + + out_FragColor = color; + return; + } + } +} diff --git a/src/renderer/shaders/glsl/cell_text.v.glsl b/src/renderer/shaders/glsl/cell_text.v.glsl new file mode 100644 index 000000000..76ede1082 --- /dev/null +++ b/src/renderer/shaders/glsl/cell_text.v.glsl @@ -0,0 +1,162 @@ +#include "common.glsl" + +// The position of the glyph in the texture (x, y) +layout(location = 0) in uvec2 glyph_pos; + +// The size of the glyph in the texture (w, h) +layout(location = 1) in uvec2 glyph_size; + +// The left and top bearings for the glyph (x, y) +layout(location = 2) in ivec2 bearings; + +// The grid coordinates (x, y) where x < columns and y < rows +layout(location = 3) in uvec2 grid_pos; + +// The color of the rendered text glyph. +layout(location = 4) in uvec4 color; + +// The mode for this cell. +layout(location = 5) in uint mode; + +// The width to constrain the glyph to, in cells, or 0 for no constraint. +layout(location = 6) in uint constraint_width; + +// These are the possible modes that "mode" can be set to. This is +// used to multiplex multiple render modes into a single shader. +const uint MODE_TEXT = 1u; +const uint MODE_TEXT_CONSTRAINED = 2u; +const uint MODE_TEXT_COLOR = 3u; +const uint MODE_TEXT_CURSOR = 4u; +const uint MODE_TEXT_POWERLINE = 5u; + +out CellTextVertexOut { + flat uint mode; + flat vec4 color; + flat vec4 bg_color; + vec2 tex_coord; +} out_data; + +layout(binding = 1, std430) readonly buffer bg_cells { + uint bg_colors[]; +}; + +void main() { + uvec2 grid_size = unpack2u16(grid_size_packed_2u16); + uvec2 cursor_pos = unpack2u16(cursor_pos_packed_2u16); + bool cursor_wide = (bools & CURSOR_WIDE) != 0; + bool use_linear_blending = (bools & USE_LINEAR_BLENDING) != 0; + + // Convert the grid x, y into world space x, y by accounting for cell size + vec2 cell_pos = cell_size * vec2(grid_pos); + + int vid = gl_VertexID; + + // We use a triangle strip with 4 vertices to render quads, + // so we determine which corner of the cell this vertex is in + // based on the vertex ID. + // + // 0 --> 1 + // | .'| + // | / | + // | L | + // 2 --> 3 + // + // 0 = top-left (0, 0) + // 1 = top-right (1, 0) + // 2 = bot-left (0, 1) + // 3 = bot-right (1, 1) + vec2 corner; + corner.x = float(vid == 1 || vid == 3); + corner.y = float(vid == 2 || vid == 3); + + out_data.mode = mode; + + // === Grid Cell === + // +X + // 0,0--...-> + // | + // . offset.x = bearings.x + // +Y. .|. + // . | | + // | cell_pos -> +-------+ _. + // v ._| |_. _|- offset.y = cell_size.y - bearings.y + // | | .###. | | + // | | #...# | | + // glyph_size.y -+ | ##### | | + // | | #.... | +- bearings.y + // |_| .#### | | + // | |_| + // +-------+ + // |_._| + // | + // glyph_size.x + // + // In order to get the top left of the glyph, we compute an offset based on + // the bearings. The Y bearing is the distance from the bottom of the cell + // to the top of the glyph, so we subtract it from the cell height to get + // the y offset. The X bearing is the distance from the left of the cell + // to the left of the glyph, so it works as the x offset directly. + + vec2 size = vec2(glyph_size); + vec2 offset = vec2(bearings); + + offset.y = cell_size.y - offset.y; + + // If we're constrained then we need to scale the glyph. + if (mode == MODE_TEXT_CONSTRAINED) { + float max_width = cell_size.x * constraint_width; + // If this glyph is wider than the constraint width, + // fit it to the width and remove its horizontal offset. + if (size.x > max_width) { + float new_y = size.y * (max_width / size.x); + offset.y += (size.y - new_y) / 2.0; + offset.x = 0.0; + size.y = new_y; + size.x = max_width; + } else if (max_width - size.x > offset.x) { + // However, if it does fit in the constraint width, make + // sure the offset is small enough to not push it over the + // right edge of the constraint width. + offset.x = max_width - size.x; + } + } + + // Calculate the final position of the cell which uses our glyph size + // and glyph offset to create the correct bounding box for the glyph. + cell_pos = cell_pos + size * corner + offset; + gl_Position = projection_matrix * vec4(cell_pos.x, cell_pos.y, 0.0f, 1.0f); + + // Calculate the texture coordinate in pixels. This is NOT normalized + // (between 0.0 and 1.0), and does not need to be, since the texture will + // be sampled with pixel coordinate mode. + out_data.tex_coord = vec2(glyph_pos) + vec2(glyph_size) * corner; + + // Get our color. We always fetch a linearized version to + // make it easier to handle minimum contrast calculations. + out_data.color = load_color(color, true); + // Get the BG color + out_data.bg_color = load_color( + unpack4u8(bg_colors[grid_pos.y * grid_size.x + grid_pos.x]), + true + ); + + // If we have a minimum contrast, we need to check if we need to + // change the color of the text to ensure it has enough contrast + // with the background. + // We only apply this adjustment to "normal" text with MODE_TEXT, + // since we want color glyphs to appear in their original color + // and Powerline glyphs to be unaffected (else parts of the line would + // have different colors as some parts are displayed via background colors). + if (min_contrast > 1.0f && mode == MODE_TEXT) { + // Ensure our minimum contrast + out_data.color = contrasted_color(min_contrast, out_data.color, out_data.bg_color); + } + + // Check if current position is under cursor (including wide cursor) + bool is_cursor_pos = ((grid_pos.x == cursor_pos.x) || (cursor_wide && (grid_pos.x == (cursor_pos.x + 1)))) && (grid_pos.y == cursor_pos.y); + + // If this cell is the cursor cell, then we need to change the color. + if (mode != MODE_TEXT_CURSOR && is_cursor_pos) { + out_data.color = load_color(unpack4u8(cursor_color_packed_4u8), use_linear_blending); + } +} diff --git a/src/renderer/shaders/glsl/common.glsl b/src/renderer/shaders/glsl/common.glsl new file mode 100644 index 000000000..0450d0c06 --- /dev/null +++ b/src/renderer/shaders/glsl/common.glsl @@ -0,0 +1,155 @@ +#version 430 core + +// These are common definitions to be shared across shaders, the first +// line of any shader that needs these should be `#include "common.glsl"`. +// +// Included in this file are: +// - The interface block for the global uniforms. +// - Functions for unpacking values. +// - Functions for working with colors. + +//----------------------------------------------------------------------------// +// Global Uniforms +//----------------------------------------------------------------------------// +layout(binding = 1, std140) uniform Globals { + uniform mat4 projection_matrix; + uniform vec2 cell_size; + uniform uint grid_size_packed_2u16; + uniform vec4 grid_padding; + uniform uint padding_extend; + uniform float min_contrast; + uniform uint cursor_pos_packed_2u16; + uniform uint cursor_color_packed_4u8; + uniform uint bg_color_packed_4u8; + uniform uint bools; +}; + +// Bools +const uint CURSOR_WIDE = 1u; +const uint USE_DISPLAY_P3 = 2u; +const uint USE_LINEAR_BLENDING = 4u; +const uint USE_LINEAR_CORRECTION = 8u; + +// Padding extend enum +const uint EXTEND_LEFT = 1u; +const uint EXTEND_RIGHT = 2u; +const uint EXTEND_UP = 4u; +const uint EXTEND_DOWN = 8u; + +//----------------------------------------------------------------------------// +// Functions for Unpacking Values +//----------------------------------------------------------------------------// +// NOTE: These unpack functions assume little-endian. +// If this ever becomes a problem... oh dear! + +uvec4 unpack4u8(uint packed_value) { + return uvec4( + uint(packed_value >> 0) & uint(0xFF), + uint(packed_value >> 8) & uint(0xFF), + uint(packed_value >> 16) & uint(0xFF), + uint(packed_value >> 24) & uint(0xFF) + ); +} + +uvec2 unpack2u16(uint packed_value) { + return uvec2( + uint(packed_value >> 0) & uint(0xFFFF), + uint(packed_value >> 16) & uint(0xFFFF) + ); +} + +ivec2 unpack2i16(int packed_value) { + return ivec2( + (packed_value << 16) >> 16, + (packed_value << 0) >> 16 + ); +} + +//----------------------------------------------------------------------------// +// Color Functions +//----------------------------------------------------------------------------// + +// Compute the luminance of the provided color. +// +// Takes colors in linear RGB space. If your colors are gamma +// encoded, linearize them before using them with this function. +float luminance(vec3 color) { + return dot(color, vec3(0.2126f, 0.7152f, 0.0722f)); +} + +// https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef +// +// Takes colors in linear RGB space. If your colors are gamma +// encoded, linearize them before using them with this function. +float contrast_ratio(vec3 color1, vec3 color2) { + float luminance1 = luminance(color1) + 0.05; + float luminance2 = luminance(color2) + 0.05; + return max(luminance1, luminance2) / min(luminance1, luminance2); +} + +// Return the fg if the contrast ratio is greater than min, otherwise +// return a color that satisfies the contrast ratio. Currently, the color +// is always white or black, whichever has the highest contrast ratio. +// +// Takes colors in linear RGB space. If your colors are gamma +// encoded, linearize them before using them with this function. +vec4 contrasted_color(float min_ratio, vec4 fg, vec4 bg) { + float ratio = contrast_ratio(fg.rgb, bg.rgb); + if (ratio < min_ratio) { + float white_ratio = contrast_ratio(vec3(1.0, 1.0, 1.0), bg.rgb); + float black_ratio = contrast_ratio(vec3(0.0, 0.0, 0.0), bg.rgb); + if (white_ratio > black_ratio) { + return vec4(1.0); + } else { + return vec4(0.0); + } + } + + return fg; +} + +// Converts a color from sRGB gamma encoding to linear. +vec4 linearize(vec4 srgb) { + bvec3 cutoff = lessThanEqual(srgb.rgb, vec3(0.04045)); + vec3 higher = pow((srgb.rgb + vec3(0.055)) / vec3(1.055), vec3(2.4)); + vec3 lower = srgb.rgb / vec3(12.92); + + return vec4(mix(higher, lower, cutoff), srgb.a); +} +float linearize(float v) { + return v <= 0.04045 ? v / 12.92 : pow((v + 0.055) / 1.055, 2.4); +} + +// Converts a color from linear to sRGB gamma encoding. +vec4 unlinearize(vec4 linear) { + bvec3 cutoff = lessThanEqual(linear.rgb, vec3(0.0031308)); + vec3 higher = pow(linear.rgb, vec3(1.0 / 2.4)) * vec3(1.055) - vec3(0.055); + vec3 lower = linear.rgb * vec3(12.92); + + return vec4(mix(higher, lower, cutoff), linear.a); +} +float unlinearize(float v) { + return v <= 0.0031308 ? v * 12.92 : pow(v, 1.0 / 2.4) * 1.055 - 0.055; +} + +// Load a 4 byte RGBA non-premultiplied color and linearize +// and convert it as necessary depending on the provided info. +// +// `linear` controls whether the returned color is linear or gamma encoded. +vec4 load_color( + uvec4 in_color, + bool linear +) { + // 0 .. 255 -> 0.0 .. 1.0 + vec4 color = vec4(in_color) / vec4(255.0f); + + // Linearize if necessary. + if (linear) color = linearize(color); + + // Premultiply our color by its alpha. + color.rgb *= color.a; + + return color; +} + +//----------------------------------------------------------------------------// diff --git a/src/renderer/shaders/glsl/full_screen.v.glsl b/src/renderer/shaders/glsl/full_screen.v.glsl new file mode 100644 index 000000000..b89cedfa5 --- /dev/null +++ b/src/renderer/shaders/glsl/full_screen.v.glsl @@ -0,0 +1,24 @@ +#version 330 core + +void main() { + vec4 position; + position.x = (gl_VertexID == 2) ? 3.0 : -1.0; + position.y = (gl_VertexID == 0) ? -3.0 : 1.0; + position.z = 1.0; + position.w = 1.0; + + // Single triangle is clipped to viewport. + // + // X <- vid == 0: (-1, -3) + // |\ + // | \ + // | \ + // |###\ + // |#+# \ `+` is (0, 0). `#`s are viewport area. + // |### \ + // X------X <- vid == 2: (3, 1) + // ^ + // vid == 1: (-1, 1) + + gl_Position = position; +} diff --git a/src/renderer/shaders/glsl/image.f.glsl b/src/renderer/shaders/glsl/image.f.glsl new file mode 100644 index 000000000..cd93cf666 --- /dev/null +++ b/src/renderer/shaders/glsl/image.f.glsl @@ -0,0 +1,21 @@ +#include "common.glsl" + +layout(binding = 0) uniform sampler2DRect image; + +in vec2 tex_coord; + +layout(location = 0) out vec4 out_FragColor; + +void main() { + bool use_linear_blending = (bools & USE_LINEAR_BLENDING) != 0; + + vec4 rgba = texture(image, tex_coord); + + if (!use_linear_blending) { + rgba = unlinearize(rgba); + } + + rgba.rgb *= vec3(rgba.a); + + out_FragColor = rgba; +} diff --git a/src/renderer/shaders/glsl/image.v.glsl b/src/renderer/shaders/glsl/image.v.glsl new file mode 100644 index 000000000..55b12ed68 --- /dev/null +++ b/src/renderer/shaders/glsl/image.v.glsl @@ -0,0 +1,46 @@ +#include "common.glsl" + +layout(binding = 0) uniform sampler2DRect image; + +layout(location = 0) in vec2 grid_pos; +layout(location = 1) in vec2 cell_offset; +layout(location = 2) in vec4 source_rect; +layout(location = 3) in vec2 dest_size; + +out vec2 tex_coord; + +void main() { + int vid = gl_VertexID; + + // We use a triangle strip with 4 vertices to render quads, + // so we determine which corner of the cell this vertex is in + // based on the vertex ID. + // + // 0 --> 1 + // | .'| + // | / | + // | L | + // 2 --> 3 + // + // 0 = top-left (0, 0) + // 1 = top-right (1, 0) + // 2 = bot-left (0, 1) + // 3 = bot-right (1, 1) + vec2 corner; + corner.x = float(vid == 1 || vid == 3); + corner.y = float(vid == 2 || vid == 3); + + // The texture coordinates start at our source x/y + // and add the width/height depending on the corner. + // + // We don't need to normalize because we use pixel addressing for our sampler. + tex_coord = source_rect.xy; + tex_coord += source_rect.zw * corner; + + // The position of our image starts at the top-left of the grid cell and + // adds the source rect width/height components. + vec2 image_pos = (cell_size * grid_pos) + cell_offset; + image_pos += dest_size * corner; + + gl_Position = projection_matrix * vec4(image_pos.xy, 1.0, 1.0); +} diff --git a/src/renderer/shaders/image.f.glsl b/src/renderer/shaders/image.f.glsl deleted file mode 100644 index e4aa9ef8e..000000000 --- a/src/renderer/shaders/image.f.glsl +++ /dev/null @@ -1,29 +0,0 @@ -#version 330 core - -in vec2 tex_coord; - -layout(location = 0) out vec4 out_FragColor; - -uniform sampler2D image; - -// Converts a color from linear to sRGB gamma encoding. -vec4 unlinearize(vec4 linear) { - bvec3 cutoff = lessThan(linear.rgb, vec3(0.0031308)); - vec3 higher = pow(linear.rgb, vec3(1.0/2.4)) * vec3(1.055) - vec3(0.055); - vec3 lower = linear.rgb * vec3(12.92); - - return vec4(mix(higher, lower, cutoff), linear.a); -} - -void main() { - vec4 color = texture(image, tex_coord); - - // Our texture is stored with an sRGB internal format, - // which means that the values are linearized when we - // sample the texture, but for now we actually want to - // output the color with gamma compression, so we do - // that. - color = unlinearize(color); - - out_FragColor = vec4(color.rgb * color.a, color.a); -} diff --git a/src/renderer/shaders/image.v.glsl b/src/renderer/shaders/image.v.glsl deleted file mode 100644 index e3d07ca9e..000000000 --- a/src/renderer/shaders/image.v.glsl +++ /dev/null @@ -1,44 +0,0 @@ -#version 330 core - -layout (location = 0) in vec2 grid_pos; -layout (location = 1) in vec2 cell_offset; -layout (location = 2) in vec4 source_rect; -layout (location = 3) in vec2 dest_size; - -out vec2 tex_coord; - -uniform sampler2D image; -uniform vec2 cell_size; -uniform mat4 projection; - -void main() { - // The size of the image in pixels - vec2 image_size = textureSize(image, 0); - - // Turn the cell position into a vertex point depending on the - // gl_VertexID. Since we use instanced drawing, we have 4 vertices - // for each corner of the cell. We can use gl_VertexID to determine - // which one we're looking at. Using this, we can use 1 or 0 to keep - // or discard the value for the vertex. - // - // 0 = top-right - // 1 = bot-right - // 2 = bot-left - // 3 = top-left - vec2 position; - position.x = (gl_VertexID == 0 || gl_VertexID == 1) ? 1. : 0.; - position.y = (gl_VertexID == 0 || gl_VertexID == 3) ? 0. : 1.; - - // The texture coordinates start at our source x/y, then add the width/height - // as enabled by our instance id, then normalize to [0, 1] - tex_coord = source_rect.xy; - tex_coord += source_rect.zw * position; - tex_coord /= image_size; - - // The position of our image starts at the top-left of the grid cell and - // adds the source rect width/height components. - vec2 image_pos = (cell_size * grid_pos) + cell_offset; - image_pos += dest_size * position; - - gl_Position = projection * vec4(image_pos.xy, 0, 1.0); -} diff --git a/src/renderer/shaders/shadertoy_prefix.glsl b/src/renderer/shaders/shadertoy_prefix.glsl index a1a220bd4..5bc25bc03 100644 --- a/src/renderer/shaders/shadertoy_prefix.glsl +++ b/src/renderer/shaders/shadertoy_prefix.glsl @@ -1,24 +1,24 @@ #version 430 core -layout(binding = 0) uniform Globals { - uniform vec3 iResolution; - uniform float iTime; - uniform float iTimeDelta; - uniform float iFrameRate; - uniform int iFrame; - uniform float iChannelTime[4]; - uniform vec3 iChannelResolution[4]; - uniform vec4 iMouse; - uniform vec4 iDate; - uniform float iSampleRate; +layout(binding = 1, std140) uniform Globals { + uniform vec3 iResolution; + uniform float iTime; + uniform float iTimeDelta; + uniform float iFrameRate; + uniform int iFrame; + uniform float iChannelTime[4]; + uniform vec3 iChannelResolution[4]; + uniform vec4 iMouse; + uniform vec4 iDate; + uniform float iSampleRate; }; -layout(binding = 0) uniform sampler2D iChannel0; +layout(binding = 0) uniform sampler2D iChannel0; // These are unused currently by Ghostty: -// layout(binding = 1) uniform sampler2D iChannel1; -// layout(binding = 2) uniform sampler2D iChannel2; -// layout(binding = 3) uniform sampler2D iChannel3; +// layout(binding = 1) uniform sampler2D iChannel1; +// layout(binding = 2) uniform sampler2D iChannel2; +// layout(binding = 3) uniform sampler2D iChannel3; layout(location = 0) in vec4 gl_FragCoord; layout(location = 0) out vec4 _fragColor; diff --git a/src/renderer/shadertoy.zig b/src/renderer/shadertoy.zig index 45d86cbfe..68171a23e 100644 --- a/src/renderer/shadertoy.zig +++ b/src/renderer/shadertoy.zig @@ -205,18 +205,25 @@ pub const SpirvLog = struct { /// Convert SPIR-V binary to MSL. pub fn mslFromSpv(alloc: Allocator, spv: []const u8) ![:0]const u8 { - return try spvCross(alloc, spvcross.c.SPVC_BACKEND_MSL, spv, null); + const c = spvcross.c; + return try spvCross(alloc, spvcross.c.SPVC_BACKEND_MSL, spv, (struct { + fn setOptions(options: c.spvc_compiler_options) error{SpvcFailed}!void { + // We enable decoration binding, because we need this + // to properly locate the uniform block to index 1. + if (c.spvc_compiler_options_set_bool( + options, + c.SPVC_COMPILER_OPTION_MSL_ENABLE_DECORATION_BINDING, + c.SPVC_TRUE, + ) != c.SPVC_SUCCESS) { + return error.SpvcFailed; + } + } + }).setOptions); } -/// Convert SPIR-V binary to GLSL.. +/// Convert SPIR-V binary to GLSL. pub fn glslFromSpv(alloc: Allocator, spv: []const u8) ![:0]const u8 { - // Our minimum version for shadertoy shaders is OpenGL 4.2 because - // Spirv-Cross generates binding locations for uniforms which is - // only supported in OpenGL 4.2 and above. - // - // If we can figure out a way to NOT do this then we can lower this - // version. - const GLSL_VERSION = 420; + const GLSL_VERSION = 430; const c = spvcross.c; return try spvCross(alloc, c.SPVC_BACKEND_GLSL, spv, (struct { From ac2eef9aeb319b0a1532607c215925bfc198e8c0 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Tue, 17 Jun 2025 16:34:05 -0600 Subject: [PATCH 226/371] renderer: disable multi-buffering for OpenGL Frames are sequential for OpenGL since the completion handler always calls `glFinish`, so the extra buffers do nothing but waste memory. --- src/renderer/OpenGL.zig | 4 ++++ src/renderer/generic.zig | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index c2f8bd652..59c2f41b6 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -29,6 +29,10 @@ pub const imagepkg = @import("opengl/image.zig"); pub const custom_shader_target: shadertoy.Target = .glsl; +/// Because OpenGL's frame completion is always +/// sync, we have no need for multi-buffering. +pub const swap_chain_count = 1; + const log = std.log.scoped(.opengl); /// We require at least OpenGL 4.3 diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index 359f5f1b3..52f789c6c 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -204,8 +204,15 @@ pub fn Renderer(comptime GraphicsAPI: type) type { // If this is one then we don't do any double+ buffering at all. // This is comptime because there isn't a good reason to change // this at runtime and there is a lot of complexity to support it. - // For comptime, this is useful for debugging. - const buf_count = 3; + const buf_count = count: { + if (@hasDecl(GraphicsAPI, "swap_chain_count")) { + break :count GraphicsAPI.swap_chain_count; + } + + // Default to triple buffering if + // graphics API has no preference. + break :count 3; + }; /// `buf_count` structs that can hold the /// data needed by the GPU to draw a frame. From 6dc5ae7a00999d0366a70cd389421b5a349e0462 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Tue, 17 Jun 2025 17:31:22 -0600 Subject: [PATCH 227/371] format (remove empty lines) --- src/renderer/opengl/Pipeline.zig | 1 - src/renderer/opengl/Texture.zig | 1 - 2 files changed, 2 deletions(-) diff --git a/src/renderer/opengl/Pipeline.zig b/src/renderer/opengl/Pipeline.zig index 127d689f5..501e6124c 100644 --- a/src/renderer/opengl/Pipeline.zig +++ b/src/renderer/opengl/Pipeline.zig @@ -31,7 +31,6 @@ pub const Options = struct { per_vertex, per_instance, }; - }; program: gl.Program, diff --git a/src/renderer/opengl/Texture.zig b/src/renderer/opengl/Texture.zig index 84a1ae9bc..d5ec816a6 100644 --- a/src/renderer/opengl/Texture.zig +++ b/src/renderer/opengl/Texture.zig @@ -96,4 +96,3 @@ pub fn replaceRegion( data.ptr, ); } - From ea1e507af712b5e843bf43ac08026f4ff4dc0b64 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Tue, 17 Jun 2025 17:32:57 -0600 Subject: [PATCH 228/371] unwrap unnecessary @"" identifiers --- pkg/macos/video/pixel_format.zig | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pkg/macos/video/pixel_format.zig b/pkg/macos/video/pixel_format.zig index 30f11881e..78091daa3 100644 --- a/pkg/macos/video/pixel_format.zig +++ b/pkg/macos/video/pixel_format.zig @@ -96,33 +96,33 @@ pub const PixelFormat = enum(c_int) { /// Component Y'CbCr 8-bit 4:2:2, full range, ordered Y'0 Cb Y'1 Cr @"422YpCbCr8FullRange" = c.kCVPixelFormatType_422YpCbCr8FullRange, /// 8 bit one component, black is zero - @"OneComponent8" = c.kCVPixelFormatType_OneComponent8, + OneComponent8 = c.kCVPixelFormatType_OneComponent8, /// 8 bit two component, black is zero - @"TwoComponent8" = c.kCVPixelFormatType_TwoComponent8, + TwoComponent8 = c.kCVPixelFormatType_TwoComponent8, /// little-endian RGB101010, 2 MSB are ignored, wide-gamut (384-895) @"30RGBLEPackedWideGamut" = c.kCVPixelFormatType_30RGBLEPackedWideGamut, /// little-endian ARGB2101010 full-range ARGB - @"ARGB2101010LEPacked" = c.kCVPixelFormatType_ARGB2101010LEPacked, + ARGB2101010LEPacked = c.kCVPixelFormatType_ARGB2101010LEPacked, /// little-endian ARGB10101010, each 10 bits in the MSBs of 16bits, wide-gamut (384-895, including alpha) @"40ARGBLEWideGamut" = c.kCVPixelFormatType_40ARGBLEWideGamut, /// little-endian ARGB10101010, each 10 bits in the MSBs of 16bits, wide-gamut (384-895, including alpha). Alpha premultiplied @"40ARGBLEWideGamutPremultiplied" = c.kCVPixelFormatType_40ARGBLEWideGamutPremultiplied, /// 10 bit little-endian one component, stored as 10 MSBs of 16 bits, black is zero - @"OneComponent10" = c.kCVPixelFormatType_OneComponent10, + OneComponent10 = c.kCVPixelFormatType_OneComponent10, /// 12 bit little-endian one component, stored as 12 MSBs of 16 bits, black is zero - @"OneComponent12" = c.kCVPixelFormatType_OneComponent12, + OneComponent12 = c.kCVPixelFormatType_OneComponent12, /// 16 bit little-endian one component, black is zero - @"OneComponent16" = c.kCVPixelFormatType_OneComponent16, + OneComponent16 = c.kCVPixelFormatType_OneComponent16, /// 16 bit little-endian two component, black is zero - @"TwoComponent16" = c.kCVPixelFormatType_TwoComponent16, + TwoComponent16 = c.kCVPixelFormatType_TwoComponent16, /// 16 bit one component IEEE half-precision float, 16-bit little-endian samples - @"OneComponent16Half" = c.kCVPixelFormatType_OneComponent16Half, + OneComponent16Half = c.kCVPixelFormatType_OneComponent16Half, /// 32 bit one component IEEE float, 32-bit little-endian samples - @"OneComponent32Float" = c.kCVPixelFormatType_OneComponent32Float, + OneComponent32Float = c.kCVPixelFormatType_OneComponent32Float, /// 16 bit two component IEEE half-precision float, 16-bit little-endian samples - @"TwoComponent16Half" = c.kCVPixelFormatType_TwoComponent16Half, + TwoComponent16Half = c.kCVPixelFormatType_TwoComponent16Half, /// 32 bit two component IEEE float, 32-bit little-endian samples - @"TwoComponent32Float" = c.kCVPixelFormatType_TwoComponent32Float, + TwoComponent32Float = c.kCVPixelFormatType_TwoComponent32Float, /// 64 bit RGBA IEEE half-precision float, 16-bit little-endian samples @"64RGBAHalf" = c.kCVPixelFormatType_64RGBAHalf, /// 128 bit RGBA IEEE float, 32-bit little-endian samples @@ -136,13 +136,13 @@ pub const PixelFormat = enum(c_int) { /// Bayer 14-bit Little-Endian, packed in 16-bits, ordered G B G B... alternating with R G R G... @"14Bayer_GBRG" = c.kCVPixelFormatType_14Bayer_GBRG, /// IEEE754-2008 binary16 (half float), describing the normalized shift when comparing two images. Units are 1/meters: ( pixelShift / (pixelFocalLength * baselineInMeters) ) - @"DisparityFloat16" = c.kCVPixelFormatType_DisparityFloat16, + DisparityFloat16 = c.kCVPixelFormatType_DisparityFloat16, /// IEEE754-2008 binary32 float, describing the normalized shift when comparing two images. Units are 1/meters: ( pixelShift / (pixelFocalLength * baselineInMeters) ) - @"DisparityFloat32" = c.kCVPixelFormatType_DisparityFloat32, + DisparityFloat32 = c.kCVPixelFormatType_DisparityFloat32, /// IEEE754-2008 binary16 (half float), describing the depth (distance to an object) in meters - @"DepthFloat16" = c.kCVPixelFormatType_DepthFloat16, + DepthFloat16 = c.kCVPixelFormatType_DepthFloat16, /// IEEE754-2008 binary32 float, describing the depth (distance to an object) in meters - @"DepthFloat32" = c.kCVPixelFormatType_DepthFloat32, + DepthFloat32 = c.kCVPixelFormatType_DepthFloat32, /// 2 plane YCbCr10 4:2:0, each 10 bits in the MSBs of 16bits, video-range (luma=[64,940] chroma=[64,960]) @"420YpCbCr10BiPlanarVideoRange" = c.kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange, /// 2 plane YCbCr10 4:2:2, each 10 bits in the MSBs of 16bits, video-range (luma=[64,940] chroma=[64,960]) From 541bb0d4d9ee441b9655bd8edd697a3168587207 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Wed, 18 Jun 2025 16:54:50 -0600 Subject: [PATCH 229/371] fix window cross-compilation --- src/renderer/OpenGL.zig | 12 +++++++++++- src/renderer/opengl/shaders.zig | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index 59c2f41b6..fe266d2ef 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -70,6 +70,16 @@ pub fn glfwWindowHints(config: *const configpkg.Config) glfw.Window.Hints { }; } +/// 32-bit windows cross-compilation breaks with `.c` for some reason, so... +const gl_debug_proc_callconv = + @typeInfo( + @typeInfo( + @typeInfo( + gl.c.GLDEBUGPROC, + ).optional.child, + ).pointer.child, + ).@"fn".calling_convention; + fn glDebugMessageCallback( src: gl.c.GLenum, typ: gl.c.GLenum, @@ -78,7 +88,7 @@ fn glDebugMessageCallback( len: gl.c.GLsizei, msg: [*c]const gl.c.GLchar, user_param: ?*const anyopaque, -) callconv(.c) void { +) callconv(gl_debug_proc_callconv) void { _ = user_param; const src_str: []const u8 = switch (src) { diff --git a/src/renderer/opengl/shaders.zig b/src/renderer/opengl/shaders.zig index 253ae8719..e509b723a 100644 --- a/src/renderer/opengl/shaders.zig +++ b/src/renderer/opengl/shaders.zig @@ -295,7 +295,7 @@ fn processIncludes(contents: [:0]const u8, basedir: []const u8) [:0]const u8 { "{s}{s}{s}", .{ contents[0..i], - @embedFile(basedir ++ .{std.fs.path.sep} ++ contents[start..end]), + @embedFile(basedir ++ "/" ++ contents[start..end]), processIncludes(contents[end + 1 ..], basedir), }, ); From e8460e80b206ebadd82c15562e46c86396da6564 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Wed, 18 Jun 2025 17:01:14 -0600 Subject: [PATCH 230/371] docs: update info about runtime change of `custom-shader` Also removes incorrect information about OpenGL requirement, since the minimum required OpenGL is now unconditionally 4.3 --- src/config/Config.zig | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/config/Config.zig b/src/config/Config.zig index f7a197184..bb094bf4d 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -1967,9 +1967,6 @@ keybind: Keybinds = .{}, /// causing the window to be completely black. If this happens, you can /// unset this configuration to disable the shader. /// -/// On Linux, this requires OpenGL 4.2. Ghostty typically only requires -/// OpenGL 3.3, but custom shaders push that requirement up to 4.2. -/// /// The shader API is identical to the Shadertoy API: you specify a `mainImage` /// function and the available uniforms match Shadertoy. The iChannel0 uniform /// is a texture containing the rendered terminal screen. @@ -1983,8 +1980,7 @@ keybind: Keybinds = .{}, /// This can be repeated multiple times to load multiple shaders. The shaders /// will be run in the order they are specified. /// -/// Changing this value at runtime and reloading the configuration will only -/// affect new windows, tabs, and splits. +/// This can be changed at runtime and will affect all open terminals. @"custom-shader": RepeatablePath = .{}, /// If `true` (default), the focused terminal surface will run an animation @@ -2002,8 +1998,7 @@ keybind: Keybinds = .{}, /// will use more CPU per terminal surface and can become quite expensive /// depending on the shader and your terminal usage. /// -/// This value can be changed at runtime and will affect all currently -/// open terminals. +/// This can be changed at runtime and will affect all open terminals. @"custom-shader-animation": CustomShaderAnimation = .true, /// Bell features to enable if bell support is available in your runtime. Not From 8b23e73d203d975811e9a97f33092b9221c86ba5 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 14:28:31 -0600 Subject: [PATCH 231/371] metal: retain IOSurfaceLayer ourselves instead of relying on the view If this was Swift code, we'd be using a strong reference, which would retain the layer for us and release it when the object is deallocated, but this is Zig land so we have to do that manually. NOTE: We don't *have* to do this, but it fits much better with Zig idiom and hopefully avoids potential future footguns. We should do this to any autoreleased objects that we persist a reference to in a Zig struct. --- src/renderer/Metal.zig | 4 +--- src/renderer/metal/IOSurfaceLayer.zig | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 766cbefa5..94c087f6c 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -165,9 +165,7 @@ pub fn init(alloc: Allocator, opts: rendererpkg.Options) !Metal { pub fn deinit(self: *Metal) void { self.queue.release(); self.device.release(); - - // NOTE: We don't release the layer here because that should be taken - // care of automatically when the hosting view is destroyed. + self.layer.release(); } pub fn loopEnter(self: *Metal) void { diff --git a/src/renderer/metal/IOSurfaceLayer.zig b/src/renderer/metal/IOSurfaceLayer.zig index 4c51a55c2..9212bd5e1 100644 --- a/src/renderer/metal/IOSurfaceLayer.zig +++ b/src/renderer/metal/IOSurfaceLayer.zig @@ -21,11 +21,14 @@ var Subclass: ?objc.Class = null; layer: objc.Object, pub fn init() !IOSurfaceLayer { + // The layer returned by `[CALayer layer]` is autoreleased, which means + // that at the end of the current autorelease pool it will be deallocated + // if it isn't retained, so we retain it here manually an extra time. const layer = (try getSubclass()).msgSend( objc.Object, objc.sel("layer"), .{}, - ); + ).retain(); errdefer layer.release(); // The layer gravity is set to top-left so that the contents aren't From b9e35c59704e9be16d11595dba372d574d2fe709 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 14:48:30 -0600 Subject: [PATCH 232/371] renderer: uncomment resize message handling We need this to get info about the padding, even if we do derive the grid and screen size separately. In the future this should possibly be changed to a message that only sends the padding info and nothing else. --- src/renderer/Thread.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/Thread.zig b/src/renderer/Thread.zig index 03ca7b5e1..c4036415b 100644 --- a/src/renderer/Thread.zig +++ b/src/renderer/Thread.zig @@ -452,7 +452,7 @@ fn drainMailbox(self: *Thread) !void { self.renderer.markDirty(); }, - .resize => {}, //|v| try self.renderer.setScreenSize(v), + .resize => |v| self.renderer.setScreenSize(v), .change_config => |config| { defer config.alloc.destroy(config.thread); From dccbec2283759e126adc387bffd8469cafd061fa Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 14:51:55 -0600 Subject: [PATCH 233/371] style(renderer): capture generic consts as decls in returned struct Out of an abundance of caution, since there have been issues in the past relating to consts outside of the returned struct. --- src/renderer/generic.zig | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index 52f789c6c..0308b4c6d 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -68,24 +68,24 @@ const log = std.log.scoped(.generic_renderer); /// [ Texture ] - An abstraction over a GPU texture. /// pub fn Renderer(comptime GraphicsAPI: type) type { - const Target = GraphicsAPI.Target; - const Buffer = GraphicsAPI.Buffer; - const Texture = GraphicsAPI.Texture; - const RenderPass = GraphicsAPI.RenderPass; - const shaderpkg = GraphicsAPI.shaders; - - const cellpkg = GraphicsAPI.cellpkg; - const imagepkg = GraphicsAPI.imagepkg; - const Image = imagepkg.Image; - const ImageMap = imagepkg.ImageMap; - - const Shaders = shaderpkg.Shaders; - - const ImagePlacementList = std.ArrayListUnmanaged(imagepkg.Placement); - return struct { const Self = @This(); + const Target = GraphicsAPI.Target; + const Buffer = GraphicsAPI.Buffer; + const Texture = GraphicsAPI.Texture; + const RenderPass = GraphicsAPI.RenderPass; + const shaderpkg = GraphicsAPI.shaders; + + const cellpkg = GraphicsAPI.cellpkg; + const imagepkg = GraphicsAPI.imagepkg; + const Image = imagepkg.Image; + const ImageMap = imagepkg.ImageMap; + + const Shaders = shaderpkg.Shaders; + + const ImagePlacementList = std.ArrayListUnmanaged(imagepkg.Placement); + /// Allocator that can be used alloc: std.mem.Allocator, From 6b7d751007291e9e082d8486171f97749b04b17c Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 14:53:30 -0600 Subject: [PATCH 234/371] renderer: make GraphicsAPI.swap_chain_count required --- src/renderer/Metal.zig | 3 +++ src/renderer/generic.zig | 10 +--------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 94c087f6c..a69d2e3d3 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -34,6 +34,9 @@ pub const imagepkg = @import("metal/image.zig"); pub const custom_shader_target: shadertoy.Target = .msl; +/// Triple buffering. +pub const swap_chain_count = 3; + const log = std.log.scoped(.metal); // Get native API access on certain platforms so we can do more customization. diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index 0308b4c6d..274f32585 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -204,15 +204,7 @@ pub fn Renderer(comptime GraphicsAPI: type) type { // If this is one then we don't do any double+ buffering at all. // This is comptime because there isn't a good reason to change // this at runtime and there is a lot of complexity to support it. - const buf_count = count: { - if (@hasDecl(GraphicsAPI, "swap_chain_count")) { - break :count GraphicsAPI.swap_chain_count; - } - - // Default to triple buffering if - // graphics API has no preference. - break :count 3; - }; + const buf_count = GraphicsAPI.swap_chain_count; /// `buf_count` structs that can hold the /// data needed by the GPU to draw a frame. From 2f10caec8f694ccf135d024264969cfc1b3be823 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 14:56:18 -0600 Subject: [PATCH 235/371] renderer: clarify why SwapChain.defunct is required --- src/renderer/generic.zig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index 274f32585..2467bfb2e 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -217,6 +217,10 @@ pub fn Renderer(comptime GraphicsAPI: type) type { /// Set to true when deinited, if you try to deinit a defunct /// swap chain it will just be ignored, to prevent double-free. + /// + /// This is required because of `displayUnrealized`, since it + /// `deinits` the swapchain, which leads to a double-free if + /// the renderer is deinited after that. defunct: bool = false, pub fn init(api: GraphicsAPI, custom_shaders: bool) !SwapChain { From 9d00018f8b48c5623ed9798f23d3f01f62779ed6 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 15:02:58 -0600 Subject: [PATCH 236/371] renderer: minimize initial size of GPU resources These will all be resized anyway on the first frame, so there's no point in preallocating sizes that will be too small. --- src/renderer/generic.zig | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index 2467bfb2e..fce69316e 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -300,23 +300,30 @@ pub fn Renderer(comptime GraphicsAPI: type) type { var uniforms = try UniformBuffer.init(api.uniformBufferOptions(), 1); errdefer uniforms.deinit(); - // Create the buffers for our vertex data. The preallocation size - // is likely too small but our first frame update will resize it. - var cells = try CellTextBuffer.init(api.fgBufferOptions(), 10 * 10); + // Create GPU buffers for our cells. + // + // We start them off with a size of 1, which will of course be + // too small, but they will be resized as needed. This is a bit + // wasteful but since it's a one-time thing it's not really a + // huge concern. + var cells = try CellTextBuffer.init(api.fgBufferOptions(), 1); errdefer cells.deinit(); - var cells_bg = try CellBgBuffer.init(api.bgBufferOptions(), 10 * 10); + var cells_bg = try CellBgBuffer.init(api.bgBufferOptions(), 1); errdefer cells_bg.deinit(); // Initialize our textures for our font atlas. + // + // As with the buffers above, we start these off as small + // as possible since they'll inevitably be resized anyway. const grayscale = try api.initAtlasTexture(&.{ .data = undefined, - .size = 8, + .size = 1, .format = .grayscale, }); errdefer grayscale.deinit(); const color = try api.initAtlasTexture(&.{ .data = undefined, - .size = 8, + .size = 1, .format = .rgba, }); errdefer color.deinit(); @@ -328,8 +335,8 @@ pub fn Renderer(comptime GraphicsAPI: type) type { null; errdefer if (custom_shader_state) |*state| state.deinit(); - // Initialize the target at 1x1 px, this is slightly - // wasteful but it's only done once so whatever. + // Initialize the target. Just as with the other resources, + // start it off as small as we can since it'll be resized. const target = try api.initTarget(1, 1); return .{ From ea7a91e2ba77da472de2d95a8aec1f1fb8b24ed1 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 15:16:31 -0600 Subject: [PATCH 237/371] style(renderer): explicit error sets --- pkg/opengl/Texture.zig | 13 +++++++------ src/renderer/Metal.zig | 7 +++++-- src/renderer/OpenGL.zig | 7 +++++-- src/renderer/metal/Texture.zig | 9 +++++++-- src/renderer/opengl/Texture.zig | 31 ++++++++++++++++++------------- 5 files changed, 42 insertions(+), 25 deletions(-) diff --git a/pkg/opengl/Texture.zig b/pkg/opengl/Texture.zig index 833a9bb4d..4a1d61433 100644 --- a/pkg/opengl/Texture.zig +++ b/pkg/opengl/Texture.zig @@ -7,15 +7,16 @@ const glad = @import("glad.zig"); id: c.GLuint, -pub fn active(index: c_uint) !void { +pub fn active(index: c_uint) errors.Error!void { glad.context.ActiveTexture.?(index + c.GL_TEXTURE0); try errors.getError(); } /// Create a single texture. -pub fn create() !Texture { +pub fn create() errors.Error!Texture { var id: c.GLuint = undefined; glad.context.GenTextures.?(1, &id); + try errors.getError(); return .{ .id = id }; } @@ -107,7 +108,7 @@ pub const Binding = struct { glad.context.GenerateMipmap.?(@intFromEnum(b.target)); } - pub fn parameter(b: Binding, name: Parameter, value: anytype) !void { + pub fn parameter(b: Binding, name: Parameter, value: anytype) errors.Error!void { switch (@TypeOf(value)) { c.GLint => glad.context.TexParameteri.?( @intFromEnum(b.target), @@ -129,7 +130,7 @@ pub const Binding = struct { format: Format, typ: DataType, data: ?*const anyopaque, - ) !void { + ) errors.Error!void { glad.context.TexImage2D.?( @intFromEnum(b.target), level, @@ -154,7 +155,7 @@ pub const Binding = struct { format: Format, typ: DataType, data: ?*const anyopaque, - ) !void { + ) errors.Error!void { glad.context.TexSubImage2D.?( @intFromEnum(b.target), level, @@ -178,7 +179,7 @@ pub const Binding = struct { y: c.GLint, width: c.GLsizei, height: c.GLsizei, - ) !void { + ) errors.Error!void { glad.context.CopyTexSubImage2D.?( @intFromEnum(b.target), level, diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index a69d2e3d3..21a10d45f 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -284,14 +284,17 @@ pub inline fn textureOptions(self: Metal) Texture.Options { } /// Initializes a Texture suitable for the provided font atlas. -pub fn initAtlasTexture(self: *const Metal, atlas: *const font.Atlas) !Texture { +pub fn initAtlasTexture( + self: *const Metal, + atlas: *const font.Atlas, +) Texture.Error!Texture { const pixel_format: mtl.MTLPixelFormat = switch (atlas.format) { .grayscale => .r8unorm, .rgba => .bgra8unorm, else => @panic("unsupported atlas format for Metal texture"), }; - return Texture.init( + return try Texture.init( .{ .device = self.device, .pixel_format = pixel_format, diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index fe266d2ef..1d1b41f0e 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -384,7 +384,10 @@ pub inline fn textureOptions(self: OpenGL) Texture.Options { } /// Initializes a Texture suitable for the provided font atlas. -pub fn initAtlasTexture(self: *const OpenGL, atlas: *const font.Atlas) !Texture { +pub fn initAtlasTexture( + self: *const OpenGL, + atlas: *const font.Atlas, +) Texture.Error!Texture { _ = self; const format: gl.Texture.Format, const internal_format: gl.Texture.InternalFormat = switch (atlas.format) { @@ -393,7 +396,7 @@ pub fn initAtlasTexture(self: *const OpenGL, atlas: *const font.Atlas) !Texture else => @panic("unsupported atlas format for OpenGL texture"), }; - return Texture.init( + return try Texture.init( .{ .format = format, .internal_format = internal_format, diff --git a/src/renderer/metal/Texture.zig b/src/renderer/metal/Texture.zig index 6e3ae78c7..32820f8fc 100644 --- a/src/renderer/metal/Texture.zig +++ b/src/renderer/metal/Texture.zig @@ -31,13 +31,18 @@ height: usize, /// Bytes per pixel for this texture. bpp: usize, +pub const Error = error{ + /// A Metal API call failed. + MetalFailed, +}; + /// Initialize a texture pub fn init( opts: Options, width: usize, height: usize, data: ?[]const u8, -) !Self { +) Error!Self { // Create our descriptor const desc = init: { const Class = objc.getClass("MTLTextureDescriptor").?; @@ -90,7 +95,7 @@ pub fn replaceRegion( width: usize, height: usize, data: []const u8, -) !void { +) error{}!void { self.texture.msgSend( void, objc.sel("replaceRegion:mipmapLevel:withBytes:bytesPerRow:"), diff --git a/src/renderer/opengl/Texture.zig b/src/renderer/opengl/Texture.zig index d5ec816a6..07123922f 100644 --- a/src/renderer/opengl/Texture.zig +++ b/src/renderer/opengl/Texture.zig @@ -31,23 +31,28 @@ format: gl.Texture.Format, /// Target for this texture. target: gl.Texture.Target, +pub const Error = error{ + /// An OpenGL API call failed. + OpenGLFailed, +}; + /// Initialize a texture pub fn init( opts: Options, width: usize, height: usize, data: ?[]const u8, -) !Self { - const tex = try gl.Texture.create(); +) Error!Self { + const tex = gl.Texture.create() catch return error.OpenGLFailed; errdefer tex.destroy(); { - const texbind = try tex.bind(opts.target); + const texbind = tex.bind(opts.target) catch return error.OpenGLFailed; defer texbind.unbind(); - try texbind.parameter(.WrapS, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.WrapT, gl.c.GL_CLAMP_TO_EDGE); - try texbind.parameter(.MinFilter, gl.c.GL_LINEAR); - try texbind.parameter(.MagFilter, gl.c.GL_LINEAR); - try texbind.image2D( + texbind.parameter(.WrapS, gl.c.GL_CLAMP_TO_EDGE) catch return error.OpenGLFailed; + texbind.parameter(.WrapT, gl.c.GL_CLAMP_TO_EDGE) catch return error.OpenGLFailed; + texbind.parameter(.MinFilter, gl.c.GL_LINEAR) catch return error.OpenGLFailed; + texbind.parameter(.MagFilter, gl.c.GL_LINEAR) catch return error.OpenGLFailed; + texbind.image2D( 0, opts.internal_format, @intCast(width), @@ -56,7 +61,7 @@ pub fn init( opts.format, .UnsignedByte, if (data) |d| @ptrCast(d.ptr) else null, - ); + ) catch return error.OpenGLFailed; } return .{ @@ -82,10 +87,10 @@ pub fn replaceRegion( width: usize, height: usize, data: []const u8, -) !void { - const texbind = try self.texture.bind(self.target); +) Error!void { + const texbind = self.texture.bind(self.target) catch return error.OpenGLFailed; defer texbind.unbind(); - try texbind.subImage2D( + texbind.subImage2D( 0, @intCast(x), @intCast(y), @@ -94,5 +99,5 @@ pub fn replaceRegion( self.format, .UnsignedByte, data.ptr, - ); + ) catch return error.OpenGLFailed; } From 3e7d64b5ce965070ca361d1f8d94cfb157faddad Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 15:45:43 -0600 Subject: [PATCH 238/371] style(renderer): explicit empty error set for OpenGL init --- src/renderer/OpenGL.zig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index 1d1b41f0e..584d3cf9d 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -47,7 +47,10 @@ blending: configpkg.Config.AlphaBlending, /// The most recently presented target, in case we need to present it again. last_target: ?Target = null, -pub fn init(alloc: Allocator, opts: rendererpkg.Options) !OpenGL { +/// NOTE: This is an error{}!OpenGL instead of just OpenGL for parity with +/// Metal, since it needs to be fallible so does this, even though it +/// can't actually fail. +pub fn init(alloc: Allocator, opts: rendererpkg.Options) error{}!OpenGL { return .{ .alloc = alloc, .blending = opts.config.blending, From 8b9e6641f22dfefe917a80cc99542990e149cbbc Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 15:48:44 -0600 Subject: [PATCH 239/371] style(renderer): explicit result type In case of future breaking changes to `options` --- src/renderer/generic.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index fce69316e..3462b6fa4 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -633,7 +633,7 @@ pub fn Renderer(comptime GraphicsAPI: type) type { const font_critical: struct { metrics: font.Metrics, } = font_critical: { - const grid = options.font_grid; + const grid: *font.SharedGrid = options.font_grid; grid.lock.lockShared(); defer grid.lock.unlockShared(); break :font_critical .{ From a8021085587f0dbe8ad9299bbab90d98ef3ff134 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 15:49:53 -0600 Subject: [PATCH 240/371] renderer: remove unused surface parameter from updateFrame --- src/renderer/Thread.zig | 1 - src/renderer/generic.zig | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/renderer/Thread.zig b/src/renderer/Thread.zig index c4036415b..b8884f2fb 100644 --- a/src/renderer/Thread.zig +++ b/src/renderer/Thread.zig @@ -605,7 +605,6 @@ fn renderCallback( // Update our frame data t.renderer.updateFrame( - t.surface, t.state, t.flags.cursor_blink_visible, ) catch |err| diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index 3462b6fa4..d7b4f4226 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -1027,12 +1027,9 @@ pub fn Renderer(comptime GraphicsAPI: type) type { /// Update the frame data. pub fn updateFrame( self: *Self, - surface: *apprt.Surface, state: *renderer.State, cursor_blink_visible: bool, ) !void { - _ = surface; - // Data we extract out of the critical area. const Critical = struct { bg: terminal.color.RGB, From ab926fc842da4765148295b7a12f42cb28b86d25 Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 15:51:48 -0600 Subject: [PATCH 241/371] naming(GraphicsAPI): repeat -> presentLastTarget --- src/renderer/Metal.zig | 2 +- src/renderer/OpenGL.zig | 2 +- src/renderer/generic.zig | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 21a10d45f..4ba477c40 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -242,7 +242,7 @@ pub inline fn present(self: *Metal, target: Target, sync: bool) !void { } /// Present the last presented target again. (noop for Metal) -pub inline fn repeat(self: *Metal) !void { +pub inline fn presentLastTarget(self: *Metal) !void { _ = self; } diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index 584d3cf9d..81dbae66e 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -357,7 +357,7 @@ pub fn present(self: *OpenGL, target: Target) !void { } /// Present the last presented target again. -pub fn repeat(self: *OpenGL) !void { +pub fn presentLastTarget(self: *OpenGL) !void { if (self.last_target) |target| try self.present(target); } diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index d7b4f4226..b3e6c4e12 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -1274,7 +1274,7 @@ pub fn Renderer(comptime GraphicsAPI: type) type { // We still need to present the last target again, because the // apprt may be swapping buffers and display an outdated frame // if we don't draw something new. - try self.api.repeat(); + try self.api.presentLastTarget(); return; } self.cells_rebuilt = false; From ddf1a5b23d2447b1d55656f95c2faad12570a84e Mon Sep 17 00:00:00 2001 From: Qwerasd Date: Fri, 20 Jun 2025 16:16:17 -0600 Subject: [PATCH 242/371] renderer: move drawFrame AutoreleasePool handling to GraphicsAPI Introduces `drawFrameStart`/`drawFrameEnd` for this purpose. --- src/renderer/Metal.zig | 20 ++++++++++++++++++++ src/renderer/OpenGL.zig | 14 ++++++++++++++ src/renderer/generic.zig | 13 ++++--------- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/renderer/Metal.zig b/src/renderer/Metal.zig index 4ba477c40..03a568d87 100644 --- a/src/renderer/Metal.zig +++ b/src/renderer/Metal.zig @@ -61,6 +61,9 @@ blending: configpkg.Config.AlphaBlending, /// the "shared" storage mode, instead we have to use the "managed" mode. default_storage_mode: mtl.MTLResourceOptions.StorageMode, +/// We start an AutoreleasePool before `drawFrame` and end it afterwards. +autorelease_pool: ?*objc.AutoreleasePool = null, + pub fn init(alloc: Allocator, opts: rendererpkg.Options) !Metal { comptime switch (builtin.os.tag) { .macos, .ios => {}, @@ -185,6 +188,23 @@ fn displayCallback(renderer: *Renderer) align(8) void { }; } +/// Actions taken before doing anything in `drawFrame`. +/// +/// Right now we use this to start an AutoreleasePool. +pub fn drawFrameStart(self: *Metal) void { + assert(self.autorelease_pool == null); + self.autorelease_pool = .init(); +} + +/// Actions taken after `drawFrame` is done. +/// +/// Right now we use this to end our AutoreleasePool. +pub fn drawFrameEnd(self: *Metal) void { + assert(self.autorelease_pool != null); + self.autorelease_pool.?.deinit(); + self.autorelease_pool = null; +} + pub fn initShaders( self: *const Metal, alloc: Allocator, diff --git a/src/renderer/OpenGL.zig b/src/renderer/OpenGL.zig index 81dbae66e..23496c148 100644 --- a/src/renderer/OpenGL.zig +++ b/src/renderer/OpenGL.zig @@ -289,6 +289,20 @@ pub fn displayRealized(self: *const OpenGL) void { } } +/// Actions taken before doing anything in `drawFrame`. +/// +/// Right now there's nothing we need to do for OpenGL. +pub fn drawFrameStart(self: *OpenGL) void { + _ = self; +} + +/// Actions taken after `drawFrame` is done. +/// +/// Right now there's nothing we need to do for OpenGL. +pub fn drawFrameEnd(self: *OpenGL) void { + _ = self; +} + pub fn initShaders( self: *const OpenGL, alloc: Allocator, diff --git a/src/renderer/generic.zig b/src/renderer/generic.zig index b3e6c4e12..f178d7bef 100644 --- a/src/renderer/generic.zig +++ b/src/renderer/generic.zig @@ -1241,15 +1241,10 @@ pub fn Renderer(comptime GraphicsAPI: type) type { self.draw_mutex.lock(); defer self.draw_mutex.unlock(); - // There's probably a more elegant way to do this... - // - // This is effectively an @autoreleasepool{} block, which we need in - // order to ensure that autoreleased objects are properly released. - const pool = if (builtin.os.tag.isDarwin()) - @import("objc").AutoreleasePool.init() - else - void; - defer if (builtin.os.tag.isDarwin()) pool.deinit(); + // Let our graphics API do any bookkeeping, etc. + // that it needs to do before / after `drawFrame`. + self.api.drawFrameStart(); + defer self.api.drawFrameEnd(); // Retrieve the most up-to-date surface size from the Graphics API const surface_size = try self.api.surfaceSize(); From b249fe0b2c68de13bac80f0262832d469ddd85bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rio=20Victor=20Ribeiro=20Silva?= Date: Fri, 20 Jun 2025 21:15:03 -0300 Subject: [PATCH 243/371] fix: undo poedit formatting --- po/pt_BR.UTF-8.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/po/pt_BR.UTF-8.po b/po/pt_BR.UTF-8.po index c7bdf4df7..ba13f4460 100644 --- a/po/pt_BR.UTF-8.po +++ b/po/pt_BR.UTF-8.po @@ -11,14 +11,13 @@ msgstr "" "POT-Creation-Date: 2025-04-22 08:57-0700\n" "PO-Revision-Date: 2025-06-20 10:19-0300\n" "Last-Translator: Mário Victor Ribeiro Silva \n" -"Language-Team: Brazilian Portuguese \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.6\n" #: src/apprt/gtk/ui/1.5/prompt-title-dialog.blp:5 msgid "Change Terminal Title" @@ -175,8 +174,8 @@ msgid "" "An application is attempting to read from the clipboard. The current " "clipboard contents are shown below." msgstr "" -"Uma aplicação está tentando ler da área de transferência. O conteúdo atual da " -"área de transferência está sendo exibido abaixo." +"Uma aplicação está tentando ler da área de transferência. O conteúdo atual " +"da área de transferência está sendo exibido abaixo." #: src/apprt/gtk/ui/1.5/ccw-osc-52-read.blp:10 #: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:10 @@ -190,8 +189,8 @@ msgstr "Permitir" #: src/apprt/gtk/ui/1.5/ccw-osc-52-write.blp:7 msgid "" -"An application is attempting to write to the clipboard. The current clipboard " -"contents are shown below." +"An application is attempting to write to the clipboard. The current " +"clipboard contents are shown below." msgstr "" "Uma aplicação está tentando escrever na área de transferência. O conteúdo " "atual da área de transferência está aparecendo abaixo." @@ -221,7 +220,8 @@ msgid "New Split" msgstr "Nova divisão" #: src/apprt/gtk/Window.zig:312 -msgid "⚠️ You're running a debug build of Ghostty! Performance will be degraded." +msgid "" +"⚠️ You're running a debug build of Ghostty! Performance will be degraded." msgstr "" "⚠️ Você está rodando uma build de debug do Ghostty! O desempenho será afetado." From 7ae5018fe8dbee7db7ff9da64a7ae4a11d874444 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 17 Jun 2025 20:59:12 -0700 Subject: [PATCH 244/371] macos: new terminal intent --- macos/Ghostty.xcodeproj/project.pbxproj | 16 ++++ macos/Sources/App/macOS/AppDelegate.swift | 2 +- .../App Intents/GhosttyIntentError.swift | 9 +++ .../App Intents/NewTerminalIntent.swift | 81 +++++++++++++++++++ .../Terminal/TerminalController.swift | 2 +- 5 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 macos/Sources/Features/App Intents/GhosttyIntentError.swift create mode 100644 macos/Sources/Features/App Intents/NewTerminalIntent.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 5c584709e..c1a7bbaef 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -120,6 +120,8 @@ A5E112952AF73E8A00C6E0C2 /* ClipboardConfirmationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E112942AF73E8A00C6E0C2 /* ClipboardConfirmationController.swift */; }; A5E112972AF7401B00C6E0C2 /* ClipboardConfirmationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E112962AF7401B00C6E0C2 /* ClipboardConfirmationView.swift */; }; A5E4082A2E022E9E0035FEAC /* TabGroupCloseCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408292E022E9B0035FEAC /* TabGroupCloseCoordinator.swift */; }; + A5E4082E2E0237460035FEAC /* NewTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */; }; + A5E408302E0271320035FEAC /* GhosttyIntentError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */; }; A5FEB3002ABB69450068369E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FEB2FF2ABB69450068369E /* main.swift */; }; AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */; }; C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; @@ -240,6 +242,8 @@ A5E112942AF73E8A00C6E0C2 /* ClipboardConfirmationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClipboardConfirmationController.swift; sourceTree = ""; }; A5E112962AF7401B00C6E0C2 /* ClipboardConfirmationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClipboardConfirmationView.swift; sourceTree = ""; }; A5E408292E022E9B0035FEAC /* TabGroupCloseCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabGroupCloseCoordinator.swift; sourceTree = ""; }; + A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTerminalIntent.swift; sourceTree = ""; }; + A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyIntentError.swift; sourceTree = ""; }; A5FEB2FF2ABB69450068369E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPasteboard+Extension.swift"; sourceTree = ""; }; C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSColor+Extension.swift"; sourceTree = ""; }; @@ -299,6 +303,7 @@ A56D58872ACDE6BE00508D2C /* Services */, A59630982AEE1C4400D64628 /* Terminal */, A5CBD05A2CA0C5910017A1AE /* QuickTerminal */, + A5E4082C2E0237270035FEAC /* App Intents */, A5E112912AF73E4D00C6E0C2 /* ClipboardConfirmation */, A57D79252C9C8782001D522E /* Secure Input */, A58636622DEF955100E04A10 /* Splits */, @@ -598,6 +603,15 @@ path = ClipboardConfirmation; sourceTree = ""; }; + A5E4082C2E0237270035FEAC /* App Intents */ = { + isa = PBXGroup; + children = ( + A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */, + A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */, + ); + path = "App Intents"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -777,8 +791,10 @@ A56D58862ACDDB4100508D2C /* Ghostty.Shell.swift in Sources */, A5985CD72C320C4500C57AD3 /* String+Extension.swift in Sources */, A5A2A3CC2D444ABB0033CF96 /* NSApplication+Extension.swift in Sources */, + A5E408302E0271320035FEAC /* GhosttyIntentError.swift in Sources */, A5FEB3002ABB69450068369E /* main.swift in Sources */, A53A297F2DB4480F00B6E02C /* EventModifiers+Extension.swift in Sources */, + A5E4082E2E0237460035FEAC /* NewTerminalIntent.swift in Sources */, A53A297B2DB2E49700B6E02C /* CommandPalette.swift in Sources */, A55B7BB829B6F53A0055DE60 /* Package.swift in Sources */, A51B78472AF4B58B00F3EDB9 /* TitlebarTabsVenturaTerminalWindow.swift in Sources */, diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index c56d7c3ac..7336f18d6 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -167,7 +167,7 @@ class AppDelegate: NSObject, // This registers the Ghostty => Services menu to exist. NSApp.servicesMenu = menuServices - + // Setup a local event monitor for app-level keyboard shortcuts. See // localEventHandler for more info why. _ = NSEvent.addLocalMonitorForEvents( diff --git a/macos/Sources/Features/App Intents/GhosttyIntentError.swift b/macos/Sources/Features/App Intents/GhosttyIntentError.swift new file mode 100644 index 000000000..a04db1e6f --- /dev/null +++ b/macos/Sources/Features/App Intents/GhosttyIntentError.swift @@ -0,0 +1,9 @@ +enum GhosttyIntentError: Error, CustomLocalizedStringResourceConvertible { + case appUnavailable + + var localizedStringResource: LocalizedStringResource { + switch self { + case .appUnavailable: return "The Ghostty app isn't properly initialized." + } + } +} diff --git a/macos/Sources/Features/App Intents/NewTerminalIntent.swift b/macos/Sources/Features/App Intents/NewTerminalIntent.swift new file mode 100644 index 000000000..c54d31c09 --- /dev/null +++ b/macos/Sources/Features/App Intents/NewTerminalIntent.swift @@ -0,0 +1,81 @@ +import AppKit +import AppIntents + +/// App intent that allows creating a new terminal window or tab. +/// +/// This requires macOS 15 or greater because we use features of macOS 15 here. +@available(macOS 15.0, *) +struct NewTerminalIntent: AppIntent { + static var title: LocalizedStringResource = "New Terminal" + static var description = IntentDescription("Create a new terminal.") + + @Parameter( + title: "Location", + description: "The location that the terminal should be created.", + default: .window + ) + var location: NewTerminalLocation + + @Parameter( + title: "Working Directory", + description: "The working directory to open in the terminal.", + supportedContentTypes: [.folder] + ) + var workingDirectory: IntentFile? + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = .foreground(.immediate) + + @available(macOS, obsoleted: 26.0, message: "Replaced by supportedModes") + static var openAppWhenRun = true + + static var parameterSummary: some ParameterSummary { + Summary("New Terminal \(\.$location)") + } + + @MainActor + func perform() async throws -> some IntentResult { + guard let appDelegate = NSApp.delegate as? AppDelegate else { + throw GhosttyIntentError.appUnavailable + } + + var config = Ghostty.SurfaceConfiguration() + + // If we were given a working directory then open that directory + if let url = workingDirectory?.fileURL { + let dir = url.hasDirectoryPath ? url : url.deletingLastPathComponent() + config.workingDirectory = dir.path(percentEncoded: false) + } + + switch location { + case .window: + _ = TerminalController.newWindow( + appDelegate.ghostty, + withBaseConfig: config) + + case .tab: + _ = TerminalController.newTab( + appDelegate.ghostty, + from: TerminalController.preferredParent?.window, + withBaseConfig: config) + } + + return .result() + } +} + +// MARK: NewTerminalLocation + +enum NewTerminalLocation: String { + case tab + case window +} + +extension NewTerminalLocation: AppEnum { + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Terminal Location") + + static var caseDisplayRepresentations: [Self: DisplayRepresentation] = [ + .tab: .init(title: "Tab"), + .window: .init(title: "Window"), + ] +} diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 273744237..a224c9248 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -169,7 +169,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr private static var lastCascadePoint = NSPoint(x: 0, y: 0) // The preferred parent terminal controller. - private static var preferredParent: TerminalController? { + static var preferredParent: TerminalController? { all.first { $0.window?.isMainWindow ?? false } ?? all.last From 2aa731a64e13856f02f0484dfce403a855abb723 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Jun 2025 08:30:41 -0700 Subject: [PATCH 245/371] macos: TerminalEntity --- macos/Ghostty.xcodeproj/project.pbxproj | 4 ++ .../Features/App Intents/TerminalEntity.swift | 67 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 macos/Sources/Features/App Intents/TerminalEntity.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index c1a7bbaef..913ce1995 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -122,6 +122,7 @@ A5E4082A2E022E9E0035FEAC /* TabGroupCloseCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408292E022E9B0035FEAC /* TabGroupCloseCoordinator.swift */; }; A5E4082E2E0237460035FEAC /* NewTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */; }; A5E408302E0271320035FEAC /* GhosttyIntentError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */; }; + A5E408322E02FEDF0035FEAC /* TerminalEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */; }; A5FEB3002ABB69450068369E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FEB2FF2ABB69450068369E /* main.swift */; }; AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */; }; C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; @@ -244,6 +245,7 @@ A5E408292E022E9B0035FEAC /* TabGroupCloseCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabGroupCloseCoordinator.swift; sourceTree = ""; }; A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTerminalIntent.swift; sourceTree = ""; }; A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyIntentError.swift; sourceTree = ""; }; + A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalEntity.swift; sourceTree = ""; }; A5FEB2FF2ABB69450068369E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPasteboard+Extension.swift"; sourceTree = ""; }; C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSColor+Extension.swift"; sourceTree = ""; }; @@ -606,6 +608,7 @@ A5E4082C2E0237270035FEAC /* App Intents */ = { isa = PBXGroup; children = ( + A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */, A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */, A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */, ); @@ -753,6 +756,7 @@ A5CF66D42D289CEE00139794 /* NSEvent+Extension.swift in Sources */, A5CBD0642CA122E70017A1AE /* QuickTerminalPosition.swift in Sources */, A596309C2AEE1C9E00D64628 /* TerminalController.swift in Sources */, + A5E408322E02FEDF0035FEAC /* TerminalEntity.swift in Sources */, A5CC36152C9CDA06004D6760 /* View+Extension.swift in Sources */, A56D58892ACDE6CA00508D2C /* ServiceProvider.swift in Sources */, A5CBD0602CA0C90A0017A1AE /* QuickTerminalWindow.swift in Sources */, diff --git a/macos/Sources/Features/App Intents/TerminalEntity.swift b/macos/Sources/Features/App Intents/TerminalEntity.swift new file mode 100644 index 000000000..dabfa25ad --- /dev/null +++ b/macos/Sources/Features/App Intents/TerminalEntity.swift @@ -0,0 +1,67 @@ +import AppKit +import AppIntents + +struct TerminalEntity: AppEntity { + let id: UUID + + @Property(title: "Title") + var title: String + + static var typeDisplayRepresentation: TypeDisplayRepresentation { + TypeDisplayRepresentation(name: "Terminal") + } + + var displayRepresentation: DisplayRepresentation { + DisplayRepresentation(title: "\(title)") + } + + static var defaultQuery = TerminalQuery() + + init(_ view: Ghostty.SurfaceView) { + self.id = view.uuid + self.title = view.title + } +} + +struct TerminalQuery: EntityStringQuery, EnumerableEntityQuery { + @MainActor + func entities(for identifiers: [TerminalEntity.ID]) async throws -> [TerminalEntity] { + return all.filter { + identifiers.contains($0.uuid) + }.map { + TerminalEntity($0) + } + } + + @MainActor + func entities(matching string: String) async throws -> [TerminalEntity] { + return all.filter { + $0.title.localizedCaseInsensitiveContains(string) + }.map { + TerminalEntity($0) + } + } + + @MainActor + func allEntities() async throws -> [TerminalEntity] { + return all.map { TerminalEntity($0) } + } + + @MainActor + func suggestedEntities() async throws -> [TerminalEntity] { + return try await allEntities() + } + + @MainActor + private var all: [Ghostty.SurfaceView] { + // Find all of our terminal windows (includes quick terminal) + let controllers = NSApp.windows.compactMap { + $0.windowController as? BaseTerminalController + } + + // Get all our surfaces + return controllers.reduce([]) { result, c in + result + (c.surfaceTree.root?.leaves() ?? []) + } + } +} From 93f0ee2089c4642813d9002faa100a592027643f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Jun 2025 10:39:15 -0700 Subject: [PATCH 246/371] macos: GetTerminalDetails intent --- macos/Ghostty.xcodeproj/project.pbxproj | 4 ++ .../GetTerminalDetailsIntent.swift | 65 +++++++++++++++++++ .../Features/App Intents/TerminalEntity.swift | 26 +++++++- .../Sources/Ghostty/SurfaceView_AppKit.swift | 26 +++++++- .../Helpers/Extensions/NSView+Extension.swift | 19 ++++++ 5 files changed, 136 insertions(+), 4 deletions(-) create mode 100644 macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 913ce1995..7bac50670 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -123,6 +123,7 @@ A5E4082E2E0237460035FEAC /* NewTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */; }; A5E408302E0271320035FEAC /* GhosttyIntentError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */; }; A5E408322E02FEDF0035FEAC /* TerminalEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */; }; + A5E408342E0320140035FEAC /* GetTerminalDetailsIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */; }; A5FEB3002ABB69450068369E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FEB2FF2ABB69450068369E /* main.swift */; }; AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */; }; C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; @@ -246,6 +247,7 @@ A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTerminalIntent.swift; sourceTree = ""; }; A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyIntentError.swift; sourceTree = ""; }; A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalEntity.swift; sourceTree = ""; }; + A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetTerminalDetailsIntent.swift; sourceTree = ""; }; A5FEB2FF2ABB69450068369E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPasteboard+Extension.swift"; sourceTree = ""; }; C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSColor+Extension.swift"; sourceTree = ""; }; @@ -610,6 +612,7 @@ children = ( A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */, A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */, + A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */, A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */, ); path = "App Intents"; @@ -754,6 +757,7 @@ C1F26EA72B738B9900404083 /* NSView+Extension.swift in Sources */, A586366F2DF25D8600E04A10 /* Duration+Extension.swift in Sources */, A5CF66D42D289CEE00139794 /* NSEvent+Extension.swift in Sources */, + A5E408342E0320140035FEAC /* GetTerminalDetailsIntent.swift in Sources */, A5CBD0642CA122E70017A1AE /* QuickTerminalPosition.swift in Sources */, A596309C2AEE1C9E00D64628 /* TerminalController.swift in Sources */, A5E408322E02FEDF0035FEAC /* TerminalEntity.swift in Sources */, diff --git a/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift b/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift new file mode 100644 index 000000000..a57ad3ac4 --- /dev/null +++ b/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift @@ -0,0 +1,65 @@ +import AppKit +import AppIntents + +/// App intent that retrieves details about a specific terminal. +struct GetTerminalDetailsIntent: AppIntent { + static var title: LocalizedStringResource = "Get Details of Terminal" + + @Parameter( + title: "Detail", + description: "The detail to extract about a terminal." + ) + var detail: TerminalDetail + + @Parameter( + title: "Terminal", + description: "The terminal to extract information about." + ) + var terminal: TerminalEntity + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = .background + + static var parameterSummary: some ParameterSummary { + Summary("Get \(\.$detail) from \(\.$terminal)") + } + + @MainActor + func perform() async throws -> some IntentResult & ReturnsValue { + switch detail { + case .title: return .result(value: terminal.title) + case .workingDirectory: return .result(value: terminal.workingDirectory) + case .allContents: + guard let view = terminal.surfaceView else { return .result(value: nil) } + return .result(value: view.cachedScreenContents.get()) + case .selectedText: + guard let view = terminal.surfaceView else { return .result(value: nil) } + return .result(value: view.accessibilitySelectedText()) + case .visibleText: + guard let view = terminal.surfaceView else { return .result(value: nil) } + return .result(value: view.cachedVisibleContents.get()) + } + } +} + +// MARK: TerminalDetail + +enum TerminalDetail: String { + case title + case workingDirectory + case allContents + case selectedText + case visibleText +} + +extension TerminalDetail: AppEnum { + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Terminal Detail") + + static var caseDisplayRepresentations: [Self: DisplayRepresentation] = [ + .title: .init(title: "Title"), + .workingDirectory: .init(title: "Working Directory"), + .allContents: .init(title: "Full Contents"), + .selectedText: .init(title: "Selected Text"), + .visibleText: .init(title: "Visible Text"), + ] +} diff --git a/macos/Sources/Features/App Intents/TerminalEntity.swift b/macos/Sources/Features/App Intents/TerminalEntity.swift index dabfa25ad..0d2832bf5 100644 --- a/macos/Sources/Features/App Intents/TerminalEntity.swift +++ b/macos/Sources/Features/App Intents/TerminalEntity.swift @@ -1,5 +1,6 @@ import AppKit import AppIntents +import SwiftUI struct TerminalEntity: AppEntity { let id: UUID @@ -7,12 +8,31 @@ struct TerminalEntity: AppEntity { @Property(title: "Title") var title: String + @Property(title: "Working Directory") + var workingDirectory: String? + + var screenshot: Image? + static var typeDisplayRepresentation: TypeDisplayRepresentation { TypeDisplayRepresentation(name: "Terminal") } + @MainActor var displayRepresentation: DisplayRepresentation { - DisplayRepresentation(title: "\(title)") + var rep = DisplayRepresentation(title: "\(title)") + if let screenshot, + let nsImage = ImageRenderer(content: screenshot).nsImage, + let data = nsImage.tiffRepresentation { + rep.image = .init(data: data) + } + + return rep + } + + /// Returns the view associated with this entity. This may no longer exist. + @MainActor + var surfaceView: Ghostty.SurfaceView? { + Self.defaultQuery.all.first { $0.uuid == self.id } } static var defaultQuery = TerminalQuery() @@ -20,6 +40,8 @@ struct TerminalEntity: AppEntity { init(_ view: Ghostty.SurfaceView) { self.id = view.uuid self.title = view.title + self.workingDirectory = view.pwd + self.screenshot = view.screenshot() } } @@ -53,7 +75,7 @@ struct TerminalQuery: EntityStringQuery, EnumerableEntityQuery { } @MainActor - private var all: [Ghostty.SurfaceView] { + var all: [Ghostty.SurfaceView] { // Find all of our terminal windows (includes quick terminal) let controllers = NSApp.windows.compactMap { $0.windowController as? BaseTerminalController diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index a47dbdaca..131e39ba7 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -139,7 +139,8 @@ extension Ghostty { private var titleFromTerminal: String? // The cached contents of the screen. - private var cachedScreenContents: CachedValue + private(set) var cachedScreenContents: CachedValue + private(set) var cachedVisibleContents: CachedValue /// Event monitor (see individual events for why) private var eventMonitor: Any? = nil @@ -166,6 +167,7 @@ extension Ghostty { // it back up later so we can reference `self`. This is a hack we should // fix at some point. self.cachedScreenContents = .init(duration: .milliseconds(500)) { "" } + self.cachedVisibleContents = self.cachedScreenContents // Initialize with some default frame size. The important thing is that this // is non-zero so that our layer bounds are non-zero so that our renderer @@ -193,6 +195,26 @@ extension Ghostty { defer { ghostty_surface_free_text(surface, &text) } return String(cString: text.text) } + cachedVisibleContents = .init(duration: .milliseconds(500)) { [weak self] in + guard let self else { return "" } + guard let surface = self.surface else { return "" } + var text = ghostty_text_s() + let sel = ghostty_selection_s( + top_left: ghostty_point_s( + tag: GHOSTTY_POINT_VIEWPORT, + coord: GHOSTTY_POINT_COORD_TOP_LEFT, + x: 0, + y: 0), + bottom_right: ghostty_point_s( + tag: GHOSTTY_POINT_VIEWPORT, + coord: GHOSTTY_POINT_COORD_BOTTOM_RIGHT, + x: 0, + y: 0), + rectangle: false) + guard ghostty_surface_read_text(surface, sel, &text) else { return "" } + defer { ghostty_surface_free_text(surface, &text) } + return String(cString: text.text) + } // Set a timer to show the ghost emoji after 500ms if no title is set titleFallbackTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] _ in @@ -1979,7 +2001,7 @@ extension Ghostty.SurfaceView { /// Caches a value for some period of time, evicting it automatically when that time expires. /// We use this to cache our surface content. This probably should be extracted some day /// to a more generic helper. -fileprivate class CachedValue { +class CachedValue { private var value: T? private let fetch: () -> T private let duration: Duration diff --git a/macos/Sources/Helpers/Extensions/NSView+Extension.swift b/macos/Sources/Helpers/Extensions/NSView+Extension.swift index b3628d406..fb209e4ac 100644 --- a/macos/Sources/Helpers/Extensions/NSView+Extension.swift +++ b/macos/Sources/Helpers/Extensions/NSView+Extension.swift @@ -1,4 +1,5 @@ import AppKit +import SwiftUI extension NSView { /// Returns true if this view is currently in the responder chain @@ -15,6 +16,24 @@ extension NSView { } } +// MARK: Screenshot + +extension NSView { + /// Take a screenshot of just this view. + func screenshot() -> NSImage? { + guard let bitmapRep = bitmapImageRepForCachingDisplay(in: bounds) else { return nil } + cacheDisplay(in: bounds, to: bitmapRep) + let image = NSImage(size: bounds.size) + image.addRepresentation(bitmapRep) + return image + } + + func screenshot() -> Image? { + guard let nsImage: NSImage = self.screenshot() else { return nil } + return Image(nsImage: nsImage) + } +} + // MARK: View Traversal and Search extension NSView { From e51a93ee7cb859cf3c312293282dde31a0cc55d1 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Jun 2025 11:14:47 -0700 Subject: [PATCH 247/371] macos: Terminal entity has screen contents deferred --- .../Features/App Intents/TerminalEntity.swift | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/macos/Sources/Features/App Intents/TerminalEntity.swift b/macos/Sources/Features/App Intents/TerminalEntity.swift index 0d2832bf5..3aea691fe 100644 --- a/macos/Sources/Features/App Intents/TerminalEntity.swift +++ b/macos/Sources/Features/App Intents/TerminalEntity.swift @@ -11,6 +11,26 @@ struct TerminalEntity: AppEntity { @Property(title: "Working Directory") var workingDirectory: String? + @MainActor + @DeferredProperty(title: "Full Contents") + @available(macOS 26.0, *) + var screenContents: String? { + get async { + guard let surfaceView else { return nil } + return surfaceView.cachedScreenContents.get() + } + } + + @MainActor + @DeferredProperty(title: "Visible Contents") + @available(macOS 26.0, *) + var visibleContents: String? { + get async { + guard let surfaceView else { return nil } + return surfaceView.cachedVisibleContents.get() + } + } + var screenshot: Image? static var typeDisplayRepresentation: TypeDisplayRepresentation { From b8d44637547cf8041f490e9fac4931d33ff51900 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Jun 2025 11:37:11 -0700 Subject: [PATCH 248/371] macos: terminal not found should be an error --- .../Features/App Intents/GetTerminalDetailsIntent.swift | 6 +++--- macos/Sources/Features/App Intents/GhosttyIntentError.swift | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift b/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift index a57ad3ac4..5c41908f4 100644 --- a/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift +++ b/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift @@ -30,13 +30,13 @@ struct GetTerminalDetailsIntent: AppIntent { case .title: return .result(value: terminal.title) case .workingDirectory: return .result(value: terminal.workingDirectory) case .allContents: - guard let view = terminal.surfaceView else { return .result(value: nil) } + guard let view = terminal.surfaceView else { throw GhosttyIntentError.surfaceNotFound } return .result(value: view.cachedScreenContents.get()) case .selectedText: - guard let view = terminal.surfaceView else { return .result(value: nil) } + guard let view = terminal.surfaceView else { throw GhosttyIntentError.surfaceNotFound } return .result(value: view.accessibilitySelectedText()) case .visibleText: - guard let view = terminal.surfaceView else { return .result(value: nil) } + guard let view = terminal.surfaceView else { throw GhosttyIntentError.surfaceNotFound } return .result(value: view.cachedVisibleContents.get()) } } diff --git a/macos/Sources/Features/App Intents/GhosttyIntentError.swift b/macos/Sources/Features/App Intents/GhosttyIntentError.swift index a04db1e6f..34a0636d9 100644 --- a/macos/Sources/Features/App Intents/GhosttyIntentError.swift +++ b/macos/Sources/Features/App Intents/GhosttyIntentError.swift @@ -1,9 +1,11 @@ enum GhosttyIntentError: Error, CustomLocalizedStringResourceConvertible { case appUnavailable + case surfaceNotFound var localizedStringResource: LocalizedStringResource { switch self { case .appUnavailable: return "The Ghostty app isn't properly initialized." + case .surfaceNotFound: return "The terminal no longer exists." } } } From 683b38f62ca4032bb3c0880c3857b70c6707fd91 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Jun 2025 19:37:41 -0700 Subject: [PATCH 249/371] macos: can specify parent terminal for new terminal intent --- .../App Intents/NewTerminalIntent.swift | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/macos/Sources/Features/App Intents/NewTerminalIntent.swift b/macos/Sources/Features/App Intents/NewTerminalIntent.swift index c54d31c09..51b037cca 100644 --- a/macos/Sources/Features/App Intents/NewTerminalIntent.swift +++ b/macos/Sources/Features/App Intents/NewTerminalIntent.swift @@ -23,16 +23,18 @@ struct NewTerminalIntent: AppIntent { ) var workingDirectory: IntentFile? + @Parameter( + title: "Parent Terminal", + description: "The terminal to inherit the base configuration from." + ) + var parent: TerminalEntity? + @available(macOS 26.0, *) static var supportedModes: IntentModes = .foreground(.immediate) @available(macOS, obsoleted: 26.0, message: "Replaced by supportedModes") static var openAppWhenRun = true - static var parameterSummary: some ParameterSummary { - Summary("New Terminal \(\.$location)") - } - @MainActor func perform() async throws -> some IntentResult { guard let appDelegate = NSApp.delegate as? AppDelegate else { @@ -47,16 +49,31 @@ struct NewTerminalIntent: AppIntent { config.workingDirectory = dir.path(percentEncoded: false) } + // Determine if we have a parent and get it + let parent: Ghostty.SurfaceView? + if let parentParam = self.parent { + guard let view = parentParam.surfaceView else { + throw GhosttyIntentError.surfaceNotFound + } + + parent = view + } else if let preferred = TerminalController.preferredParent { + parent = preferred.focusedSurface ?? preferred.surfaceTree.root?.leftmostLeaf() + } else { + parent = nil + } + switch location { case .window: _ = TerminalController.newWindow( appDelegate.ghostty, - withBaseConfig: config) + withBaseConfig: config, + withParent: parent?.window) case .tab: _ = TerminalController.newTab( appDelegate.ghostty, - from: TerminalController.preferredParent?.window, + from: parent?.window, withBaseConfig: config) } From bbb69c8f27273247cc8e838aef5075cc258575d9 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 18 Jun 2025 19:50:05 -0700 Subject: [PATCH 250/371] macos: NewTerminalIntent returns Terminal, can split --- .../App Intents/NewTerminalIntent.swift | 58 +++++++++++++++-- .../Terminal/BaseTerminalController.swift | 65 ++++++++++++------- 2 files changed, 93 insertions(+), 30 deletions(-) diff --git a/macos/Sources/Features/App Intents/NewTerminalIntent.swift b/macos/Sources/Features/App Intents/NewTerminalIntent.swift index 51b037cca..55f33bd46 100644 --- a/macos/Sources/Features/App Intents/NewTerminalIntent.swift +++ b/macos/Sources/Features/App Intents/NewTerminalIntent.swift @@ -1,5 +1,6 @@ import AppKit import AppIntents +import GhosttyKit /// App intent that allows creating a new terminal window or tab. /// @@ -16,6 +17,12 @@ struct NewTerminalIntent: AppIntent { ) var location: NewTerminalLocation + @Parameter( + title: "Command", + description: "Command to execute instead of the default shell." + ) + var command: String? + @Parameter( title: "Working Directory", description: "The working directory to open in the terminal.", @@ -36,12 +43,14 @@ struct NewTerminalIntent: AppIntent { static var openAppWhenRun = true @MainActor - func perform() async throws -> some IntentResult { + func perform() async throws -> some IntentResult & ReturnsValue { guard let appDelegate = NSApp.delegate as? AppDelegate else { throw GhosttyIntentError.appUnavailable } + let ghostty = appDelegate.ghostty var config = Ghostty.SurfaceConfiguration() + config.command = command // If we were given a working directory then open that directory if let url = workingDirectory?.fileURL { @@ -65,19 +74,38 @@ struct NewTerminalIntent: AppIntent { switch location { case .window: - _ = TerminalController.newWindow( - appDelegate.ghostty, + let newController = TerminalController.newWindow( + ghostty, withBaseConfig: config, withParent: parent?.window) + if let view = newController.surfaceTree.root?.leftmostLeaf() { + return .result(value: TerminalEntity(view)) + } case .tab: - _ = TerminalController.newTab( - appDelegate.ghostty, + let newController = TerminalController.newTab( + ghostty, from: parent?.window, withBaseConfig: config) + if let view = newController?.surfaceTree.root?.leftmostLeaf() { + return .result(value: TerminalEntity(view)) + } + + case .splitLeft, .splitRight, .splitUp, .splitDown: + guard let parent, + let controller = parent.window?.windowController as? BaseTerminalController else { + throw GhosttyIntentError.surfaceNotFound + } + + if let view = controller.newSplit( + at: parent, + direction: location.splitDirection! + ) { + return .result(value: TerminalEntity(view)) + } } - return .result() + return .result(value: .none) } } @@ -86,6 +114,20 @@ struct NewTerminalIntent: AppIntent { enum NewTerminalLocation: String { case tab case window + case splitLeft = "split:left" + case splitRight = "split:right" + case splitUp = "split:up" + case splitDown = "split:down" + + var splitDirection: SplitTree.NewDirection? { + switch self { + case .splitLeft: return .left + case .splitRight: return .right + case .splitUp: return .up + case .splitDown: return .down + default: return nil + } + } } extension NewTerminalLocation: AppEnum { @@ -94,5 +136,9 @@ extension NewTerminalLocation: AppEnum { static var caseDisplayRepresentations: [Self: DisplayRepresentation] = [ .tab: .init(title: "Tab"), .window: .init(title: "Window"), + .splitLeft: .init(title: "Split Left"), + .splitRight: .init(title: "Split Right"), + .splitUp: .init(title: "Split Up"), + .splitDown: .init(title: "Split Down"), ] } diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index bc91b920e..81b7d32b6 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -193,6 +193,46 @@ class BaseTerminalController: NSWindowController, } } + // MARK: Methods + + /// Create a new split. + @discardableResult + func newSplit( + at oldView: Ghostty.SurfaceView, + direction: SplitTree.NewDirection, + baseConfig config: Ghostty.SurfaceConfiguration? = nil + ) -> Ghostty.SurfaceView? { + // We can only create new splits for surfaces in our tree. + guard surfaceTree.root?.node(view: oldView) != nil else { return nil } + + // Create a new surface view + guard let ghostty_app = ghostty.app else { return nil } + let newView = Ghostty.SurfaceView(ghostty_app, baseConfig: config) + + // Do the split + let newTree: SplitTree + do { + newTree = try surfaceTree.insert( + view: newView, + at: oldView, + direction: direction) + } catch { + // If splitting fails for any reason (it should not), then we just log + // and return. The new view we created will be deinitialized and its + // no big deal. + Ghostty.logger.warning("failed to insert split: \(error)") + return nil + } + + replaceSurfaceTree( + newTree, + moveFocusTo: newView, + moveFocusFrom: oldView, + undoAction: "New Split") + + return newView + } + /// Called when the surfaceTree variable changed. /// /// Subclasses should call super first. @@ -477,30 +517,7 @@ class BaseTerminalController: NSWindowController, default: return } - // Create a new surface view - guard let ghostty_app = ghostty.app else { return } - let newView = Ghostty.SurfaceView(ghostty_app, baseConfig: config) - - // Do the split - let newTree: SplitTree - do { - newTree = try surfaceTree.insert( - view: newView, - at: oldView, - direction: splitDirection) - } catch { - // If splitting fails for any reason (it should not), then we just log - // and return. The new view we created will be deinitialized and its - // no big deal. - Ghostty.logger.warning("failed to insert split: \(error)") - return - } - - replaceSurfaceTree( - newTree, - moveFocusTo: newView, - moveFocusFrom: oldView, - undoAction: "New Split") + newSplit(at: oldView, direction: splitDirection, baseConfig: config) } @objc private func ghosttyDidEqualizeSplits(_ notification: Notification) { From 5259d0fa55e8f60db8632cf47dab98744eb730ba Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 07:07:32 -0700 Subject: [PATCH 251/371] macos: starting to work on new libghostty data models --- macos/Ghostty.xcodeproj/project.pbxproj | 16 +++-- .../TerminalCommandPalette.swift | 38 ++++------- macos/Sources/Ghostty/AppError.swift | 3 - macos/Sources/Ghostty/Ghostty.Command.swift | 46 +++++++++++++ macos/Sources/Ghostty/Ghostty.Error.swift | 12 ++++ macos/Sources/Ghostty/Ghostty.Surface.swift | 64 +++++++++++++++++++ macos/Sources/Ghostty/Package.swift | 9 +++ macos/Sources/Ghostty/SurfaceView.swift | 4 +- .../Sources/Ghostty/SurfaceView_AppKit.swift | 21 +++--- src/apprt/embedded.zig | 4 +- 10 files changed, 171 insertions(+), 46 deletions(-) delete mode 100644 macos/Sources/Ghostty/AppError.swift create mode 100644 macos/Sources/Ghostty/Ghostty.Command.swift create mode 100644 macos/Sources/Ghostty/Ghostty.Error.swift create mode 100644 macos/Sources/Ghostty/Ghostty.Surface.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 7bac50670..db2c9d893 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -53,7 +53,6 @@ A54B0CED2D0CFB7700CBEFF8 /* ColorizedGhosttyIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54B0CEC2D0CFB7300CBEFF8 /* ColorizedGhosttyIcon.swift */; }; A54B0CEF2D0D2E2800CBEFF8 /* ColorizedGhosttyIconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54B0CEE2D0D2E2400CBEFF8 /* ColorizedGhosttyIconImage.swift */; }; A54D786C2CA7978E001B19B1 /* BaseTerminalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54D786B2CA79788001B19B1 /* BaseTerminalController.swift */; }; - A55685E029A03A9F004303CE /* AppError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55685DF29A03A9F004303CE /* AppError.swift */; }; A5593FDF2DF8D57C00B47B10 /* TerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */; }; A5593FE12DF8D74000B47B10 /* HiddenTitlebarTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */; }; A5593FE32DF8D78600B47B10 /* TerminalHiddenTitlebar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */; }; @@ -124,6 +123,9 @@ A5E408302E0271320035FEAC /* GhosttyIntentError.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */; }; A5E408322E02FEDF0035FEAC /* TerminalEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */; }; A5E408342E0320140035FEAC /* GetTerminalDetailsIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */; }; + A5E408382E03C7DA0035FEAC /* Ghostty.Surface.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408372E03C7D80035FEAC /* Ghostty.Surface.swift */; }; + A5E4083A2E0449BD0035FEAC /* Ghostty.Command.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408392E0449BB0035FEAC /* Ghostty.Command.swift */; }; + A5E4083C2E044DB50035FEAC /* Ghostty.Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4083B2E044DB40035FEAC /* Ghostty.Error.swift */; }; A5FEB3002ABB69450068369E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FEB2FF2ABB69450068369E /* main.swift */; }; AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */; }; C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; @@ -175,7 +177,6 @@ A54B0CEC2D0CFB7300CBEFF8 /* ColorizedGhosttyIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorizedGhosttyIcon.swift; sourceTree = ""; }; A54B0CEE2D0D2E2400CBEFF8 /* ColorizedGhosttyIconImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorizedGhosttyIconImage.swift; sourceTree = ""; }; A54D786B2CA79788001B19B1 /* BaseTerminalController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTerminalController.swift; sourceTree = ""; }; - A55685DF29A03A9F004303CE /* AppError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppError.swift; sourceTree = ""; }; A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalWindow.swift; sourceTree = ""; }; A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HiddenTitlebarTerminalWindow.swift; sourceTree = ""; }; A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalHiddenTitlebar.xib; sourceTree = ""; }; @@ -248,6 +249,9 @@ A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GhosttyIntentError.swift; sourceTree = ""; }; A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TerminalEntity.swift; sourceTree = ""; }; A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetTerminalDetailsIntent.swift; sourceTree = ""; }; + A5E408372E03C7D80035FEAC /* Ghostty.Surface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Surface.swift; sourceTree = ""; }; + A5E408392E0449BB0035FEAC /* Ghostty.Command.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Command.swift; sourceTree = ""; }; + A5E4083B2E044DB40035FEAC /* Ghostty.Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Error.swift; sourceTree = ""; }; A5FEB2FF2ABB69450068369E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPasteboard+Extension.swift"; sourceTree = ""; }; C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSColor+Extension.swift"; sourceTree = ""; }; @@ -440,12 +444,14 @@ A5333E152B59DE8E008AEFF7 /* SurfaceView_UIKit.swift */, A59FB5CE2AE0DB50009128F3 /* InspectorView.swift */, A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */, + A5E408392E0449BB0035FEAC /* Ghostty.Command.swift */, A514C8D52B54A16400493A16 /* Ghostty.Config.swift */, A53A6C022CCC1B7D00943E98 /* Ghostty.Action.swift */, + A5E4083B2E044DB40035FEAC /* Ghostty.Error.swift */, A5CF66D62D29DDB100139794 /* Ghostty.Event.swift */, A5278A9A2AA05B2600CD3039 /* Ghostty.Input.swift */, A56D58852ACDDB4100508D2C /* Ghostty.Shell.swift */, - A55685DF29A03A9F004303CE /* AppError.swift */, + A5E408372E03C7D80035FEAC /* Ghostty.Surface.swift */, A52FFF5A2CAA54A8000C6A5B /* FullscreenMode+Extension.swift */, A5CF66D32D289CEA00139794 /* NSEvent+Extension.swift */, ); @@ -766,6 +772,7 @@ A5CBD0602CA0C90A0017A1AE /* QuickTerminalWindow.swift in Sources */, A5CBD05E2CA0C5EC0017A1AE /* QuickTerminalController.swift in Sources */, A5CF66D72D29DDB500139794 /* Ghostty.Event.swift in Sources */, + A5E408382E03C7DA0035FEAC /* Ghostty.Surface.swift in Sources */, A5593FE72DF927D200B47B10 /* TransparentTitlebarTerminalWindow.swift in Sources */, A5A2A3CA2D4445E30033CF96 /* Dock.swift in Sources */, A586365F2DEE6C2300E04A10 /* SplitTree.swift in Sources */, @@ -800,6 +807,7 @@ A5985CD72C320C4500C57AD3 /* String+Extension.swift in Sources */, A5A2A3CC2D444ABB0033CF96 /* NSApplication+Extension.swift in Sources */, A5E408302E0271320035FEAC /* GhosttyIntentError.swift in Sources */, + A5E4083A2E0449BD0035FEAC /* Ghostty.Command.swift in Sources */, A5FEB3002ABB69450068369E /* main.swift in Sources */, A53A297F2DB4480F00B6E02C /* EventModifiers+Extension.swift in Sources */, A5E4082E2E0237460035FEAC /* NewTerminalIntent.swift in Sources */, @@ -809,13 +817,13 @@ A57D79272C9C879B001D522E /* SecureInput.swift in Sources */, A5CEAFDC29B8009000646FDA /* SplitView.swift in Sources */, A5593FE12DF8D74000B47B10 /* HiddenTitlebarTerminalWindow.swift in Sources */, + A5E4083C2E044DB50035FEAC /* Ghostty.Error.swift in Sources */, A5CDF1932AAF9E0800513312 /* ConfigurationErrorsController.swift in Sources */, A53A6C032CCC1B7F00943E98 /* Ghostty.Action.swift in Sources */, A54B0CED2D0CFB7700CBEFF8 /* ColorizedGhosttyIcon.swift in Sources */, A5CA378C2D2A4DEB00931030 /* KeyboardLayout.swift in Sources */, A54B0CEF2D0D2E2800CBEFF8 /* ColorizedGhosttyIconImage.swift in Sources */, A59FB5D12AE0DEA7009128F3 /* MetalView.swift in Sources */, - A55685E029A03A9F004303CE /* AppError.swift in Sources */, A599CDB02CF103F60049FA26 /* NSAppearance+Extension.swift in Sources */, A52FFF572CA90484000C6A5B /* QuickTerminalScreen.swift in Sources */, A5CC36132C9CD72D004D6760 /* SecureInputOverlay.swift in Sources */, diff --git a/macos/Sources/Features/Command Palette/TerminalCommandPalette.swift b/macos/Sources/Features/Command Palette/TerminalCommandPalette.swift index 47f2baf23..d02828494 100644 --- a/macos/Sources/Features/Command Palette/TerminalCommandPalette.swift +++ b/macos/Sources/Features/Command Palette/TerminalCommandPalette.swift @@ -17,33 +17,19 @@ struct TerminalCommandPaletteView: View { // The commands available to the command palette. private var commandOptions: [CommandOption] { - guard let surface = surfaceView.surface else { return [] } - - var ptr: UnsafeMutablePointer? = nil - var count: Int = 0 - ghostty_surface_commands(surface, &ptr, &count) - guard let ptr else { return [] } - - let buffer = UnsafeBufferPointer(start: ptr, count: count) - return Array(buffer).filter { c in - let key = String(cString: c.action_key) - switch (key) { - case "toggle_tab_overview", - "toggle_window_decorations", - "show_gtk_inspector": - return false - default: - return true - } - }.map { c in - let action = String(cString: c.action) - return CommandOption( - title: String(cString: c.title), - description: String(cString: c.description), - symbols: ghosttyConfig.keyboardShortcut(for: action)?.keyList - ) { - onAction(action) + guard let surface = surfaceView.surfaceModel else { return [] } + do { + return try surface.commands().map { c in + return CommandOption( + title: c.title, + description: c.description, + symbols: ghosttyConfig.keyboardShortcut(for: c.action)?.keyList + ) { + onAction(c.action) + } } + } catch { + return [] } } diff --git a/macos/Sources/Ghostty/AppError.swift b/macos/Sources/Ghostty/AppError.swift deleted file mode 100644 index 55f191d3d..000000000 --- a/macos/Sources/Ghostty/AppError.swift +++ /dev/null @@ -1,3 +0,0 @@ -enum AppError: Error { - case surfaceCreateError -} diff --git a/macos/Sources/Ghostty/Ghostty.Command.swift b/macos/Sources/Ghostty/Ghostty.Command.swift new file mode 100644 index 000000000..1479ae92d --- /dev/null +++ b/macos/Sources/Ghostty/Ghostty.Command.swift @@ -0,0 +1,46 @@ +import GhosttyKit + +extension Ghostty { + /// `ghostty_command_s` + struct Command: Sendable { + private let cValue: ghostty_command_s + + /// The title of the command. + var title: String { + String(cString: cValue.title) + } + + /// Human-friendly description of what this command will do. + var description: String { + String(cString: cValue.description) + } + + /// The full action that must be performed to invoke this command. + var action: String { + String(cString: cValue.action) + } + + /// Only the key portion of the action so you can compare action types, e.g. `goto_split` + /// instead of `goto_split:left`. + var actionKey: String { + String(cString: cValue.action_key) + } + + /// True if this can be performed on this target. + var isSupported: Bool { + !Self.unsupportedActionKeys.contains(actionKey) + } + + /// Unsupported action keys, because they either don't make sense in the context of our + /// target platform or they just aren't implemented yet. + static let unsupportedActionKeys: [String] = [ + "toggle_tab_overview", + "toggle_window_decorations", + "show_gtk_inspector", + ] + + init(cValue: ghostty_command_s) { + self.cValue = cValue + } + } +} diff --git a/macos/Sources/Ghostty/Ghostty.Error.swift b/macos/Sources/Ghostty/Ghostty.Error.swift new file mode 100644 index 000000000..66f6857bf --- /dev/null +++ b/macos/Sources/Ghostty/Ghostty.Error.swift @@ -0,0 +1,12 @@ +extension Ghostty { + /// Possible errors from internal Ghostty calls. + enum Error: Swift.Error, CustomLocalizedStringResourceConvertible { + case apiFailed + + var localizedStringResource: LocalizedStringResource { + switch self { + case .apiFailed: return "libghostty API call failed" + } + } + } +} diff --git a/macos/Sources/Ghostty/Ghostty.Surface.swift b/macos/Sources/Ghostty/Ghostty.Surface.swift new file mode 100644 index 000000000..5560ff3a8 --- /dev/null +++ b/macos/Sources/Ghostty/Ghostty.Surface.swift @@ -0,0 +1,64 @@ +import GhosttyKit + +extension Ghostty { + /// Represents a single surface within Ghostty. + /// + /// NOTE(mitchellh): This is a work-in-progress class as part of a general refactor + /// of our Ghostty data model. At the time of writing there's still a ton of surface + /// functionality that is not encapsulated in this class. It is planned to migrate that + /// all over. + /// + /// Wraps a `ghostty_surface_t` + final class Surface: Sendable { + private let surface: ghostty_surface_t + + /// Read the underlying C value for this surface. This is unsafe because the value will be + /// freed when the Surface class is deinitialized. + var unsafeCValue: ghostty_surface_t { + surface + } + + /// Initialize from the C structure. + init(cSurface: ghostty_surface_t) { + self.surface = cSurface + } + + deinit { + // deinit is not guaranteed to happen on the main actor and our API + // calls into libghostty must happen there so we capture the surface + // value so we don't capture `self` and then we detach it in a task. + // We can't wait for the task to succeed so this will happen sometime + // but that's okay. + let surface = self.surface + Task.detached { @MainActor in + ghostty_surface_free(surface) + } + } + + /// Perform a keybinding action. + /// + /// The action can be any valid keybind parameter. e.g. `keybind = goto_tab:4` + /// you can perform `goto_tab:4` with this. + /// + /// Returns true if the action was performed. Invalid actions return false. + @MainActor + func perform(action: String) -> Bool { + let len = action.utf8CString.count + if (len == 0) { return false } + return action.withCString { cString in + ghostty_surface_binding_action(surface, cString, UInt(len - 1)) + } + } + + /// Command options for this surface. + @MainActor + func commands() throws -> [Command] { + var ptr: UnsafeMutablePointer? = nil + var count: Int = 0 + ghostty_surface_commands(surface, &ptr, &count) + guard let ptr else { throw Error.apiFailed } + let buffer = UnsafeBufferPointer(start: ptr, count: count) + return Array(buffer).map { Command(cValue: $0) }.filter { $0.isSupported } + } + } +} diff --git a/macos/Sources/Ghostty/Package.swift b/macos/Sources/Ghostty/Package.swift index 82721c17e..125a09825 100644 --- a/macos/Sources/Ghostty/Package.swift +++ b/macos/Sources/Ghostty/Package.swift @@ -19,6 +19,15 @@ struct Ghostty { static let userNotificationActionShow = "com.mitchellh.ghostty.userNotification.Show" } +// MARK: C Extensions + +/// A command is fully self-contained so it is Sendable. +extension ghostty_command_s: @unchecked @retroactive Sendable {} + +/// A surface is sendable because it is just a reference type. Using the surface in parameters +/// may be unsafe but the value itself is safe to send across threads. +extension ghostty_surface_t: @unchecked @retroactive Sendable {} + // MARK: Build Info extension Ghostty { diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index f830da4ef..371e4ff41 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -79,7 +79,7 @@ extension Ghostty { let pubResign = center.publisher(for: NSWindow.didResignKeyNotification) #endif - Surface(view: surfaceView, size: geo.size) + SurfaceRepresentable(view: surfaceView, size: geo.size) .focused($surfaceFocus) .focusedValue(\.ghosttySurfacePwd, surfaceView.pwd) .focusedValue(\.ghosttySurfaceView, surfaceView) @@ -381,7 +381,7 @@ extension Ghostty { /// We just wrap an AppKit NSView here at the moment so that we can behave as low level as possible /// since that is what the Metal renderer in Ghostty expects. In the future, it may make more sense to /// wrap an MTKView and use that, but for legacy reasons we didn't do that to begin with. - struct Surface: OSViewRepresentable { + struct SurfaceRepresentable: OSViewRepresentable { /// The view to render for the terminal surface. let view: SurfaceView diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 131e39ba7..fe0851261 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -115,10 +115,20 @@ extension Ghostty { } } + /// Returns the data model for this surface. + /// + /// Note: eventually, all surface access will be through this, but presently its in a transition + /// state so we're mixing this with direct surface access. + private(set) var surfaceModel: Ghostty.Surface? + + /// Returns the underlying C value for the surface. See "note" on surfaceModel. + var surface: ghostty_surface_t? { + surfaceModel?.unsafeCValue + } + // Notification identifiers associated with this surface var notificationIdentifiers: Set = [] - private(set) var surface: ghostty_surface_t? private var markedText: NSMutableAttributedString private(set) var focused: Bool = true private var prevPressureStage: Int = 0 @@ -282,10 +292,10 @@ extension Ghostty { let surface_cfg = baseConfig ?? SurfaceConfiguration() var surface_cfg_c = surface_cfg.ghosttyConfig(view: self) guard let surface = ghostty_surface_new(app, &surface_cfg_c) else { - self.error = AppError.surfaceCreateError + self.error = Ghostty.Error.apiFailed return } - self.surface = surface; + self.surfaceModel = Ghostty.Surface(cSurface: surface) // Setup our tracking area so we get mouse moved events updateTrackingAreas() @@ -340,11 +350,6 @@ extension Ghostty { // Remove any notifications associated with this surface let identifiers = Array(self.notificationIdentifiers) UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: identifiers) - - // Free our core surface resources - if let surface = self.surface { - ghostty_surface_free(surface) - } } func focusDidChange(_ focused: Bool) { diff --git a/src/apprt/embedded.zig b/src/apprt/embedded.zig index a61c75e96..01e287d16 100644 --- a/src/apprt/embedded.zig +++ b/src/apprt/embedded.zig @@ -1837,12 +1837,10 @@ pub const CAPI = struct { return false; }; - _ = ptr.core_surface.performBindingAction(action) catch |err| { + return ptr.core_surface.performBindingAction(action) catch |err| { log.err("error performing binding action action={} err={}", .{ action, err }); return false; }; - - return true; } /// Complete a clipboard read request started via the read callback. From 14e46d09791bed1332b93f050a58eb69d9c8350b Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 09:43:25 -0700 Subject: [PATCH 252/371] macos: InvokeCommandPaletteIntent and CommandEntity --- macos/Ghostty.xcodeproj/project.pbxproj | 18 ++- .../App Intents/CommandPaletteIntent.swift | 34 +++++ .../App Intents/Entities/CommandEntity.swift | 128 ++++++++++++++++++ .../{ => Entities}/TerminalEntity.swift | 5 + 4 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 macos/Sources/Features/App Intents/CommandPaletteIntent.swift create mode 100644 macos/Sources/Features/App Intents/Entities/CommandEntity.swift rename macos/Sources/Features/App Intents/{ => Entities}/TerminalEntity.swift (96%) diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index db2c9d893..990280397 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -126,6 +126,8 @@ A5E408382E03C7DA0035FEAC /* Ghostty.Surface.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408372E03C7D80035FEAC /* Ghostty.Surface.swift */; }; A5E4083A2E0449BD0035FEAC /* Ghostty.Command.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408392E0449BB0035FEAC /* Ghostty.Command.swift */; }; A5E4083C2E044DB50035FEAC /* Ghostty.Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4083B2E044DB40035FEAC /* Ghostty.Error.swift */; }; + A5E408402E04532C0035FEAC /* CommandEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4083F2E04532A0035FEAC /* CommandEntity.swift */; }; + A5E408432E047D0B0035FEAC /* CommandPaletteIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */; }; A5FEB3002ABB69450068369E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FEB2FF2ABB69450068369E /* main.swift */; }; AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */; }; C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; @@ -252,6 +254,8 @@ A5E408372E03C7D80035FEAC /* Ghostty.Surface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Surface.swift; sourceTree = ""; }; A5E408392E0449BB0035FEAC /* Ghostty.Command.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Command.swift; sourceTree = ""; }; A5E4083B2E044DB40035FEAC /* Ghostty.Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Error.swift; sourceTree = ""; }; + A5E4083F2E04532A0035FEAC /* CommandEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandEntity.swift; sourceTree = ""; }; + A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandPaletteIntent.swift; sourceTree = ""; }; A5FEB2FF2ABB69450068369E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPasteboard+Extension.swift"; sourceTree = ""; }; C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSColor+Extension.swift"; sourceTree = ""; }; @@ -616,14 +620,24 @@ A5E4082C2E0237270035FEAC /* App Intents */ = { isa = PBXGroup; children = ( - A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */, + A5E408412E0453370035FEAC /* Entities */, A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */, A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */, + A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */, A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */, ); path = "App Intents"; sourceTree = ""; }; + A5E408412E0453370035FEAC /* Entities */ = { + isa = PBXGroup; + children = ( + A5E408312E02FEDC0035FEAC /* TerminalEntity.swift */, + A5E4083F2E04532A0035FEAC /* CommandEntity.swift */, + ); + path = Entities; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -750,6 +764,7 @@ buildActionMask = 2147483647; files = ( A5AEB1652D5BE7D000513529 /* LastWindowPosition.swift in Sources */, + A5E408432E047D0B0035FEAC /* CommandPaletteIntent.swift in Sources */, A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */, A54B0CEB2D0CFB4C00CBEFF8 /* NSImage+Extension.swift in Sources */, A5874D9D2DAD786100E83852 /* NSWindow+Extension.swift in Sources */, @@ -827,6 +842,7 @@ A599CDB02CF103F60049FA26 /* NSAppearance+Extension.swift in Sources */, A52FFF572CA90484000C6A5B /* QuickTerminalScreen.swift in Sources */, A5CC36132C9CD72D004D6760 /* SecureInputOverlay.swift in Sources */, + A5E408402E04532C0035FEAC /* CommandEntity.swift in Sources */, A5E4082A2E022E9E0035FEAC /* TabGroupCloseCoordinator.swift in Sources */, A535B9DA299C569B0017E2E4 /* ErrorView.swift in Sources */, A53A29882DB69D2F00B6E02C /* TerminalCommandPalette.swift in Sources */, diff --git a/macos/Sources/Features/App Intents/CommandPaletteIntent.swift b/macos/Sources/Features/App Intents/CommandPaletteIntent.swift new file mode 100644 index 000000000..2c1ff3386 --- /dev/null +++ b/macos/Sources/Features/App Intents/CommandPaletteIntent.swift @@ -0,0 +1,34 @@ +import AppKit +import AppIntents + +/// App intent that invokes a command palette entry. +@available(macOS 14.0, *) +struct CommandPaletteIntent: AppIntent { + static var title: LocalizedStringResource = "Invoke Command Palette Action" + + @Parameter( + title: "Terminal", + description: "The terminal to base available commands from." + ) + var terminal: TerminalEntity + + @Parameter( + title: "Command", + description: "The command to invoke.", + optionsProvider: CommandQuery() + ) + var command: CommandEntity + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = .background + + @MainActor + func perform() async throws -> some IntentResult & ReturnsValue { + guard let surface = terminal.surfaceModel else { + throw GhosttyIntentError.surfaceNotFound + } + + let performed = surface.perform(action: command.action) + return .result(value: performed) + } +} diff --git a/macos/Sources/Features/App Intents/Entities/CommandEntity.swift b/macos/Sources/Features/App Intents/Entities/CommandEntity.swift new file mode 100644 index 000000000..f7abcc6de --- /dev/null +++ b/macos/Sources/Features/App Intents/Entities/CommandEntity.swift @@ -0,0 +1,128 @@ +import AppIntents + +// MARK: AppEntity + +@available(macOS 14.0, *) +struct CommandEntity: AppEntity { + let id: ID + + // Note: for macOS 26 we can move all the properties to @ComputedProperty. + + @Property(title: "Title") + var title: String + + @Property(title: "Description") + var description: String + + @Property(title: "Action") + var action: String + + /// The underlying data model + let command: Ghostty.Command + + /// A command identifier is a composite key based on the terminal and action. + struct ID: Hashable { + let terminalId: TerminalEntity.ID + let actionKey: String + + init(terminalId: TerminalEntity.ID, actionKey: String) { + self.terminalId = terminalId + self.actionKey = actionKey + } + } + + static var typeDisplayRepresentation: TypeDisplayRepresentation { + TypeDisplayRepresentation(name: "Command Palette Command") + } + + var displayRepresentation: DisplayRepresentation { + DisplayRepresentation( + title: LocalizedStringResource(stringLiteral: command.title), + subtitle: LocalizedStringResource(stringLiteral: command.description), + ) + } + + static var defaultQuery = CommandQuery() + + init(_ command: Ghostty.Command, for terminal: TerminalEntity) { + self.id = .init(terminalId: terminal.id, actionKey: command.actionKey) + self.command = command + self.title = command.title + self.description = command.description + self.action = command.action + } +} + +@available(macOS 14.0, *) +extension CommandEntity.ID: RawRepresentable { + var rawValue: String { + return "\(terminalId):\(actionKey)" + } + + init?(rawValue: String) { + let components = rawValue.split(separator: ":", maxSplits: 1) + guard components.count == 2 else { return nil } + + guard let terminalId = TerminalEntity.ID(uuidString: String(components[0])) else { + return nil + } + + self.terminalId = terminalId + self.actionKey = String(components[1]) + } +} + +// Required by AppEntity +@available(macOS 14.0, *) +extension CommandEntity.ID: EntityIdentifierConvertible { + static func entityIdentifier(for entityIdentifierString: String) -> CommandEntity.ID? { + .init(rawValue: entityIdentifierString) + } + + var entityIdentifierString: String { + rawValue + } +} + +// MARK: EntityQuery + +@available(macOS 14.0, *) +struct CommandQuery: EntityQuery { + // Inject our terminal parameter from our command palette intent. + @IntentParameterDependency(\.$terminal) + var commandPaletteIntent + + @MainActor + func entities(for identifiers: [CommandEntity.ID]) async throws -> [CommandEntity] { + // Extract unique terminal IDs to avoid fetching duplicates + let terminalIds = Set(identifiers.map(\.terminalId)) + let terminals = try await TerminalEntity.defaultQuery.entities(for: Array(terminalIds)) + + // Build a cache of terminals and their available commands + // This avoids repeated command fetching for the same terminal + typealias Tuple = (terminal: TerminalEntity, commands: [Ghostty.Command]) + let commandMap: [TerminalEntity.ID: Tuple] = + terminals.reduce(into: [:]) { result, terminal in + guard let commands = try? terminal.surfaceModel?.commands() else { return } + result[terminal.id] = (terminal: terminal, commands: commands) + } + + // Map each identifier to its corresponding CommandEntity. If a command doesn't + // exist it maps to nil and is removed via compactMap. + return identifiers.compactMap { id in + guard let (terminal, commands) = commandMap[id.terminalId], + let command = commands.first(where: { $0.actionKey == id.actionKey }) else { + return nil + } + + return CommandEntity(command, for: terminal) + } + } + + @MainActor + func suggestedEntities() async throws -> [CommandEntity] { + guard let terminal = commandPaletteIntent?.terminal, + let surface = terminal.surfaceModel else { return [] } + return try surface.commands().map { CommandEntity($0, for: terminal) } + } +} diff --git a/macos/Sources/Features/App Intents/TerminalEntity.swift b/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift similarity index 96% rename from macos/Sources/Features/App Intents/TerminalEntity.swift rename to macos/Sources/Features/App Intents/Entities/TerminalEntity.swift index 3aea691fe..750512d02 100644 --- a/macos/Sources/Features/App Intents/TerminalEntity.swift +++ b/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift @@ -55,6 +55,11 @@ struct TerminalEntity: AppEntity { Self.defaultQuery.all.first { $0.uuid == self.id } } + @MainActor + var surfaceModel: Ghostty.Surface? { + surfaceView?.surfaceModel + } + static var defaultQuery = TerminalQuery() init(_ view: Ghostty.SurfaceView) { From c904e86883a8567d96ab6655d28365557d77c57f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 10:47:56 -0700 Subject: [PATCH 253/371] macos: invoke keybind intent --- macos/Ghostty.xcodeproj/project.pbxproj | 4 +++ .../Features/App Intents/KeybindIntent.swift | 32 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 macos/Sources/Features/App Intents/KeybindIntent.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 990280397..a691ce55f 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -128,6 +128,7 @@ A5E4083C2E044DB50035FEAC /* Ghostty.Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4083B2E044DB40035FEAC /* Ghostty.Error.swift */; }; A5E408402E04532C0035FEAC /* CommandEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4083F2E04532A0035FEAC /* CommandEntity.swift */; }; A5E408432E047D0B0035FEAC /* CommandPaletteIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */; }; + A5E408452E0483FD0035FEAC /* KeybindIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408442E0483F80035FEAC /* KeybindIntent.swift */; }; A5FEB3002ABB69450068369E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FEB2FF2ABB69450068369E /* main.swift */; }; AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */; }; C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; @@ -256,6 +257,7 @@ A5E4083B2E044DB40035FEAC /* Ghostty.Error.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Error.swift; sourceTree = ""; }; A5E4083F2E04532A0035FEAC /* CommandEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandEntity.swift; sourceTree = ""; }; A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandPaletteIntent.swift; sourceTree = ""; }; + A5E408442E0483F80035FEAC /* KeybindIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeybindIntent.swift; sourceTree = ""; }; A5FEB2FF2ABB69450068369E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPasteboard+Extension.swift"; sourceTree = ""; }; C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSColor+Extension.swift"; sourceTree = ""; }; @@ -624,6 +626,7 @@ A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */, A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */, A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */, + A5E408442E0483F80035FEAC /* KeybindIntent.swift */, A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */, ); path = "App Intents"; @@ -823,6 +826,7 @@ A5A2A3CC2D444ABB0033CF96 /* NSApplication+Extension.swift in Sources */, A5E408302E0271320035FEAC /* GhosttyIntentError.swift in Sources */, A5E4083A2E0449BD0035FEAC /* Ghostty.Command.swift in Sources */, + A5E408452E0483FD0035FEAC /* KeybindIntent.swift in Sources */, A5FEB3002ABB69450068369E /* main.swift in Sources */, A53A297F2DB4480F00B6E02C /* EventModifiers+Extension.swift in Sources */, A5E4082E2E0237460035FEAC /* NewTerminalIntent.swift in Sources */, diff --git a/macos/Sources/Features/App Intents/KeybindIntent.swift b/macos/Sources/Features/App Intents/KeybindIntent.swift new file mode 100644 index 000000000..ddb9c489c --- /dev/null +++ b/macos/Sources/Features/App Intents/KeybindIntent.swift @@ -0,0 +1,32 @@ +import AppKit +import AppIntents + +/// App intent that invokes a command palette entry. +struct KeybindIntent: AppIntent { + static var title: LocalizedStringResource = "Invoke a Keybind Action" + + @Parameter( + title: "Terminal", + description: "The terminal to base available commands from." + ) + var terminal: TerminalEntity + + @Parameter( + title: "Action", + description: "The keybind action to invoke. This can be any valid keybind action you could put in a configuration file." + ) + var action: String + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = [.background, .foreground] + + @MainActor + func perform() async throws -> some IntentResult & ReturnsValue { + guard let surface = terminal.surfaceModel else { + throw GhosttyIntentError.surfaceNotFound + } + + let performed = surface.perform(action: action) + return .result(value: performed) + } +} From a6074040e7f9268c84ce44bd5bbe0d072548b9ed Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 11:07:46 -0700 Subject: [PATCH 254/371] macos: input intent --- macos/Ghostty.xcodeproj/project.pbxproj | 4 + .../Features/App Intents/InputIntent.swift | 92 +++++++++++++++++++ .../Features/App Intents/KeybindIntent.swift | 3 +- macos/Sources/Ghostty/Ghostty.Input.swift | 11 +++ macos/Sources/Ghostty/Ghostty.Surface.swift | 13 +++ .../Sources/Ghostty/SurfaceView_AppKit.swift | 10 +- 6 files changed, 123 insertions(+), 10 deletions(-) create mode 100644 macos/Sources/Features/App Intents/InputIntent.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index a691ce55f..bbb34820f 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -129,6 +129,7 @@ A5E408402E04532C0035FEAC /* CommandEntity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E4083F2E04532A0035FEAC /* CommandEntity.swift */; }; A5E408432E047D0B0035FEAC /* CommandPaletteIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */; }; A5E408452E0483FD0035FEAC /* KeybindIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408442E0483F80035FEAC /* KeybindIntent.swift */; }; + A5E408472E04852B0035FEAC /* InputIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E408462E0485270035FEAC /* InputIntent.swift */; }; A5FEB3002ABB69450068369E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5FEB2FF2ABB69450068369E /* main.swift */; }; AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */; }; C159E81D2B66A06B00FDFE9C /* OSColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */; }; @@ -258,6 +259,7 @@ A5E4083F2E04532A0035FEAC /* CommandEntity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandEntity.swift; sourceTree = ""; }; A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandPaletteIntent.swift; sourceTree = ""; }; A5E408442E0483F80035FEAC /* KeybindIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeybindIntent.swift; sourceTree = ""; }; + A5E408462E0485270035FEAC /* InputIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputIntent.swift; sourceTree = ""; }; A5FEB2FF2ABB69450068369E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; AEE8B3442B9AA39600260C5E /* NSPasteboard+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPasteboard+Extension.swift"; sourceTree = ""; }; C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OSColor+Extension.swift"; sourceTree = ""; }; @@ -626,6 +628,7 @@ A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */, A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */, A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */, + A5E408462E0485270035FEAC /* InputIntent.swift */, A5E408442E0483F80035FEAC /* KeybindIntent.swift */, A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */, ); @@ -819,6 +822,7 @@ A5B4EA852DFE691B0022C3A2 /* NSMenuItem+Extension.swift in Sources */, A5874D992DAD751B00E83852 /* CGS.swift in Sources */, A586366B2DF0A98C00E04A10 /* Array+Extension.swift in Sources */, + A5E408472E04852B0035FEAC /* InputIntent.swift in Sources */, A51544FE2DFB111C009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift in Sources */, A59444F729A2ED5200725BBA /* SettingsView.swift in Sources */, A56D58862ACDDB4100508D2C /* Ghostty.Shell.swift in Sources */, diff --git a/macos/Sources/Features/App Intents/InputIntent.swift b/macos/Sources/Features/App Intents/InputIntent.swift new file mode 100644 index 000000000..46c849c99 --- /dev/null +++ b/macos/Sources/Features/App Intents/InputIntent.swift @@ -0,0 +1,92 @@ +import AppKit +import AppIntents + +/// App intent to input text in a terminal. +struct InputTextIntent: AppIntent { + static var title: LocalizedStringResource = "Input Text to Terminal" + + @Parameter( + title: "Text", + description: "The text to input to the terminal. The text will be inputted as if it was pasted.", + inputOptions: String.IntentInputOptions( + capitalizationType: .none, + multiline: true, + autocorrect: false, + smartQuotes: false, + smartDashes: false + ) + ) + var text: String + + @Parameter( + title: "Terminal", + description: "The terminal to scope this action to." + ) + var terminal: TerminalEntity + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = [.background, .foreground] + + @MainActor + func perform() async throws -> some IntentResult { + guard let surface = terminal.surfaceModel else { + throw GhosttyIntentError.surfaceNotFound + } + + surface.sendText(text) + return .result() + } +} + +/// App intent to trigger a keyboard event. +struct KeyEventIntent: AppIntent { + static var title: LocalizedStringResource = "Send Keyboard Event to Terminal" + static var description = IntentDescription("Simulate a keyboard event. This will not handle text encoding; use the 'Input Text' action for that.") + + @Parameter( + title: "Text", + description: "The key to send to the terminal." + ) + var key: KeyIntentKey + + @Parameter( + title: "Terminal", + description: "The terminal to scope this action to." + ) + var terminal: TerminalEntity + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = [.background, .foreground] + + @MainActor + func perform() async throws -> some IntentResult { + guard let surface = terminal.surfaceModel else { + throw GhosttyIntentError.surfaceNotFound + } + + surface.sendText(text) + return .result() + } +} + +// MARK: TerminalDetail + +enum KeyIntentKey: String { + case title + case workingDirectory + case allContents + case selectedText + case visibleText +} + +extension KeyIntentKey: AppEnum { + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Terminal Detail") + + static var caseDisplayRepresentations: [Self: DisplayRepresentation] = [ + .title: .init(title: "Title"), + .workingDirectory: .init(title: "Working Directory"), + .allContents: .init(title: "Full Contents"), + .selectedText: .init(title: "Selected Text"), + .visibleText: .init(title: "Visible Text"), + ] +} diff --git a/macos/Sources/Features/App Intents/KeybindIntent.swift b/macos/Sources/Features/App Intents/KeybindIntent.swift index ddb9c489c..adeb64331 100644 --- a/macos/Sources/Features/App Intents/KeybindIntent.swift +++ b/macos/Sources/Features/App Intents/KeybindIntent.swift @@ -1,13 +1,12 @@ import AppKit import AppIntents -/// App intent that invokes a command palette entry. struct KeybindIntent: AppIntent { static var title: LocalizedStringResource = "Invoke a Keybind Action" @Parameter( title: "Terminal", - description: "The terminal to base available commands from." + description: "The terminal to invoke the action on." ) var terminal: TerminalEntity diff --git a/macos/Sources/Ghostty/Ghostty.Input.swift b/macos/Sources/Ghostty/Ghostty.Input.swift index 942ca5973..e18203f65 100644 --- a/macos/Sources/Ghostty/Ghostty.Input.swift +++ b/macos/Sources/Ghostty/Ghostty.Input.swift @@ -208,4 +208,15 @@ extension Ghostty { 0x43: GHOSTTY_KEY_NUMPAD_MULTIPLY, 0x4E: GHOSTTY_KEY_NUMPAD_SUBTRACT, ]; + + /// `ghostty_input_key_e` + enum Key: String { + case undentified + + var cKey: ghostty_input_key_e { + switch self { + case .undentified: GHOSTTY_KEY_UNIDENTIFIED + } + } + } } diff --git a/macos/Sources/Ghostty/Ghostty.Surface.swift b/macos/Sources/Ghostty/Ghostty.Surface.swift index 5560ff3a8..10e699c1f 100644 --- a/macos/Sources/Ghostty/Ghostty.Surface.swift +++ b/macos/Sources/Ghostty/Ghostty.Surface.swift @@ -35,6 +35,19 @@ extension Ghostty { } } + /// Send text to the terminal as if it was typed. This doesn't send the key events so keyboard + /// shortcuts and other encodings do not take effect. + @MainActor + func sendText(_ text: String) { + let len = text.utf8CString.count + if (len == 0) { return } + + text.withCString { ptr in + // len includes the null terminator so we do len - 1 + ghostty_surface_text(surface, ptr, UInt(len - 1)) + } + } + /// Perform a keybinding action. /// /// The action can be any valid keybind parameter. e.g. `keybind = goto_tab:4` diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index fe0851261..2e7cf499b 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -1700,7 +1700,7 @@ extension Ghostty.SurfaceView: NSTextInputClient { func insertText(_ string: Any, replacementRange: NSRange) { // We must have an associated event guard NSApp.currentEvent != nil else { return } - guard let surface = self.surface else { return } + guard let surfaceModel else { return } // We want the string view of the any value var chars = "" @@ -1724,13 +1724,7 @@ extension Ghostty.SurfaceView: NSTextInputClient { return } - let len = chars.utf8CString.count - if (len == 0) { return } - - chars.withCString { ptr in - // len includes the null terminator so we do len - 1 - ghostty_surface_text(surface, ptr, UInt(len - 1)) - } + surfaceModel.sendText(chars) } /// This function needs to exist for two reasons: From 93619ad42045c42eaf3a1cc1cdb2cd3a32cc2d29 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 11:29:34 -0700 Subject: [PATCH 255/371] macos: Ghostty.Key --- .../Features/App Intents/InputIntent.swift | 25 +- macos/Sources/Ghostty/Ghostty.Input.swift | 905 +++++++++++++++--- macos/Sources/Ghostty/InspectorView.swift | 4 +- 3 files changed, 789 insertions(+), 145 deletions(-) diff --git a/macos/Sources/Features/App Intents/InputIntent.swift b/macos/Sources/Features/App Intents/InputIntent.swift index 46c849c99..1b9f88c9f 100644 --- a/macos/Sources/Features/App Intents/InputIntent.swift +++ b/macos/Sources/Features/App Intents/InputIntent.swift @@ -47,7 +47,7 @@ struct KeyEventIntent: AppIntent { title: "Text", description: "The key to send to the terminal." ) - var key: KeyIntentKey + var key: Ghostty.Key @Parameter( title: "Terminal", @@ -64,29 +64,6 @@ struct KeyEventIntent: AppIntent { throw GhosttyIntentError.surfaceNotFound } - surface.sendText(text) return .result() } } - -// MARK: TerminalDetail - -enum KeyIntentKey: String { - case title - case workingDirectory - case allContents - case selectedText - case visibleText -} - -extension KeyIntentKey: AppEnum { - static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Terminal Detail") - - static var caseDisplayRepresentations: [Self: DisplayRepresentation] = [ - .title: .init(title: "Title"), - .workingDirectory: .init(title: "Working Directory"), - .allContents: .init(title: "Full Contents"), - .selectedText: .init(title: "Selected Text"), - .visibleText: .init(title: "Visible Text"), - ] -} diff --git a/macos/Sources/Ghostty/Ghostty.Input.swift b/macos/Sources/Ghostty/Ghostty.Input.swift index e18203f65..b3060a44d 100644 --- a/macos/Sources/Ghostty/Ghostty.Input.swift +++ b/macos/Sources/Ghostty/Ghostty.Input.swift @@ -1,3 +1,4 @@ +import AppIntents import Cocoa import SwiftUI import GhosttyKit @@ -92,131 +93,797 @@ extension Ghostty { GHOSTTY_KEY_SPACE: .space, ] - // Mapping of event keyCode to ghostty input key values. This is cribbed from - // glfw mostly since we started as a glfw-based app way back in the day! - static let keycodeToKey: [UInt16 : ghostty_input_key_e] = [ - 0x1D: GHOSTTY_KEY_DIGIT_0, - 0x12: GHOSTTY_KEY_DIGIT_1, - 0x13: GHOSTTY_KEY_DIGIT_2, - 0x14: GHOSTTY_KEY_DIGIT_3, - 0x15: GHOSTTY_KEY_DIGIT_4, - 0x17: GHOSTTY_KEY_DIGIT_5, - 0x16: GHOSTTY_KEY_DIGIT_6, - 0x1A: GHOSTTY_KEY_DIGIT_7, - 0x1C: GHOSTTY_KEY_DIGIT_8, - 0x19: GHOSTTY_KEY_DIGIT_9, - 0x00: GHOSTTY_KEY_A, - 0x0B: GHOSTTY_KEY_B, - 0x08: GHOSTTY_KEY_C, - 0x02: GHOSTTY_KEY_D, - 0x0E: GHOSTTY_KEY_E, - 0x03: GHOSTTY_KEY_F, - 0x05: GHOSTTY_KEY_G, - 0x04: GHOSTTY_KEY_H, - 0x22: GHOSTTY_KEY_I, - 0x26: GHOSTTY_KEY_J, - 0x28: GHOSTTY_KEY_K, - 0x25: GHOSTTY_KEY_L, - 0x2E: GHOSTTY_KEY_M, - 0x2D: GHOSTTY_KEY_N, - 0x1F: GHOSTTY_KEY_O, - 0x23: GHOSTTY_KEY_P, - 0x0C: GHOSTTY_KEY_Q, - 0x0F: GHOSTTY_KEY_R, - 0x01: GHOSTTY_KEY_S, - 0x11: GHOSTTY_KEY_T, - 0x20: GHOSTTY_KEY_U, - 0x09: GHOSTTY_KEY_V, - 0x0D: GHOSTTY_KEY_W, - 0x07: GHOSTTY_KEY_X, - 0x10: GHOSTTY_KEY_Y, - 0x06: GHOSTTY_KEY_Z, - - 0x27: GHOSTTY_KEY_QUOTE, - 0x2A: GHOSTTY_KEY_BACKSLASH, - 0x2B: GHOSTTY_KEY_COMMA, - 0x18: GHOSTTY_KEY_EQUAL, - 0x32: GHOSTTY_KEY_BACKQUOTE, - 0x21: GHOSTTY_KEY_BRACKET_LEFT, - 0x1B: GHOSTTY_KEY_MINUS, - 0x2F: GHOSTTY_KEY_PERIOD, - 0x1E: GHOSTTY_KEY_BRACKET_RIGHT, - 0x29: GHOSTTY_KEY_SEMICOLON, - 0x2C: GHOSTTY_KEY_SLASH, - - 0x33: GHOSTTY_KEY_BACKSPACE, - 0x39: GHOSTTY_KEY_CAPS_LOCK, - 0x75: GHOSTTY_KEY_DELETE, - 0x7D: GHOSTTY_KEY_ARROW_DOWN, - 0x77: GHOSTTY_KEY_END, - 0x24: GHOSTTY_KEY_ENTER, - 0x35: GHOSTTY_KEY_ESCAPE, - 0x7A: GHOSTTY_KEY_F1, - 0x78: GHOSTTY_KEY_F2, - 0x63: GHOSTTY_KEY_F3, - 0x76: GHOSTTY_KEY_F4, - 0x60: GHOSTTY_KEY_F5, - 0x61: GHOSTTY_KEY_F6, - 0x62: GHOSTTY_KEY_F7, - 0x64: GHOSTTY_KEY_F8, - 0x65: GHOSTTY_KEY_F9, - 0x6D: GHOSTTY_KEY_F10, - 0x67: GHOSTTY_KEY_F11, - 0x6F: GHOSTTY_KEY_F12, - 0x69: GHOSTTY_KEY_PRINT_SCREEN, - 0x6B: GHOSTTY_KEY_F14, - 0x71: GHOSTTY_KEY_F15, - 0x6A: GHOSTTY_KEY_F16, - 0x40: GHOSTTY_KEY_F17, - 0x4F: GHOSTTY_KEY_F18, - 0x50: GHOSTTY_KEY_F19, - 0x5A: GHOSTTY_KEY_F20, - 0x73: GHOSTTY_KEY_HOME, - 0x72: GHOSTTY_KEY_INSERT, - 0x7B: GHOSTTY_KEY_ARROW_LEFT, - 0x3A: GHOSTTY_KEY_ALT_LEFT, - 0x3B: GHOSTTY_KEY_CONTROL_LEFT, - 0x38: GHOSTTY_KEY_SHIFT_LEFT, - 0x37: GHOSTTY_KEY_META_LEFT, - 0x47: GHOSTTY_KEY_NUM_LOCK, - 0x79: GHOSTTY_KEY_PAGE_DOWN, - 0x74: GHOSTTY_KEY_PAGE_UP, - 0x7C: GHOSTTY_KEY_ARROW_RIGHT, - 0x3D: GHOSTTY_KEY_ALT_RIGHT, - 0x3E: GHOSTTY_KEY_CONTROL_RIGHT, - 0x3C: GHOSTTY_KEY_SHIFT_RIGHT, - 0x36: GHOSTTY_KEY_META_RIGHT, - 0x31: GHOSTTY_KEY_SPACE, - 0x30: GHOSTTY_KEY_TAB, - 0x7E: GHOSTTY_KEY_ARROW_UP, - - 0x52: GHOSTTY_KEY_NUMPAD_0, - 0x53: GHOSTTY_KEY_NUMPAD_1, - 0x54: GHOSTTY_KEY_NUMPAD_2, - 0x55: GHOSTTY_KEY_NUMPAD_3, - 0x56: GHOSTTY_KEY_NUMPAD_4, - 0x57: GHOSTTY_KEY_NUMPAD_5, - 0x58: GHOSTTY_KEY_NUMPAD_6, - 0x59: GHOSTTY_KEY_NUMPAD_7, - 0x5B: GHOSTTY_KEY_NUMPAD_8, - 0x5C: GHOSTTY_KEY_NUMPAD_9, - 0x45: GHOSTTY_KEY_NUMPAD_ADD, - 0x41: GHOSTTY_KEY_NUMPAD_DECIMAL, - 0x4B: GHOSTTY_KEY_NUMPAD_DIVIDE, - 0x4C: GHOSTTY_KEY_NUMPAD_ENTER, - 0x51: GHOSTTY_KEY_NUMPAD_EQUAL, - 0x43: GHOSTTY_KEY_NUMPAD_MULTIPLY, - 0x4E: GHOSTTY_KEY_NUMPAD_SUBTRACT, - ]; - /// `ghostty_input_key_e` enum Key: String { - case undentified + // Writing System Keys + case backquote + case backslash + case bracketLeft + case bracketRight + case comma + case digit0 + case digit1 + case digit2 + case digit3 + case digit4 + case digit5 + case digit6 + case digit7 + case digit8 + case digit9 + case equal + case intlBackslash + case intlRo + case intlYen + case a + case b + case c + case d + case e + case f + case g + case h + case i + case j + case k + case l + case m + case n + case o + case p + case q + case r + case s + case t + case u + case v + case w + case x + case y + case z + case minus + case period + case quote + case semicolon + case slash + + // Functional Keys + case altLeft + case altRight + case backspace + case capsLock + case contextMenu + case controlLeft + case controlRight + case enter + case metaLeft + case metaRight + case shiftLeft + case shiftRight + case space + case tab + case convert + case kanaMode + case nonConvert + + // Control Pad Section + case delete + case end + case help + case home + case insert + case pageDown + case pageUp + + // Arrow Pad Section + case arrowDown + case arrowLeft + case arrowRight + case arrowUp + + // Numpad Section + case numLock + case numpad0 + case numpad1 + case numpad2 + case numpad3 + case numpad4 + case numpad5 + case numpad6 + case numpad7 + case numpad8 + case numpad9 + case numpadAdd + case numpadBackspace + case numpadClear + case numpadClearEntry + case numpadComma + case numpadDecimal + case numpadDivide + case numpadEnter + case numpadEqual + case numpadMemoryAdd + case numpadMemoryClear + case numpadMemoryRecall + case numpadMemoryStore + case numpadMemorySubtract + case numpadMultiply + case numpadParenLeft + case numpadParenRight + case numpadSubtract + case numpadSeparator + case numpadUp + case numpadDown + case numpadRight + case numpadLeft + case numpadBegin + case numpadHome + case numpadEnd + case numpadInsert + case numpadDelete + case numpadPageUp + case numpadPageDown + + // Function Section + case escape + case f1 + case f2 + case f3 + case f4 + case f5 + case f6 + case f7 + case f8 + case f9 + case f10 + case f11 + case f12 + case f13 + case f14 + case f15 + case f16 + case f17 + case f18 + case f19 + case f20 + case f21 + case f22 + case f23 + case f24 + case f25 + case fn + case fnLock + case printScreen + case scrollLock + case pause + + // Media Keys + case browserBack + case browserFavorites + case browserForward + case browserHome + case browserRefresh + case browserSearch + case browserStop + case eject + case launchApp1 + case launchApp2 + case launchMail + case mediaPlayPause + case mediaSelect + case mediaStop + case mediaTrackNext + case mediaTrackPrevious + case power + case sleep + case audioVolumeDown + case audioVolumeMute + case audioVolumeUp + case wakeUp + + // Legacy, Non-standard, and Special Keys + case copy + case cut + case paste + + /// Get a key from a keycode + init?(keyCode: UInt16) { + if let key = Key.allCases.first(where: { $0.keyCode == keyCode }) { + self = key + return + } + + return nil + } var cKey: ghostty_input_key_e { switch self { - case .undentified: GHOSTTY_KEY_UNIDENTIFIED + // Writing System Keys + case .backquote: GHOSTTY_KEY_BACKQUOTE + case .backslash: GHOSTTY_KEY_BACKSLASH + case .bracketLeft: GHOSTTY_KEY_BRACKET_LEFT + case .bracketRight: GHOSTTY_KEY_BRACKET_RIGHT + case .comma: GHOSTTY_KEY_COMMA + case .digit0: GHOSTTY_KEY_DIGIT_0 + case .digit1: GHOSTTY_KEY_DIGIT_1 + case .digit2: GHOSTTY_KEY_DIGIT_2 + case .digit3: GHOSTTY_KEY_DIGIT_3 + case .digit4: GHOSTTY_KEY_DIGIT_4 + case .digit5: GHOSTTY_KEY_DIGIT_5 + case .digit6: GHOSTTY_KEY_DIGIT_6 + case .digit7: GHOSTTY_KEY_DIGIT_7 + case .digit8: GHOSTTY_KEY_DIGIT_8 + case .digit9: GHOSTTY_KEY_DIGIT_9 + case .equal: GHOSTTY_KEY_EQUAL + case .intlBackslash: GHOSTTY_KEY_INTL_BACKSLASH + case .intlRo: GHOSTTY_KEY_INTL_RO + case .intlYen: GHOSTTY_KEY_INTL_YEN + case .a: GHOSTTY_KEY_A + case .b: GHOSTTY_KEY_B + case .c: GHOSTTY_KEY_C + case .d: GHOSTTY_KEY_D + case .e: GHOSTTY_KEY_E + case .f: GHOSTTY_KEY_F + case .g: GHOSTTY_KEY_G + case .h: GHOSTTY_KEY_H + case .i: GHOSTTY_KEY_I + case .j: GHOSTTY_KEY_J + case .k: GHOSTTY_KEY_K + case .l: GHOSTTY_KEY_L + case .m: GHOSTTY_KEY_M + case .n: GHOSTTY_KEY_N + case .o: GHOSTTY_KEY_O + case .p: GHOSTTY_KEY_P + case .q: GHOSTTY_KEY_Q + case .r: GHOSTTY_KEY_R + case .s: GHOSTTY_KEY_S + case .t: GHOSTTY_KEY_T + case .u: GHOSTTY_KEY_U + case .v: GHOSTTY_KEY_V + case .w: GHOSTTY_KEY_W + case .x: GHOSTTY_KEY_X + case .y: GHOSTTY_KEY_Y + case .z: GHOSTTY_KEY_Z + case .minus: GHOSTTY_KEY_MINUS + case .period: GHOSTTY_KEY_PERIOD + case .quote: GHOSTTY_KEY_QUOTE + case .semicolon: GHOSTTY_KEY_SEMICOLON + case .slash: GHOSTTY_KEY_SLASH + + // Functional Keys + case .altLeft: GHOSTTY_KEY_ALT_LEFT + case .altRight: GHOSTTY_KEY_ALT_RIGHT + case .backspace: GHOSTTY_KEY_BACKSPACE + case .capsLock: GHOSTTY_KEY_CAPS_LOCK + case .contextMenu: GHOSTTY_KEY_CONTEXT_MENU + case .controlLeft: GHOSTTY_KEY_CONTROL_LEFT + case .controlRight: GHOSTTY_KEY_CONTROL_RIGHT + case .enter: GHOSTTY_KEY_ENTER + case .metaLeft: GHOSTTY_KEY_META_LEFT + case .metaRight: GHOSTTY_KEY_META_RIGHT + case .shiftLeft: GHOSTTY_KEY_SHIFT_LEFT + case .shiftRight: GHOSTTY_KEY_SHIFT_RIGHT + case .space: GHOSTTY_KEY_SPACE + case .tab: GHOSTTY_KEY_TAB + case .convert: GHOSTTY_KEY_CONVERT + case .kanaMode: GHOSTTY_KEY_KANA_MODE + case .nonConvert: GHOSTTY_KEY_NON_CONVERT + + // Control Pad Section + case .delete: GHOSTTY_KEY_DELETE + case .end: GHOSTTY_KEY_END + case .help: GHOSTTY_KEY_HELP + case .home: GHOSTTY_KEY_HOME + case .insert: GHOSTTY_KEY_INSERT + case .pageDown: GHOSTTY_KEY_PAGE_DOWN + case .pageUp: GHOSTTY_KEY_PAGE_UP + + // Arrow Pad Section + case .arrowDown: GHOSTTY_KEY_ARROW_DOWN + case .arrowLeft: GHOSTTY_KEY_ARROW_LEFT + case .arrowRight: GHOSTTY_KEY_ARROW_RIGHT + case .arrowUp: GHOSTTY_KEY_ARROW_UP + + // Numpad Section + case .numLock: GHOSTTY_KEY_NUM_LOCK + case .numpad0: GHOSTTY_KEY_NUMPAD_0 + case .numpad1: GHOSTTY_KEY_NUMPAD_1 + case .numpad2: GHOSTTY_KEY_NUMPAD_2 + case .numpad3: GHOSTTY_KEY_NUMPAD_3 + case .numpad4: GHOSTTY_KEY_NUMPAD_4 + case .numpad5: GHOSTTY_KEY_NUMPAD_5 + case .numpad6: GHOSTTY_KEY_NUMPAD_6 + case .numpad7: GHOSTTY_KEY_NUMPAD_7 + case .numpad8: GHOSTTY_KEY_NUMPAD_8 + case .numpad9: GHOSTTY_KEY_NUMPAD_9 + case .numpadAdd: GHOSTTY_KEY_NUMPAD_ADD + case .numpadBackspace: GHOSTTY_KEY_NUMPAD_BACKSPACE + case .numpadClear: GHOSTTY_KEY_NUMPAD_CLEAR + case .numpadClearEntry: GHOSTTY_KEY_NUMPAD_CLEAR_ENTRY + case .numpadComma: GHOSTTY_KEY_NUMPAD_COMMA + case .numpadDecimal: GHOSTTY_KEY_NUMPAD_DECIMAL + case .numpadDivide: GHOSTTY_KEY_NUMPAD_DIVIDE + case .numpadEnter: GHOSTTY_KEY_NUMPAD_ENTER + case .numpadEqual: GHOSTTY_KEY_NUMPAD_EQUAL + case .numpadMemoryAdd: GHOSTTY_KEY_NUMPAD_MEMORY_ADD + case .numpadMemoryClear: GHOSTTY_KEY_NUMPAD_MEMORY_CLEAR + case .numpadMemoryRecall: GHOSTTY_KEY_NUMPAD_MEMORY_RECALL + case .numpadMemoryStore: GHOSTTY_KEY_NUMPAD_MEMORY_STORE + case .numpadMemorySubtract: GHOSTTY_KEY_NUMPAD_MEMORY_SUBTRACT + case .numpadMultiply: GHOSTTY_KEY_NUMPAD_MULTIPLY + case .numpadParenLeft: GHOSTTY_KEY_NUMPAD_PAREN_LEFT + case .numpadParenRight: GHOSTTY_KEY_NUMPAD_PAREN_RIGHT + case .numpadSubtract: GHOSTTY_KEY_NUMPAD_SUBTRACT + case .numpadSeparator: GHOSTTY_KEY_NUMPAD_SEPARATOR + case .numpadUp: GHOSTTY_KEY_NUMPAD_UP + case .numpadDown: GHOSTTY_KEY_NUMPAD_DOWN + case .numpadRight: GHOSTTY_KEY_NUMPAD_RIGHT + case .numpadLeft: GHOSTTY_KEY_NUMPAD_LEFT + case .numpadBegin: GHOSTTY_KEY_NUMPAD_BEGIN + case .numpadHome: GHOSTTY_KEY_NUMPAD_HOME + case .numpadEnd: GHOSTTY_KEY_NUMPAD_END + case .numpadInsert: GHOSTTY_KEY_NUMPAD_INSERT + case .numpadDelete: GHOSTTY_KEY_NUMPAD_DELETE + case .numpadPageUp: GHOSTTY_KEY_NUMPAD_PAGE_UP + case .numpadPageDown: GHOSTTY_KEY_NUMPAD_PAGE_DOWN + + // Function Section + case .escape: GHOSTTY_KEY_ESCAPE + case .f1: GHOSTTY_KEY_F1 + case .f2: GHOSTTY_KEY_F2 + case .f3: GHOSTTY_KEY_F3 + case .f4: GHOSTTY_KEY_F4 + case .f5: GHOSTTY_KEY_F5 + case .f6: GHOSTTY_KEY_F6 + case .f7: GHOSTTY_KEY_F7 + case .f8: GHOSTTY_KEY_F8 + case .f9: GHOSTTY_KEY_F9 + case .f10: GHOSTTY_KEY_F10 + case .f11: GHOSTTY_KEY_F11 + case .f12: GHOSTTY_KEY_F12 + case .f13: GHOSTTY_KEY_F13 + case .f14: GHOSTTY_KEY_F14 + case .f15: GHOSTTY_KEY_F15 + case .f16: GHOSTTY_KEY_F16 + case .f17: GHOSTTY_KEY_F17 + case .f18: GHOSTTY_KEY_F18 + case .f19: GHOSTTY_KEY_F19 + case .f20: GHOSTTY_KEY_F20 + case .f21: GHOSTTY_KEY_F21 + case .f22: GHOSTTY_KEY_F22 + case .f23: GHOSTTY_KEY_F23 + case .f24: GHOSTTY_KEY_F24 + case .f25: GHOSTTY_KEY_F25 + case .fn: GHOSTTY_KEY_FN + case .fnLock: GHOSTTY_KEY_FN_LOCK + case .printScreen: GHOSTTY_KEY_PRINT_SCREEN + case .scrollLock: GHOSTTY_KEY_SCROLL_LOCK + case .pause: GHOSTTY_KEY_PAUSE + + // Media Keys + case .browserBack: GHOSTTY_KEY_BROWSER_BACK + case .browserFavorites: GHOSTTY_KEY_BROWSER_FAVORITES + case .browserForward: GHOSTTY_KEY_BROWSER_FORWARD + case .browserHome: GHOSTTY_KEY_BROWSER_HOME + case .browserRefresh: GHOSTTY_KEY_BROWSER_REFRESH + case .browserSearch: GHOSTTY_KEY_BROWSER_SEARCH + case .browserStop: GHOSTTY_KEY_BROWSER_STOP + case .eject: GHOSTTY_KEY_EJECT + case .launchApp1: GHOSTTY_KEY_LAUNCH_APP_1 + case .launchApp2: GHOSTTY_KEY_LAUNCH_APP_2 + case .launchMail: GHOSTTY_KEY_LAUNCH_MAIL + case .mediaPlayPause: GHOSTTY_KEY_MEDIA_PLAY_PAUSE + case .mediaSelect: GHOSTTY_KEY_MEDIA_SELECT + case .mediaStop: GHOSTTY_KEY_MEDIA_STOP + case .mediaTrackNext: GHOSTTY_KEY_MEDIA_TRACK_NEXT + case .mediaTrackPrevious: GHOSTTY_KEY_MEDIA_TRACK_PREVIOUS + case .power: GHOSTTY_KEY_POWER + case .sleep: GHOSTTY_KEY_SLEEP + case .audioVolumeDown: GHOSTTY_KEY_AUDIO_VOLUME_DOWN + case .audioVolumeMute: GHOSTTY_KEY_AUDIO_VOLUME_MUTE + case .audioVolumeUp: GHOSTTY_KEY_AUDIO_VOLUME_UP + case .wakeUp: GHOSTTY_KEY_WAKE_UP + + // Legacy, Non-standard, and Special Keys + case .copy: GHOSTTY_KEY_COPY + case .cut: GHOSTTY_KEY_CUT + case .paste: GHOSTTY_KEY_PASTE + } + } + + // Based on src/input/keycodes.zig + var keyCode: UInt16? { + switch self { + // Writing System Keys + case .backquote: return 0x0032 + case .backslash: return 0x002a + case .bracketLeft: return 0x0021 + case .bracketRight: return 0x001e + case .comma: return 0x002b + case .digit0: return 0x001d + case .digit1: return 0x0012 + case .digit2: return 0x0013 + case .digit3: return 0x0014 + case .digit4: return 0x0015 + case .digit5: return 0x0017 + case .digit6: return 0x0016 + case .digit7: return 0x001a + case .digit8: return 0x001c + case .digit9: return 0x0019 + case .equal: return 0x0018 + case .intlBackslash: return 0x000a + case .intlRo: return 0x005e + case .intlYen: return 0x005d + case .a: return 0x0000 + case .b: return 0x000b + case .c: return 0x0008 + case .d: return 0x0002 + case .e: return 0x000e + case .f: return 0x0003 + case .g: return 0x0005 + case .h: return 0x0004 + case .i: return 0x0022 + case .j: return 0x0026 + case .k: return 0x0028 + case .l: return 0x0025 + case .m: return 0x002e + case .n: return 0x002d + case .o: return 0x001f + case .p: return 0x0023 + case .q: return 0x000c + case .r: return 0x000f + case .s: return 0x0001 + case .t: return 0x0011 + case .u: return 0x0020 + case .v: return 0x0009 + case .w: return 0x000d + case .x: return 0x0007 + case .y: return 0x0010 + case .z: return 0x0006 + case .minus: return 0x001b + case .period: return 0x002f + case .quote: return 0x0027 + case .semicolon: return 0x0029 + case .slash: return 0x002c + + // Functional Keys + case .altLeft: return 0x003a + case .altRight: return 0x003d + case .backspace: return 0x0033 + case .capsLock: return 0x0039 + case .contextMenu: return 0x006e + case .controlLeft: return 0x003b + case .controlRight: return 0x003e + case .enter: return 0x0024 + case .metaLeft: return 0x0037 + case .metaRight: return 0x0036 + case .shiftLeft: return 0x0038 + case .shiftRight: return 0x003c + case .space: return 0x0031 + case .tab: return 0x0030 + case .convert: return nil // No Mac keycode + case .kanaMode: return nil // No Mac keycode + case .nonConvert: return nil // No Mac keycode + + // Control Pad Section + case .delete: return 0x0075 + case .end: return 0x0077 + case .help: return nil // No Mac keycode + case .home: return 0x0073 + case .insert: return 0x0072 + case .pageDown: return 0x0079 + case .pageUp: return 0x0074 + + // Arrow Pad Section + case .arrowDown: return 0x007d + case .arrowLeft: return 0x007b + case .arrowRight: return 0x007c + case .arrowUp: return 0x007e + + // Numpad Section + case .numLock: return 0x0047 + case .numpad0: return 0x0052 + case .numpad1: return 0x0053 + case .numpad2: return 0x0054 + case .numpad3: return 0x0055 + case .numpad4: return 0x0056 + case .numpad5: return 0x0057 + case .numpad6: return 0x0058 + case .numpad7: return 0x0059 + case .numpad8: return 0x005b + case .numpad9: return 0x005c + case .numpadAdd: return 0x0045 + case .numpadBackspace: return nil // No Mac keycode + case .numpadClear: return nil // No Mac keycode + case .numpadClearEntry: return nil // No Mac keycode + case .numpadComma: return 0x005f + case .numpadDecimal: return 0x0041 + case .numpadDivide: return 0x004b + case .numpadEnter: return 0x004c + case .numpadEqual: return 0x0051 + case .numpadMemoryAdd: return nil // No Mac keycode + case .numpadMemoryClear: return nil // No Mac keycode + case .numpadMemoryRecall: return nil // No Mac keycode + case .numpadMemoryStore: return nil // No Mac keycode + case .numpadMemorySubtract: return nil // No Mac keycode + case .numpadMultiply: return 0x0043 + case .numpadParenLeft: return nil // No Mac keycode + case .numpadParenRight: return nil // No Mac keycode + case .numpadSubtract: return 0x004e + case .numpadSeparator: return nil // No Mac keycode + case .numpadUp: return nil // No Mac keycode + case .numpadDown: return nil // No Mac keycode + case .numpadRight: return nil // No Mac keycode + case .numpadLeft: return nil // No Mac keycode + case .numpadBegin: return nil // No Mac keycode + case .numpadHome: return nil // No Mac keycode + case .numpadEnd: return nil // No Mac keycode + case .numpadInsert: return nil // No Mac keycode + case .numpadDelete: return nil // No Mac keycode + case .numpadPageUp: return nil // No Mac keycode + case .numpadPageDown: return nil // No Mac keycode + + // Function Section + case .escape: return 0x0035 + case .f1: return 0x007a + case .f2: return 0x0078 + case .f3: return 0x0063 + case .f4: return 0x0076 + case .f5: return 0x0060 + case .f6: return 0x0061 + case .f7: return 0x0062 + case .f8: return 0x0064 + case .f9: return 0x0065 + case .f10: return 0x006d + case .f11: return 0x0067 + case .f12: return 0x006f + case .f13: return 0x0069 + case .f14: return 0x006b + case .f15: return 0x0071 + case .f16: return 0x006a + case .f17: return 0x0040 + case .f18: return 0x004f + case .f19: return 0x0050 + case .f20: return 0x005a + case .f21: return nil // No Mac keycode + case .f22: return nil // No Mac keycode + case .f23: return nil // No Mac keycode + case .f24: return nil // No Mac keycode + case .f25: return nil // No Mac keycode + case .fn: return nil // No Mac keycode + case .fnLock: return nil // No Mac keycode + case .printScreen: return nil // No Mac keycode + case .scrollLock: return nil // No Mac keycode + case .pause: return nil // No Mac keycode + + // Media Keys + case .browserBack: return nil // No Mac keycode + case .browserFavorites: return nil // No Mac keycode + case .browserForward: return nil // No Mac keycode + case .browserHome: return nil // No Mac keycode + case .browserRefresh: return nil // No Mac keycode + case .browserSearch: return nil // No Mac keycode + case .browserStop: return nil // No Mac keycode + case .eject: return nil // No Mac keycode + case .launchApp1: return nil // No Mac keycode + case .launchApp2: return nil // No Mac keycode + case .launchMail: return nil // No Mac keycode + case .mediaPlayPause: return nil // No Mac keycode + case .mediaSelect: return nil // No Mac keycode + case .mediaStop: return nil // No Mac keycode + case .mediaTrackNext: return nil // No Mac keycode + case .mediaTrackPrevious: return nil // No Mac keycode + case .power: return nil // No Mac keycode + case .sleep: return nil // No Mac keycode + case .audioVolumeDown: return 0x0049 + case .audioVolumeMute: return 0x004a + case .audioVolumeUp: return 0x0048 + case .wakeUp: return nil // No Mac keycode + + // Legacy, Non-standard, and Special Keys + case .copy: return nil // No Mac keycode + case .cut: return nil // No Mac keycode + case .paste: return nil // No Mac keycode } } } } + +// MARK: Ghostty.Key AppEnum + +extension Ghostty.Key: AppEnum { + static var typeDisplayRepresentation: TypeDisplayRepresentation = "Key" + + static var caseDisplayRepresentations: [Ghostty.Key : DisplayRepresentation] = [ + // Writing System Keys + .backquote: "Backtick (`)", + .backslash: "Backslash (\\)", + .bracketLeft: "Left Bracket ([)", + .bracketRight: "Right Bracket (])", + .comma: "Comma (,)", + .digit0: "0", + .digit1: "1", + .digit2: "2", + .digit3: "3", + .digit4: "4", + .digit5: "5", + .digit6: "6", + .digit7: "7", + .digit8: "8", + .digit9: "9", + .equal: "Equal (=)", + .intlBackslash: "International Backslash", + .intlRo: "International Ro", + .intlYen: "International Yen", + .a: "A", + .b: "B", + .c: "C", + .d: "D", + .e: "E", + .f: "F", + .g: "G", + .h: "H", + .i: "I", + .j: "J", + .k: "K", + .l: "L", + .m: "M", + .n: "N", + .o: "O", + .p: "P", + .q: "Q", + .r: "R", + .s: "S", + .t: "T", + .u: "U", + .v: "V", + .w: "W", + .x: "X", + .y: "Y", + .z: "Z", + .minus: "Minus (-)", + .period: "Period (.)", + .quote: "Quote (')", + .semicolon: "Semicolon (;)", + .slash: "Slash (/)", + + // Functional Keys + .altLeft: "Left Alt", + .altRight: "Right Alt", + .backspace: "Backspace", + .capsLock: "Caps Lock", + .contextMenu: "Context Menu", + .controlLeft: "Left Control", + .controlRight: "Right Control", + .enter: "Enter", + .metaLeft: "Left Command", + .metaRight: "Right Command", + .shiftLeft: "Left Shift", + .shiftRight: "Right Shift", + .space: "Space", + .tab: "Tab", + .convert: "Convert", + .kanaMode: "Kana Mode", + .nonConvert: "Non Convert", + + // Control Pad Section + .delete: "Delete", + .end: "End", + .help: "Help", + .home: "Home", + .insert: "Insert", + .pageDown: "Page Down", + .pageUp: "Page Up", + + // Arrow Pad Section + .arrowDown: "Down Arrow", + .arrowLeft: "Left Arrow", + .arrowRight: "Right Arrow", + .arrowUp: "Up Arrow", + + // Numpad Section + .numLock: "Num Lock", + .numpad0: "Numpad 0", + .numpad1: "Numpad 1", + .numpad2: "Numpad 2", + .numpad3: "Numpad 3", + .numpad4: "Numpad 4", + .numpad5: "Numpad 5", + .numpad6: "Numpad 6", + .numpad7: "Numpad 7", + .numpad8: "Numpad 8", + .numpad9: "Numpad 9", + .numpadAdd: "Numpad Add (+)", + .numpadBackspace: "Numpad Backspace", + .numpadClear: "Numpad Clear", + .numpadClearEntry: "Numpad Clear Entry", + .numpadComma: "Numpad Comma", + .numpadDecimal: "Numpad Decimal", + .numpadDivide: "Numpad Divide (÷)", + .numpadEnter: "Numpad Enter", + .numpadEqual: "Numpad Equal", + .numpadMemoryAdd: "Numpad Memory Add", + .numpadMemoryClear: "Numpad Memory Clear", + .numpadMemoryRecall: "Numpad Memory Recall", + .numpadMemoryStore: "Numpad Memory Store", + .numpadMemorySubtract: "Numpad Memory Subtract", + .numpadMultiply: "Numpad Multiply (×)", + .numpadParenLeft: "Numpad Left Parenthesis", + .numpadParenRight: "Numpad Right Parenthesis", + .numpadSubtract: "Numpad Subtract (-)", + .numpadSeparator: "Numpad Separator", + .numpadUp: "Numpad Up", + .numpadDown: "Numpad Down", + .numpadRight: "Numpad Right", + .numpadLeft: "Numpad Left", + .numpadBegin: "Numpad Begin", + .numpadHome: "Numpad Home", + .numpadEnd: "Numpad End", + .numpadInsert: "Numpad Insert", + .numpadDelete: "Numpad Delete", + .numpadPageUp: "Numpad Page Up", + .numpadPageDown: "Numpad Page Down", + + // Function Section + .escape: "Escape", + .f1: "F1", + .f2: "F2", + .f3: "F3", + .f4: "F4", + .f5: "F5", + .f6: "F6", + .f7: "F7", + .f8: "F8", + .f9: "F9", + .f10: "F10", + .f11: "F11", + .f12: "F12", + .f13: "F13", + .f14: "F14", + .f15: "F15", + .f16: "F16", + .f17: "F17", + .f18: "F18", + .f19: "F19", + .f20: "F20", + .f21: "F21", + .f22: "F22", + .f23: "F23", + .f24: "F24", + .f25: "F25", + .fn: "Fn", + .fnLock: "Fn Lock", + .printScreen: "Print Screen", + .scrollLock: "Scroll Lock", + .pause: "Pause", + + // Media Keys + .browserBack: "Browser Back", + .browserFavorites: "Browser Favorites", + .browserForward: "Browser Forward", + .browserHome: "Browser Home", + .browserRefresh: "Browser Refresh", + .browserSearch: "Browser Search", + .browserStop: "Browser Stop", + .eject: "Eject", + .launchApp1: "Launch App 1", + .launchApp2: "Launch App 2", + .launchMail: "Launch Mail", + .mediaPlayPause: "Media Play/Pause", + .mediaSelect: "Media Select", + .mediaStop: "Media Stop", + .mediaTrackNext: "Media Next Track", + .mediaTrackPrevious: "Media Previous Track", + .power: "Power", + .sleep: "Sleep", + .audioVolumeDown: "Volume Down", + .audioVolumeMute: "Volume Mute", + .audioVolumeUp: "Volume Up", + .wakeUp: "Wake Up", + + // Legacy, Non-standard, and Special Keys + .copy: "Copy", + .cut: "Cut", + .paste: "Paste" + ] +} diff --git a/macos/Sources/Ghostty/InspectorView.swift b/macos/Sources/Ghostty/InspectorView.swift index a6e80bd47..491ec86e1 100644 --- a/macos/Sources/Ghostty/InspectorView.swift +++ b/macos/Sources/Ghostty/InspectorView.swift @@ -337,9 +337,9 @@ extension Ghostty { private func keyAction(_ action: ghostty_input_action_e, event: NSEvent) { guard let inspector = self.inspector else { return } - guard let key = Ghostty.keycodeToKey[event.keyCode] else { return } + guard let key = Ghostty.Key(keyCode: event.keyCode) else { return } let mods = Ghostty.ghosttyMods(event.modifierFlags) - ghostty_inspector_key(inspector, action, key, mods) + ghostty_inspector_key(inspector, action, key.cKey, mods) } // MARK: NSTextInputClient From 71b6e223af1ef2e2033326792e86bc9587326e91 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 12:06:27 -0700 Subject: [PATCH 256/371] macos: input keyboard event can send modifiers and actions now --- .../Features/App Intents/InputIntent.swift | 60 ++- macos/Sources/Ghostty/Ghostty.Input.swift | 509 +++++++++++------- macos/Sources/Ghostty/Ghostty.Surface.swift | 14 + macos/Sources/Ghostty/InspectorView.swift | 2 +- 4 files changed, 382 insertions(+), 203 deletions(-) diff --git a/macos/Sources/Features/App Intents/InputIntent.swift b/macos/Sources/Features/App Intents/InputIntent.swift index 1b9f88c9f..6d3d60d59 100644 --- a/macos/Sources/Features/App Intents/InputIntent.swift +++ b/macos/Sources/Features/App Intents/InputIntent.swift @@ -44,10 +44,25 @@ struct KeyEventIntent: AppIntent { static var description = IntentDescription("Simulate a keyboard event. This will not handle text encoding; use the 'Input Text' action for that.") @Parameter( - title: "Text", - description: "The key to send to the terminal." + title: "Key", + description: "The key to send to the terminal.", + default: .enter ) - var key: Ghostty.Key + var key: Ghostty.Input.Key + + @Parameter( + title: "Modifier(s)", + description: "The modifiers to send with the key event.", + default: [] + ) + var mods: [KeyEventMods] + + @Parameter( + title: "Event Type", + description: "A key press or release.", + default: .press + ) + var action: Ghostty.Input.Action @Parameter( title: "Terminal", @@ -64,6 +79,45 @@ struct KeyEventIntent: AppIntent { throw GhosttyIntentError.surfaceNotFound } + // Convert KeyEventMods array to Ghostty.Input.Mods + let ghosttyMods = mods.reduce(Ghostty.Input.Mods()) { result, mod in + result.union(mod.ghosttyMod) + } + + let keyEvent = Ghostty.Input.KeyEvent( + key: key, + action: action, + mods: ghosttyMods + ) + surface.sendKeyEvent(keyEvent) + return .result() } } + +// MARK: Mods + +enum KeyEventMods: String, AppEnum, CaseIterable { + case shift + case control + case option + case command + + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Modifier Key") + + static var caseDisplayRepresentations: [KeyEventMods : DisplayRepresentation] = [ + .shift: "Shift", + .control: "Control", + .option: "Option", + .command: "Command" + ] + + var ghosttyMod: Ghostty.Input.Mods { + switch self { + case .shift: .shift + case .control: .ctrl + case .option: .alt + case .command: .super + } + } +} diff --git a/macos/Sources/Ghostty/Ghostty.Input.swift b/macos/Sources/Ghostty/Ghostty.Input.swift index b3060a44d..df93017c7 100644 --- a/macos/Sources/Ghostty/Ghostty.Input.swift +++ b/macos/Sources/Ghostty/Ghostty.Input.swift @@ -4,6 +4,8 @@ import SwiftUI import GhosttyKit extension Ghostty { + struct Input {} + // MARK: Keyboard Shortcuts /// Return the key equivalent for the given trigger. @@ -92,7 +94,175 @@ extension Ghostty { GHOSTTY_KEY_BACKSPACE: .delete, GHOSTTY_KEY_SPACE: .space, ] +} +// MARK: Ghostty.Input.KeyEvent + +extension Ghostty.Input { + /// `ghostty_input_key_s` + struct KeyEvent { + let action: Action + let key: Key + let text: String? + let composing: Bool + let mods: Mods + let consumedMods: Mods + let unshiftedCodepoint: UInt32 + + init( + key: Key, + action: Action = .press, + text: String? = nil, + composing: Bool = false, + mods: Mods = [], + consumedMods: Mods = [], + unshiftedCodepoint: UInt32 = 0 + ) { + self.key = key + self.action = action + self.text = text + self.composing = composing + self.mods = mods + self.consumedMods = consumedMods + self.unshiftedCodepoint = unshiftedCodepoint + } + + init?(cValue: ghostty_input_key_s) { + // Convert action + switch cValue.action { + case GHOSTTY_ACTION_PRESS: self.action = .press + case GHOSTTY_ACTION_RELEASE: self.action = .release + case GHOSTTY_ACTION_REPEAT: self.action = .repeat + default: self.action = .press + } + + // Convert key from keycode + guard let key = Key(keyCode: UInt16(cValue.keycode)) else { return nil } + self.key = key + + // Convert text + if let textPtr = cValue.text { + self.text = String(cString: textPtr) + } else { + self.text = nil + } + + // Set composing state + self.composing = cValue.composing + + // Convert modifiers + self.mods = Mods(cMods: cValue.mods) + self.consumedMods = Mods(cMods: cValue.consumed_mods) + + // Set unshifted codepoint + self.unshiftedCodepoint = cValue.unshifted_codepoint + } + + /// Executes a closure with a temporary C representation of this KeyEvent. + /// + /// This method safely converts the Swift KeyEntity to a C `ghostty_input_key_s` struct + /// and passes it to the provided closure. The C struct is only valid within the closure's + /// execution scope. The text field's C string pointer is managed automatically and will + /// be invalid after the closure returns. + /// + /// - Parameter execute: A closure that receives the C struct and returns a value + /// - Returns: The value returned by the closure + @discardableResult + func withCValue(execute: (ghostty_input_key_s) -> T) -> T { + var keyEvent = ghostty_input_key_s() + keyEvent.action = action.cAction + keyEvent.keycode = UInt32(key.keyCode ?? 0) + keyEvent.composing = composing + keyEvent.mods = mods.cMods + keyEvent.consumed_mods = consumedMods.cMods + keyEvent.unshifted_codepoint = unshiftedCodepoint + + // Handle text with proper memory management + if let text = text { + return text.withCString { textPtr in + keyEvent.text = textPtr + return execute(keyEvent) + } + } else { + keyEvent.text = nil + return execute(keyEvent) + } + } + } +} + +// MARK: Ghostty.Input.Action + +extension Ghostty.Input { + /// `ghostty_input_action_e` + enum Action: String, CaseIterable { + case release + case press + case `repeat` + + var cAction: ghostty_input_action_e { + switch self { + case .release: GHOSTTY_ACTION_RELEASE + case .press: GHOSTTY_ACTION_PRESS + case .repeat: GHOSTTY_ACTION_REPEAT + } + } + } +} + +extension Ghostty.Input.Action: AppEnum { + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Key Action") + + static var caseDisplayRepresentations: [Ghostty.Input.Action : DisplayRepresentation] = [ + .release: "Release", + .press: "Press", + .repeat: "Repeat" + ] +} + +// MARK: Ghostty.Input.Mods + +extension Ghostty.Input { + /// `ghostty_input_mods_e` + struct Mods: OptionSet { + let rawValue: UInt32 + + static let none = Mods(rawValue: GHOSTTY_MODS_NONE.rawValue) + static let shift = Mods(rawValue: GHOSTTY_MODS_SHIFT.rawValue) + static let ctrl = Mods(rawValue: GHOSTTY_MODS_CTRL.rawValue) + static let alt = Mods(rawValue: GHOSTTY_MODS_ALT.rawValue) + static let `super` = Mods(rawValue: GHOSTTY_MODS_SUPER.rawValue) + static let caps = Mods(rawValue: GHOSTTY_MODS_CAPS.rawValue) + static let shiftRight = Mods(rawValue: GHOSTTY_MODS_SHIFT_RIGHT.rawValue) + static let ctrlRight = Mods(rawValue: GHOSTTY_MODS_CTRL_RIGHT.rawValue) + static let altRight = Mods(rawValue: GHOSTTY_MODS_ALT_RIGHT.rawValue) + static let superRight = Mods(rawValue: GHOSTTY_MODS_SUPER_RIGHT.rawValue) + + var cMods: ghostty_input_mods_e { + ghostty_input_mods_e(rawValue) + } + + init(rawValue: UInt32) { + self.rawValue = rawValue + } + + init(cMods: ghostty_input_mods_e) { + self.rawValue = cMods.rawValue + } + + init(nsFlags: NSEvent.ModifierFlags) { + self.init(cMods: Ghostty.ghosttyMods(nsFlags)) + } + + var nsFlags: NSEvent.ModifierFlags { + Ghostty.eventModifierFlags(mods: cMods) + } + } +} + +// MARK: Ghostty.Input.Key + +extension Ghostty.Input { /// `ghostty_input_key_e` enum Key: String { // Writing System Keys @@ -146,7 +316,7 @@ extension Ghostty { case quote case semicolon case slash - + // Functional Keys case altLeft case altRight @@ -165,7 +335,7 @@ extension Ghostty { case convert case kanaMode case nonConvert - + // Control Pad Section case delete case end @@ -174,13 +344,13 @@ extension Ghostty { case insert case pageDown case pageUp - + // Arrow Pad Section case arrowDown case arrowLeft case arrowRight case arrowUp - + // Numpad Section case numLock case numpad0 @@ -223,7 +393,7 @@ extension Ghostty { case numpadDelete case numpadPageUp case numpadPageDown - + // Function Section case escape case f1 @@ -256,7 +426,7 @@ extension Ghostty { case printScreen case scrollLock case pause - + // Media Keys case browserBack case browserFavorites @@ -280,7 +450,7 @@ extension Ghostty { case audioVolumeMute case audioVolumeUp case wakeUp - + // Legacy, Non-standard, and Special Keys case copy case cut @@ -349,7 +519,7 @@ extension Ghostty { case .quote: GHOSTTY_KEY_QUOTE case .semicolon: GHOSTTY_KEY_SEMICOLON case .slash: GHOSTTY_KEY_SLASH - + // Functional Keys case .altLeft: GHOSTTY_KEY_ALT_LEFT case .altRight: GHOSTTY_KEY_ALT_RIGHT @@ -368,7 +538,7 @@ extension Ghostty { case .convert: GHOSTTY_KEY_CONVERT case .kanaMode: GHOSTTY_KEY_KANA_MODE case .nonConvert: GHOSTTY_KEY_NON_CONVERT - + // Control Pad Section case .delete: GHOSTTY_KEY_DELETE case .end: GHOSTTY_KEY_END @@ -377,13 +547,13 @@ extension Ghostty { case .insert: GHOSTTY_KEY_INSERT case .pageDown: GHOSTTY_KEY_PAGE_DOWN case .pageUp: GHOSTTY_KEY_PAGE_UP - + // Arrow Pad Section case .arrowDown: GHOSTTY_KEY_ARROW_DOWN case .arrowLeft: GHOSTTY_KEY_ARROW_LEFT case .arrowRight: GHOSTTY_KEY_ARROW_RIGHT case .arrowUp: GHOSTTY_KEY_ARROW_UP - + // Numpad Section case .numLock: GHOSTTY_KEY_NUM_LOCK case .numpad0: GHOSTTY_KEY_NUMPAD_0 @@ -426,7 +596,7 @@ extension Ghostty { case .numpadDelete: GHOSTTY_KEY_NUMPAD_DELETE case .numpadPageUp: GHOSTTY_KEY_NUMPAD_PAGE_UP case .numpadPageDown: GHOSTTY_KEY_NUMPAD_PAGE_DOWN - + // Function Section case .escape: GHOSTTY_KEY_ESCAPE case .f1: GHOSTTY_KEY_F1 @@ -459,7 +629,7 @@ extension Ghostty { case .printScreen: GHOSTTY_KEY_PRINT_SCREEN case .scrollLock: GHOSTTY_KEY_SCROLL_LOCK case .pause: GHOSTTY_KEY_PAUSE - + // Media Keys case .browserBack: GHOSTTY_KEY_BROWSER_BACK case .browserFavorites: GHOSTTY_KEY_BROWSER_FAVORITES @@ -483,7 +653,7 @@ extension Ghostty { case .audioVolumeMute: GHOSTTY_KEY_AUDIO_VOLUME_MUTE case .audioVolumeUp: GHOSTTY_KEY_AUDIO_VOLUME_UP case .wakeUp: GHOSTTY_KEY_WAKE_UP - + // Legacy, Non-standard, and Special Keys case .copy: GHOSTTY_KEY_COPY case .cut: GHOSTTY_KEY_CUT @@ -545,7 +715,7 @@ extension Ghostty { case .quote: return 0x0027 case .semicolon: return 0x0029 case .slash: return 0x002c - + // Functional Keys case .altLeft: return 0x003a case .altRight: return 0x003d @@ -564,7 +734,7 @@ extension Ghostty { case .convert: return nil // No Mac keycode case .kanaMode: return nil // No Mac keycode case .nonConvert: return nil // No Mac keycode - + // Control Pad Section case .delete: return 0x0075 case .end: return 0x0077 @@ -573,13 +743,13 @@ extension Ghostty { case .insert: return 0x0072 case .pageDown: return 0x0079 case .pageUp: return 0x0074 - + // Arrow Pad Section case .arrowDown: return 0x007d case .arrowLeft: return 0x007b case .arrowRight: return 0x007c case .arrowUp: return 0x007e - + // Numpad Section case .numLock: return 0x0047 case .numpad0: return 0x0052 @@ -622,7 +792,7 @@ extension Ghostty { case .numpadDelete: return nil // No Mac keycode case .numpadPageUp: return nil // No Mac keycode case .numpadPageDown: return nil // No Mac keycode - + // Function Section case .escape: return 0x0035 case .f1: return 0x007a @@ -655,7 +825,7 @@ extension Ghostty { case .printScreen: return nil // No Mac keycode case .scrollLock: return nil // No Mac keycode case .pause: return nil // No Mac keycode - + // Media Keys case .browserBack: return nil // No Mac keycode case .browserFavorites: return nil // No Mac keycode @@ -679,7 +849,7 @@ extension Ghostty { case .audioVolumeMute: return 0x004a case .audioVolumeUp: return 0x0048 case .wakeUp: return nil // No Mac keycode - + // Legacy, Non-standard, and Special Keys case .copy: return nil // No Mac keycode case .cut: return nil // No Mac keycode @@ -689,201 +859,142 @@ extension Ghostty { } } -// MARK: Ghostty.Key AppEnum +extension Ghostty.Input.Key: AppEnum { + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Key") -extension Ghostty.Key: AppEnum { - static var typeDisplayRepresentation: TypeDisplayRepresentation = "Key" - - static var caseDisplayRepresentations: [Ghostty.Key : DisplayRepresentation] = [ - // Writing System Keys - .backquote: "Backtick (`)", - .backslash: "Backslash (\\)", - .bracketLeft: "Left Bracket ([)", - .bracketRight: "Right Bracket (])", - .comma: "Comma (,)", - .digit0: "0", - .digit1: "1", - .digit2: "2", - .digit3: "3", - .digit4: "4", - .digit5: "5", - .digit6: "6", - .digit7: "7", - .digit8: "8", - .digit9: "9", - .equal: "Equal (=)", - .intlBackslash: "International Backslash", - .intlRo: "International Ro", - .intlYen: "International Yen", - .a: "A", - .b: "B", - .c: "C", - .d: "D", - .e: "E", - .f: "F", - .g: "G", - .h: "H", - .i: "I", - .j: "J", - .k: "K", - .l: "L", - .m: "M", - .n: "N", - .o: "O", - .p: "P", - .q: "Q", - .r: "R", - .s: "S", - .t: "T", - .u: "U", - .v: "V", - .w: "W", - .x: "X", - .y: "Y", - .z: "Z", - .minus: "Minus (-)", - .period: "Period (.)", - .quote: "Quote (')", - .semicolon: "Semicolon (;)", - .slash: "Slash (/)", + // Only include keys that have Mac keycodes for App Intents + static var allCases: [Ghostty.Input.Key] { + return [ + // Letters (A-Z) + .a, .b, .c, .d, .e, .f, .g, .h, .i, .j, .k, .l, .m, .n, .o, .p, .q, .r, .s, .t, .u, .v, .w, .x, .y, .z, + + // Numbers (0-9) + .digit0, .digit1, .digit2, .digit3, .digit4, .digit5, .digit6, .digit7, .digit8, .digit9, + + // Common Control Keys + .space, .enter, .tab, .backspace, .escape, .delete, + + // Arrow Keys + .arrowUp, .arrowDown, .arrowLeft, .arrowRight, + + // Navigation Keys + .home, .end, .pageUp, .pageDown, .insert, + + // Function Keys (F1-F20) + .f1, .f2, .f3, .f4, .f5, .f6, .f7, .f8, .f9, .f10, .f11, .f12, + .f13, .f14, .f15, .f16, .f17, .f18, .f19, .f20, + + // Modifier Keys + .shiftLeft, .shiftRight, .controlLeft, .controlRight, .altLeft, .altRight, + .metaLeft, .metaRight, .capsLock, + + // Punctuation & Symbols + .minus, .equal, .backquote, .bracketLeft, .bracketRight, .backslash, + .semicolon, .quote, .comma, .period, .slash, + + // Numpad + .numLock, .numpad0, .numpad1, .numpad2, .numpad3, .numpad4, .numpad5, + .numpad6, .numpad7, .numpad8, .numpad9, .numpadAdd, .numpadSubtract, + .numpadMultiply, .numpadDivide, .numpadDecimal, .numpadEqual, + .numpadEnter, .numpadComma, + + // Media Keys + .audioVolumeUp, .audioVolumeDown, .audioVolumeMute, + + // International Keys + .intlBackslash, .intlRo, .intlYen, + + // Other + .contextMenu + ] + } + + static var caseDisplayRepresentations: [Ghostty.Input.Key : DisplayRepresentation] = [ + // Letters (A-Z) + .a: "A", .b: "B", .c: "C", .d: "D", .e: "E", .f: "F", .g: "G", .h: "H", .i: "I", .j: "J", + .k: "K", .l: "L", .m: "M", .n: "N", .o: "O", .p: "P", .q: "Q", .r: "R", .s: "S", .t: "T", + .u: "U", .v: "V", .w: "W", .x: "X", .y: "Y", .z: "Z", - // Functional Keys - .altLeft: "Left Alt", - .altRight: "Right Alt", - .backspace: "Backspace", - .capsLock: "Caps Lock", - .contextMenu: "Context Menu", - .controlLeft: "Left Control", - .controlRight: "Right Control", - .enter: "Enter", - .metaLeft: "Left Command", - .metaRight: "Right Command", - .shiftLeft: "Left Shift", - .shiftRight: "Right Shift", + // Numbers (0-9) + .digit0: "0", .digit1: "1", .digit2: "2", .digit3: "3", .digit4: "4", + .digit5: "5", .digit6: "6", .digit7: "7", .digit8: "8", .digit9: "9", + + // Common Control Keys .space: "Space", + .enter: "Enter", .tab: "Tab", - .convert: "Convert", - .kanaMode: "Kana Mode", - .nonConvert: "Non Convert", - - // Control Pad Section + .backspace: "Backspace", + .escape: "Escape", .delete: "Delete", - .end: "End", - .help: "Help", - .home: "Home", - .insert: "Insert", - .pageDown: "Page Down", - .pageUp: "Page Up", - // Arrow Pad Section + // Arrow Keys + .arrowUp: "Up Arrow", .arrowDown: "Down Arrow", .arrowLeft: "Left Arrow", .arrowRight: "Right Arrow", - .arrowUp: "Up Arrow", - // Numpad Section + // Navigation Keys + .home: "Home", + .end: "End", + .pageUp: "Page Up", + .pageDown: "Page Down", + .insert: "Insert", + + // Function Keys (F1-F20) + .f1: "F1", .f2: "F2", .f3: "F3", .f4: "F4", .f5: "F5", .f6: "F6", + .f7: "F7", .f8: "F8", .f9: "F9", .f10: "F10", .f11: "F11", .f12: "F12", + .f13: "F13", .f14: "F14", .f15: "F15", .f16: "F16", .f17: "F17", + .f18: "F18", .f19: "F19", .f20: "F20", + + // Modifier Keys + .shiftLeft: "Left Shift", + .shiftRight: "Right Shift", + .controlLeft: "Left Control", + .controlRight: "Right Control", + .altLeft: "Left Alt", + .altRight: "Right Alt", + .metaLeft: "Left Command", + .metaRight: "Right Command", + .capsLock: "Caps Lock", + + // Punctuation & Symbols + .minus: "Minus (-)", + .equal: "Equal (=)", + .backquote: "Backtick (`)", + .bracketLeft: "Left Bracket ([)", + .bracketRight: "Right Bracket (])", + .backslash: "Backslash (\\)", + .semicolon: "Semicolon (;)", + .quote: "Quote (')", + .comma: "Comma (,)", + .period: "Period (.)", + .slash: "Slash (/)", + + // Numpad .numLock: "Num Lock", - .numpad0: "Numpad 0", - .numpad1: "Numpad 1", - .numpad2: "Numpad 2", - .numpad3: "Numpad 3", - .numpad4: "Numpad 4", - .numpad5: "Numpad 5", - .numpad6: "Numpad 6", - .numpad7: "Numpad 7", - .numpad8: "Numpad 8", - .numpad9: "Numpad 9", + .numpad0: "Numpad 0", .numpad1: "Numpad 1", .numpad2: "Numpad 2", + .numpad3: "Numpad 3", .numpad4: "Numpad 4", .numpad5: "Numpad 5", + .numpad6: "Numpad 6", .numpad7: "Numpad 7", .numpad8: "Numpad 8", .numpad9: "Numpad 9", .numpadAdd: "Numpad Add (+)", - .numpadBackspace: "Numpad Backspace", - .numpadClear: "Numpad Clear", - .numpadClearEntry: "Numpad Clear Entry", - .numpadComma: "Numpad Comma", - .numpadDecimal: "Numpad Decimal", - .numpadDivide: "Numpad Divide (÷)", - .numpadEnter: "Numpad Enter", - .numpadEqual: "Numpad Equal", - .numpadMemoryAdd: "Numpad Memory Add", - .numpadMemoryClear: "Numpad Memory Clear", - .numpadMemoryRecall: "Numpad Memory Recall", - .numpadMemoryStore: "Numpad Memory Store", - .numpadMemorySubtract: "Numpad Memory Subtract", - .numpadMultiply: "Numpad Multiply (×)", - .numpadParenLeft: "Numpad Left Parenthesis", - .numpadParenRight: "Numpad Right Parenthesis", .numpadSubtract: "Numpad Subtract (-)", - .numpadSeparator: "Numpad Separator", - .numpadUp: "Numpad Up", - .numpadDown: "Numpad Down", - .numpadRight: "Numpad Right", - .numpadLeft: "Numpad Left", - .numpadBegin: "Numpad Begin", - .numpadHome: "Numpad Home", - .numpadEnd: "Numpad End", - .numpadInsert: "Numpad Insert", - .numpadDelete: "Numpad Delete", - .numpadPageUp: "Numpad Page Up", - .numpadPageDown: "Numpad Page Down", - - // Function Section - .escape: "Escape", - .f1: "F1", - .f2: "F2", - .f3: "F3", - .f4: "F4", - .f5: "F5", - .f6: "F6", - .f7: "F7", - .f8: "F8", - .f9: "F9", - .f10: "F10", - .f11: "F11", - .f12: "F12", - .f13: "F13", - .f14: "F14", - .f15: "F15", - .f16: "F16", - .f17: "F17", - .f18: "F18", - .f19: "F19", - .f20: "F20", - .f21: "F21", - .f22: "F22", - .f23: "F23", - .f24: "F24", - .f25: "F25", - .fn: "Fn", - .fnLock: "Fn Lock", - .printScreen: "Print Screen", - .scrollLock: "Scroll Lock", - .pause: "Pause", + .numpadMultiply: "Numpad Multiply (×)", + .numpadDivide: "Numpad Divide (÷)", + .numpadDecimal: "Numpad Decimal", + .numpadEqual: "Numpad Equal", + .numpadEnter: "Numpad Enter", + .numpadComma: "Numpad Comma", // Media Keys - .browserBack: "Browser Back", - .browserFavorites: "Browser Favorites", - .browserForward: "Browser Forward", - .browserHome: "Browser Home", - .browserRefresh: "Browser Refresh", - .browserSearch: "Browser Search", - .browserStop: "Browser Stop", - .eject: "Eject", - .launchApp1: "Launch App 1", - .launchApp2: "Launch App 2", - .launchMail: "Launch Mail", - .mediaPlayPause: "Media Play/Pause", - .mediaSelect: "Media Select", - .mediaStop: "Media Stop", - .mediaTrackNext: "Media Next Track", - .mediaTrackPrevious: "Media Previous Track", - .power: "Power", - .sleep: "Sleep", + .audioVolumeUp: "Volume Up", .audioVolumeDown: "Volume Down", .audioVolumeMute: "Volume Mute", - .audioVolumeUp: "Volume Up", - .wakeUp: "Wake Up", - // Legacy, Non-standard, and Special Keys - .copy: "Copy", - .cut: "Cut", - .paste: "Paste" + // International Keys + .intlBackslash: "International Backslash", + .intlRo: "International Ro", + .intlYen: "International Yen", + + // Other + .contextMenu: "Context Menu" ] } diff --git a/macos/Sources/Ghostty/Ghostty.Surface.swift b/macos/Sources/Ghostty/Ghostty.Surface.swift index 10e699c1f..88d3f1d09 100644 --- a/macos/Sources/Ghostty/Ghostty.Surface.swift +++ b/macos/Sources/Ghostty/Ghostty.Surface.swift @@ -48,6 +48,20 @@ extension Ghostty { } } + /// Send a key event to the terminal. + /// + /// This sends the full key event including modifiers, action type, and text to the terminal. + /// Unlike `sendText`, this method processes keyboard shortcuts, key bindings, and terminal + /// encoding based on the complete key event information. + /// + /// - Parameter event: The key event to send to the terminal + @MainActor + func sendKeyEvent(_ event: Input.KeyEvent) { + event.withCValue { cEvent in + ghostty_surface_key(surface, cEvent) + } + } + /// Perform a keybinding action. /// /// The action can be any valid keybind parameter. e.g. `keybind = goto_tab:4` diff --git a/macos/Sources/Ghostty/InspectorView.swift b/macos/Sources/Ghostty/InspectorView.swift index 491ec86e1..8008e49c2 100644 --- a/macos/Sources/Ghostty/InspectorView.swift +++ b/macos/Sources/Ghostty/InspectorView.swift @@ -337,7 +337,7 @@ extension Ghostty { private func keyAction(_ action: ghostty_input_action_e, event: NSEvent) { guard let inspector = self.inspector else { return } - guard let key = Ghostty.Key(keyCode: event.keyCode) else { return } + guard let key = Ghostty.Input.Key(keyCode: event.keyCode) else { return } let mods = Ghostty.ghosttyMods(event.modifierFlags) ghostty_inspector_key(inspector, action, key.cKey, mods) } From 4445a9c63701c52906be2c7a4f987939e79fb237 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 13:49:36 -0700 Subject: [PATCH 257/371] macos: add mouse button intent --- .../Features/App Intents/InputIntent.swift | 58 +++++++++ macos/Sources/Ghostty/Ghostty.Input.swift | 117 +++++++++++++++++- macos/Sources/Ghostty/Ghostty.Surface.swift | 26 ++++ .../Sources/Ghostty/SurfaceView_AppKit.swift | 15 +-- 4 files changed, 206 insertions(+), 10 deletions(-) diff --git a/macos/Sources/Features/App Intents/InputIntent.swift b/macos/Sources/Features/App Intents/InputIntent.swift index 6d3d60d59..56af10ceb 100644 --- a/macos/Sources/Features/App Intents/InputIntent.swift +++ b/macos/Sources/Features/App Intents/InputIntent.swift @@ -95,6 +95,64 @@ struct KeyEventIntent: AppIntent { } } +// MARK: MouseButtonIntent + +/// App intent to trigger a mouse button event. +struct MouseButtonIntent: AppIntent { + static var title: LocalizedStringResource = "Send Mouse Button Event to Terminal" + + @Parameter( + title: "Button", + description: "The mouse button to press or release.", + default: .left + ) + var button: Ghostty.Input.MouseButton + + @Parameter( + title: "Action", + description: "Whether to press or release the button.", + default: .press + ) + var action: Ghostty.Input.MouseState + + @Parameter( + title: "Modifier(s)", + description: "The modifiers to send with the mouse event.", + default: [] + ) + var mods: [KeyEventMods] + + @Parameter( + title: "Terminal", + description: "The terminal to scope this action to." + ) + var terminal: TerminalEntity + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = [.background, .foreground] + + @MainActor + func perform() async throws -> some IntentResult { + guard let surface = terminal.surfaceModel else { + throw GhosttyIntentError.surfaceNotFound + } + + // Convert KeyEventMods array to Ghostty.Input.Mods + let ghosttyMods = mods.reduce(Ghostty.Input.Mods()) { result, mod in + result.union(mod.ghosttyMod) + } + + let mouseEvent = Ghostty.Input.MouseButtonEvent( + action: action, + button: button, + mods: ghosttyMods + ) + surface.sendMouseButton(mouseEvent) + + return .result() + } +} + // MARK: Mods enum KeyEventMods: String, AppEnum, CaseIterable { diff --git a/macos/Sources/Ghostty/Ghostty.Input.swift b/macos/Sources/Ghostty/Ghostty.Input.swift index df93017c7..a2d6b104d 100644 --- a/macos/Sources/Ghostty/Ghostty.Input.swift +++ b/macos/Sources/Ghostty/Ghostty.Input.swift @@ -215,11 +215,126 @@ extension Ghostty.Input.Action: AppEnum { static var caseDisplayRepresentations: [Ghostty.Input.Action : DisplayRepresentation] = [ .release: "Release", - .press: "Press", + .press: "Press", .repeat: "Repeat" ] } +// MARK: Ghostty.Input.MouseEvent + +extension Ghostty.Input { + /// Represents a mouse input event with button state, button type, and modifier keys. + struct MouseButtonEvent { + let action: MouseState + let button: MouseButton + let mods: Mods + + init( + action: MouseState, + button: MouseButton, + mods: Mods = [] + ) { + self.action = action + self.button = button + self.mods = mods + } + + /// Creates a MouseEvent from C enum values. + /// + /// This initializer converts C-style mouse input enums to Swift types. + /// Returns nil if any of the C enum values are invalid or unsupported. + /// + /// - Parameters: + /// - state: The mouse button state (press/release) + /// - button: The mouse button that was pressed/released + /// - mods: The modifier keys held during the mouse event + init?(state: ghostty_input_mouse_state_e, button: ghostty_input_mouse_button_e, mods: ghostty_input_mods_e) { + // Convert state + switch state { + case GHOSTTY_MOUSE_RELEASE: self.action = .release + case GHOSTTY_MOUSE_PRESS: self.action = .press + default: return nil + } + + // Convert button + switch button { + case GHOSTTY_MOUSE_UNKNOWN: self.button = .unknown + case GHOSTTY_MOUSE_LEFT: self.button = .left + case GHOSTTY_MOUSE_RIGHT: self.button = .right + case GHOSTTY_MOUSE_MIDDLE: self.button = .middle + default: return nil + } + + // Convert modifiers + self.mods = Mods(cMods: mods) + } + } +} + +// MARK: Ghostty.Input.MouseState + +extension Ghostty.Input { + /// `ghostty_input_mouse_state_e` + enum MouseState: String, CaseIterable { + case release + case press + + var cMouseState: ghostty_input_mouse_state_e { + switch self { + case .release: GHOSTTY_MOUSE_RELEASE + case .press: GHOSTTY_MOUSE_PRESS + } + } + } +} + +extension Ghostty.Input.MouseState: AppEnum { + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Mouse State") + + static var caseDisplayRepresentations: [Ghostty.Input.MouseState : DisplayRepresentation] = [ + .release: "Release", + .press: "Press" + ] +} + +// MARK: Ghostty.Input.MouseButton + +extension Ghostty.Input { + /// `ghostty_input_mouse_button_e` + enum MouseButton: String, CaseIterable { + case unknown + case left + case right + case middle + + var cMouseButton: ghostty_input_mouse_button_e { + switch self { + case .unknown: GHOSTTY_MOUSE_UNKNOWN + case .left: GHOSTTY_MOUSE_LEFT + case .right: GHOSTTY_MOUSE_RIGHT + case .middle: GHOSTTY_MOUSE_MIDDLE + } + } + } +} + +extension Ghostty.Input.MouseButton: AppEnum { + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Mouse Button") + + static var caseDisplayRepresentations: [Ghostty.Input.MouseButton : DisplayRepresentation] = [ + .unknown: "Unknown", + .left: "Left", + .right: "Right", + .middle: "Middle" + ] + + static var allCases: [Ghostty.Input.MouseButton] = [ + .left, + .right, + .middle, + ] +} + // MARK: Ghostty.Input.Mods extension Ghostty.Input { diff --git a/macos/Sources/Ghostty/Ghostty.Surface.swift b/macos/Sources/Ghostty/Ghostty.Surface.swift index 88d3f1d09..2cc85f1e4 100644 --- a/macos/Sources/Ghostty/Ghostty.Surface.swift +++ b/macos/Sources/Ghostty/Ghostty.Surface.swift @@ -62,6 +62,32 @@ extension Ghostty { } } + /// Whether the terminal has captured mouse input. + /// + /// When the mouse is captured, the terminal application is receiving mouse events + /// directly rather than the host system handling them. This typically occurs when + /// a terminal application enables mouse reporting mode. + @MainActor + var mouseCaptured: Bool { + ghostty_surface_mouse_captured(surface) + } + + /// Send a mouse button event to the terminal. + /// + /// This sends a complete mouse button event including the button state (press/release), + /// which button was pressed, and any modifier keys that were held during the event. + /// The terminal processes this event according to its mouse handling configuration. + /// + /// - Parameter event: The mouse button event to send to the terminal + @MainActor + func sendMouseButton(_ event: Input.MouseButtonEvent) { + ghostty_surface_mouse_button( + surface, + event.action.cMouseState, + event.button.cMouseButton, + event.mods.cMods) + } + /// Perform a keybinding action. /// /// The action can be any valid keybind parameter. e.g. `keybind = goto_tab:4` diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index 2e7cf499b..d987b80be 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -1312,8 +1312,8 @@ extension Ghostty { // In this case, AppKit calls menu BEFORE calling any mouse events. // If mouse capturing is enabled then we never show the context menu // so that we can handle ctrl+left-click in the terminal app. - guard let surface = self.surface else { return nil } - if ghostty_surface_mouse_captured(surface) { + guard let surfaceModel else { return nil } + if surfaceModel.mouseCaptured { return nil } @@ -1323,13 +1323,10 @@ extension Ghostty { // // Note this never sounds a right mouse up event but that's the // same as normal right-click with capturing disabled from AppKit. - let mods = Ghostty.ghosttyMods(event.modifierFlags) - ghostty_surface_mouse_button( - surface, - GHOSTTY_MOUSE_PRESS, - GHOSTTY_MOUSE_RIGHT, - mods - ) + surfaceModel.sendMouseButton(.init( + action: .press, + button: .right, + mods: .init(nsFlags: event.modifierFlags))) default: return nil From bc134016f7d978036103cd3c4532ab9636e445ad Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 14:07:09 -0700 Subject: [PATCH 258/371] macos: move mousePos and mousScroll to Ghostty.Surface --- macos/Sources/Ghostty/Ghostty.Input.swift | 120 ++++++++++++++++++ macos/Sources/Ghostty/Ghostty.Surface.swift | 32 +++++ .../Sources/Ghostty/SurfaceView_AppKit.swift | 70 +++++----- 3 files changed, 183 insertions(+), 39 deletions(-) diff --git a/macos/Sources/Ghostty/Ghostty.Input.swift b/macos/Sources/Ghostty/Ghostty.Input.swift index a2d6b104d..bbc83c5e5 100644 --- a/macos/Sources/Ghostty/Ghostty.Input.swift +++ b/macos/Sources/Ghostty/Ghostty.Input.swift @@ -269,6 +269,40 @@ extension Ghostty.Input { self.mods = Mods(cMods: mods) } } + + /// Represents a mouse position/movement event with coordinates and modifier keys. + struct MousePosEvent { + let x: Double + let y: Double + let mods: Mods + + init( + x: Double, + y: Double, + mods: Mods = [] + ) { + self.x = x + self.y = y + self.mods = mods + } + } + + /// Represents a mouse scroll event with scroll deltas and modifier keys. + struct MouseScrollEvent { + let x: Double + let y: Double + let mods: ScrollMods + + init( + x: Double, + y: Double, + mods: ScrollMods = .init(rawValue: 0) + ) { + self.x = x + self.y = y + self.mods = mods + } + } } // MARK: Ghostty.Input.MouseState @@ -335,6 +369,92 @@ extension Ghostty.Input.MouseButton: AppEnum { ] } +// MARK: Ghostty.Input.ScrollMods + +extension Ghostty.Input { + /// `ghostty_input_scroll_mods_t` - Scroll event modifiers + /// + /// This is a packed bitmask that contains precision and momentum information + /// for scroll events, matching the Zig `ScrollMods` packed struct. + struct ScrollMods { + let rawValue: Int32 + + /// True if this is a high-precision scroll event (e.g., trackpad, Magic Mouse) + var precision: Bool { + rawValue & 0b0000_0001 != 0 + } + + /// The momentum phase of the scroll event for inertial scrolling + var momentum: Momentum { + let momentumBits = (rawValue >> 1) & 0b0000_0111 + return Momentum(rawValue: UInt8(momentumBits)) ?? .none + } + + init(precision: Bool = false, momentum: Momentum = .none) { + var value: Int32 = 0 + if precision { + value |= 0b0000_0001 + } + value |= Int32(momentum.rawValue) << 1 + self.rawValue = value + } + + init(rawValue: Int32) { + self.rawValue = rawValue + } + + var cScrollMods: ghostty_input_scroll_mods_t { + rawValue + } + } +} + +// MARK: Ghostty.Input.Momentum + +extension Ghostty.Input { + /// `ghostty_input_mouse_momentum_e` - Momentum phase for scroll events + enum Momentum: UInt8, CaseIterable { + case none = 0 + case began = 1 + case stationary = 2 + case changed = 3 + case ended = 4 + case cancelled = 5 + case mayBegin = 6 + + var cMomentum: ghostty_input_mouse_momentum_e { + switch self { + case .none: GHOSTTY_MOUSE_MOMENTUM_NONE + case .began: GHOSTTY_MOUSE_MOMENTUM_BEGAN + case .stationary: GHOSTTY_MOUSE_MOMENTUM_STATIONARY + case .changed: GHOSTTY_MOUSE_MOMENTUM_CHANGED + case .ended: GHOSTTY_MOUSE_MOMENTUM_ENDED + case .cancelled: GHOSTTY_MOUSE_MOMENTUM_CANCELLED + case .mayBegin: GHOSTTY_MOUSE_MOMENTUM_MAY_BEGIN + } + } + } +} + +#if canImport(AppKit) +import AppKit + +extension Ghostty.Input.Momentum { + /// Create a Momentum from an NSEvent.Phase + init(_ phase: NSEvent.Phase) { + switch phase { + case .began: self = .began + case .stationary: self = .stationary + case .changed: self = .changed + case .ended: self = .ended + case .cancelled: self = .cancelled + case .mayBegin: self = .mayBegin + default: self = .none + } + } +} +#endif + // MARK: Ghostty.Input.Mods extension Ghostty.Input { diff --git a/macos/Sources/Ghostty/Ghostty.Surface.swift b/macos/Sources/Ghostty/Ghostty.Surface.swift index 2cc85f1e4..c7198e147 100644 --- a/macos/Sources/Ghostty/Ghostty.Surface.swift +++ b/macos/Sources/Ghostty/Ghostty.Surface.swift @@ -88,6 +88,38 @@ extension Ghostty { event.mods.cMods) } + /// Send a mouse position event to the terminal. + /// + /// This reports the current mouse position to the terminal, which may be used + /// for mouse tracking, hover effects, or other position-dependent features. + /// The terminal will only receive these events if mouse reporting is enabled. + /// + /// - Parameter event: The mouse position event to send to the terminal + @MainActor + func sendMousePos(_ event: Input.MousePosEvent) { + ghostty_surface_mouse_pos( + surface, + event.x, + event.y, + event.mods.cMods) + } + + /// Send a mouse scroll event to the terminal. + /// + /// This sends scroll wheel input to the terminal with delta values for both + /// horizontal and vertical scrolling, along with precision and momentum information. + /// The terminal processes this according to its scroll handling configuration. + /// + /// - Parameter event: The mouse scroll event to send to the terminal + @MainActor + func sendMouseScroll(_ event: Input.MouseScrollEvent) { + ghostty_surface_mouse_scroll( + surface, + event.x, + event.y, + event.mods.cScrollMods) + } + /// Perform a keybinding action. /// /// The action can be any valid keybind parameter. e.g. `keybind = goto_tab:4` diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift index d987b80be..83a8da29c 100644 --- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift +++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift @@ -808,19 +808,23 @@ extension Ghostty { override func mouseEntered(with event: NSEvent) { super.mouseEntered(with: event) - guard let surface = self.surface else { return } + guard let surfaceModel else { return } // On mouse enter we need to reset our cursor position. This is // super important because we set it to -1/-1 on mouseExit and // lots of mouse logic (i.e. whether to send mouse reports) depend // on the position being in the viewport if it is. let pos = self.convert(event.locationInWindow, from: nil) - let mods = Ghostty.ghosttyMods(event.modifierFlags) - ghostty_surface_mouse_pos(surface, pos.x, frame.height - pos.y, mods) + let mouseEvent = Ghostty.Input.MousePosEvent( + x: pos.x, + y: frame.height - pos.y, + mods: .init(nsFlags: event.modifierFlags) + ) + surfaceModel.sendMousePos(mouseEvent) } override func mouseExited(with event: NSEvent) { - guard let surface = self.surface else { return } + guard let surfaceModel else { return } // If the mouse is being dragged then we don't have to emit // this because we get mouse drag events even if we've already @@ -830,17 +834,25 @@ extension Ghostty { } // Negative values indicate cursor has left the viewport - let mods = Ghostty.ghosttyMods(event.modifierFlags) - ghostty_surface_mouse_pos(surface, -1, -1, mods) + let mouseEvent = Ghostty.Input.MousePosEvent( + x: -1, + y: -1, + mods: .init(nsFlags: event.modifierFlags) + ) + surfaceModel.sendMousePos(mouseEvent) } override func mouseMoved(with event: NSEvent) { - guard let surface = self.surface else { return } + guard let surfaceModel else { return } // Convert window position to view position. Note (0, 0) is bottom left. let pos = self.convert(event.locationInWindow, from: nil) - let mods = Ghostty.ghosttyMods(event.modifierFlags) - ghostty_surface_mouse_pos(surface, pos.x, frame.height - pos.y, mods) + let mouseEvent = Ghostty.Input.MousePosEvent( + x: pos.x, + y: frame.height - pos.y, + mods: .init(nsFlags: event.modifierFlags) + ) + surfaceModel.sendMousePos(mouseEvent) // Handle focus-follows-mouse if let window, @@ -866,16 +878,13 @@ extension Ghostty { } override func scrollWheel(with event: NSEvent) { - guard let surface = self.surface else { return } - - // Builds up the "input.ScrollMods" bitmask - var mods: Int32 = 0 + guard let surfaceModel else { return } var x = event.scrollingDeltaX var y = event.scrollingDeltaY - if event.hasPreciseScrollingDeltas { - mods = 1 - + let precision = event.hasPreciseScrollingDeltas + + if precision { // We do a 2x speed multiplier. This is subjective, it "feels" better to me. x *= 2; y *= 2; @@ -883,29 +892,12 @@ extension Ghostty { // TODO(mitchellh): do we have to scale the x/y here by window scale factor? } - // Determine our momentum value - var momentum: ghostty_input_mouse_momentum_e = GHOSTTY_MOUSE_MOMENTUM_NONE - switch (event.momentumPhase) { - case .began: - momentum = GHOSTTY_MOUSE_MOMENTUM_BEGAN - case .stationary: - momentum = GHOSTTY_MOUSE_MOMENTUM_STATIONARY - case .changed: - momentum = GHOSTTY_MOUSE_MOMENTUM_CHANGED - case .ended: - momentum = GHOSTTY_MOUSE_MOMENTUM_ENDED - case .cancelled: - momentum = GHOSTTY_MOUSE_MOMENTUM_CANCELLED - case .mayBegin: - momentum = GHOSTTY_MOUSE_MOMENTUM_MAY_BEGIN - default: - break - } - - // Pack our momentum value into the mods bitmask - mods |= Int32(momentum.rawValue) << 1 - - ghostty_surface_mouse_scroll(surface, x, y, mods) + let scrollEvent = Ghostty.Input.MouseScrollEvent( + x: x, + y: y, + mods: .init(precision: precision, momentum: .init(event.momentumPhase)) + ) + surfaceModel.sendMouseScroll(scrollEvent) } override func pressureChange(with event: NSEvent) { From 2df301e2fb6abd5d37fef3f7d8808d24977ad89e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 14:14:09 -0700 Subject: [PATCH 259/371] macos: mouse pos and scroll intents --- .../Features/App Intents/InputIntent.swift | 116 ++++++++++++++++++ macos/Sources/Ghostty/Ghostty.Input.swift | 14 +++ 2 files changed, 130 insertions(+) diff --git a/macos/Sources/Features/App Intents/InputIntent.swift b/macos/Sources/Features/App Intents/InputIntent.swift index 56af10ceb..b8c248fe3 100644 --- a/macos/Sources/Features/App Intents/InputIntent.swift +++ b/macos/Sources/Features/App Intents/InputIntent.swift @@ -153,6 +153,122 @@ struct MouseButtonIntent: AppIntent { } } +/// App intent to send a mouse position event. +struct MousePosIntent: AppIntent { + static var title: LocalizedStringResource = "Send Mouse Position Event to Terminal" + static var description = IntentDescription("Send a mouse position event to the terminal. This reports the cursor position for mouse tracking.") + + @Parameter( + title: "X Position", + description: "The horizontal position of the mouse cursor in pixels.", + default: 0 + ) + var x: Double + + @Parameter( + title: "Y Position", + description: "The vertical position of the mouse cursor in pixels.", + default: 0 + ) + var y: Double + + @Parameter( + title: "Modifier(s)", + description: "The modifiers to send with the mouse position event.", + default: [] + ) + var mods: [KeyEventMods] + + @Parameter( + title: "Terminal", + description: "The terminal to scope this action to." + ) + var terminal: TerminalEntity + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = [.background, .foreground] + + @MainActor + func perform() async throws -> some IntentResult { + guard let surface = terminal.surfaceModel else { + throw GhosttyIntentError.surfaceNotFound + } + + // Convert KeyEventMods array to Ghostty.Input.Mods + let ghosttyMods = mods.reduce(Ghostty.Input.Mods()) { result, mod in + result.union(mod.ghosttyMod) + } + + let mousePosEvent = Ghostty.Input.MousePosEvent( + x: x, + y: y, + mods: ghosttyMods + ) + surface.sendMousePos(mousePosEvent) + + return .result() + } +} + +/// App intent to send a mouse scroll event. +struct MouseScrollIntent: AppIntent { + static var title: LocalizedStringResource = "Send Mouse Scroll Event to Terminal" + static var description = IntentDescription("Send a mouse scroll event to the terminal with configurable precision and momentum.") + + @Parameter( + title: "X Scroll Delta", + description: "The horizontal scroll amount.", + default: 0 + ) + var x: Double + + @Parameter( + title: "Y Scroll Delta", + description: "The vertical scroll amount.", + default: 0 + ) + var y: Double + + @Parameter( + title: "High Precision", + description: "Whether this is a high-precision scroll event (e.g., from trackpad).", + default: false + ) + var precision: Bool + + @Parameter( + title: "Momentum Phase", + description: "The momentum phase for inertial scrolling.", + default: Ghostty.Input.Momentum.none + ) + var momentum: Ghostty.Input.Momentum + + @Parameter( + title: "Terminal", + description: "The terminal to scope this action to." + ) + var terminal: TerminalEntity + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = [.background, .foreground] + + @MainActor + func perform() async throws -> some IntentResult { + guard let surface = terminal.surfaceModel else { + throw GhosttyIntentError.surfaceNotFound + } + + let scrollEvent = Ghostty.Input.MouseScrollEvent( + x: x, + y: y, + mods: .init(precision: precision, momentum: momentum) + ) + surface.sendMouseScroll(scrollEvent) + + return .result() + } +} + // MARK: Mods enum KeyEventMods: String, AppEnum, CaseIterable { diff --git a/macos/Sources/Ghostty/Ghostty.Input.swift b/macos/Sources/Ghostty/Ghostty.Input.swift index bbc83c5e5..e05911c06 100644 --- a/macos/Sources/Ghostty/Ghostty.Input.swift +++ b/macos/Sources/Ghostty/Ghostty.Input.swift @@ -436,6 +436,20 @@ extension Ghostty.Input { } } +extension Ghostty.Input.Momentum: AppEnum { + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Scroll Momentum") + + static var caseDisplayRepresentations: [Ghostty.Input.Momentum : DisplayRepresentation] = [ + .none: "None", + .began: "Began", + .stationary: "Stationary", + .changed: "Changed", + .ended: "Ended", + .cancelled: "Cancelled", + .mayBegin: "May Begin" + ] +} + #if canImport(AppKit) import AppKit From 0a27aef508ceb5b3376a77ac9fbb6dc6f30020dd Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 14:19:37 -0700 Subject: [PATCH 260/371] README: note Xcode 26 requirement --- .github/workflows/test.yml | 41 -------------------------------------- README.md | 22 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2eca0a41e..4d09603f4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,6 @@ jobs: - build-nix - build-snap - build-macos - - build-macos-sequoia-stable - build-macos-tahoe - build-macos-matrix - build-windows @@ -310,46 +309,6 @@ jobs: cd macos xcodebuild -target Ghostty-iOS "CODE_SIGNING_ALLOWED=NO" - build-macos-sequoia-stable: - runs-on: namespace-profile-ghostty-macos-sequoia - needs: test - steps: - - name: Checkout code - uses: actions/checkout@v4 - - # Install Nix and use that to run our tests so our environment matches exactly. - - uses: cachix/install-nix-action@v31 - with: - nix_path: nixpkgs=channel:nixos-unstable - - uses: cachix/cachix-action@v16 - with: - name: ghostty - authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}" - - - name: Xcode Select - run: sudo xcode-select -s /Applications/Xcode_16.4.app - - - name: get the Zig deps - id: deps - run: nix build -L .#deps && echo "deps=$(readlink ./result)" >> $GITHUB_OUTPUT - - # GhosttyKit is the framework that is built from Zig for our native - # Mac app to access. - - name: Build GhosttyKit - run: nix develop -c zig build --system ${{ steps.deps.outputs.deps }} - - # The native app is built with native Xcode tooling. This also does - # codesigning. IMPORTANT: this must NOT run in a Nix environment. - # Nix breaks xcodebuild so this has to be run outside. - - name: Build Ghostty.app - run: cd macos && xcodebuild -target Ghostty - - # Build the iOS target without code signing just to verify it works. - - name: Build Ghostty iOS - run: | - cd macos - xcodebuild -target Ghostty-iOS "CODE_SIGNING_ALLOWED=NO" - build-macos-tahoe: runs-on: namespace-profile-ghostty-macos-tahoe needs: test diff --git a/README.md b/README.md index d5c9dba02..b59964e61 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,28 @@ macOS users don't require any additional dependencies. > source tarballs, see the > [website](http://ghostty.org/docs/install/build). +### Xcode Version and SDKs + +Building the Ghostty macOS app requires that Xcode, the macOS SDK, +and the iOS SDK are all installed. + +A common issue is that the incorrect version of Xcode is either +installed or selected. Use the `xcode-select` command to +ensure that the correct version of Xcode is selected: + +```shell-session +sudo xcode-select --switch /Applications/Xcode-beta.app +``` + +> [!IMPORTANT] +> +> Main branch development of Ghostty is preparing for the next major +> macOS release, Tahoe (macOS 26). Therefore, the main branch requires +> **Xcode 26 and the macOS 26 SDK**. +> +> You do not need to be running on macOS 26 to build Ghostty, you can +> still use Xcode 26 beta on macOS 15 stable. + ### Linting #### Prettier From f096675eaf389871e53140d0037a6ce208307654 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Jun 2025 20:00:24 -0700 Subject: [PATCH 261/371] macos: Close Terminal Intent --- macos/Ghostty.xcodeproj/project.pbxproj | 4 + .../App Intents/CloseTerminalIntent.swift | 38 ++++++++++ .../QuickTerminalController.swift | 6 +- .../Terminal/BaseTerminalController.swift | 73 +++++++++++-------- .../Terminal/TerminalController.swift | 4 +- 5 files changed, 88 insertions(+), 37 deletions(-) create mode 100644 macos/Sources/Features/App Intents/CloseTerminalIntent.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index bbb34820f..acf4b0e43 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 857F63812A5E64F200CA4815 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 857F63802A5E64F200CA4815 /* MainMenu.xib */; }; 9351BE8E3D22937F003B3499 /* nvim in Resources */ = {isa = PBXBuildFile; fileRef = 9351BE8E2D22937F003B3499 /* nvim */; }; A50297352DFA0F3400B4E924 /* Double+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50297342DFA0F3300B4E924 /* Double+Extension.swift */; }; + A511940F2E050595007258CC /* CloseTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A511940E2E050590007258CC /* CloseTerminalIntent.swift */; }; A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D72B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D82B54DC6800493A16 /* Ghostty.App.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */; }; @@ -149,6 +150,7 @@ 857F63802A5E64F200CA4815 /* MainMenu.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MainMenu.xib; sourceTree = ""; }; 9351BE8E2D22937F003B3499 /* nvim */ = {isa = PBXFileReference; lastKnownFileType = folder; name = nvim; path = "../zig-out/share/nvim"; sourceTree = ""; }; A50297342DFA0F3300B4E924 /* Double+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+Extension.swift"; sourceTree = ""; }; + A511940E2E050590007258CC /* CloseTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseTerminalIntent.swift; sourceTree = ""; }; A514C8D52B54A16400493A16 /* Ghostty.Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Config.swift; sourceTree = ""; }; A51544FD2DFB1110009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitlebarTabsTahoeTerminalWindow.swift; sourceTree = ""; }; A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebarTahoe.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTabsTitlebarTahoe.xib; sourceTree = ""; }; @@ -625,6 +627,7 @@ isa = PBXGroup; children = ( A5E408412E0453370035FEAC /* Entities */, + A511940E2E050590007258CC /* CloseTerminalIntent.swift */, A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */, A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */, A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */, @@ -793,6 +796,7 @@ A5CBD0602CA0C90A0017A1AE /* QuickTerminalWindow.swift in Sources */, A5CBD05E2CA0C5EC0017A1AE /* QuickTerminalController.swift in Sources */, A5CF66D72D29DDB500139794 /* Ghostty.Event.swift in Sources */, + A511940F2E050595007258CC /* CloseTerminalIntent.swift in Sources */, A5E408382E03C7DA0035FEAC /* Ghostty.Surface.swift in Sources */, A5593FE72DF927D200B47B10 /* TransparentTitlebarTerminalWindow.swift in Sources */, A5A2A3CA2D4445E30033CF96 /* Dock.swift in Sources */, diff --git a/macos/Sources/Features/App Intents/CloseTerminalIntent.swift b/macos/Sources/Features/App Intents/CloseTerminalIntent.swift new file mode 100644 index 000000000..18079650b --- /dev/null +++ b/macos/Sources/Features/App Intents/CloseTerminalIntent.swift @@ -0,0 +1,38 @@ +import AppKit +import AppIntents +import GhosttyKit + +struct CloseTerminalIntent: AppIntent { + static var title: LocalizedStringResource = "Close Terminal" + static var description = IntentDescription("Close an existing terminal.") + + @Parameter( + title: "Terminal", + description: "The terminal to close.", + ) + var terminal: TerminalEntity + + @Parameter( + title: "Command", + description: "Command to execute instead of the default shell.", + default: true + ) + var confirm: Bool + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = .background + + @MainActor + func perform() async throws -> some IntentResult { + guard let surfaceView = terminal.surfaceView else { + throw GhosttyIntentError.surfaceNotFound + } + + guard let controller = surfaceView.window?.windowController as? BaseTerminalController else { + return .result() + } + + controller.closeSurface(surfaceView, withConfirmation: confirm) + return .result() + } +} diff --git a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift index 28dea9579..80b0c9413 100644 --- a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift +++ b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift @@ -218,19 +218,19 @@ class QuickTerminalController: BaseTerminalController { } } - override func closeSurfaceNode( + override func closeSurface( _ node: SplitTree.Node, withConfirmation: Bool = true ) { // If this isn't the root then we're dealing with a split closure. if surfaceTree.root != node { - super.closeSurfaceNode(node, withConfirmation: withConfirmation) + super.closeSurface(node, withConfirmation: withConfirmation) return } // If this isn't a final leaf then we're dealing with a split closure guard case .leaf(let surface) = node else { - super.closeSurfaceNode(node, withConfirmation: withConfirmation) + super.closeSurface(node, withConfirmation: withConfirmation) return } diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift index 81b7d32b6..c93a9450d 100644 --- a/macos/Sources/Features/Terminal/BaseTerminalController.swift +++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift @@ -300,6 +300,46 @@ class BaseTerminalController: NSWindowController, self.alert = alert } + /// Close a surface from a view. + func closeSurface( + _ view: Ghostty.SurfaceView, + withConfirmation: Bool = true + ) { + guard let node = surfaceTree.root?.node(view: view) else { return } + closeSurface(node, withConfirmation: withConfirmation) + } + + /// Close a surface node (which may contain splits), requesting confirmation if necessary. + /// + /// This will also insert the proper undo stack information in. + func closeSurface( + _ node: SplitTree.Node, + withConfirmation: Bool = true + ) { + // This node must be part of our tree + guard surfaceTree.contains(node) else { return } + + // If the child process is not alive, then we exit immediately + guard withConfirmation else { + removeSurfaceNode(node) + return + } + + // Confirm close. We use an NSAlert instead of a SwiftUI confirmationDialog + // due to SwiftUI bugs (see Ghostty #560). To repeat from #560, the bug is that + // confirmationDialog allows the user to Cmd-W close the alert, but when doing + // so SwiftUI does not update any of the bindings to note that window is no longer + // being shown, and provides no callback to detect this. + confirmClose( + messageText: "Close Terminal?", + informativeText: "The terminal still has a running process. If you close the terminal the process will be killed." + ) { [weak self] in + if let self { + self.removeSurfaceNode(node) + } + } + } + // MARK: Split Tree Management /// Find the next surface to focus when a node is being closed. @@ -460,42 +500,11 @@ class BaseTerminalController: NSWindowController, @objc private func ghosttyDidCloseSurface(_ notification: Notification) { guard let target = notification.object as? Ghostty.SurfaceView else { return } guard let node = surfaceTree.root?.node(view: target) else { return } - closeSurfaceNode( + closeSurface( node, withConfirmation: (notification.userInfo?["process_alive"] as? Bool) ?? false) } - /// Close a surface node (which may contain splits), requesting confirmation if necessary. - /// - /// This will also insert the proper undo stack information in. - func closeSurfaceNode( - _ node: SplitTree.Node, - withConfirmation: Bool = true - ) { - // This node must be part of our tree - guard surfaceTree.contains(node) else { return } - - // If the child process is not alive, then we exit immediately - guard withConfirmation else { - removeSurfaceNode(node) - return - } - - // Confirm close. We use an NSAlert instead of a SwiftUI confirmationDialog - // due to SwiftUI bugs (see Ghostty #560). To repeat from #560, the bug is that - // confirmationDialog allows the user to Cmd-W close the alert, but when doing - // so SwiftUI does not update any of the bindings to note that window is no longer - // being shown, and provides no callback to detect this. - confirmClose( - messageText: "Close Terminal?", - informativeText: "The terminal still has a running process. If you close the terminal the process will be killed." - ) { [weak self] in - if let self { - self.removeSurfaceNode(node) - } - } - } - @objc private func ghosttyDidNewSplit(_ notification: Notification) { // The target must be within our tree guard let oldView = notification.object as? Ghostty.SurfaceView else { return } diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index a224c9248..77eb079ad 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -519,13 +519,13 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr } /// This is called anytime a node in the surface tree is being removed. - override func closeSurfaceNode( + override func closeSurface( _ node: SplitTree.Node, withConfirmation: Bool = true ) { // If this isn't the root then we're dealing with a split closure. if surfaceTree.root != node { - super.closeSurfaceNode(node, withConfirmation: withConfirmation) + super.closeSurface(node, withConfirmation: withConfirmation) return } From 2c1e83ba2fd621d532ea0e7e4746f3f7ae19c069 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 20 Jun 2025 07:03:40 -0700 Subject: [PATCH 262/371] macos: intent to open quick terminal --- macos/Ghostty.xcodeproj/project.pbxproj | 4 +++ macos/Sources/App/macOS/AppDelegate.swift | 15 ++++------ .../App Intents/Entities/TerminalEntity.swift | 27 +++++++++++++++++- .../App Intents/QuickTerminalIntent.swift | 28 +++++++++++++++++++ .../QuickTerminalController.swift | 6 +++- 5 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 macos/Sources/Features/App Intents/QuickTerminalIntent.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index acf4b0e43..6b0cfd6f8 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 9351BE8E3D22937F003B3499 /* nvim in Resources */ = {isa = PBXBuildFile; fileRef = 9351BE8E2D22937F003B3499 /* nvim */; }; A50297352DFA0F3400B4E924 /* Double+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50297342DFA0F3300B4E924 /* Double+Extension.swift */; }; A511940F2E050595007258CC /* CloseTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A511940E2E050590007258CC /* CloseTerminalIntent.swift */; }; + A51194112E05A483007258CC /* QuickTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51194102E05A480007258CC /* QuickTerminalIntent.swift */; }; A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D72B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D82B54DC6800493A16 /* Ghostty.App.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */; }; @@ -151,6 +152,7 @@ 9351BE8E2D22937F003B3499 /* nvim */ = {isa = PBXFileReference; lastKnownFileType = folder; name = nvim; path = "../zig-out/share/nvim"; sourceTree = ""; }; A50297342DFA0F3300B4E924 /* Double+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+Extension.swift"; sourceTree = ""; }; A511940E2E050590007258CC /* CloseTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseTerminalIntent.swift; sourceTree = ""; }; + A51194102E05A480007258CC /* QuickTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickTerminalIntent.swift; sourceTree = ""; }; A514C8D52B54A16400493A16 /* Ghostty.Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Config.swift; sourceTree = ""; }; A51544FD2DFB1110009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitlebarTabsTahoeTerminalWindow.swift; sourceTree = ""; }; A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebarTahoe.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTabsTitlebarTahoe.xib; sourceTree = ""; }; @@ -630,6 +632,7 @@ A511940E2E050590007258CC /* CloseTerminalIntent.swift */, A5E4082D2E0237410035FEAC /* NewTerminalIntent.swift */, A5E408332E03200F0035FEAC /* GetTerminalDetailsIntent.swift */, + A51194102E05A480007258CC /* QuickTerminalIntent.swift */, A5E408422E047D060035FEAC /* CommandPaletteIntent.swift */, A5E408462E0485270035FEAC /* InputIntent.swift */, A5E408442E0483F80035FEAC /* KeybindIntent.swift */, @@ -806,6 +809,7 @@ A53A29812DB44A6100B6E02C /* KeyboardShortcut+Extension.swift in Sources */, A50297352DFA0F3400B4E924 /* Double+Extension.swift in Sources */, A5CBD0562C9E65B80017A1AE /* DraggableWindowView.swift in Sources */, + A51194112E05A483007258CC /* QuickTerminalIntent.swift in Sources */, C1F26EE92B76CBFC00404083 /* VibrantLayer.m in Sources */, A5593FDF2DF8D57C00B47B10 /* TerminalWindow.swift in Sources */, A58636712DF298FB00E04A10 /* ExpiringUndoManager.swift in Sources */, diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index 7336f18d6..4ffb9efa4 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -92,7 +92,10 @@ class AppDelegate: NSObject, lazy var undoManager = ExpiringUndoManager() /// Our quick terminal. This starts out uninitialized and only initializes if used. - private var quickController: QuickTerminalController? = nil + private(set) lazy var quickController = QuickTerminalController( + ghostty, + position: derivedConfig.quickTerminalPosition + ) /// Manages updates let updaterController: SPUStandardUpdaterController @@ -286,7 +289,7 @@ class AppDelegate: NSObject, // NOTE(mitchellh): I don't think we need this check at all anymore. I'm keeping it // here because I don't want to remove it in a patch release cycle but we should // target removing it soon. - if (self.quickController == nil && windows.allSatisfy { !$0.isVisible }) { + if (windows.allSatisfy { !$0.isVisible }) { return .terminateNow } @@ -919,14 +922,6 @@ class AppDelegate: NSObject, } @IBAction func toggleQuickTerminal(_ sender: Any) { - if quickController == nil { - quickController = QuickTerminalController( - ghostty, - position: derivedConfig.quickTerminalPosition - ) - } - - guard let quickController = self.quickController else { return } quickController.toggle() } diff --git a/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift b/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift index 750512d02..1fb69f1f8 100644 --- a/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift +++ b/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift @@ -11,6 +11,9 @@ struct TerminalEntity: AppEntity { @Property(title: "Working Directory") var workingDirectory: String? + @Property(title: "Kind") + var kind: Kind + @MainActor @DeferredProperty(title: "Full Contents") @available(macOS 26.0, *) @@ -67,6 +70,27 @@ struct TerminalEntity: AppEntity { self.title = view.title self.workingDirectory = view.pwd self.screenshot = view.screenshot() + + // Determine the kind based on the window controller type + if view.window?.windowController is QuickTerminalController { + self.kind = .quick + } else { + self.kind = .normal + } + } +} + +extension TerminalEntity { + enum Kind: String, AppEnum { + case normal + case quick + + static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Terminal Kind") + + static var caseDisplayRepresentations: [Self: DisplayRepresentation] = [ + .normal: .init(title: "Normal"), + .quick: .init(title: "Quick") + ] } } @@ -101,7 +125,8 @@ struct TerminalQuery: EntityStringQuery, EnumerableEntityQuery { @MainActor var all: [Ghostty.SurfaceView] { - // Find all of our terminal windows (includes quick terminal) + // Find all of our terminal windows. This will include the quick terminal + // but only if it was previously opened. let controllers = NSApp.windows.compactMap { $0.windowController as? BaseTerminalController } diff --git a/macos/Sources/Features/App Intents/QuickTerminalIntent.swift b/macos/Sources/Features/App Intents/QuickTerminalIntent.swift new file mode 100644 index 000000000..ee2761217 --- /dev/null +++ b/macos/Sources/Features/App Intents/QuickTerminalIntent.swift @@ -0,0 +1,28 @@ +import AppKit +import AppIntents + +struct QuickTerminalIntent: AppIntent { + static var title: LocalizedStringResource = "Open the Quick Terminal" + static var description = IntentDescription("Open the Quick Terminal. If it is already open, then do nothing.") + + @available(macOS 26.0, *) + static var supportedModes: IntentModes = .background + + @MainActor + func perform() async throws -> some IntentResult & ReturnsValue<[TerminalEntity]> { + guard let delegate = NSApp.delegate as? AppDelegate else { + throw GhosttyIntentError.appUnavailable + } + + // This is safe to call even if it is already shown. + let c = delegate.quickController + c.animateIn() + + // Grab all our terminals + let terminals = c.surfaceTree.root?.leaves().map { + TerminalEntity($0) + } ?? [] + + return .result(value: terminals) + } +} diff --git a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift index 80b0c9413..3bd8bc18f 100644 --- a/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift +++ b/macos/Sources/Features/QuickTerminal/QuickTerminalController.swift @@ -42,7 +42,11 @@ class QuickTerminalController: BaseTerminalController { ) { self.position = position self.derivedConfig = DerivedConfig(ghostty.config) - super.init(ghostty, baseConfig: base, surfaceTree: tree) + + // Important detail here: we initialize with an empty surface tree so + // that we don't start a terminal process. This gets started when the + // first terminal is shown in `animateIn`. + super.init(ghostty, baseConfig: base, surfaceTree: .init()) // Setup our notifications for behaviors let center = NotificationCenter.default From e6c24fbf0a634a28d8c079948d982636f00cf197 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 20 Jun 2025 07:22:12 -0700 Subject: [PATCH 263/371] macos: remove confirmation option for close terminal --- .../Features/App Intents/CloseTerminalIntent.swift | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/macos/Sources/Features/App Intents/CloseTerminalIntent.swift b/macos/Sources/Features/App Intents/CloseTerminalIntent.swift index 18079650b..4de415494 100644 --- a/macos/Sources/Features/App Intents/CloseTerminalIntent.swift +++ b/macos/Sources/Features/App Intents/CloseTerminalIntent.swift @@ -12,13 +12,6 @@ struct CloseTerminalIntent: AppIntent { ) var terminal: TerminalEntity - @Parameter( - title: "Command", - description: "Command to execute instead of the default shell.", - default: true - ) - var confirm: Bool - @available(macOS 26.0, *) static var supportedModes: IntentModes = .background @@ -32,7 +25,7 @@ struct CloseTerminalIntent: AppIntent { return .result() } - controller.closeSurface(surfaceView, withConfirmation: confirm) + controller.closeSurface(surfaceView, withConfirmation: false) return .result() } } From f8bc9b547c2a7e37de80cad6709936852126c46e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 20 Jun 2025 10:09:01 -0700 Subject: [PATCH 264/371] macos: support env vars for surface config, clean up surface config --- include/ghostty.h | 10 +- macos/Ghostty.xcodeproj/project.pbxproj | 4 + macos/Sources/Ghostty/SurfaceView.swift | 72 ++++++++++++--- .../Sources/Ghostty/SurfaceView_AppKit.swift | 6 +- macos/Sources/Ghostty/SurfaceView_UIKit.swift | 6 +- .../Helpers/Extensions/Array+Extension.swift | 25 +++++ .../Extensions/Optional+Extension.swift | 10 ++ src/apprt/embedded.zig | 92 ++++++++++++------- src/config/Config.zig | 5 + 9 files changed, 180 insertions(+), 50 deletions(-) create mode 100644 macos/Sources/Helpers/Extensions/Optional+Extension.swift diff --git a/include/ghostty.h b/include/ghostty.h index fc2c915cb..0c5a63448 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -385,6 +385,11 @@ typedef struct { bool rectangle; } ghostty_selection_s; +typedef struct { + const char* key; + const char* value; +} ghostty_env_var_s; + typedef struct { void* nsview; } ghostty_platform_macos_s; @@ -406,6 +411,8 @@ typedef struct { float font_size; const char* working_directory; const char* command; + ghostty_env_var_s* env_vars; + size_t env_var_count; } ghostty_surface_config_s; typedef struct { @@ -807,7 +814,8 @@ void ghostty_app_set_color_scheme(ghostty_app_t, ghostty_color_scheme_e); ghostty_surface_config_s ghostty_surface_config_new(); -ghostty_surface_t ghostty_surface_new(ghostty_app_t, ghostty_surface_config_s*); +ghostty_surface_t ghostty_surface_new(ghostty_app_t, + const ghostty_surface_config_s*); void ghostty_surface_free(ghostty_surface_t); void* ghostty_surface_userdata(ghostty_surface_t); ghostty_app_t ghostty_surface_app(ghostty_surface_t); diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index 6b0cfd6f8..a64e6038e 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ A50297352DFA0F3400B4E924 /* Double+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A50297342DFA0F3300B4E924 /* Double+Extension.swift */; }; A511940F2E050595007258CC /* CloseTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A511940E2E050590007258CC /* CloseTerminalIntent.swift */; }; A51194112E05A483007258CC /* QuickTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51194102E05A480007258CC /* QuickTerminalIntent.swift */; }; + A51194132E05D006007258CC /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51194122E05D003007258CC /* Optional+Extension.swift */; }; A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D72B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D82B54DC6800493A16 /* Ghostty.App.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */; }; @@ -153,6 +154,7 @@ A50297342DFA0F3300B4E924 /* Double+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+Extension.swift"; sourceTree = ""; }; A511940E2E050590007258CC /* CloseTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseTerminalIntent.swift; sourceTree = ""; }; A51194102E05A480007258CC /* QuickTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickTerminalIntent.swift; sourceTree = ""; }; + A51194122E05D003007258CC /* Optional+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Optional+Extension.swift"; sourceTree = ""; }; A514C8D52B54A16400493A16 /* Ghostty.Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Config.swift; sourceTree = ""; }; A51544FD2DFB1110009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitlebarTabsTahoeTerminalWindow.swift; sourceTree = ""; }; A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebarTahoe.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTabsTitlebarTahoe.xib; sourceTree = ""; }; @@ -506,6 +508,7 @@ A586366E2DF25D8300E04A10 /* Duration+Extension.swift */, A53A29802DB44A5E00B6E02C /* KeyboardShortcut+Extension.swift */, A53A297E2DB4480A00B6E02C /* EventModifiers+Extension.swift */, + A51194122E05D003007258CC /* Optional+Extension.swift */, C159E81C2B66A06B00FDFE9C /* OSColor+Extension.swift */, A599CDAF2CF103F20049FA26 /* NSAppearance+Extension.swift */, A5A2A3CB2D444AB80033CF96 /* NSApplication+Extension.swift */, @@ -786,6 +789,7 @@ CFBB5FEA2D231E5000FD62EE /* QuickTerminalSpaceBehavior.swift in Sources */, A54B0CE92D0CECD100CBEFF8 /* ColorizedGhosttyIconView.swift in Sources */, A5D0AF3D2B37804400D21823 /* CodableBridge.swift in Sources */, + A51194132E05D006007258CC /* Optional+Extension.swift in Sources */, A5D0AF3B2B36A1DE00D21823 /* TerminalRestorable.swift in Sources */, C1F26EA72B738B9900404083 /* NSView+Extension.swift in Sources */, A586366F2DF25D8600E04A10 /* Duration+Extension.swift in Sources */, diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index 371e4ff41..2f0623b79 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -418,18 +418,36 @@ extension Ghostty { /// Explicit command to set var command: String? = nil + + /// Environment variables to set for the terminal + var environmentVariables: [String: String] = [:] init() {} init(from config: ghostty_surface_config_s) { self.fontSize = config.font_size - self.workingDirectory = String.init(cString: config.working_directory, encoding: .utf8) - self.command = String.init(cString: config.command, encoding: .utf8) + if let workingDirectory = config.working_directory { + self.workingDirectory = String.init(cString: workingDirectory, encoding: .utf8) + } + if let command = config.command { + self.command = String.init(cString: command, encoding: .utf8) + } + + // Convert the C env vars to Swift dictionary + if config.env_var_count > 0, let envVars = config.env_vars { + for i in 0.. ghostty_surface_config_s { + /// Provides a C-compatible ghostty configuration within a closure. The configuration + /// and all its string pointers are only valid within the closure. + func withCValue(view: SurfaceView, _ body: (inout ghostty_surface_config_s) throws -> T) rethrows -> T { var config = ghostty_surface_config_new() config.userdata = Unmanaged.passUnretained(view).toOpaque() #if os(macOS) @@ -438,7 +456,6 @@ extension Ghostty { nsview: Unmanaged.passUnretained(view).toOpaque() )) config.scale_factor = NSScreen.main!.backingScaleFactor - #elseif os(iOS) config.platform_tag = GHOSTTY_PLATFORM_IOS config.platform = ghostty_platform_u(ios: ghostty_platform_ios_s( @@ -453,15 +470,42 @@ extension Ghostty { #error("unsupported target") #endif - if let fontSize = fontSize { config.font_size = fontSize } - if let workingDirectory = workingDirectory { - config.working_directory = (workingDirectory as NSString).utf8String - } - if let command = command { - config.command = (command as NSString).utf8String - } + // Zero is our default value that means to inherit the font size. + config.font_size = fontSize ?? 0 - return config + // Use withCString to ensure strings remain valid for the duration of the closure + return try workingDirectory.withCString { cWorkingDir in + config.working_directory = cWorkingDir + + return try command.withCString { cCommand in + config.command = cCommand + + // Convert dictionary to arrays for easier processing + let keys = Array(environmentVariables.keys) + let values = Array(environmentVariables.values) + + // Create C strings for all keys and values + return try keys.withCStrings { keyCStrings in + return try values.withCStrings { valueCStrings in + // Create array of ghostty_env_var_s + var envVars = Array() + envVars.reserveCapacity(environmentVariables.count) + for i in 0..(_ body: ([UnsafePointer?]) throws -> T) rethrows -> T { + // Handle empty array + if isEmpty { + return try body([]) + } + + // Recursive helper to process strings + func helper(index: Int, accumulated: [UnsafePointer?], body: ([UnsafePointer?]) throws -> T) rethrows -> T { + if index == count { + return try body(accumulated) + } else { + return try self[index].withCString { cStr in + var newAccumulated = accumulated + newAccumulated.append(cStr) + return try helper(index: index + 1, accumulated: newAccumulated, body: body) + } + } + } + + return try helper(index: 0, accumulated: [], body: body) + } +} diff --git a/macos/Sources/Helpers/Extensions/Optional+Extension.swift b/macos/Sources/Helpers/Extensions/Optional+Extension.swift new file mode 100644 index 000000000..a844c0fe9 --- /dev/null +++ b/macos/Sources/Helpers/Extensions/Optional+Extension.swift @@ -0,0 +1,10 @@ +extension Optional where Wrapped == String { + /// Executes a closure with a C string pointer, handling nil gracefully. + func withCString(_ body: (UnsafePointer?) throws -> T) rethrows -> T { + if let string = self { + return try string.withCString(body) + } else { + return try body(nil) + } + } +} diff --git a/src/apprt/embedded.zig b/src/apprt/embedded.zig index 01e287d16..02f143985 100644 --- a/src/apprt/embedded.zig +++ b/src/apprt/embedded.zig @@ -376,6 +376,14 @@ pub const PlatformTag = enum(c_int) { ios = 2, }; +pub const EnvVar = extern struct { + /// The name of the environment variable. + key: [*:0]const u8, + + /// The value of the environment variable. + value: [*:0]const u8, +}; + pub const Surface = struct { app: *App, platform: Platform, @@ -407,7 +415,7 @@ pub const Surface = struct { font_size: f32 = 0, /// The working directory to load into. - working_directory: [*:0]const u8 = "", + working_directory: ?[*:0]const u8 = null, /// The command to run in the new surface. If this is set then /// the "wait-after-command" option is also automatically set to true, @@ -417,7 +425,11 @@ pub const Surface = struct { /// despite Ghostty allowing directly executed commands via config. /// This is a legacy thing and we should probably change it in the /// future once we have a concrete use case. - command: [*:0]const u8 = "", + command: ?[*:0]const u8 = null, + + /// Extra environment variables to set for the surface. + env_vars: ?[*]EnvVar = null, + env_var_count: usize = 0, }; pub fn init(self: *Surface, app: *App, opts: Options) !void { @@ -443,41 +455,59 @@ pub const Surface = struct { defer config.deinit(); // If we have a working directory from the options then we set it. - const wd = std.mem.sliceTo(opts.working_directory, 0); - if (wd.len > 0) wd: { - var dir = std.fs.openDirAbsolute(wd, .{}) catch |err| { - log.warn( - "error opening requested working directory dir={s} err={}", - .{ wd, err }, - ); - break :wd; - }; - defer dir.close(); + if (opts.working_directory) |c_wd| { + const wd = std.mem.sliceTo(c_wd, 0); + if (wd.len > 0) wd: { + var dir = std.fs.openDirAbsolute(wd, .{}) catch |err| { + log.warn( + "error opening requested working directory dir={s} err={}", + .{ wd, err }, + ); + break :wd; + }; + defer dir.close(); - const stat = dir.stat() catch |err| { - log.warn( - "failed to stat requested working directory dir={s} err={}", - .{ wd, err }, - ); - break :wd; - }; + const stat = dir.stat() catch |err| { + log.warn( + "failed to stat requested working directory dir={s} err={}", + .{ wd, err }, + ); + break :wd; + }; - if (stat.kind != .directory) { - log.warn( - "requested working directory is not a directory dir={s}", - .{wd}, - ); - break :wd; + if (stat.kind != .directory) { + log.warn( + "requested working directory is not a directory dir={s}", + .{wd}, + ); + break :wd; + } + + config.@"working-directory" = wd; } - - config.@"working-directory" = wd; } // If we have a command from the options then we set it. - const cmd = std.mem.sliceTo(opts.command, 0); - if (cmd.len > 0) { - config.command = .{ .shell = cmd }; - config.@"wait-after-command" = true; + if (opts.command) |c_command| { + const cmd = std.mem.sliceTo(c_command, 0); + if (cmd.len > 0) { + config.command = .{ .shell = cmd }; + config.@"wait-after-command" = true; + } + } + + // Apply any environment variables that were requested. + if (opts.env_var_count > 0) { + const alloc = config.arenaAlloc(); + for (opts.env_vars.?[0..opts.env_var_count]) |env_var| { + const key = std.mem.sliceTo(env_var.key, 0); + const value = std.mem.sliceTo(env_var.value, 0); + try config.env.map.put( + alloc, + try alloc.dupeZ(u8, key), + try alloc.dupeZ(u8, value), + ); + } } // Initialize our surface right away. We're given a view that is diff --git a/src/config/Config.zig b/src/config/Config.zig index 2df66ba45..e9370d9b3 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -3004,6 +3004,11 @@ pub fn loadRecursiveFiles(self: *Config, alloc_gpa: Allocator) !void { } } +/// Get the arena allocator associated with the configuration. +pub fn arenaAlloc(self: *Config) Allocator { + return self._arena.?.allocator(); +} + /// Change the state of conditionals and reload the configuration /// based on the new state. This returns a new configuration based /// on the new state. The caller must free the old configuration if they From 027171bd5db7f1ffd199fffeed4e8ef41f7a30d1 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 20 Jun 2025 10:40:33 -0700 Subject: [PATCH 265/371] macos: can set env vars on new terminal --- .../Features/App Intents/NewTerminalIntent.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/macos/Sources/Features/App Intents/NewTerminalIntent.swift b/macos/Sources/Features/App Intents/NewTerminalIntent.swift index 55f33bd46..444f3d7c0 100644 --- a/macos/Sources/Features/App Intents/NewTerminalIntent.swift +++ b/macos/Sources/Features/App Intents/NewTerminalIntent.swift @@ -30,6 +30,13 @@ struct NewTerminalIntent: AppIntent { ) var workingDirectory: IntentFile? + @Parameter( + title: "Environment Variables", + description: "Environment variables in `KEY=VALUE` format.", + default: [] + ) + var env: [String] + @Parameter( title: "Parent Terminal", description: "The terminal to inherit the base configuration from." @@ -58,6 +65,15 @@ struct NewTerminalIntent: AppIntent { config.workingDirectory = dir.path(percentEncoded: false) } + // Parse environment variables from KEY=VALUE format + for envVar in env { + if let separatorIndex = envVar.firstIndex(of: "=") { + let key = String(envVar[.. Date: Fri, 20 Jun 2025 11:06:05 -0700 Subject: [PATCH 266/371] macos: intents all ask for permission --- macos/Ghostty.xcodeproj/project.pbxproj | 8 + .../App Intents/CloseTerminalIntent.swift | 4 + .../App Intents/CommandPaletteIntent.swift | 4 + .../GetTerminalDetailsIntent.swift | 4 + .../App Intents/GhosttyIntentError.swift | 2 + .../Features/App Intents/InputIntent.swift | 20 +++ .../App Intents/IntentPermission.swift | 37 ++++ .../Features/App Intents/KeybindIntent.swift | 4 + .../App Intents/NewTerminalIntent.swift | 3 + .../App Intents/QuickTerminalIntent.swift | 4 + macos/Sources/Helpers/PermissionRequest.swift | 162 ++++++++++++++++++ 11 files changed, 252 insertions(+) create mode 100644 macos/Sources/Features/App Intents/IntentPermission.swift create mode 100644 macos/Sources/Helpers/PermissionRequest.swift diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index a64e6038e..a203ad682 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -16,6 +16,8 @@ A511940F2E050595007258CC /* CloseTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A511940E2E050590007258CC /* CloseTerminalIntent.swift */; }; A51194112E05A483007258CC /* QuickTerminalIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51194102E05A480007258CC /* QuickTerminalIntent.swift */; }; A51194132E05D006007258CC /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51194122E05D003007258CC /* Optional+Extension.swift */; }; + A51194172E05D964007258CC /* PermissionRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51194162E05D95E007258CC /* PermissionRequest.swift */; }; + A51194192E05DFC4007258CC /* IntentPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51194182E05DFBB007258CC /* IntentPermission.swift */; }; A514C8D62B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D72B54A16400493A16 /* Ghostty.Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A514C8D52B54A16400493A16 /* Ghostty.Config.swift */; }; A514C8D82B54DC6800493A16 /* Ghostty.App.swift in Sources */ = {isa = PBXBuildFile; fileRef = A53D0C992B543F3B00305CE6 /* Ghostty.App.swift */; }; @@ -155,6 +157,8 @@ A511940E2E050590007258CC /* CloseTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseTerminalIntent.swift; sourceTree = ""; }; A51194102E05A480007258CC /* QuickTerminalIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickTerminalIntent.swift; sourceTree = ""; }; A51194122E05D003007258CC /* Optional+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Optional+Extension.swift"; sourceTree = ""; }; + A51194162E05D95E007258CC /* PermissionRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PermissionRequest.swift; sourceTree = ""; }; + A51194182E05DFBB007258CC /* IntentPermission.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntentPermission.swift; sourceTree = ""; }; A514C8D52B54A16400493A16 /* Ghostty.Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ghostty.Config.swift; sourceTree = ""; }; A51544FD2DFB1110009E85D8 /* TitlebarTabsTahoeTerminalWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitlebarTabsTahoeTerminalWindow.swift; sourceTree = ""; }; A51544FF2DFB112E009E85D8 /* TerminalTabsTitlebarTahoe.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TerminalTabsTitlebarTahoe.xib; sourceTree = ""; }; @@ -355,6 +359,7 @@ A59630962AEE163600D64628 /* HostingWindow.swift */, A5CA378B2D2A4DE800931030 /* KeyboardLayout.swift */, A59FB5D02AE0DEA7009128F3 /* MetalView.swift */, + A51194162E05D95E007258CC /* PermissionRequest.swift */, A5E408292E022E9B0035FEAC /* TabGroupCloseCoordinator.swift */, A5CA378D2D31D6C100931030 /* Weak.swift */, C1F26EE72B76CBFC00404083 /* VibrantLayer.h */, @@ -640,6 +645,7 @@ A5E408462E0485270035FEAC /* InputIntent.swift */, A5E408442E0483F80035FEAC /* KeybindIntent.swift */, A5E4082F2E0271320035FEAC /* GhosttyIntentError.swift */, + A51194182E05DFBB007258CC /* IntentPermission.swift */, ); path = "App Intents"; sourceTree = ""; @@ -821,6 +827,8 @@ A51BFC2B2B30F6BE00E92F16 /* UpdateDelegate.swift in Sources */, A5CBD06B2CA322430017A1AE /* GlobalEventTap.swift in Sources */, AEE8B3452B9AA39600260C5E /* NSPasteboard+Extension.swift in Sources */, + A51194172E05D964007258CC /* PermissionRequest.swift in Sources */, + A51194192E05DFC4007258CC /* IntentPermission.swift in Sources */, A52FFF5D2CAB4D08000C6A5B /* NSScreen+Extension.swift in Sources */, A53426352A7DA53D00EBB7A2 /* AppDelegate.swift in Sources */, A5CBD0582C9F30960017A1AE /* Cursor.swift in Sources */, diff --git a/macos/Sources/Features/App Intents/CloseTerminalIntent.swift b/macos/Sources/Features/App Intents/CloseTerminalIntent.swift index 4de415494..923d22c97 100644 --- a/macos/Sources/Features/App Intents/CloseTerminalIntent.swift +++ b/macos/Sources/Features/App Intents/CloseTerminalIntent.swift @@ -17,6 +17,10 @@ struct CloseTerminalIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + guard let surfaceView = terminal.surfaceView else { throw GhosttyIntentError.surfaceNotFound } diff --git a/macos/Sources/Features/App Intents/CommandPaletteIntent.swift b/macos/Sources/Features/App Intents/CommandPaletteIntent.swift index 2c1ff3386..fa983054b 100644 --- a/macos/Sources/Features/App Intents/CommandPaletteIntent.swift +++ b/macos/Sources/Features/App Intents/CommandPaletteIntent.swift @@ -24,6 +24,10 @@ struct CommandPaletteIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult & ReturnsValue { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + guard let surface = terminal.surfaceModel else { throw GhosttyIntentError.surfaceNotFound } diff --git a/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift b/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift index 5c41908f4..1cbaa9d68 100644 --- a/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift +++ b/macos/Sources/Features/App Intents/GetTerminalDetailsIntent.swift @@ -26,6 +26,10 @@ struct GetTerminalDetailsIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult & ReturnsValue { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + switch detail { case .title: return .result(value: terminal.title) case .workingDirectory: return .result(value: terminal.workingDirectory) diff --git a/macos/Sources/Features/App Intents/GhosttyIntentError.swift b/macos/Sources/Features/App Intents/GhosttyIntentError.swift index 34a0636d9..635250f72 100644 --- a/macos/Sources/Features/App Intents/GhosttyIntentError.swift +++ b/macos/Sources/Features/App Intents/GhosttyIntentError.swift @@ -1,11 +1,13 @@ enum GhosttyIntentError: Error, CustomLocalizedStringResourceConvertible { case appUnavailable case surfaceNotFound + case permissionDenied var localizedStringResource: LocalizedStringResource { switch self { case .appUnavailable: return "The Ghostty app isn't properly initialized." case .surfaceNotFound: return "The terminal no longer exists." + case .permissionDenied: return "Ghostty doesn't allow Shortcuts." } } } diff --git a/macos/Sources/Features/App Intents/InputIntent.swift b/macos/Sources/Features/App Intents/InputIntent.swift index b8c248fe3..17c97fbbb 100644 --- a/macos/Sources/Features/App Intents/InputIntent.swift +++ b/macos/Sources/Features/App Intents/InputIntent.swift @@ -29,6 +29,10 @@ struct InputTextIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + guard let surface = terminal.surfaceModel else { throw GhosttyIntentError.surfaceNotFound } @@ -75,6 +79,10 @@ struct KeyEventIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + guard let surface = terminal.surfaceModel else { throw GhosttyIntentError.surfaceNotFound } @@ -133,6 +141,10 @@ struct MouseButtonIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + guard let surface = terminal.surfaceModel else { throw GhosttyIntentError.surfaceNotFound } @@ -190,6 +202,10 @@ struct MousePosIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + guard let surface = terminal.surfaceModel else { throw GhosttyIntentError.surfaceNotFound } @@ -254,6 +270,10 @@ struct MouseScrollIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + guard let surface = terminal.surfaceModel else { throw GhosttyIntentError.surfaceNotFound } diff --git a/macos/Sources/Features/App Intents/IntentPermission.swift b/macos/Sources/Features/App Intents/IntentPermission.swift new file mode 100644 index 000000000..e02c4591d --- /dev/null +++ b/macos/Sources/Features/App Intents/IntentPermission.swift @@ -0,0 +1,37 @@ +/// Requests permission for Shortcuts app to interact with Ghostty +/// +/// This function displays a permission dialog asking the user to allow Shortcuts +/// to interact with Ghostty. The permission is automatically cached for 10 minutes +/// if the user selects "Allow", meaning subsequent intent calls won't show the dialog +/// again during that time period. +/// +/// The permission uses a shared UserDefaults key across all intents, so granting +/// permission for one intent allows all Ghostty intents to execute without additional +/// prompts for the duration of the cache period. +/// +/// - Returns: `true` if permission is granted, `false` if denied +/// +/// ## Usage +/// Add this check at the beginning of any App Intent's `perform()` method: +/// ```swift +/// @MainActor +/// func perform() async throws -> some IntentResult { +/// guard await requestIntentPermission() else { +/// throw GhosttyIntentError.permissionDenied +/// } +/// // ... continue with intent implementation +/// } +/// ``` +func requestIntentPermission() async -> Bool { + await withCheckedContinuation { continuation in + Task { @MainActor in + PermissionRequest.show( + "org.mitchellh.ghostty.shortcutsPermission", + message: "Allow Shortcuts to interact with Ghostty for the next 10 minutes?", + allowDuration: .seconds(600), + ) { response in + continuation.resume(returning: response) + } + } + } +} diff --git a/macos/Sources/Features/App Intents/KeybindIntent.swift b/macos/Sources/Features/App Intents/KeybindIntent.swift index adeb64331..b31da4a50 100644 --- a/macos/Sources/Features/App Intents/KeybindIntent.swift +++ b/macos/Sources/Features/App Intents/KeybindIntent.swift @@ -21,6 +21,10 @@ struct KeybindIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult & ReturnsValue { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + guard let surface = terminal.surfaceModel else { throw GhosttyIntentError.surfaceNotFound } diff --git a/macos/Sources/Features/App Intents/NewTerminalIntent.swift b/macos/Sources/Features/App Intents/NewTerminalIntent.swift index 444f3d7c0..3c36bed87 100644 --- a/macos/Sources/Features/App Intents/NewTerminalIntent.swift +++ b/macos/Sources/Features/App Intents/NewTerminalIntent.swift @@ -51,6 +51,9 @@ struct NewTerminalIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult & ReturnsValue { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } guard let appDelegate = NSApp.delegate as? AppDelegate else { throw GhosttyIntentError.appUnavailable } diff --git a/macos/Sources/Features/App Intents/QuickTerminalIntent.swift b/macos/Sources/Features/App Intents/QuickTerminalIntent.swift index ee2761217..2e6c9850c 100644 --- a/macos/Sources/Features/App Intents/QuickTerminalIntent.swift +++ b/macos/Sources/Features/App Intents/QuickTerminalIntent.swift @@ -10,6 +10,10 @@ struct QuickTerminalIntent: AppIntent { @MainActor func perform() async throws -> some IntentResult & ReturnsValue<[TerminalEntity]> { + guard await requestIntentPermission() else { + throw GhosttyIntentError.permissionDenied + } + guard let delegate = NSApp.delegate as? AppDelegate else { throw GhosttyIntentError.appUnavailable } diff --git a/macos/Sources/Helpers/PermissionRequest.swift b/macos/Sources/Helpers/PermissionRequest.swift new file mode 100644 index 000000000..35694081c --- /dev/null +++ b/macos/Sources/Helpers/PermissionRequest.swift @@ -0,0 +1,162 @@ +import AppKit +import Foundation + +/// Displays a permission request dialog with optional caching of user decisions +class PermissionRequest { + /// Shows a permission request dialog with customizable caching behavior + /// - Parameters: + /// - key: Unique identifier for storing/retrieving cached decisions in UserDefaults + /// - message: The message to display in the alert dialog + /// - allowText: Custom text for the allow button (defaults to "Allow") + /// - allowDuration: If provided, automatically cache "Allow" responses for this duration + /// - window: If provided, shows the alert as a sheet attached to this window + /// - completion: Called with the user's decision (true for allow, false for deny) + /// + /// Caching behavior: + /// - If user checks "Remember my decision for one day", both allow/deny are cached for 24 hours + /// - If allowDuration is provided and user selects allow (without checkbox), decision is cached for that duration + /// - Cached decisions are automatically returned without showing the dialog + @MainActor + static func show( + _ key: String, + message: String, + informative: String = "", + allowText: String = "Allow", + allowDuration: Duration? = nil, + window: NSWindow? = nil, + completion: @escaping (Bool) -> Void + ) { + // Check if we have a stored decision that hasn't expired + if let storedResult = getStoredResult(for: key) { + completion(storedResult) + return + } + + let alert = NSAlert() + alert.messageText = message + alert.informativeText = informative + alert.alertStyle = .informational + + // Add buttons (they appear in reverse order) + alert.addButton(withTitle: allowText) + alert.addButton(withTitle: "Don't Allow") + + // Create checkbox for remembering + let checkbox = NSButton( + checkboxWithTitle: "Remember my decision for one day", + target: nil, + action: nil) + checkbox.state = .off + + // Set checkbox as accessory view + alert.accessoryView = checkbox + + // Show the alert + if let window = window { + alert.beginSheetModal(for: window) { response in + handleResponse(response, rememberDecision: checkbox.state == .on, key: key, allowDuration: allowDuration, completion: completion) + } + } else { + let response = alert.runModal() + handleResponse(response, rememberDecision: checkbox.state == .on, key: key, allowDuration: allowDuration, completion: completion) + } + } + + /// Handles the alert response and processes caching logic + /// - Parameters: + /// - response: The alert response from the user + /// - rememberDecision: Whether the remember checkbox was checked + /// - key: The UserDefaults key for caching + /// - allowDuration: Optional duration for auto-caching allow responses + /// - completion: Completion handler to call with the result + private static func handleResponse( + _ response: NSApplication.ModalResponse, + rememberDecision: Bool, + key: String, + allowDuration: Duration?, + completion: @escaping (Bool) -> Void) { + + let result: Bool + switch response { + case .alertFirstButtonReturn: // Allow + result = true + case .alertSecondButtonReturn: // Don't Allow + result = false + default: + result = false + } + + // Store the result if checkbox is checked or if "Allow" was selected and allowDuration is set + if rememberDecision { + storeResult(result, for: key, duration: .seconds(86400)) + } else if result, let allowDuration { + storeResult(result, for: key, duration: allowDuration) + } + + completion(result) + } + + /// Retrieves a cached permission decision if it hasn't expired + /// - Parameter key: The UserDefaults key to check + /// - Returns: The cached decision, or nil if no valid cached decision exists + private static func getStoredResult(for key: String) -> Bool? { + let userDefaults = UserDefaults.standard + guard let data = userDefaults.data(forKey: key), + let storedPermission = try? NSKeyedUnarchiver.unarchivedObject( + ofClass: StoredPermission.self, from: data) else { + return nil + } + + if Date() > storedPermission.expiry { + // Decision has expired, remove stored value + userDefaults.removeObject(forKey: key) + return nil + } + + return storedPermission.result + } + + /// Stores a permission decision in UserDefaults with an expiration date + /// - Parameters: + /// - result: The permission decision to store + /// - key: The UserDefaults key to store under + /// - duration: How long the decision should be cached + private static func storeResult(_ result: Bool, for key: String, duration: Duration) { + let expiryDate = Date().addingTimeInterval(duration.timeInterval) + let storedPermission = StoredPermission(result: result, expiry: expiryDate) + if let data = try? NSKeyedArchiver.archivedData(withRootObject: storedPermission, requiringSecureCoding: true) { + let userDefaults = UserDefaults.standard + userDefaults.set(data, forKey: key) + } + } + + /// Internal class for storing permission decisions with expiration dates in UserDefaults + /// Conforms to NSSecureCoding for safe archiving/unarchiving + @objc(StoredPermission) + private class StoredPermission: NSObject, NSSecureCoding { + static var supportsSecureCoding: Bool = true + + let result: Bool + let expiry: Date + + init(result: Bool, expiry: Date) { + self.result = result + self.expiry = expiry + super.init() + } + + required init?(coder: NSCoder) { + self.result = coder.decodeBool(forKey: "result") + guard let expiry = coder.decodeObject(of: NSDate.self, forKey: "expiry") as? Date else { + return nil + } + self.expiry = expiry + super.init() + } + + func encode(with coder: NSCoder) { + coder.encode(result, forKey: "result") + coder.encode(expiry, forKey: "expiry") + } + } +} From b6559d08994ebb39ef66d210cd5461e03c594637 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 20 Jun 2025 11:54:19 -0700 Subject: [PATCH 267/371] macos: add a macos-shortcut config --- .../App Intents/IntentPermission.swift | 21 ++++++++++++- macos/Sources/Ghostty/Ghostty.Config.swift | 17 ++++++++++ src/config/Config.zig | 31 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/macos/Sources/Features/App Intents/IntentPermission.swift b/macos/Sources/Features/App Intents/IntentPermission.swift index e02c4591d..78efb3d5d 100644 --- a/macos/Sources/Features/App Intents/IntentPermission.swift +++ b/macos/Sources/Features/App Intents/IntentPermission.swift @@ -1,5 +1,7 @@ +import AppKit + /// Requests permission for Shortcuts app to interact with Ghostty -/// +/// /// This function displays a permission dialog asking the user to allow Shortcuts /// to interact with Ghostty. The permission is automatically cached for 10 minutes /// if the user selects "Allow", meaning subsequent intent calls won't show the dialog @@ -25,6 +27,23 @@ func requestIntentPermission() async -> Bool { await withCheckedContinuation { continuation in Task { @MainActor in + if let delegate = NSApp.delegate as? AppDelegate { + switch (delegate.ghostty.config.macosShortcuts) { + case .allow: + continuation.resume(returning: true) + return + + case .deny: + continuation.resume(returning: false) + return + + case .ask: + // Continue with the permission dialog + break + } + } + + PermissionRequest.show( "org.mitchellh.ghostty.shortcutsPermission", message: "Allow Shortcuts to interact with Ghostty for the next 10 minutes?", diff --git a/macos/Sources/Ghostty/Ghostty.Config.swift b/macos/Sources/Ghostty/Ghostty.Config.swift index fcbea2a12..241c10632 100644 --- a/macos/Sources/Ghostty/Ghostty.Config.swift +++ b/macos/Sources/Ghostty/Ghostty.Config.swift @@ -558,6 +558,17 @@ extension Ghostty { _ = ghostty_config_get(config, &v, key, UInt(key.count)) return v } + + var macosShortcuts: MacShortcuts { + let defaultValue = MacShortcuts.ask + guard let config = self.config else { return defaultValue } + var v: UnsafePointer? = nil + let key = "macos-shortcuts" + guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return defaultValue } + guard let ptr = v else { return defaultValue } + let str = String(cString: ptr) + return MacShortcuts(rawValue: str) ?? defaultValue + } } } @@ -584,6 +595,12 @@ extension Ghostty.Config { case always } + enum MacShortcuts: String { + case allow + case deny + case ask + } + enum ResizeOverlay : String { case always case never diff --git a/src/config/Config.zig b/src/config/Config.zig index e9370d9b3..aee670213 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2355,6 +2355,30 @@ keybind: Keybinds = .{}, /// @"macos-icon-screen-color": ?ColorList = null, +/// Whether macOS Shortcuts are allowed to control Ghostty. +/// +/// Ghostty exposes a number of actions that allow Shortcuts to +/// control and interact with Ghostty. This includes creating new +/// terminals, sending text to terminals, running commands, invoking +/// any keybind action, etc. +/// +/// This is a powerful feature but can be a security risk if a malicious +/// shortcut is able to be installed and executed. Therefore, this +/// configuration allows you to disable this feature. +/// +/// Valid values are: +/// +/// * `ask` - Ask the user whether for permission. Ghostty will by default +/// cache the user's choice for 10 minutes since we can't determine +/// when a single workflow begins or ends. The user also has an option +/// in the GUI to allow for the remainder of the day. +/// +/// * `allow` - Allow Shortcuts to control Ghostty without asking. +/// +/// * `deny` - Deny Shortcuts from controlling Ghostty. +/// +@"macos-shortcuts": MacShortcuts = .ask, + /// Put every surface (tab, split, window) into a dedicated Linux cgroup. /// /// This makes it so that resource management can be done on a per-surface @@ -5961,6 +5985,13 @@ pub const MacAppIconFrame = enum { chrome, }; +/// See macos-shortcuts +pub const MacShortcuts = enum { + allow, + deny, + ask, +}; + /// See gtk-single-instance pub const GtkSingleInstance = enum { desktop, From e4c13cdba87761dfd8feb77b7e57231f8032415f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 20 Jun 2025 12:09:03 -0700 Subject: [PATCH 268/371] macos: Optional/Array extensions need to build for iOS too --- macos/Ghostty.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/macos/Ghostty.xcodeproj/project.pbxproj b/macos/Ghostty.xcodeproj/project.pbxproj index a203ad682..416d8b106 100644 --- a/macos/Ghostty.xcodeproj/project.pbxproj +++ b/macos/Ghostty.xcodeproj/project.pbxproj @@ -58,6 +58,8 @@ A54B0CED2D0CFB7700CBEFF8 /* ColorizedGhosttyIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54B0CEC2D0CFB7300CBEFF8 /* ColorizedGhosttyIcon.swift */; }; A54B0CEF2D0D2E2800CBEFF8 /* ColorizedGhosttyIconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54B0CEE2D0D2E2400CBEFF8 /* ColorizedGhosttyIconImage.swift */; }; A54D786C2CA7978E001B19B1 /* BaseTerminalController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54D786B2CA79788001B19B1 /* BaseTerminalController.swift */; }; + A553F4062E05E93000257779 /* Optional+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51194122E05D003007258CC /* Optional+Extension.swift */; }; + A553F4072E05E93D00257779 /* Array+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A586366A2DF0A98900E04A10 /* Array+Extension.swift */; }; A5593FDF2DF8D57C00B47B10 /* TerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FDE2DF8D57100B47B10 /* TerminalWindow.swift */; }; A5593FE12DF8D74000B47B10 /* HiddenTitlebarTerminalWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5593FE02DF8D73400B47B10 /* HiddenTitlebarTerminalWindow.swift */; }; A5593FE32DF8D78600B47B10 /* TerminalHiddenTitlebar.xib in Resources */ = {isa = PBXBuildFile; fileRef = A5593FE22DF8D78600B47B10 /* TerminalHiddenTitlebar.xib */; }; @@ -892,6 +894,7 @@ buildActionMask = 2147483647; files = ( A5CBD0592C9F37B10017A1AE /* Backport.swift in Sources */, + A553F4062E05E93000257779 /* Optional+Extension.swift in Sources */, A53D0C942B53B43700305CE6 /* iOSApp.swift in Sources */, A514C8D72B54A16400493A16 /* Ghostty.Config.swift in Sources */, A5333E232B5A219A008AEFF7 /* SurfaceView.swift in Sources */, @@ -901,6 +904,7 @@ A53D0C9B2B543F3B00305CE6 /* Ghostty.App.swift in Sources */, A5333E242B5A22D9008AEFF7 /* Ghostty.Shell.swift in Sources */, A5985CD82C320C4500C57AD3 /* String+Extension.swift in Sources */, + A553F4072E05E93D00257779 /* Array+Extension.swift in Sources */, C159E89D2B69A2EF00FDFE9C /* OSColor+Extension.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From 020976bf8859324f2cd653988988b08b60ae300c Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 21 Jun 2025 06:42:31 -0700 Subject: [PATCH 269/371] macos: address some feedback --- .../App Intents/Entities/TerminalEntity.swift | 6 +++--- .../Features/App Intents/GhosttyIntentError.swift | 6 +++--- .../Sources/Helpers/Extensions/Array+Extension.swift | 12 ++++++------ 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift b/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift index 1fb69f1f8..e29fbba3f 100644 --- a/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift +++ b/macos/Sources/Features/App Intents/Entities/TerminalEntity.swift @@ -130,10 +130,10 @@ struct TerminalQuery: EntityStringQuery, EnumerableEntityQuery { let controllers = NSApp.windows.compactMap { $0.windowController as? BaseTerminalController } - + // Get all our surfaces - return controllers.reduce([]) { result, c in - result + (c.surfaceTree.root?.leaves() ?? []) + return controllers.flatMap { + $0.surfaceTree.root?.leaves() ?? [] } } } diff --git a/macos/Sources/Features/App Intents/GhosttyIntentError.swift b/macos/Sources/Features/App Intents/GhosttyIntentError.swift index 635250f72..c52b7a52e 100644 --- a/macos/Sources/Features/App Intents/GhosttyIntentError.swift +++ b/macos/Sources/Features/App Intents/GhosttyIntentError.swift @@ -5,9 +5,9 @@ enum GhosttyIntentError: Error, CustomLocalizedStringResourceConvertible { var localizedStringResource: LocalizedStringResource { switch self { - case .appUnavailable: return "The Ghostty app isn't properly initialized." - case .surfaceNotFound: return "The terminal no longer exists." - case .permissionDenied: return "Ghostty doesn't allow Shortcuts." + case .appUnavailable: "The Ghostty app isn't properly initialized." + case .surfaceNotFound: "The terminal no longer exists." + case .permissionDenied: "Ghostty doesn't allow Shortcuts." } } } diff --git a/macos/Sources/Helpers/Extensions/Array+Extension.swift b/macos/Sources/Helpers/Extensions/Array+Extension.swift index fac340472..4e8e39918 100644 --- a/macos/Sources/Helpers/Extensions/Array+Extension.swift +++ b/macos/Sources/Helpers/Extensions/Array+Extension.swift @@ -34,12 +34,12 @@ extension Array where Element == String { func helper(index: Int, accumulated: [UnsafePointer?], body: ([UnsafePointer?]) throws -> T) rethrows -> T { if index == count { return try body(accumulated) - } else { - return try self[index].withCString { cStr in - var newAccumulated = accumulated - newAccumulated.append(cStr) - return try helper(index: index + 1, accumulated: newAccumulated, body: body) - } + } + + return try self[index].withCString { cStr in + var newAccumulated = accumulated + newAccumulated.append(cStr) + return try helper(index: index + 1, accumulated: newAccumulated, body: body) } } From 296f340ff425c9986fedc2dbb4b5faa496dc63e3 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 21 Jun 2025 06:46:33 -0700 Subject: [PATCH 270/371] macos: the approval dialog is now forever --- .../App Intents/IntentPermission.swift | 5 +- macos/Sources/Helpers/PermissionRequest.swift | 87 +++++++++++++++---- src/config/Config.zig | 7 +- 3 files changed, 75 insertions(+), 24 deletions(-) diff --git a/macos/Sources/Features/App Intents/IntentPermission.swift b/macos/Sources/Features/App Intents/IntentPermission.swift index 78efb3d5d..2ec4f2bd9 100644 --- a/macos/Sources/Features/App Intents/IntentPermission.swift +++ b/macos/Sources/Features/App Intents/IntentPermission.swift @@ -46,8 +46,9 @@ func requestIntentPermission() async -> Bool { PermissionRequest.show( "org.mitchellh.ghostty.shortcutsPermission", - message: "Allow Shortcuts to interact with Ghostty for the next 10 minutes?", - allowDuration: .seconds(600), + message: "Allow Shortcuts to interact with Ghostty?", + allowDuration: .forever, + rememberDuration: nil, ) { response in continuation.resume(returning: response) } diff --git a/macos/Sources/Helpers/PermissionRequest.swift b/macos/Sources/Helpers/PermissionRequest.swift index 35694081c..9c16c7163 100644 --- a/macos/Sources/Helpers/PermissionRequest.swift +++ b/macos/Sources/Helpers/PermissionRequest.swift @@ -3,17 +3,25 @@ import Foundation /// Displays a permission request dialog with optional caching of user decisions class PermissionRequest { + /// Specifies how long a permission decision should be cached + enum AllowDuration { + case once + case forever + case duration(Duration) + } + /// Shows a permission request dialog with customizable caching behavior /// - Parameters: /// - key: Unique identifier for storing/retrieving cached decisions in UserDefaults /// - message: The message to display in the alert dialog /// - allowText: Custom text for the allow button (defaults to "Allow") /// - allowDuration: If provided, automatically cache "Allow" responses for this duration + /// - rememberDuration: If provided, shows a checkbox to remember the decision for this duration /// - window: If provided, shows the alert as a sheet attached to this window /// - completion: Called with the user's decision (true for allow, false for deny) /// /// Caching behavior: - /// - If user checks "Remember my decision for one day", both allow/deny are cached for 24 hours + /// - If rememberDuration is provided and user checks "Remember my decision", both allow/deny are cached for that duration /// - If allowDuration is provided and user selects allow (without checkbox), decision is cached for that duration /// - Cached decisions are automatically returned without showing the dialog @MainActor @@ -22,7 +30,8 @@ class PermissionRequest { message: String, informative: String = "", allowText: String = "Allow", - allowDuration: Duration? = nil, + allowDuration: AllowDuration = .once, + rememberDuration: Duration? = .seconds(86400), window: NSWindow? = nil, completion: @escaping (Bool) -> Void ) { @@ -41,24 +50,28 @@ class PermissionRequest { alert.addButton(withTitle: allowText) alert.addButton(withTitle: "Don't Allow") - // Create checkbox for remembering - let checkbox = NSButton( - checkboxWithTitle: "Remember my decision for one day", - target: nil, - action: nil) - checkbox.state = .off - - // Set checkbox as accessory view - alert.accessoryView = checkbox + // Create checkbox for remembering if duration is provided + var checkbox: NSButton? + if let rememberDuration = rememberDuration { + let checkboxTitle = formatRememberText(for: rememberDuration) + checkbox = NSButton( + checkboxWithTitle: checkboxTitle, + target: nil, + action: nil) + checkbox!.state = .off + + // Set checkbox as accessory view + alert.accessoryView = checkbox + } // Show the alert if let window = window { alert.beginSheetModal(for: window) { response in - handleResponse(response, rememberDecision: checkbox.state == .on, key: key, allowDuration: allowDuration, completion: completion) + handleResponse(response, rememberDecision: checkbox?.state == .on, key: key, allowDuration: allowDuration, rememberDuration: rememberDuration, completion: completion) } } else { let response = alert.runModal() - handleResponse(response, rememberDecision: checkbox.state == .on, key: key, allowDuration: allowDuration, completion: completion) + handleResponse(response, rememberDecision: checkbox?.state == .on, key: key, allowDuration: allowDuration, rememberDuration: rememberDuration, completion: completion) } } @@ -68,12 +81,14 @@ class PermissionRequest { /// - rememberDecision: Whether the remember checkbox was checked /// - key: The UserDefaults key for caching /// - allowDuration: Optional duration for auto-caching allow responses + /// - rememberDuration: Optional duration for the remember checkbox /// - completion: Completion handler to call with the result private static func handleResponse( _ response: NSApplication.ModalResponse, rememberDecision: Bool, key: String, - allowDuration: Duration?, + allowDuration: AllowDuration, + rememberDuration: Duration?, completion: @escaping (Bool) -> Void) { let result: Bool @@ -87,10 +102,21 @@ class PermissionRequest { } // Store the result if checkbox is checked or if "Allow" was selected and allowDuration is set - if rememberDecision { - storeResult(result, for: key, duration: .seconds(86400)) - } else if result, let allowDuration { - storeResult(result, for: key, duration: allowDuration) + if rememberDecision, let rememberDuration = rememberDuration { + storeResult(result, for: key, duration: rememberDuration) + } else if result { + switch allowDuration { + case .once: + // Don't store anything for once + break + case .forever: + // Store for a very long time (100 years). When the bug comes in that + // 100 years has passed and their forever permission expired I'll be + // dead so it won't be my problem. + storeResult(result, for: key, duration: .seconds(3153600000)) + case .duration(let duration): + storeResult(result, for: key, duration: duration) + } } completion(result) @@ -130,6 +156,31 @@ class PermissionRequest { } } + /// Formats the remember checkbox text based on the duration + /// - Parameter duration: The duration to format + /// - Returns: A human-readable string for the checkbox + private static func formatRememberText(for duration: Duration) -> String { + let seconds = duration.timeInterval + + // Warning: this probably isn't localization friendly at all so we're + // going to have to redo this for that. + switch seconds { + case 0..<60: + return "Remember my decision for \(Int(seconds)) seconds" + case 60..<3600: + let minutes = Int(seconds / 60) + return "Remember my decision for \(minutes) minute\(minutes == 1 ? "" : "s")" + case 3600..<86400: + let hours = Int(seconds / 3600) + return "Remember my decision for \(hours) hour\(hours == 1 ? "" : "s")" + case 86400: + return "Remember my decision for one day" + default: + let days = Int(seconds / 86400) + return "Remember my decision for \(days) day\(days == 1 ? "" : "s")" + } + } + /// Internal class for storing permission decisions with expiration dates in UserDefaults /// Conforms to NSSecureCoding for safe archiving/unarchiving @objc(StoredPermission) diff --git a/src/config/Config.zig b/src/config/Config.zig index aee670213..aabf4f6ba 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2368,10 +2368,9 @@ keybind: Keybinds = .{}, /// /// Valid values are: /// -/// * `ask` - Ask the user whether for permission. Ghostty will by default -/// cache the user's choice for 10 minutes since we can't determine -/// when a single workflow begins or ends. The user also has an option -/// in the GUI to allow for the remainder of the day. +/// * `ask` - Ask the user whether for permission. Ghostty will remember +/// this choice and never ask again. This is similar to other macOS +/// permissions such as microphone access, camera access, etc. /// /// * `allow` - Allow Shortcuts to control Ghostty without asking. /// From c1c3f639c5d50e15c8890ecfa56d82f52072deea Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 20 Jun 2025 21:08:06 -0700 Subject: [PATCH 271/371] macos: Ghostty Icon Update for macOS Tahoe This updates the Ghostty icon to be compatible with macOS Tahoe (supports glass effects, light/dark, tinting, etc.). This icon is made in the new Apple Icon Composer as the source format, and all other formats are exported from it. This commit also updates the icon for non-Apple platforms because the icon is fundamentally the same and I don't see any reason to maintain multiple icons of fundamentally the same design and style. This commit also includes updates to the macOS app so that the About Window and so on will use the new icon. --- .prettierignore | 3 + dist/macos/Ghostty.icns | Bin 382978 -> 0 bytes dist/macos/Info.plist | 17 -- images/Ghostty.icon/Assets/Ghostty.png | Bin 0 -> 106126 bytes .../Ghostty.icon/Assets/Inner Bevel 6px.png | Bin 0 -> 435672 bytes images/Ghostty.icon/Assets/Screen Effects.png | Bin 0 -> 92547 bytes images/Ghostty.icon/Assets/Screen.png | Bin 0 -> 143481 bytes images/Ghostty.icon/Assets/gloss.png | Bin 0 -> 3353 bytes images/Ghostty.icon/icon.json | 170 ++++++++++++++++++ images/icons/icon_1024.png | Bin 464853 -> 2365230 bytes images/icons/icon_1024@2x.png | Bin 0 -> 2365230 bytes images/icons/icon_128.png | Bin 15177 -> 15089 bytes images/icons/icon_256.png | Bin 68189 -> 237699 bytes images/icons/icon_256@2x.png | Bin 221047 -> 237699 bytes images/icons/icon_512.png | Bin 221047 -> 667563 bytes images/icons/icon_512@2x.png | Bin 0 -> 667563 bytes .../AppIcon.appiconset/Contents.json | 74 -------- .../macOS-AppIcon-1024px 1.png | Bin 464853 -> 0 bytes .../macOS-AppIcon-1024px.png | Bin 464853 -> 0 bytes .../macOS-AppIcon-128px-128pt@1x.png | Bin 15177 -> 0 bytes .../macOS-AppIcon-16px-16pt@1x.png | Bin 666 -> 0 bytes .../macOS-AppIcon-256px-128pt@2x 1.png | Bin 68177 -> 0 bytes .../macOS-AppIcon-256px-128pt@2x.png | Bin 68177 -> 0 bytes .../macOS-AppIcon-32px-16pt@2x.png | Bin 1562 -> 0 bytes .../macOS-AppIcon-32px-32pt@1x.png | Bin 1564 -> 0 bytes .../macOS-AppIcon-512px-256pt@2x.png | Bin 221047 -> 0 bytes .../macOS-AppIcon-512px.png | Bin 220725 -> 0 bytes .../macOS-AppIcon-64px-32pt@2x.png | Bin 4485 -> 0 bytes macos/Ghostty.xcodeproj/project.pbxproj | 18 +- .../ColorizedGhosttyIconImage.swift | 14 ++ 30 files changed, 199 insertions(+), 97 deletions(-) delete mode 100644 dist/macos/Ghostty.icns delete mode 100644 dist/macos/Info.plist create mode 100644 images/Ghostty.icon/Assets/Ghostty.png create mode 100644 images/Ghostty.icon/Assets/Inner Bevel 6px.png create mode 100644 images/Ghostty.icon/Assets/Screen Effects.png create mode 100644 images/Ghostty.icon/Assets/Screen.png create mode 100644 images/Ghostty.icon/Assets/gloss.png create mode 100644 images/Ghostty.icon/icon.json create mode 100644 images/icons/icon_1024@2x.png create mode 100644 images/icons/icon_512@2x.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-1024px 1.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-1024px.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-128px-128pt@1x.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-16px-16pt@1x.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-256px-128pt@2x 1.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-256px-128pt@2x.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-32px-16pt@2x.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-32px-32pt@1x.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-512px-256pt@2x.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-512px.png delete mode 100644 macos/Assets.xcassets/AppIcon.appiconset/macOS-AppIcon-64px-32pt@2x.png diff --git a/.prettierignore b/.prettierignore index 490538680..f131a5edc 100644 --- a/.prettierignore +++ b/.prettierignore @@ -11,6 +11,9 @@ zig-out/ # macos is managed by XCode GUI macos/ +# produced by Icon Composer on macOS +images/Ghostty.icon/icon.json + # website dev run website/.next diff --git a/dist/macos/Ghostty.icns b/dist/macos/Ghostty.icns deleted file mode 100644 index 44a44711aac562d23a82630e3b374ba9c5325b14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382978 zcmeFZi8otY{5G!DN^g-=)l5=V)!v#y%|v?@?KPygy|<_#B!;%;p#%|AE9OvbQ6x%B z2UEDl64FFMDOD}esv&|XDls)8c-`;&zU%il{MLHUS$lo^?6c4Q49~OA9aK=b z$YJKeJ3+p|A|eN1$dG_L;SsvJpAQ@qJ#<(MaMby9q)%A*o!}ss(_Uey+jsV_{yrTM z9O8UB7RGBoK5=TGq+&hPJ;?boi}(`F}dPc^Vbq6&_wDbv)r4*IW8C1u&t(gd+jkdvyXZvF3`{%h#` zzq3B!ZjLuD-$6y}KZsXYbeXD}v*Qi;|2)7EDaF(0^o*|B|8>LF>vl+N(gR#tW_HfQ z{JO^W4suub$FaEuk^eak9QfZ-_8%ib zb7h3-+UKh$6D1_P9;#w4dnKOisnWcdn~}hOb++yDUzgm0`E}Y@VBZTTS|a5)uTUBO z#bbbj;+LfW-nv^ks)-_r{iw>}tN5tBAJKdBpQFRu@^ontm66xo|B2DZ)Agv1~alaH01Z^!mc?zX)T{T}@N@wadH_F`sh z8PjiwlWj+EBM0&lI|7?TeG^ftb_yKOc6IB|As5YK(>e!MY?ICYSjyNM$A5}?dq2ju z#YVQx5>eUB%p11eWgYHN-zwWJSeaMop)&{bq3;kq35!2;R~7{}xCQchOf=$TP;bh2 zm8?xh!OCru_6FMU%Epe@hq(5!d5hpigUeVu!H}yYin}=@!G5>Gu#C~?~xHqT-Ip*z|*^c<*^1_0IJd8ZPd!dwbgrX_uJh-3C9LX%>0xL z0}38b5Pldv%3LPgZBQJ1uQ67&KKhZ`xlmE`bZIIXls#cXwu>6vT>hpM^kJ+nxcw>Q z@7O-xKy>?HmRUR$b%L@Jt$P zwmY}^Hn^QfU)GhvdWU=1A+wtEJ4%f9(v^yNarf=2Cy4n`i`pYXM}79d}|7f z^1a)V66w~c<_OzjQ?oTqm+Gk5=09GRXTLlZ?Jd(r zT|6^&hWzR)#lW&btOBfp z41VYlEZ7X-l|V$K#AE>$qEC?L{(-!_G*zEy4bt&{ujt9Ob+UIcl31f%f*iIR7%OWd zH5(`li$k6;FZj!fgWbF{kBcw4_0cZd47Sx1_z5Tn?$&cBqc0Vs3G;iji3`w=@Bnt& zxvg>~x5e`EXSA@LjnQTdQ#69+Q^Gm{uwUb!8l8G~+^l5E$1zAE{AX=N>{lw~iI(g5 zdUJk&>)3ba=r+=vkz3rxmr9LP%U# zkL=~;oRsF5`CG4Xal;i3xRU6(!l=$g_mvp>GaNYP{X!)XyBha1oOok#0vjendJD$# zrx_#X`Bo=LRzMT)n}X`8bGOoOq~|9+W>poOV;wCHO)pIHT}oj%Qg0~BV8b81dwK0H z=2P-HAj;Gmjq%pD3C%tCUPu|4;ZYDr|AmESoX2u#%}OanQYJ~=8YZsf=^qQeALi&T z`p>cXm17;o<=C$n7$@KIOn4;IVhUzYC(o*a*JXR@9^R@(ooHR4o ztbMoxUo|5R<6EolgqfyvNyiHPvhzciXeS42Vn?0|y@?e2s)!`7fbXle+9ON>lYTMTa@msG&N z3Vp%I&Mp`$qE;PjT@Mm5As#hs6?QdbGxHj7wMK(aGq?0`A8v+AUtG6pZGEU_xMWaY z#V8KW>M-b4v3$Bnl`G5O{>Ac?o2=XRcff06&Fyp7bPQ4Gh^bk{DZmXP)LoBP4-W|7 z@gDY7bqxM9lI2&zl8jtmf9l-B!hx6_C2@~;2p#>7#p_5>IHtF@H7`8!tNl`Tm_YE*HLuq&4GtgIEzaE3XE%B9)+X0qOZfxa8OcOx-pTe#;D zTkoSGTRpb0jTbs`3*#}2DQV(Xzn`||7a4;Wt4&`;DXYF>WC2w~#oFty{N2*M3JEry zH_67fEbHY^Noa?gMKgC^3)3q%+bEOE)1Y{M`48W{oHicuUO$vk9R2=W<>$AXxJK4v zWQ~Yo<+0yujvghDlFC|g&fljWJ%T;@$fF#8oqIiE;rF(49wFD2dvo61=kRii^ehDF zF5n|4F7QfeD0{i-G!5%x__&ZBskq&4J4;yj4W!j*u_lS-qJ(K$@1Is{Ll2GS4bA6u zgz_V1%>|OrcPVmm-^N8~NmF&I!&IwvsSeuAv+k@6`x#5}bgBwm-_N$D@U7vJC(8#x zb0Px5VghKyd+89%R*I3FS!ay~0jdJcU3&lrfjzlf!m zifU`Eb{r;{?_xb1f(;o;5oUg#UvrxqhNpw9#bj$Q0qq8j99=_)YnvC1ECl;)`Bo6Y zM-6k96dvsz=eYN=Z5pyPbsm;}KrgCA<|xix$`1Ou^5P56-;Z5^dglL;SefwroU!h- z|Bz8d^7a0n>+L<rS|*eAReIh1w9aXN)IR|1IR3rP#%2Q7`jsFf$FkF`IoWpOB{;N}7K zjxDKhs0|KoymUc;%+?~92&=Tr7roz94qBQU{rw0aYMM4^@cwD{ao5d|zb0gkhYuRb zi9=X}Pd()`K;6VvsDct7V+x@!v4|cuIDY?D&)1FK;4m+6Y*VU(uwbSrR_=;~;vRQN z1smouOVIwY!It9X8&F=T5l0xnCj>AUqC3{37H1AsTpa5vWejYw@jL4IZhCK4j$?k# zK=%0CujBZTJsxE6m9F+(O8?%gC`oe(W=`u^CH^Z*Io`ly-F8oMpesyWAZDh>HR|iS z+qx31u-NzlWVP6^O(idXBQO8vS8{Je`i;d4Sf}OKrD~l+1{&u?fF!Hsg!1*HIn+SM zpyGo$2g|OV)tvKIpx(TA!fbOcJ;lTwCL`ODs*+?2#>AvrlmP%02ibHA9!h|g)$$ks zbBp#&wV6CEvH@pdTHVo^gqz%crU4|KTi4AgpuN6bS-Se0ezbQ63lCw|v2CBh&DZs0 z#W9cMdzlT=02ODx@ZqdtcM7m9Z_%qiUPs?g2P~vz1qUM2R%l*e%a~X=fs=s;S6z@t zew>=oK#X`1n0y&=H&jf>!s&Sa94obCBTt78hueGe>-3iC%jewv>SlbvbyLS9L3W z48Ua$`OH6iU}?Akb#)bo?NnvOll zYTJOArlHEB_FF{rg@qAnSJpfs_UHEGFY>RFwc0&F?aJ>j*OWYWZh(#yqu=*`i2IuP zm-8G>x})DV-puEuQQ^1V?;$r7oVDhsU*w+!-0ps}v%=3_LI2U{_t{}@VWYc4T1ETm45~VbWUAaYJeR-^xuMCCZsH&y%6UMuRc+Vi-P#(renY^(RRt zJpJ}6;|%GrD|{f^O;f1Gv$hP)(?F1X7>SDzA=QH}N{C~A0*{Y$w z?jc?$V_Gjw7rL4y4Wly7wPDiI%*mNjE@2Oasox8-Hb_^CLweWIx7K4Zt28P|>5-Bz z*F6fgI3!q108M(F?!zX2M<|)HGRX#MCcKw>YX}-^f9)#7=H!>vcS` z5WJHk=irZwvxlDszy^(X(DGN#1mVb?)8oLOKR;{V?7KIp@8}xSxYq@MasSnT@zMsd zpYjOn#Q+P=CD7kze<;0O4mq!TW#yXbRQe;UrLNyk0AE=ZvmPESwOx=oY@G&%oRgoc zJJx>UF(KFr;>DPIw`7ZYxLM3(FvLyR~M>F}IV*KT^MbfERgVznH6#8GFoU!EcbB9qJ& zf3+Sx6Ag)<>&^0j@$XX|t5PL`=rNo8nj1BUCHHOSu${+4t9BSZVtLf9h(A34^s;4W z-vKjB`vhbU-D*?!A-tp8?hFK}?_2wTLzNXROJ)SG5*HKk{NHq1lNDM?%&Oi3ZA|FU zXhyG@3hTAbv7oIffF=J)bLY--uqOYPk;cYg?8F+O8*rekyC}|bg^{SRGioB*_jZ0! z!hGt9Ufr$iSOTdc9WK)*hL0D{K(?0rEVm!P(eI=QuAR<)CBchx7xPQS>E0n-*PpEYdJ~Q%rLkgYJPf30^JY31Z6X4wml7)1QLh}63GyHKiLfON2a;}js za-D2p&aY4g1UsQ#iaT-YQQ6@^2Z*d$OGK5mbVe&PX;IA9GIVk5#n5n${M1SFnW>@- zHDgS-rAHXmMz~Z)WGN#?a)hm_AMJ$GRI55^2;oU{#n?x@B`j;fwHcERHAl79;io<^ zlJ6{gBQJ&YE({In%{4{>F$A}J`?JZQIK1jno%%ELNnK}(@ z!f4D@T-%!(LcJM6i53N|Ue+*SA+#GjI^=2gvP$y&5Gl9ImLx6%4{LKFn!sXrrObru zbyKW`*$f93>O7c)zTGs)>{_!pWxRRFHF7L=1nD?HXea0Wd%6}cw#)kvj9pvYoeSQb z+j~>@b-D_FuCnsi?>gNLoL!qqyxr&91|Ht!dy4uWCsWBbFTKcriV1|9sMm8})0Ou0 z_l>I+^!^L{#bTJxLE#}S$~J)hM0;qsyoztP4UskFY4+%xC(!$-6*>m@&w<3?8pd z`Fg=r*GXG?#I=a&bg6{}t|~C@==s7{=d9UeA}yn`ka}8t_7>^G(_~x5t-PqnJ4k2> zu3tYWQ=kD|?E@7vIlZ~}oWqf-b_2Zb2UDq8%Dqr<$&w1D1ruFYN>nd^K|9<^n0_n>_4jbV{+akyLKK5Y}UdTrhUJ~ zmed(FY(abXsulCEv|GT1x!`x#HDsF<|tLNA8ny0eVW<`g?W=rnch+7kc|MlF8=r^$Qpd-9E+_w^Z60mb19SrxwpMV@1^~km zN5)Lh5!cW1l&>64)^^2RV4AEimDxT?&a4c%f5IF9hRD7@Kg>DniJ@GoGk|uBossbG z6Y%e6osjddOg`S(N{1D&Nz~;11)6v2ux9H+BbbyXmZpg4J+Fdt7I+RD%u5f-!}~{G zCe%ChM|ci1M)~$I=6nqAFhB>}+doEOo!{y+H|bR@r;5QLDsf0UPREjec2Qr$XxMiFf4U9F9@Zs-ioR#Fs>~=%)_fJ>Kz= zlfgoIaQkj$yr44vr*>3p-#I6@P-`;`@D_olatq*W2mRYv`C@lcP4bUxrZ3OA4c#kP zSjT-Suz=8S9lfZ#uB+lp{vh@CgbIKlkqyI5$`e{H7_zSNlJ00~>$L^MLegD@zJW`e zBI>gE?-H0W|Btv_wYD@yadv9~%LpbdSJ=XWKnSPK8fF0}`9tDx z7?0*>51D>eb#>4KpBb*jxl8(B%A=L5gM^CIAsV=qBpVwR`alk|J4UN?W**Xy6XsDu zm&ba~Yp!~xWvHabFG{~LQ9_ZtSJWZwp~O75cQeUgGn9E7#ZW^UzTR7&LA;k?p%+T0 z7r+$u6sQ@2wRX4~gWjvG?)hYGiByf(_lb`ZpYk*L(Fx zsYCVJeg}Y=G-CVHnZe01<0`E876~5x{ssZjWVW|Fxx1{UKKWOm)2!tr%%Njx`wKnL zeTG=8C3JgEL;!P> z=K^oAxhA)-Ky@pKET5oa008iaAo{~|erof9_!&z~y+$8pK(#`8GTL*>2)#a4*^)CI zeT9Nk%A|Qo@^zUMYn~cVJ~b;e;>P$1xu$2#j|L-{ie7E!h-5XL)jVa&pB`RoO3Ija zPj$v>7CRFZHy0r#VdABuG15b*hLT~>-wQmT3%mxKt>fXk5BvBp-~(s2Px88s;ahF; zE$lau67c@@-fAU^Pp~6gNb!Y3AV9J~;f$>q&K@H?g)$G%s$uey9t0PgnDJR_zuyR& zE?7%rYG4a^wqg(v7>ltUG>x@iv_lPVdzJgB1T4^D{_kw(A{M-rV@8#AH}hQ5*fi-@~IWIB{owKl(B8zRnoX8EoLrbL_es-hQbWD%$sD%}^1zA)`>>$e_J< zt{waM^!>kYu#zjewdn5iyQ8(cKWcXuELNfi_1jraf2+j6SI#K|v#e%C%9O(Zz0dw6 zmFBUAA#*)4cL7g9F-Jw-Cw9;DQGAk#rz#n6sZ>b|>uZCu8`h$}LCQkP5#Jj%@t#8s z9?l~)8$9m1@z>|O3mHehoj{@@73+Psyom-18J7kf?U9~&#qu+E*uw5JdT}*UCheZB z*xui;BRvp322N_6hLl96SZ6~BCfFdix`!DY7pocr_s`o&FI3TI%>~?bZWTUzQPnp* zZe%!f5n`H_RqHlGdoHK%7WSFZ)ifA~mz$(KRzjcMGV)F4+iAala=>isxds@U3;j-@QE>E{ zQ91ERMH57fp*MG$lu^q}9c+B0(+(5coO5xCVe;#^Q+MkyuUfHQV{?_TjaP%OF_vZ6 zKc^ZD_O3U&f5!tWp4>wIxPvbI)d!jRR*=XO2~m=6DxC;^hqc!-+8r1AO>TEgZdZ+V z{Jgif-D?d@7~Jakj{W+rh^HB`4zx0smO=2_z<+DlNU^A3{C+0y z0&MklGVE5SnbD!pjK^+Xm*+y5XYkP{)%^MZ-)JRnIjX$dZ11!FgZG*}u>6z5+$lvh zw62?en>U4O8{pYef##0=B8NM0Y1Tx7!ORfu&8TOJ24tPHMr=$=b66F#MP=}x_ko}A zd#9)T9E}#AGjJ)Ku5vuX59x`jlCxz895c((^ruzk`xm!xr7SkbR@ker=K%`TFKU82 ztjlS+U^9Qm%(OzCLmDQ}#FJ~}vu4cvOQ{eQJyY-8jC}Lf^q}yYd#813KrWjHmGvyZ z3VKFohBN-rmlf3;@w|lyqn?@h3|V|Qx&3_w`-@+*BB+79jtb94Gt4G<@O$*8FV5G) z>naZ!fsD5O5cNgpK=k(#rzz)KQIY<7buB!-sHa&Q%m2jhd?MV~odWGnNp3vZ)A_Q( zwtS5ZwK22DT6S8^mKy7tTn0X-E>ER!?s%IdoC7Z9iascNbIiEws6Ke-Ld=r#&BzEZ zv*&XrRZG(O1->Lkgwup6X&;oi$o`N2p5Xl*4M{u%{a2I5wS#O68NJ z=O7Q{Rkx)cH>c3`Xi6oX+x;hEt%;=UQrXH}@OFE zPhfA6v1e{tva)()+-6989B0Ect&wpm-@j!?(h{n{SZ7%-BBkTga2^2yOdi$yJcxca zS~AKMFZi8%$LWXTWn)`{G3a+B{8oAbASfeFt;9JE)GI`a99c!#Zq;)KyAEyBu zJau2e)?ZYH#m`VsE&g)n+uhwRzs2u=1&(gb6NyCGD{+T?+Km~I2qk@8ut*T<-Q15c z%vfrnSvP(4>reV%{O%g@#$?RS8-b_=X!G^tfu@D<8NH~2>qnG>a5ngSYJPHXO)hoF z>^8b*I-=zmmR`p>)#g2iQJ_X~c}yAz!YY@J7A>5q8;v<`#X>R&TG)_rMv*i6 zg95&5W^&NTQPIQ6n&v!pF;hCa?ndguyFXlTV0d1GxqV$0tkA?oce+6)qrD}2z4|dc zhMo3XE&d<-0M3iF^RNZ~H2v7m)(y zip5KEygLC483&#~J?MN@W42(b5y;>@mm{y=SxA($k%zZdS2YNYs za*ey)FzB&_83XkiVQXXxj<;(=1ZbZ0& zy=(H#J@d{1qfQM`iEhexKZ`HJJ?7*5x{ zaC-{tjb#-HexNkp>OCPSzGop#s)kTJNkb8mtB=)v;nbQJn(k_Q4-+{1Ft-0uUBQ|d2MWXT+f34s$+KL=+q}kO97ga;!gm8+K}nR z@z5fTc@haYDexP#8PxbR3?HZ;=;2nk?vC`jd?9!sP6*LE%XvDViN7~ND-Ov>?38tr z=M5h42Fdz4hkm;HU)i_2{-G~~uLaAjyLN84cD@MOjlUWHe13v(_b*^lXiz4)=UIqz zI8`??bv>1U^r~?-J`IfAi@rb**`N1_vd57&J_>|-4!4jr1@;xmGaq#zvN@L#CG$TIj02SQZ$QGT> zNS2trMe*tjMykOzy(yk6G2Yd^YVI>Iu}~5<0~E7a=uwU$`e?;q46&~hH4hP$O;$!I z9`lebR1EnGYwM{ZnT-94`F&QUy}1ra=+xoW!G;UX3$`nJ$h_ojF0 z;0?>0QXl@|Z0fCPU|AX-Lh(+ncx{;T&TXP-O4!Rl%m?47V*wGSKv{yQ_tG)>^GARV zz`MZT?Aw*y0Kgh#q8w5wz#^8juVkaU*w6N_!* z=mVq%|Lo$y@sGS>chgjlAm%HDSLb#lAt|>mF`OL|pQW56PE#*Mcz(n~%r{QKJgGyR zr)m~TO~~){K6ZKAP)?_?uM@LohY);%Xf_6JsJ!kSTNO>{u8CY*iFT8?)pIdk-}PA5 zg1Km1wjeZU7ri{&9lSFV+_7nkW!rji=qvP}s$E{8#>yg(vVzOMu?@{siY(znbJ4dd zt!&^#t0U4Wt;tsghr@tH$q&}+SdhU2Jo6p7`jGzaCn~oqsi#^4VCnz7kI39Epy6#n zz0%Pmj=e;wrzVt8qF)%K=+YY-SJd_+4P=6EF z(8T;yxv0oeU?3v+RI8Zi1RrI4J;7WIiRLjVhF2!s^X;EUj#Iw)Wzlt+{?RghMl8S( zKD#xPh4bpyAe)%+?(4{6FQBq?qP^9eB4+U8=2+fzgOTHS#4+VCL7^=Gp+CwvgAt&0 zIkd{qh**UkPYsQ^r%a~&TUgy^iSRa3qeuH^sn$Q2Rv%)VSE|*?vmc`E2~|VJ^EV}? zd0v?sbD7e1+=sy!|38ohzW)2Z!1`?8*UT+hD{i;OfZ)o#&HvDvc8K5^B}&E_ z&I0xDqf%N;ry?q-4g3Y|5}d~jE#OM{(G$G>r^4ETBZMT?K7gmOcfIIB> zotF!Pis@r}ymB=xSw_IlW|#g@yr?+kkFa3nBF?)9X?i2LQyG)A;YB6eft&3Z1qM8V zsV3y7c?f9A_G@mIqrVX?$iB+vdRas;XfV2AG8gl)HzuZ?|7TTz*Yq#*@Ds#{OleRd zsbPt+z=?gZM7g9-ABDuN4=v~a6zuM;#s!pZi9Afy>C|k*KLEY z6Tt)O%HfZcEL=CVF~&!L7%h|@+2Tm*b{}GQ^@+gaOM~4`@Z`?VsMw_8fGZ~#{F%3- zhaFbAww8lk5k5AiH~TJz-$ zHbsJ%+CDh8I<=ZM_3nOot87|frUN_;8p(U5F`TEaZ9(iYj&u=^(=tWcj9knogyJ1W zv44!2u`}*7G(J&*HzShIiybnHNzYP7K0Ri5d?j2U@=U_WkF`t)0~pmpH_o$X{=YX6xi@sCcuXQ-)|mGcy2X&L%?nwgusdsF$*tg&Db#V4j0vNfQgcAZDJH z#Qtopj@!3YiC>890DyMel7(iS+<8n#G2mD*S|*2B?>QzU%U{-b zP=&xdsbkV`=H$F`S_*{adTE*};8)=4fqDg)=|aEibrwixhF|Jm71gozzI_yj($+!N z$(qa!OO|Lx^3#Uo&qNautF)76^rAoVPx|>~CP~_=`AP3l)Wj)ec?Gc&rf~tt)M|hK zr85a^v7w=3;}hV>y;2D)*jWA5_9f0cqmevSlwSCj&mc}I73{d`Xmmo^e0Q}JSwqUR zlb>@zcw^qB651)p03}tE^821&=-kqDo&E?w4TbRr6Voi49G>ka!r?@cvTH^$yS$B) zG4|mLwM!JtO&Hr*iQgM*#`HD!gZW*6fo#(sFJBsHHu3!8y|aX>9rs)so}jbF(kK}+ zp$fxUC9p_d?!*Sl>Zgt*A#QVQFY48vWdL?Q3d?w-Qlw=hC>=OIn1Q2 zR(&s``Y|wxSipOT<9lc5{G|OcschN(alA3TmMx=Wx+>-*4IiL#(fn6?- zQ#5R3yH5MKJ#XgE&Okh}@X_>jUNT@(KF&}$sQ0F0ceptuG*e;GDx_YA+p~0Ocj^u= z*-xvE+f9Iu)6y7c>OH&Y<@v?jtJxqtXqDTm7n#*FJIIK0fgr#~222;LHg&IcKCiS; zzCab=$OiQ0xZ9dyO|19e3fw6JadOzrUW{0D8gYf2n~%dGjK5(18Qbl06mk7QS~`?W5}qzu@@oZ+`K=qT)vEWOgxB#S3fAYm(-PxRdXhs|c^~~FJ{@-ghDVIeJUemJq+YB$*<-|xF>ad6 z=kTg=-H;u2erE6*r_P}!vq9EEWs@=m(uw{}+r6IMRjhNLNGQ2?vLFLJcPn6Dmj~)* z^=`1PB<7uGde=CF|3gn3{zFq6DlK;w8urmZ%7+QdO+`e=HB13OXEez?W~VXL zq2_>j(-Q4&0R9^sS$`7&teUJBv?U3>S~i^ik+G4pJ4ujbSY1^23jRFF*{lfno7Rw9 zsQzXQ5;6QVAlE*1c&`CV-@^x9$6bI|0gIE_$8x7}VMqD{eN7E7C;_@`nqHO9pX>?| z8K*4_C$3cMuwQjxFZgagX>Rw~-2V)lyOUNfvcvV5N3=WBAB7@x`_-bl_$()hrzY6+ zL+-{V#koF`E)cUAwkoP%MA5`tScR`?R3}DMCp)GikzS%8b?tUeo7kMUkkr>Ub(htR zmo)M44)B`d)iSIidT4-2WB&?KIlKhfmmoit+xpw5QRa-+*Sf_tWwJbToy=3i6)JC- zJE!G#Ks6u9vu=!^<-Ikmu`~h4kAc?rXNF#u2cPm|M@+*)g&)FVnD$Sz$1j5+BUfsh z4H)>$K;$#qfeGU{q<6B;O`2ooS&W4RhR5Np^AwavO`|K``0O!V*N=;C?+R>Wqib#m z55YlwyME>B8n0Xe#xHkUrPMk_^<-`tI%=)zPNA$1?eX^U*Cm(1n2{=MIO2^7|A%5c z(o@`OU`gSGN66L?+YZuNT=#`rt+0>GgPg`I2{AvaJaRgo(R51J@+`OVa5v{)g_s|@ z(gVBQYPw>z;CS*+@F&;$eMA2BO7>UIV0GmOqvNJ0f(FhOeVV&hsw`3@J;smNPVy{H zLT1))p#bMGrduOF^U3QkTy|)bC5Pac;iY{JcA+=hI3c#?t`Hut@KahXB(wYq+dLo6s8Ih|BBb3=po^Bkjj|a&M~=i#1^zy1W@VUq0(fK%C~74%e&Ui<|U) z96#v;z@x5z?8idRP)5**tU~+_xnj_xN=OG1CBX>(>K{gjiX4$cYR<6Db!j-~-(kn1 z|Dx+fI~@EjXK5ddvYSbxfIsK7cy{~MZOuwgDt0I94c@yk%Iva(^<>U|l9OK?POv;T z4DsA+u-tBFo>TSwohv!vHMs@1u$QEhz|weQfB}Y+}qK3wET8&8nSySNs#rgoA)8;(B1Z)pC@)ob`F$IiYP3u zy`MzK?%bVZ?2Zw4#@+@R9{!po65SXaJ~LKDH;e+7Iows7zt%u14D=K#>#g=M3(P#Z zLgn4_9=!B1kgyBX4_ki*GVs8U2=T*$&E^e|qc8w8G^lx3JI1ccBNe6Hpu+zZysoXor&(v909qkR;+dNogg!IjF^CSG1T~UX!P38(Jh?vyF zK+6u$?$$*YtB9FC+vK$FHi2=L#pf@KKrV)!rRYmaP~`rCeAnz62L0lI=r`0eWv=>$t6}Zr)ib55)eAoijgz7S%MT|&R z*M{*H=)`Dx#KR(NM~4ce6&rEE{Lw^X_GHfncP0b7wC$EN}D69ot1C5EV0 zl*Hc{#oF&Ddd6YtwV#!pSMRv5e<&|!40`wxF;opXKoRrlyt{;v8!t7>aU?Kv5UjI! zui;l;45oQ186upj!dm`G-TRLb6WMeew9PlVDYu2QVz?>SRXgC1zqxlhIN-RPMD#1- zO*DHS%*oaQMfX_2{zl~Znjg6ED3S^R9k`+Wb)}97T8VIvA8tm6YbnjqzkXzp*Gg7| zqcKH0w>u9Ex_THsbC^3h7BXk(Wmpys%=(atuY9Kbhv~WOv5({_-26A;{nav!xWT3|oMhnK_jE_~6BS31Wxu&OS<} z+f$Wg9@=%;W|gm(Qq;&aaw!raP@#jW8f87}FomqYi1mU8=v?_aCZ!H}dP9%0`4Co6--L zXpueJs4CB=3<96WdZPfI1H>n_kfF52g&QnT0RIro@8Fx9I^HR`0aEzl47%&%&mILPn4BnL8s ze%ha!MkBNy+^GjFCD~}~_%Wh;T~XN1@C+rjq=5e-xY+oEw1%)}*3e%@I{xV4ezr^s z?n(Poj<`fzc$*8v)lkTpO$v^2iA8?&?^TzWsVeG7;g*TpEs?~*mgs$cFkxdM&%Y@m zsfge(QYvTU@zlhUrR!@eb{-a^0?o*Ub@b?EOLox25LWB^zMVO&`Y$^|mXxKi72C7% z@6F5k9>@W~aV7G-k5?slGDSVzfjaA$_WmvFX$5L`^OGt7crS*R`j5C_tjWc7PHHv6 z$U{fXPfd1)Etb+MKXuADVByRrvsW#E#8THuQ{9~7_G~@y8%Jpb*JU=2XO7+0?HN-= z8B@BY0T}-&r>qw4JMlE%!TmibaeviXoJ{?0c6cXQ%@rnSOvs(Es+oxHKf7MOirUPI$1QU+}L6YI8kf%Zk(MN-6?tU@a!!3JOAv{N^^Q4`fj ztlk(Ygv_p)bSm94jP3pm6zLR}(#ja&CwsP%Yi-fzT7XB8(jGtsgvrIaeFCjw1Jq_6 z8N8fo8P+tU55$fHbVQ8hZjfvMWCO}G|EgTImWAGOHJi_i)4cM-cnh+PQ}QKk#N5cd z%mZgyzlWDvhKjP*gNzyzW!^jQ`CB&mnHHx|D6kT?`=VI>AWcNnvT2EP+KDp6m?&@; zel)NZRN>5L__~9NG{4OGuidhaLi)tGap;hN&9r)u{};|}%wXVCNEP zL*E#Hy;S$wz7(>-j}MI#&B6k;dbS-ft2?1Sn9J$?Eh(_7+tNG+b62ui>PCc zU7$6YyowK#n2Grs7o#aMs-y7+f5VS_8a=r^ z(cDqW!h!8K=X3?*hd`5U3x_AiJk?-+k0qV}@UP1kf2=f^FXJVWwxVQ20<;8 zn<l-O7gmBqub)$T*;^XDy8!ebN~9t_q(i$2kKYh7vpt#rSp9Z5`bRwbqbdztD14IQ3(g_Gm{Yz&xx) zxBp8rw|^FgXP*k^HK>*c7cWjLroacCllS*GpvVj5OwM%g;ZD^yOpe-&=Vcp2CcpPZ zbWO5z@;OLd`?rNlU2y&ABi!5{c|;*Q^2ulG?V}X$490+)1h;xvIqd<#B;Ff6;ypOE zHE^>d$CUN?20V_r&x?L;^x0NQ*3_ccz7hQSkaPaX^Rqh_%)0hE^tGB0{`A(ZqHnx! z1LkY}wmTb$y$wKMK+!p+@5V)6nJJ4#9i*)HK%bgYA5=ZbMCB+%qd0zdt6|=J-lPGK zVXG~N@D*+;8NpOU+JyBVE`8JiCnz(OkC-Z&w+YNsr(CUc1*b9qYX0Ro=EIFP=|~SL z!EQpcwiEffbMwI4<9(LMBSt1j5V2EvZhy~^LyVxeccA13sS>Vz#&ER(yK{j^AO2w8 zS`H9xJriOSFctf|>Dwr3NqTz0mqfN+Ym^pe`Kv+PUq>NnR++5Q62vD;YQ}sjTge30riisXtS2gseOtvuajyIC9t_L&9U^DHw)D-oG04)pnRFHHj8} zYBc(iat<)^-BKAn>SHR6>}$lYu)CBio|scIbo>n}S7K%pN1Owm8l)=?StB#ydZc&v zXJncQf$>?)R5f`Ff9C-9&(gbrz|O0o|My=2vGUw9z>_Eb)|Sz@H0CX(hib3|ZXXaN z7QarLzVt4cG3H0ydE>Jw-nsp@bJ4ctb8N=yWsvU5QO)4CG(?$bQJ9)}os&tmw*PW0 z>VxCtP0N8W+T`BOWPH;^ndyY|YbTCjLDu}q+0q4`fzp>0{SiOvw@2%r?t3Pi21M*^ zlKo(7h0E}z5u&t*KxJo)zdi$!B~MWLhM~$u#RRM4#0Zr`WG?4pcb{rDmK8Y_~Iy~#S*xzcRP+NPD zToELJc}EFfGm2#Lj6OSK((EKQ;;X}BVq;LV&r5!OpHR(7Uhw_w*2v69%+|^H^}%Ia zNa{vmB=Z{N&6vf-=>s~4`_QYMnQGdYt&e`7>2mjx8^)Ao`mIZAT23k6{?#P!*4?E_ zjDwN$n&%lHzb>-(-tvJHZ+8Xz!HD__Mzz~#hrb6w_R;zMC1w`#qtu^-JCf`$5gbAJ zl)pa02_$M}M-B=?I7KbQH16njp5fK{G335CIYPg9+-{LM&%#gA)WM6oqZ!|w;W}II zW<+8A+z+#6v5$g7TOtRJ+WVshZ5nJBR9pWS0Kq^$za!W4sU^=lYwtM+@uhFM=CbrM z7uVAIONJkLpIbb0at%38dt8%}ImftSm8Y!1n7&>DJan0hgC)XV>`Bs0()fPU3N7t)!f0)d7tLhv3v&TO6u?<6w()hPdSn8%;OB{H~7woLT zk0N>~;X8lVfZTVip8C|MKB<=S_w`Z4Vb$BH(qtp2uVEYO(Ujb2d_ev?ovH(JX)6}h zuhTe9Wz=kjo%P3k{`U|5;152-pUAb*rh`(FBAYxL(AZ7brpu|^6HOIGA|JFycziLkJ984cyscmY3UQIIgv;1m_I+Gi4>WVs}mZ%AMdQDBy zGMAe?Y#66rrdGkp1A|@-`t+wi-R$c(tj=Eaq8BwAf2}nB=xInV#`qPBSbe;}mpI51 zkB1CI$B%E<7Xh!VpANWZv975v2<9O`5z$ck9QO2+^Z@+VNjcD|Ut`8@`o`&RtXJdz z^H2WdPyYDIE3a&u&qneT>FL$erp;=T8QXy7HlTU`G~XWp8=nq+KO>8N`Imor_R3ej zvTfQ^Pd&BS(+L)vZ1_B2=yOvy*68G5+Tg~y!8-uC@#7h@zqX!^udlaV9Sm!^?UeN0 zcFShb%fNLYJOMaeYIhHJ+b;2;G)~>8ZEA4aXv+}{BPuoJqrcX&m}!AX0ry$21IV=K6|pk z=-6arxj|=R+l=@&EY#IMb3^t zay@?z3`{X<{(y%A;DIG;$eLO)sl(K$b@Q>q)rQjaRnQz}*>ah&aH++5gi+!)NuW@4Bmrf^ZZss<+`A0dOMyoj< z0{lF`KCi~rD77b)`lt5MQIC*1Mpx}hZN#ImrsX36Jaf&DK>J?6OJ4GlS^crKX6IvA zHt=Dq%P2R0JbqIzXxv|M!3Y3kv29^$?4gM znoWmnaB??eZ>>29^%tsUuX@$1+Eb`6rI6vZ zpI43P>7e>T>aoWh+g`+|Z*I1^k*hy>f#OE1{-{d`Uu{gi!dp>`YEG7$G%WAF`qk(D zs8IcNzjpKXP@wk0f(Qpnke*OZ^1Gy~_O3dSLJn z;67mCX-UpvUn&O{c?Eo+QeOo#wmXgU0I9KCbQAlvA5ai{rHdnc>CP{#1l_!2MN!{q@Rt72N$u2n@vv-FPl6zIeb0? zqwBEL=UnYuwl~&6ZRDokzCcyIHE4y^dZ`GHUTZzC#`%<_#BB_#wVE#JFOS=SH!a)- z-O?S*&Tse&{d9xpcjc|#te25%^|)01L~Z2AF0nG0`e57)r>zY}4d&yew6t}U1&C$l z>SK=gsWV@H)0xM)LVq>hYM8gAw-{?b@5hVSJ?_57i*|dNw|w+C^cLsg^%&9V`^Z=0 zttO+_V`tv$_T$L+h2QJ1HV!X+u*{A7>mOcpGmlN*M+YzCMg7Hje04TU$;TtF-ajy> zNp;0<=b(61chnUh8M-m&olmtc^$P;(>*I9xmwyycol@J_M5b5QQsZE#naJ-#akGBP zQ=ZaZ*m&qr|1_lj!3v&t2ts0nt)6Op$B()17o2p`NgL}Uk5eD{$Va~AeeZjpdm!LE z`LwJAZ{DxQTTt0Qrw8o9>T+aleeXh>`!MQ;dQ0ip+H9XY<&;y7urb{H-As{9WaHUf zHoVPaBk65go6v?NL(%ix93F{kFUt$cW?99=|jOVUv0d|i`{B{??2<yvG;a8 z*0T4BTXswKou2*MXfE$QD)6pm-9+2>n$$?I{?)>~fKjJ3JUu?W)G~ZceTyC)^-vx4 zae#LN&OZC>_7_mudI-tGf_jPAvmsY&Qx9R%$%BDf%+}mT1ZwDU#~n9&_OqY;w1Rn8 zef)bw^}ZCPgZjvUzMA8^{K>>F{%NwjXS$$ly32FkbVT*UZXCyZQS9N;Wpz@bmS`|H>w7%PhO;DZZBMm3rAt^|Twep+i~+wEZ_7)JZpb>C3r{ z1*h2X#ZyPTK^sl-x$mYM-rP^KVb`~kRlJSo=bJ0uHLWimerx#iw#LKILLWkwj_ztY zx0MI8$BU2Kf)kq_=a%f*+>*|a-{u@GoVV=L6@A;E(m&t3HDCI#rM&)u(ZaOePUbAJL&n}YrT@2o`?u{zU4PlH z$?(Y4WA^HBYOx*$8C>JUq*kh{?8Te7PCM8fBg?i-_2hDtKICoq_i*&sDHA! z18PyVn5;|RH`U7HIhstJeFP<1WcK zLHPVsH(8py)M(sXDEB>6=w`q8L^E>}00$-uI-JX1B0zdBx1a1ktGn~ge!BB{D z38J=S*FcxnILS-6!smpv1T&v5b@A7Fz`c_i_tPb#xn8rGo3xlH%m=ydfn1W$L1Npc zQR-y#Vc;@d>Q{}cq&okCx|cmoJ^Q*q1!Kc3!3z$bPrRi6`D==9ieM zPhO3yp_*EkI+r?%XY2;9&S`399stNvYcIU;!uHDloO90c7yjCpnc1s}Zshvl!pVaH zY-76g#6nN6*7|tC_XxyX-_82PTH*hyzg+0M02Y-m1xiTYYT9TyQQ_>z{oZ!oe!Qd= zr^))#+!4Iv;Zb!*{lT3N)~o+V`Rw1@{@JuPWB&kPBe^l>)w);v*}(L&$!#>7-Ob;x zyY#oPy=~>^{OOb1eDwLUNf$RhJPnQmK^M^z100{l`J5kCqv9 zipg~8CRuOqwO=CA-sUUZJ#_~BBAU<=?wmn{m%iO>O{zIUy?(tCUsfb9g%&gYqBYao zd2L+3v}U?mwI+I%qe>Q~I+k_W4B^o;F>ZONas9HNCTCN{piRWp!m7Eo)h}+DY>7*+ z39Dn9IO&nK@aiAPYBN-gtXpq{B?=DEqMb@b_xsf}u^9{;@a&TH78{NyKReqoxMx0^kz zzAl;vLk)#RFZkl|VolxEVt?_)7jJvq;~sZLJrG<}Djot9T?ND`S!&lgoUd zQPz~+9WqVT-}2L~I{riWq7E)N9svw886o~{jy*c$uQ!9K%k)DE&G&X?J`XMKQ~YZ zvTfhFZcX;M$+utnGac4eB-Yov4t0~rl@8pHQ zZsXyzgErQW`c#;E>ZZJX+chl@iqG2ho92F-c((ncQJNt-#XiV)0P@d|83Y*>sedB9j#uu@7`6fFv`|irt@Fl z^EkL-ZVwC<*RFbHantfoSFE?*^&alLm08uJYUTsObjT!Y>)qONGUaND zdEEwbZ*5jScHGdK6|Sv#))jUQTa>$Z){jC}t`Xh!8^v5}H!t7(+A~eR0@-j-eXJ=U zxh(n48@H71v=79*cKx&;OI+7zYpvTCsl8f>zdX} zUTfM}e>}5%iFy4&bq!X;ytQP$sww8f3Um7Hd3MB(ZDOAG-}-|Novqz4JtVs-*1CIF zUEi{^t|o7J_EDMZTk_p%wO>e6zg@HT4Ly5p%A=U3k8{@7zQUJ`md73PXkP!8&W3~4 zeL<7g&y-g_%$cmK^{ibt{pP%-JhshI`?d10uHtUFsMNQZD<<*dO}TV^t-sDuU4z~8 z2i3Lp;42?{>Kclq<#9)Sho_wSPaZw6PV1>_P-k%I9F;!#+WL)*;@nm7x&}T9oBUQj z?7Mn!g?rPDSJxS>k1=a)duo4Ipk+5F55;wz*~(?3_Ap#gdC*oTirU_qMkZ}E^)+rU z7N*>L2=M&?bxzG+{SYigZ!7;9v?DTkj20Jd)0>fS>i`q0@w|MNdLT|XWOCl3sX zPd$g3dTX582}`Z^uB}?lhg#~#0_#V!UsD(_`n6yCHNPAPS+r(zT5MVklO)6apX|K@ ziL#!)pYBxCTmN?c?zg`6t)FUhhWjsT0|#$i_l8ps~$G z*Durfu^;=fncr%4`st^)?+@fjG*7GSY+m~9aL*4$4nlbJ_~YM(zuVUVQL?BwVP9ESMfUH*wbgnY`#yGSUUCl?Kd4;znZo_ z(>rAIZ1c(gqYlquvu!tAF}vd8k2id{iq7V{KD6SmFH6=diz_cZcXq>;iz}r12(1qD zu_r!ow(0QAZEahw{^IQFOFy}EgLH~EpLFJIW8I9`RN-mz%l=QT(*w>;v!gfPuVOl_ zVySml>cQc%FMqV%+;>&cI`oM8($R?zXtK3ctS+yZwq1XD!`@jB8iyZq+U%GU?%N8u zd|dIBPt0!GdS$yA9klVt*>NX5q&?%TtB0IxF8}Q8nkzmtTer4iF5Tnq`rvx-IJ}+g z?KfOKyW)~*y{;=AF|Vr|W?k&rP1~+*`5;sHj;)vuIqZa1VC6?#JL=)W&FRQv?lC*+ zxHGEW`knWiW>;VSso9omE-Wk$h1+IF9ec0Yk=1tAjo(e|>dQYlyZ+iQwU{;?dfe>T z6TYc%yo%X4yZ*W_&#t=cla<%{en{nR^Iad(FkKkyzx?8lwOqApR5z^6Cq1-X6Z>gL z-5@T%q~x{N)U;!cub2-%vE2;qmn$y$L_JW|!&dn^{OD6E=KIvm!k1Y$&91rfGqY>2 zx}c4xnD1FJ-@ANnt#uqyd8{>EePN4hwzaNrt;NmjnB(t1JM74lTU>QA zN?zA@+f}vPJ+niOxNGI={_P<~Zd;zkNsN-wT)!s!{eC1>H zV0m3(`tE-Kd{?cJ+_kDrT>I^a*>QJyNad!^Ze4?`E~|5N-KEX1H6456 zH_Z+?^!T6-2AOeQ|t6@&c@{SX=)`5bG22C)-J4%1L}{o&FV+C zTW$94DhxGJeNH`Phdczpqhp+RaQWg_eb-Q7?XKSt_)RtZ$9Zi{`}AX{EPB!(Bid?VpAZSB2SGr zXC4x4rdCXALwiWDk+N}ZRImQu`ObIFe&%O>rhRe6XY~jMJR8v_rK|B{W5TqF$;@F! zmtDO@)t-RixLK94(=oO7*4{L48-HF*+H$S9US%l8v+ebpu&QXRsbY83arbIB_q(6= zZL@pc{~5EB?*52+P&vMC{zq3ksvZF9l|$R-UbF0;ZN2uQDjZwOZEcmp-|bz4l6Zx2 zV-;vOf3H~byT}zM7+yJUx%vyOP}Txz)VgYICEr-DsCQIMTdw|m6)^9Jc;!+dR-s>C zxYlxA*>10!?er^5J=ND2Evqs3(QP&U*%4;!j@-EiF{bNTcN za96$JQT*NHy>sA(rHI3BuOiF$M(<2i5FSce5pN$&cpI`_F;zSp4?eoZzV(`t*Q;$e zklof(wg*+-++Y;p8@629ZYFXfR~zaTqIT1^t7q4jt<<)nPhK%>IOy<-d(-U38?J0O ze+5>tc7u_}gX&e{&RW~`_296pZjStT6-mc~l-HIX8sN9LbzLL!if>~*_}EKZO77j1 z$+lkE*A;XVptJ4zOQvh+`qnjK+hVHg&~jBV!n4;~QKt*dv4TAsypQ9*h)ul7}~2L^0Osl77;L@swZ7u<(6P1lqz9HJD`orLL#;hKJy?9PU1PZ3O|sWv zcp$pr`pat1TJQ8qeDZ5=)EAKJf#Ui)gLsqNxvY~}_V&Py+peq!txFmfJUZ5iJfu0F zHk}7{`~ToWj++WI%{^s;V0EY%IUKsjyb*F1*!bhcj0!{HLWMcW&^KL>P=0o zEPt0_681X9seGxKZpwbAN^ZP#r+qYiL*HE8!^^t@YMi-Rh|KdMNNxP5fBL6cy?fjK zlyDvZyrQS4KBtbd*HTNph@yk1wxkB*@m)WiwWh|$6!zOb@PQ9_@HRiFwmj(s?IB@W9rrDq4jFDy#lRQoo=e_23I;>wM;v{?5lW& z&whF}RD-4K%-oZQXOZ$h?hNv9GVUwiWkw zQ<%TP!*^42;}Wu*czd?_Et!WP_HI7b?bW&)ns|{{c5KDvT?^b+I4dSOv<8KIM-}7g zVMm@DaFcuY!;RjnvsUEYTna-TT}MURjl?U*mJha~s^aAx8dz-Q%zi*_ey*X9W9+j@ zJ{47R*z4<|gKr;&pmxog%uk`zPnn3haJ~Do>~~tzy0)gn>LGS|8-9}WJH1+TGj;vE zVqWWAmPQqGVTs9pxv9NU7IVv3%Y|3CQy#_Sp+n5pYj4y|zT|YaZ}%}+U0?gGXpdK_ zHE$1|b^VgZNjP0UGS{zttYBZwaplQ_oP4-Gu4mitl{X|;ZsM-#bPeV)cY990>>Ke+ zH_ds>Wm{@32d?3Cji&XwM)Jj0UMNoMS@zo=V49vU2`6SzP1m6S44Yj$3vyPUzqAKa z`-f)ji}oH+Ag%g&o!aruAE_V_5IUSzDP+%;-B zDZ_bg8dy8Jb6)Y=-mbk#rapQn)UQETGxLJUp48Mly|b)WOVv!ZFAoP~>M~p3132M? z6K0?N>}T7%t$q@LuCt)2oqDz&4Afh-){8Cv^ARmM89p1mF9m+*cYfzXD)5ijFADN5 zfCSpm7Nf64Hd^fG?ESN|8xIu9TGID7f2a2PdiDQ*)!YAX_A~!Bj?HDm*#I_-4T?s?C9HZ1yd*t5~|nN6CF&K{B3_ zLbXq8iSc%)3>R{Jen#}}Os{T|-P7IEGd=H@h8gP#l8gjm1OkhvSmSlr0T{zNU>9P+ z8#aO^AOeWBgFi6g-Pn!YzYO8P3v0r}vMh2CuxnNjE0B;ZBu0#+(TJIz(Y*UvRbACp zwcpRlo4@*XYa9;$u@O^b_pRT(_vGW`$&=@t%siPF{)yiNn!5HFfP|*C_Ryo(Ibhkh zaZ&Ip<75=XdEWv7(*!PzTi$yx^(=#_VDJjw(iTolI585SLMh3kV6sTz1a2Wgc}trh zsXt8^x6xY@#09QD@-s_-mSEC$l)>QK3@WomO@UXoVEI?D-1kxEjcG?XRLiK4V-H|$ zriqe4Px%RjQ^6Q{Q68g`?J50E>hxuBwBpr`-y6<1;G~pZZj7j+<5b4d={FsxR?CJ{ zm0M|z>^q%%?u}N;?n<~rijHHsa#E*hO0?n|J;0lioTp+i)g6~Fw z_ms6~GyxYHeVU&XCEh=w{;R+Gt2OBA>;B^RbmXmk$Y1Ze{8cU^gQIqj>zH(dH-<$% z75pz#J^SM2xj?)`20SC8vgt^KEAf92kL z@4XchV79LC{ZhQexJg7wcZKX-XR^*r&IS;~Gu8jwzx~_8PyEDBOpf{O3@#7%{a0S@ zUCNhU+4Akm-}@(?c%o(!s*nh*5+~JJQ=RS*KAgMv zv0*W5y+*x8b0uK$tu(pdvwNTkpz8IgR}?ggi1G>VPn5uzCNGi$#gu+w#A7sE^=u<| z(Mloamq00jOTZDllvv^_xAKiYfzkAVblw9Mx8)5tqmx5{SGtOmS(742hsC&(Ca@|8 z9#tR0McRxcD&LmBdQo!T$y>U1HDjU#b;_-D@PxA~@hfd97t@x?489{AN_&bcZ3~Zt zS}RR{6droC_+Q@L_+>QXLy%u@q+s^S4YbNsuKQ*@NY{cq3a3(vO<}ft<=o1ZckU`*{4an7;VM`8txxQgt8I+H z;ZzC_eJf>44Q`~|;5XtdhFP6GocHpraPI54 zzwwQ4{DvRl zwV4iDun3ma5$tfB+V}x9!Pd%cf^;`df~QK+^45k=<;$Q*=bn#0!tBCoP4hS57=e=r zythpsFRnC)J5FS!Lt)}CpZ8V5Ng>%Bf@~y%9mZC-BRSLD?G`n!ToY#s6 zG6O>qbXg+3HQB{Du@RO$wkLQ+_?!M;T)91b5vM^*2$X@^24-q~F-~Co0IajuT6WR0 z!A)B)C9O4g%N9*3GrpS8T@22g7tKKIj2`6hQg{9!i!0|!(AUm`DW%tNJ`p;@nGvjw zwUBbN9Fk>;rIkBsN}bUelt-NL{-LD1J?(qE*4x|EH^Za|JNT@apU*Q{hS~6*{&?3*;dM?g~ zmZLZnPGImF4e;5y0PPc>_(VAclCv&xTx6(pU9NT*nGGh7o)-hby_o{{*=Be!vjJOgfBV}% z^pTHzq#FPT(}+_wt3Nl@b`P-M?*1wm0Mm`(-ld23OE13u!4H1$pS|Zj?|G2(2qx-` z$6~}B7=@LHc`yoQ^4>cZCdQG5AwYp!Pr}f@@C&~%{Q9r|daZSJYqK+;H150N@6W-f z%IJ)U0hROQlQ&NLgZo#CALF{$*;K7+7iPDmDMI`7onJlN_sDmpquyVRN-4FxxtEXK z5#h2{p6NB3O&(2fEe)&j3s~e?9l_STml+c}<$QTnFGs-`g>z7AeIWfH#joCyDZLZ- zmZILeW;vyVY1_a~1h%vqMV#$^9MGCTjX@RRSsv)O#k+mwRBZ= zwqb7RWGPGzZs=+hwsH&4_Irl87){8#k)02IOEIO&tMTMsIeu5*x0GN67r}ZlPweBT zA1+}{=x$`^0s2yga}oY_2{6WHqg2s?QAQCm6y}$1Dc=l+8>0s;nv#i=Wt6^rdFxAW z?b;e`HGf*;=*jzrmH2j)l86CTIOTnqq1x!!Ef2=v0gsYMqTYtu7tY!MPBYm)w-Imp zqE&E)2Y(Sp+-wvOC2oshwNZ?)xx5FT1y6cgA}LkWqG(sM?6k1LAPUaOZ!>x08Ss@8 z_tkEV`QXH8Y&f@(tTc84%q<=-rOLw}|1gL;ZyX!pdpM(W{4=sGbu}YZJcZ_P-rF*H zAo)I6e5rkRGUKvY4wKCoQZKYxigCyoQ&yvMbBJ7uQNfd6eN^OHobJ?z!G-5mv-?0B zHK)kXF?B|7`N;2h;0y@N^`( zU#fmO7biixQdVOOTv>l1e#P-k3hioEPX+>mZ8XZXw>;HHVB}o9cwso1ZFjSgzvL)* z(JFnAjO?-}k=veVeH$ z3`E&e)*7Axpy4~ybw(5i17RdEzui#4fTpw@$n#6T^h*Vo2PShV!_`B-$86y87Femu z^Xz25J%>M2jbj!3rlUo=j-4sbBWySOisv$td&f8a)8Ub?{0Ft(w!Zdal*oEI+3`{^ zvk@)}Q8YSp%3H61Hz)}BT=s_9pW{R-rq65ccdSU5I%E}tw%#mUKsBKO`%Q8ghJGXQqzll#d zM#0#kg=RaU5yeALUcZ*Q1wYr$wmK2EafpjjVYrxen9Hb`SHIbaQV_xO$oz7IDCK)N ziVVFNQHPGqM%f+9_9>(2oH-sm)T2glX%}hH;`(+B z%aqd`?+BHQN*Cg3pS-qWY}lb-mxXi!V@Q1%WfUw=@uE36SY|tF1Q#bgbUzY0;|cX) zl+{j(7!wQ%w5YQe5-$+~PhOcl*otw;pg0nGNFyzUN|rpC3c*?T%l5&zSgNf2$ zsCZVtJ)DoGjo^H-$|-noW~A92zzC9W@ke$}7`ZCfY?Jd87>j#26VPyuzf54*y5Y1C zBW|VAX(RP!Y%p%FhaR;HAx@bMXQTg>lp80^&=I|hH{g`^n~CC8e?|(N=HL|kH7>XcfLKUP`^qD!{4JS^J{9 zclb^pRW73f46PV5?$rwp@Xd<`4_@<`z0q~>TNyUNr-5RX5}2#QUxl)Ps$waa61y(16!T#?Pc z_=~?dJpJ_3CCkCP@)xIvE?>Kh?|Jm{yKFb0gIAmuk3aUFfeDz}b1%!ijwHQ&-MhS3mOK~}6_N*7Dn)!w*@0ZOdlJKY~!zuFTaqEVQS9wS)6n>H?p-T`?C*3NnE{{d@h6@b}hu3j=*YLp(0?T zlsB%lJPsbPmLH`WrMR)4va0iEJuZ9hIhlbOnQW|ORG#0NY(bN+se6i1{?{VhH>2E* z{ok0RA$>$e+1WNyzw`4PzSLaTUmWcy)8aiOI{bD9rAzKNdtY;W1x z7{!-gv_1siw2`S@a7Idb&6^D=yaG>qJ3xssL)qoDn8eMV_c&Uim%N-uFmou1GSk`{ zanib8%PoX?W<)aWYc^r#aOxC+ZVR9^ggvDvZ5>3D!-BSAL~f>j+FIUVmRn4DqyI*= zQ9RJ`P2lRth=KD?%BlLRQ_?fA>dXV%_43cG1EWH@+6Eq$hGw!Q4b8Xn@hWFfq&L*F zwmF=%TiK51(469p#L%C_$J-PeoL$;p-gw+>5(Qj170!VrZ(I9pku*YwlY98%H^vD# zx*rZ51$`k6T(F`Q2RQ8&9^JT-(Qs&^FX0XRD?KCPTI#BO59GaITP!$y3Z8s6N1Pk2 zt`sh2deB_^>O=6dEVGe5X2HkomhHA^1P^69Xlf%{A;}0v&$Yn&PK?%uF9)wIzl68f zBLh<5#MHM_-zaU{4jE!srX3VT*TcH^TTL{s<(+b^Q%vlDc(<5*Bf#Hq^ zV+5ox?53WaO$X15x}wKjw~+&Y$i#a%SR1Kzgcm&?xT~S_~r?LL(*CRCb%n8(|s6P-3Rt zjr1}m4=TuM1Zre;Afw&Y5*D>JDkByFZgMd4A$;0?`J}6=q#VK~^)oG9ikHBQP^t(K zQXCJ#4o9J{N7%xG^cg%}!@gJHmYAe=9-uzWI# z^=jZTOq3h?61M8Tm?aB&ZA3U4l@?suw51XCLf}S_4bDKIOwH)T2Ou*n1iAg`)@vD4 zXe93%`DFxZ+Swj*MpO?q;?Bs=2+%Y$C zzVOiwoEgE5{MN%C1&3Fj1#8cRvl*j|ewzX@17sG!3{Y?mJ`^U!QEil36+CUvK%me~ zmp7anpW#P&qXWeyT}|UBU-4>W8>G={4=0q@_9v>&mQhS=cUsiwH8D(gQ>Gh*b8G*+ z4o(cemEhf$QTptKve61HEZ;C}YAK}nF?~wfw5hrq?J{&30NTFw(>7yQvjTYsFL>%_ zLX{h%gWZ~2`Xl+eRpDP1mk~Xp;b?!@O>e@rmI%T81`pILGHU;1< z?a6`GY|4wz|NG%{pZfJ-hXER+FcFd!{N=mu$(<35AN zuS=BwJ96HEE;3?8xKu_ZTcvU{-nYAb_II!4_Zi|Nx*dPNu4(13mtM}XynpLAe&aWO zO=DBKrjOiX4$Q=nPorBC>I?#gS#4dx927ar6;qlja`hAcZ2M!qb_SLfBZ(^=1rOG( zPw$imj`<#c{PA|YuTH45RZT`CAo;Xvsace7(nTW=r|x{`aBsZ)tw9sg)gcLK9V{8h zV>hG5nqHLyi@aWjZ{;r(8#jgBlzZM4EPwJ}=O>5=f;|Dy;t&$1%bTF=3QdNL8?feS zODOfUJ8(+?FQ-Hhc~^xS>OEg^rEP*%Itqe9ZEZmzb>+}1l5!IZPU;Lsz!gTSlQJr8 z(!-f?(~2!%vWSCbMyPp8xt4uG%LrJ{A`*Iaen8$(CS@D|fd^NDv>A1liWox-1Te;x za|aj{?IgNNHMSE3TiOwxY5JBc%$uTj^sx4!@b>~bo0iT1B~c5fGWMivp>PHd9<9FG z34E`O;9PVrocGcePGx+-dAi(|_kS2p;iiqyIXnmF;=M_^jgIj6a-2iQC}=!DNj5sR z^7e4%h`x&bHokF+$h56zB+sePutcfJ^4x&i|@TaR(mF=DS9)& zf|*`&+5tvB67=&w|MUM-UjLVwxnF z_MW(whWuZD^hba6Kj%4$88ARs@ZIyiA0^2^pz!@t*aAipI)nHi1*WqNMSh-pTukP| zumXmam#Z5P;24mx;X_2M*y^D6*|J}hS7rM33`|&r=VE1_x%=J2Jr91%Wc00^ij+7l zSrmVJ**c#m`3RHSRwn{T+OE)=(yIbf55_^1Afp5la1cAUeoLu!0a685R;|nu5J_b% zP|3H#m7Nfe9v23uX_hKKYfF60f+y%|G?o zj!-ns3Eohynj{}-qdfAjgl$!FD)Ycgsii1e4@Znz!Ek3RB@RJMpjNq($A}<^i&kC8 z=RNqCxL}2M;FER$tauazLp6%2l#8@u(#Rk)3_^`6%l7R+jTCtB(g1t#ik?3WFL4?z zD7C#%vpk_!wf$J`9#qy0-8{&Gg#v61$30}YvTmx25;>@FH4;ErALRG>(lBB z7OpHhP18{s=+WW5{j`7emZGCrH>Mrop+{2R1QUBNeKM%BTYg|;@V-YIU(Lt=;c}J} z9{mYN;N;|^k3L%R)1a&?cruu5?W1_|Q!tnk`e4g5 z-zhS>e=NwS-35J&fk44`*(*=)rISX!^6E05T&5@ZcV(BsvsnswQ?ha@l^p>(n@YK+ z4FJ>-`fq#MCx1KV>=SfvK(qG+l^0&RucE$+QDAOi1g9D{k88R5+)D?Jud6$tMAyV0O zTqwM}(U)WcM~>GBeqiY}px_L@9~SJKYL@vg%UX^%=v zsc`6u^Izgos+8iMaLj>Fnb!6ZoVFdS(Gt9wJ(e{Bk3&}5ei+(-rOwLo;hmXGf0h?_ zWP`E-OgRj|Y^O|G!g|LEZ0b~PgdYe&&VO-e3{DJ*Mq}-#{yEM!BP{JA@7{)GK!qNh z22JDFHn7yI^I202!8ud3XogqRyWyKw3(w5Vw5jVhnr|a6XfZ0}$-%AoD{IhgS*jsj za9c#d!_RFdNVjYCQ9m%VH;&4s^st7!v>`tXZH&$xr%Ic0wO<`cYt$Ti^!iNT;S1C4 zZKhxf=W5U9WLW1{pmW+sC|(}R#V^g%Uc0u?;8`CoC&YFFWv_3NRXbP;D?0PBNoCY0 zH&u5=AAYyIkjPUwgSR&1a96W6H?&bx!j9<0L#~Fi_Q{2J!f&md)<4lpXn2K(%~n+0 z4hO||Xs7=8v)?zEeA5Gp56kJW>Z3wE?>*xXZ5l1A0h3+w&Mu1L)q*u%<{<055xYxX z^c{`(MI1<98nc8(y9$LOp1b0IGS-qRSs+l#)z|Z@{rh_`_lyE@N_M1gd*(cCF!$c~ zzPIG6ci=sad|c9z=YBnt>0S0qV-{H1;$&uGIa>ign%RJV|J-xWaRNi2enF=ZY_DeC z?Yls7?#HmlMSJXplMNPL%dd=1-`JI0{YDgUn6y~B*2#WjuOm%_&+ zei;tdneq+knm)SamRpJe#p_qkhcV!uwduDrAm(#%gn>hP*j^{oX~UT9Y8^P5DmA$> zoH+Nk;l78za~%0o{%wuecCgue&CZ(XP8((y%v9$}K9FOJ5@)hfZ0RrpAgk7Sz1_Mt=RWnI@aIzA>KWVD zP9@Kcatte_7JuT5)|1P+Hpo)#X~83^gg=f!#Ret-yEnTogsN z0bY$0SvqRWkI*DaDr=s{&e(!>dv+ki$t+G++7s>bzqX+H(9lejF+YH{c&r42%>?2I@vo1F%6=we`mo1*;NHZdP|v6fHCTMNcVc+D2S zqpSDTnmYRO&}JwE=zq2dwlm(FH+kx$4XaM6Z^~<1+v4qwRvhEfJ`56kaXj1YoNchT zrOr0b2;Hv-w5dgzczijWo8epE zzVHSILm%{5$XN}HC9*;LReeLxMvuFLfn#>nRcLr6Qk`3Y=kY^3Q$Y;MKf5SGUpO=H z<=Ya+88P?ALSr8hd;a`K;}{rxv(u+S6+pIy-pRingNOUIwYDA4bUpmKtdtI~_daak zL^gLN-sP)!22*^pzV~~-w+2@Rc`h=$U-BV~UCN>41^EeNyn8dV%C$6+U1Qg>#QSeP z{NWFq0f2V1QY64Qe+5G0sJ{Xg8LOa?T&8J;cfRwT-)IU*!(t!}i_uK^Q~uWSF$n7q zb72CWrI^I~ZVdFL0_pAfcUX^gB23ux?PYl99wTEq`SfS$yT!`dEL2M=2j##fS5?7t zI&D0(kDYt#@RjfRZzEgMA*;itqeLkZ()I%{9lJY%c{Sx_R2Al~twr-E>p&I6=?tUd8ZGJ3UlU)hATJZvkPKYD9yk0aTSd{>RgDftq58SN}(kFxm6Cy=dk z%hS33zB@qJ9n5HsvNq~(qcWq3nPD+I7u3sVWhq`Z3p&}+H=9FZ4&=T2`HUufm8{Lc z#4CLvTbE`d?BdNnGk;4Ic^vw(ZeQusnUCb%!I>!0f}adLTl;cvZU0b|>)|NTYiZX* z8TrmRY$ge9AGGE_yA(mmN=QI2^=^iPQCPN3#b{A?r~A2A&-R?rZUi-t@VI-&_=rKc zU?w26O1bmd)_7z-AM@FXlT+HK4ul!oh;X%+o}-`9q0zk2KKdJ(HHXGHdF9#2l@Wj~ z7+G+3&O%zN@BlN?ul4ufY4=0l8m1h|%WRGr2<=hl8AMsg+i2Z3I3syiIbo)aIq^|o zwaqbgBm3kJM>90wM&q_?%17QD-fX$^oB~IjDJ9Nt4!yB`G&pAz$uKFLQznCFjw5C0 zdOfoS3=163#z}C`c zw1h9qa6LHO`-Tq;kAC%!R(`hghKRW*%kpbBFu0Q){-q*;4Yd@CPsvADGt5M5qxLRi z$q9od@ESZNEqQB4!1?p%hxmHcl)rdQZfsRNYyAuY@|<6n^y2igycfI^aKR2Ce+=C0sao-IK&;7l!+PZ(rfTb@S8N_2}+5yJp2wGW&b2M2?*?S|JQz_(MD`cho**tLuioNIbD@B=e#R)_Jin|uz& zz#I-|)Df5!s;Y9bS109AgcJ-~CL^sI`bT)83gHB2ZE19wcBhD|eS%Nn6opdj{l!Nk zJaO7l$!Q0Qg#t7Z4=t`I?^-?y-rE3;Kytr%)@DWA`~|}+MN`iy7u_3Q!FdmEwxq%F zRQORjF-lsw;iDKnrNC213P}AKf%3lIafXvrDQCBMjDqE)m2#>+*fiy!#|Ym}Ug9g0 zLE~OK;Ri=s*V4n7mT`(!=)^FUPth@TQ!$FVK8_Qd(7E84HtEYC4j%Yko#d;%(Ze4f zJA!+CpsH|cIO7X(u5YJrf; zGG+zkUvw_KteeYS?bm*-el67++>yH!zc_+fU3pr9r4Ptx z@|~RS^4(c6WV(16{h!GRvhT7TCYAxzg5 zeafrgnbFV<3(v}QDPOtI#qrM!M4?NdL0iWtrq6vTXo5N&FT(4dulT^Qlqu7fzx1i} zA&QCfl=b;``JFex^EYd$M)SXr`^_5fzlJLt?U3E7QMgm!3(g zysyqjF-HJwT@K#s`2^}0b04K$Yvu%IrbzQCUrN=dQ|*l|C7iSjg^g^{Q@73RYrgdA z(9XDXyl4&te`?Ci)`kCRk= z;x_53&C>?k!HWVR&(`xfSo^b$?(hN{7%6JY%}jS+(MF*;TFa9WMv3o4k@&=I;i!%B zPdhYUg($Spt+k=A35GwyL(=jmus(b>`PLrvq*XSakUxH1znahTUV1KZ8;|1FiPFpc zdiII?oN)PS6fGOh@UrdEr=)%Bpm2^sri~hJj(io|$`>OXQ^!K*7k<)R%V~>+Z^{mJ zgI5${ei<Z|;QL-VofvXzYPF!EJ8j)3of|NCo8AbC!< zd#~S{i51^{&tG2NX-h_cG=jJc2R>d|T6ihjy#LS0e#-zt)ui3l{dl`Sf2s}k8S2wG zcg61=PVCpEANi3V`5!;{!4LjW95~7vWEEl*N?*gX05OM|0Ph5f-qHXVCc$KwLA;YE zPYyrxGe0x@?9cw}aPPhMmNEyICq{KIo~tvJd(7qP;nSb~RPr_*sj~-dFu!aUzjbAl z7)5&Gj<*l@J@~D|x}#^)U7B!lOC+T;`==8oZ7JxHADhUGYKia*f7i&UI@2^fovw}i z(gAEgi(%o5e=sp>A+#tsBQ`>-2l*K#l*3v&ze9(N)F`stl#;JepKcO(Uwf2J-bNfH zG;>c;G|zceG78Dax<=orK{~3nU3izUPJGJ{?$zJHEd9IWRo@6p%OXlKYJszMFcNYo zQJb12+mnZX6jsuRQ?m;xz4dKqx3x?7DjzL+8+vD?DHKhO2$NP_lzS+6sc6CEAB6>$ zOzM}wMBh9hWYSRT4pC}TzeO*ZCogSVZ5}>~gbhuae@cM^lLvf~Nx=&LWL-5G;lT1@ z3{|N5j5wnKWgi%tKpZ~xPJIgJ)`l(D4u|uYHu1Eb(D;T@K#SBj{|f(tHaaG9iyNF< zxgG-x9u!_)R=ImP0ZZFxRrJ%ZMq{Vptlu?d1m~tmiGreZ(Xq7$W9!Ckb7)n4C}`mY z^e=wTeJj_LbJFFX|M*V6t=vW{FeTxeR=a?`Lrd*YkD2M|ZP4CSU(hznxuL#Eiyjob zP_W?D%Jl}^OjR2p<3}=J4==pa*1Fqv%jvYe54Lv4dwcoHyY-QxBfhw)+*T+3aCF?Q z6zGv$EUUpehWPyaiQ#ID!$1G{FIPS4+X48vDP0I$)gFC zw)XF|zf%4LcjDzwN*%Asa};4lhDWk4dG5}4M@N{hO$QDfmsOJ7)qS2P%BsJ}Z%r3Q z8JmhX-P{FKD+^pk5lEThciZ0Q&M~|?X5QAQF1KCDRy45#KTJXDyh0RHkzctH0Ebg% z?fI{4DD~Wsarr0jLo@Qoi_oq{??sEWMP4^Wl9++j=squv7~#Um*a_m+?$KTL{#0G+ zA+zk>r7-!R7R>w-;4aG-`CIqf+ur9n!UsBSTDS?AmZoJY9e;+ZW^y}Nh$i1g*u04# zA($qx;4i8A3^AT6o6w4o)_8e_m)E;7yqqG4J_ippfmBH=TIzi`^-SK{ztX1eV-|Tg z3U2uoaz*Ln+5&^HwPoP(QIKziv_UskG<8z|+6J^Tt9PaJ7%nNW@`3aO-riN(4hJq8 zC@XD5aikp@Rw|Tor*JAdwjAqk@px!@15UCO&>;C~*UB4SDQklBbh+pPr~LCDvEj); zEu5q)fQ%Cohrv+!BCfQda|`IrzyWpN>myy_Zpe#!7*yQbFz>@pv7*oB<37$uU(0D~l$1_a!Y1IBnze0Y+x!=N zF|Hsb2qLKRTkFCUW;%NbYf6hoO8I4}Cw;9^rygwv0agT6(i)LQz!65ZrjPF{@1)J> z;=sXp?GluwpfmfCTY>Xi#A4;4oTjKKMP(=N(B09$`BOrZ6B0TW%@U`CPw)+DSzFKa zZt~sAHFqQ)=F2&eZ^62sa~k3xmF0lLnSLiKt_SDqNwb|l8`rWFv5{j?*K^oMuFb8` zFSs8{oS6umBnyT{jn>1hC%3JhMqH|lz%>F(xwRCNEx@(YA)wk?n0gV7P460Q8Rf;O zBs5DXkHknEv>JBQs~Iwh*ytuoa56Kob0GMo7A5pWNIEQ{{fxL$Qpy^QM#*xSz33xX zZ5z=mVdBa**rjgGxr>sDKp){1NBf$&$S-;`uzJX=q%}*!@JN}JHYJW#@?*LkUIi=o zm^$^@8@Z<38bKDeK?+}?m41e&I?lv_6oKWe(Yl(8$SN=kJl-!6gU}fmY}CI6YQBh zHqvJ(cy`edW(XJpW`f1Zw*d~k^{sDxXR`l)^VxTuY+Csvjtdov5>wB)ef@|1ZUFQK znEu^;)0^J(RS!JyzyZ@Z8dc+Co<9BK8Dn%y56m+~-;`?3v=4Jg%Mbu(00^7|O&?)G z>E-33=*9C+9)3IH%EO^QHTn;~=vevFxPwqArIE+H+fAog%2&R8f^$9VaEIc>ybv#E zTk)*15pe06r2vfnSK{$&mSAJ!6*(sp%GZeLKza8YtzXGHZmsnNKY=o{KYi)=?OC5Y zJY3EvKCL;MqJ%SEUXHguZ|tj=zLfR8tjDH)Se#%f@Bd@BX1)7T*2I(6l0bwB<Ywt!uL5=d~Wqs_Hb5-T5ujDw`z&W~I+l+!_m=r#^_a8d4-Sh9v!(ovywn=j+tnud>e%It;mXy`{B8~} z=em&lXP>(?ym)bQcih`3IE!wpV=DQ+L}SvM1eZ;{+LZWDiE)A|9?bR1oHAM(7cq-R2 zRVn&_wI9R#P`vH=uh{+3Xce5(K8!498>kb19DPR{34J-Mb}z)gz|vS7JtJgzCvmj{ zL(aMVWx!X;(2@=c&1{F&UgbV0q)nzA{>Yh9^Q0Vu4c9qNq6DW61e82m9hClB*K#z+L+$^q#$M5FQal{F@s9Csv5}=9@J< zW}(DQ^9Yo@_Zk@!u=-31fm;Kj^f3mQhQ}Z*MB$?!{b>F6Kb@gEvnWg6CCHMme3T=e z-+n?>dR{OO>czA{*|RBioi82IT0E;+f z?A%@NzP=1v@ufc=7S%NN}VRMVKz0xIKo(oyD$Eft5G4WJK!w z^eZRttJ#4=+19nS_3_bR398wa6xiVih?%()8C`G22>4<;4I!VcfyeI2@>=gfx{~iiW%?vD@$cJ5AuMw_g>i;vJe`)x_b61B?fA*!}@z3Xc_xbo5EavpG ztt<(he{OjB{L|Hr*AH64$){IOW)Jx?2c_NNN}K?zzM&N*HJ`1FM^E1$Wu1?|!~yE! z3!ka>knV8KXIRZAeJKHscdtGd|BomU!kI^S+xz~8@JgH}D z#t3U)#k=^@=Z34Cy+(n%>1V}Fx<%Z2`;_-Br1lk_O+j?vl{TW4wx}oo#k#bNSV$${7=`rI3QRJ~kV} zgaLE;)hElbj>0tyRxT^F<>U9oNN4=LnsPtODhOHAKf@c~E1?HN z-M0WPz4Ez~N$Itb`HD|!JGUT4)}@y}S3Ce`anNb;=$(m~HVB=Xqb8Zwl)o){3~{u% zoV4{(rqs#vkr-&pC+`g!@o7qZ*Ta`)DCCRR@P_T0oKmmE;j#p2`c9wKu`QT^$RTnq z4t=fvGQzTDap9IKmlNiC(!+<0W6;=gxp4fpy7!?WMl2(7H8fg2{y_T86Pe08mg&08 zim6BOvigK1g+)`+wqhG-_33>woILKoVw1OIEP1PZaF<{fK;XDdzLV!&`FrnKx-PrP zc+ccFLx7&JV}RWD?xBYsdUKMcGYzqJBP`2eAxs-0OrjFs#FcoXL7jvf@dM%UmPn#Bj!8{IF4!a(l3p@1=@F?z>TM)Hh?KIMd2#P?jC zAbEH;b=03RDJGO>g)nPp_C(4(OPKAF%NPD~Ak9jYx&t~G$r*YVtQ^2n^@z*-&A+gi z5uNq+9r2O}1+E^|DJz}Xf`Bs01vduLgx`}{WpmZ`i zv=ys9yPUi?;?P;M03jNsBBi%JF?SW? zZN%@Cu*08h^`j8&Z!bEg&#I4e4T@G#N^o{&07KeVL&|bCbVn;Q7+`Dhey^Ppd4}`h zY&-QuKy-1MBs#|Dyycx)Bc}i|?$G>j=;+IR+RP`ZrDq5_OTY}%W)yjK`6%-FoCBbr z9?bUC`J6Rjw~o5P*{q6Cb7A%_r2OD>hslKRwvS26A! znpIx}ty!KJ4-DF*U0A-Y(k`yt5qQ$Z(9<>yfyEfS&S1bdW<=VDiekVTIAqYlFkuYX zNp$t{(-|?~$lc-0xwj9Ouf|}IPwF>hb^smH_=Hf&G;$|}P1fVdRkD;^rii=zRu`cU z*1Ye}WHwptNMDEf^gtey!F`Kh*9r83GRStnbOSlp2Y=w%1@KS|lDo5{@QLKtMr$o& z63bOJX|L+?E*T_NQ*)(P*V zqncWc1R74|l(iPedn3*#hwBTz%I4%dGX(NTNc!4F7lB~Z?rU;JX<$5+*D`f)6n8k^ zv%iw$8(#VKLLTv-87R7Vvg#%@NQ_J!x*s3@&kzfao{!a4gi&A1gon05^OU<4TfrY#O; z8DKZcOMGooBhv%%;!c}8Oy$6?^wu&n17*54m2!v*(P?x^5tXk;%F^!TyqN8EhYz+{ zj-4zmD7yzA5Hc<9uov;`guy)H^<`4PZ<_YiSHSf@X!5j6q^H`D6oP>LDf`z4B58bQaf&WvSl~8X%DkU zjHEKMVwjp$s5U4n8%Z~~dKt}|`BAT;W&WZEUUI-tEotC|s*i<)F)dz9k+4ZG?txZvc&;4leiWS^s~}_k7Ry{B71A zB}^e>4EJ48CtfiY1`v8YjDcA&0><;6Lx{tFtSgyPVi|S=0CTtmznHDR>&)tq8CwzM z8w48T>d19X@lHCO>Ezqa{q^J%Co5KQ;@B&01XcWt!COApx}K3v-mPs$EXDKxoo~H;_@Te^=Hc(Z|Gwd&+m8+_ z3lzwIIH0PLbq46eMy~ks4eKG{)m&Fn)aB?YzggZNuH@dYxYr^l*Ai#VbM7~D#RqV& zr-n%A^xEOTa6FENU-cEIhi`bt?ZZ8H9E~5r)#1sfGI~z?9n9GXmtJ_X*6W@8N0@G9 z#7>ZJ=GfxPFU8p@v@z16C@kAt&#VrCeKku5mJf`|jF7~s<6i^gD{%GIXF~61gI2Ih zgi?T$LWPnrg%td(n;zxMi9 zyoU1xC;67b(2tx=@NA7t)u*^R^bi+e9K_Sk0ccbF<%^LzGBD5z&J8Cx2Pd>b$JBw} z!4-SogG=FDw8Ym20?q-*IRS+;!>!GDP^P++IPDyO7*Fs@{5o(a{Y=?t%s)h3Dqc0anM4Y;CA)W(6Rogq*LK(#~DcQxwIvJu%q zCUxgUZ6)72KOl0)ebFL_2lXr&S~A+mGRbFBkuC?dSb_*uzx*kEzgtSUZ`~$~Df&Lh zLNhX$yj3U9e!I+OK={(&V~;&naSYPPat`4P0qNvLN6-moa=Ve>S$uH%LAueo@bftk z=tH0U z%CmnScvCh9GmFsRX}3`Nat@DK%WO+2Tmn42pd4u(z~p-et%AJJO{-STlgHsYJHo6` zqd`V!J#AoHQDzrjd?NK$uBq-eqs4GE%5$(#856nh%DwRkUbjyEg}~u5D$-IQ=yvDc+8Z0HBay`{d_S~;0-4N8cyhte3E}t9-qy<5g>&y z;ylK2sLfg_?yXAhpbr3`s6pf1H9p@k?RbPO!O z`ZZHl6-@*(ywHE6P8{McvDYV99&NME!aPo_`TcoWX33JCdpDBT@eASzb6WcVu|~Th9&O^$qt9 zU-`&s30^bUwr5mtbWicuHa@a7g;Ugi;ZgVbt@88ho%`wFols2RW=z}Z;k_9J!Hk0R zi~_z241wtMAv+A~xgt&e92&mi-EXMt-+k*}^d}Bd6{5&4GiNs&6CGhPS_*4vqAy zo>^wNfgs7BfUdk@l{V^SDw-0+b35@7m?+Z1X@uq8$hDMZDU^n*LMm;h!_8Wh0b1~p zutBDki}zVpA?lcK9`Y^NQDKdTnFP(orqo*k9PD}BjGLdu5 zVY`pS$x;_3P2S=Y7bPx`#bi9$+vTp01KCkP-V4qckcLv1jxk_KmmVZw-Fld(LY}KLR*%5AdJ^<=fBi~*u!l#m zwNP(+-UOnNgicw)dQ2j%EoV*9kTY3Zrp>~asZHcc6j8jOYX5!EJea-nrAcFD6COEm zv-|=Ihs4_(jV0d_culBPhe+Pc7YFfF2>hUR@4Q9Zg}HneAaT~B7~c5kso{IR`GMhU z-h69|d(&T8o33|J#P<2qiO3^lhhLGVNSpUlMHZYfAP=F)*KQ~8UJE`pQ>(tT$wNHv z%^EO5kWSgNAyXzUhQ)C}HfCQxUz=qN*Z=+pUmX6`?>sSl_Q{u1_sn|O#+NDojWyG@ znHNaLXm44Bk!0&ytwqNWDB&6&aJWouo3zG1mu-((JGCuJJHe}zcaZe4CQCD>j7zx% z`Et%oUe;oTa!S)eMGypHgxDrF!mWcxL6y=-*_I%jPj8CW2)EX}N5NgbD2dC#Pnk8f zo;rkDxs)BgNxH*1M9PuL)9|)5!1*&Dy@|lL43Y{}x)hqY!8vR3@@dBrhuC8y_N9UY z`J!T@75*Cyh|r;Mjv<4drsGqKz$u#slMi~pxeV$mR~u8Pp=;`^ZR#5mBP@yc;Ax{h zxcUkyCH=43EPX~hv}x_o7_NW2eSGAN zysW(I9F8bjZH>mwP-`#|ited@xF|^)Uro|#qtK)JxwI5^B@L|-x9XJo=;xCq3-F|Y z6I#Q+aG#=;H^rA|TJ=i4+OMY#eXGs$u4cO!K)tgjl4YEQIAQXU(MKdDLmF<$Bz=M` z$lsFRM&INvSw^{&sp>_^yYI@HEbcPjJ4*klr=F@UftGDwc_p(fN!Rs&w9+sTO!9MHED zVlweCvC)2K7Wume_q!E?7h;a9J{O@|^( z7vd4@C81dYB=-aWk7u9k7022Bwt1EEC-CA-wS3~P+D^2+-98p%B#C0>j1~+0=q>lx zRY6 z!|;>e_om^V+u~q$Q!u6fN_?U&Wog<-zw#Qp3gzqBv^>`UO4xHY8Wg_nDeU>k<+;F& z+`+tuV22yQ8_iF{!BBWk+Fa})GXXB|!R5P@a>4iyWK%%-5RhHjAW>x}>LfgvvkAWb z?Y9lra&Ex0>pMBJ`Htb_iCfb|Gg*W7Ed(RgWR#KlO1AR(LZaOPwg6h2Cz!8iDPblG zYxVS31kSTM`|9H~X}!2A6?!k{)44v&${DQIZk;2LwkO2rGo89}BJCINas0w#eyov3 zDksh5eEyi{x=PxoUTFj4eZH)H^GR8|H25Nv;7`6B8f^hx%%@~+6>I0&!`TSiC~UFd zz9@(9to7DR1nLA4+fo*y<@^@a8l2MaGvj58;X=M*Svw=NLGmm*gU8shby5FiM6`Z{P|TOz z!q;})!}&sGt@$TSt8aE3#9M#aHbGzc49|4Fk=D|k-3!b4{H`{#o?pgh_zGSOAuyi| z*4L}Pj0N>gdfNw=R?f+(wp^A>Nu8$QXr}(1R_a9_X$PMEj8Scm=Nez7t@6$%h-cyy zTn>u! zxWw1+6uZmRknrS_Pu4H15`$nI@#Lu-znH}P&WP^C-OPJTBuG=3)^8_!@`+|Ulr2H0 z&wW+m;Cl)?!oBLkA@}y%}R9Q*N za9{{Ht=O`}^TGR>=yMK-@R$yK1pd+Ad)x3!|M+W$x4k7ZH%AW+r|-OTSUqt%ct_YI zGGREIebYv9wv)~Jbh0(fSQgrFHt@qfdm9Bew{p6a-%jyTmXorjY(AeC-Zd)_f$np% z^)Z*k#Rm)dL~Ic#Wz9#R^E5YVlovmec1RE`@(JU>jmX;QO#Cx>whfjd$)}SenDI{G z5rd*W=^H+y;NeZ-;OA02dA7xjbDb@N_JzxrVzoW2_R}X{GfF;}8>ADrEj84qbv0^2 z;Q;5rH2z$a)uHj=o1#?|8z-~c+LrjXu2HCHITv21=#?pNTkvYTUdk<;V)W<(@;)48 zRLVPaVB9DdPL!Lp4mH|?ht8pupr0{%8tv>L$QMMT$Q__#7D4`SI+D+B%WpoPn0BZS zoZx8Zf;M14w0xSuRJ2OHW@lGZ7Q_B<)d$@;+SbxbXt$8F8XVT8E!>kc+N;5RE;xom z&g8It(3U{&)rss7pMij$WCY`*cq4t=XTxpRvyGDRVM}2-9jEVC8-mAJvctgVg0*Ai zO&(xIxF;VQYK2$M^=GU^M}7imj6QjMecs$CtzVxw-i%czY$tq&Z)f}8 zy&4K5Xfz{#Or$X}59ZLol(NRA)a@7T_u{b}d*jR4`TYW;KzcCoUEayBGh~0SeC6>U zs1N}$-sC4}C!far`H6Gh;_}@kcsTv&!1X`*7fYD~r+f&l4r{T-d=g!DiJTOZ`+AdN zP20CUyvOKWzl;*YyRxyQ0Gp12z6sIN=S9VvSitnv!n@`i7vZ+UZ4t-jXttY76t zN#&A9r-^h84|VUjwHhaqlzwu>Xes{pJigB}G#foc>NvGq?NH}%n0ZS(Rz3|=8CE{Q zr0^j-WY+Q0C##f6UF6-;hzVY_s5I&$c|)MuaBK&rrX550UZ~bdWO!A3j676jiKo1Z zmA?(8%3IEr4``Gp7(T7{+B5fp_tpOH>ylf$tNP`g*g}KkZ^{&uYzwV}#wx$66i70a zy=>~&pUlE#R8CeK$Wg@AE@K+^lzf-HU9NW-Eqylt4DhDqw>W)}Mn{m<Svlk_MPTtn$UDz zeRw3DYG+&$Z~~nJO28_;6tS?~v&^r)`cxD}rg5XB%OH?8Q~rDgjIu7j{Dn-(Wq2N? z18#awXOw;|+s}Mj*Hp1O&7_RWnSX!7!>hxOy#La_$-(v zZ#cCj0PoFs$)`rbnQFJiP`|P^UbAt^EnkWp51#FMwi0$<41KDcV1u(yZadwu`gt*J z`e5=yCrfL#&DoaQWRfMI^v{qK&ULC@w)$y%xbPjQqoB=@WV`P4XM5$}wvjqwJN32I zFCPEex!NeS?7SnM&lKBA+-TMKiku2*lkSdV$eEE>rN982p+ImUoBI3FN=L z!QDUc#1k*%NZ{W}u{whQiJPwi?3X|LaR#8%77x27A&q&P4u%;tDCS|^QSPisjhHVx zRU=c*8W}^d5T()3()V9+c#k$Fjj{>@f_H0E!O}4tFqgn6P$ov2H~<0^bMB$s9(AS6 zDkP81zCB8mJhzUMJ*heNbYsKma1J%fHlt`t|D?=OTHZIC|g1C=|huHiaqj074@76Jn?D^U|{vGk)R9%&lGo# z_%9`2qvffz1y7lmaxns?;R;s1vjPsa+2%4dq>0R|P$PUYFQFR?JrD27VUhkyp!_Wf z@MSm^U6x}5CgB|qo*w@BKYZ8lGynYehfjU_#bIS;V|ew8&xCKX{WOA_gQqFqO!TIX zS&zK@Lg@T-DL&^i5aP{wD!8Q$Ub-5g6a#@WAXuvnlNZDpZS9!W_=ePUYK*yHQX4%& zyDJf}6cR%7?R|XyeFY2lCW1n9+RkyGXlbJZ;q0#3+?0*M?KeAq1+e zdh0pQfWl{(P0~gl*z(3V15+}7O3BJLasb`!Yj@aFozsyxtshaw*+Lljr5FFA=vGEs z-j(hMIkcfRT8rYZoe{A%+b#o9Z1c?d9;q|=QnM54Qw*EL$%nz$zVXnQxSRwNx0ieI z#m^MZ_^9o;NWP)F83IPZ+NH?J)OT+kej5Hv7(CDNi_EE@Kc-w~Mo{j;9t@BHxS2YA z0VF8$uZj>DaZZe!S@1#`eZFx~CpVVN)5f59M0|H8;nEh_a+n!hGP=(MbY+h&WGuOB zzy|KwdvaQE{JI%k^0=p?3n+Sl+$Q_w(YJidLwxU*OJ|q`AlFZyK5gn^HCGli$B&N| z;(2PnT2>e(OM7@d|810bJ!80s+sGw*FLH>WEsoty-HFeQ^9naK2uj^Trd5}yDV8$$I4^ysxT(hy=F2p1*Ygs zeY$5{_@K_A!`9Za3nCr+Z^ zM)B&FDz-Yd(kFlWdio9U#1~5O_O$KQBoDBzpr_N0O1{o#{23t=;cU`|gP zj>ciqh$18K@Ce0JBjqS7$Ef;V1A4=+LKGnZeLaSO26hr-eU`S63j#Y7OjCpuS}DR* zvcRdJf90f=7lg5zkI>=`O4bM;%&5BYUQ-~}nzy5T2z-3h)1i!a*1)$nC_`||MMQ;YFkGh%N4UJfF?-&D z^icT)1}|X`>RsAA@~i_VF!2+L*CNdhX0QJ&$K@EsHI@eMC{#?5BS`RnpJJMA6Z%+GF}{hvp-w5nf}%5TY^F{w1tg1IleN0^@pJb<1@yaV#6(yeF;Zb7KUH?$!{9|yMOWV;a~sTCx)YOj=FXwhu~yH96#eW znonUAi|KfWD47D+Zukxr8423&KxSQPJ6Q^=ZE;D5Z`w#Uju;8`6}lkkV@PlUryTGL z9<5P2BOovV&)@|kSG?7Pa0q}t_$}${YjNV`xfGv#3$KhQONlldn^KgqvI%K$`S#Ja zavQvOm7*MRC?mi_a4BV{j`A+W7d}J_X{X@~gTk4C8~6lgihz(0BZiS0&P@fit&L6T zp=B9Fg_AnvQqPXR8I364Nx6CM!Dza{L{ELuDp%c`HV^KFlUyh8yoW!Ura$#i<&OO` zEvS*OH3wOcZZrumNYI8Z(!Z zB;$=i)U>>%_+4ZuxvRgBwSGPKxD+Cc`$yPBDTGScy+8t272UB<{x9>{GpnO`LdpX(eQ(!< z-#Shm#8V&6_J1){)DtjnL~zc2GDR$IM05CvDl%+R2e~>$Bs6(P1g4EkBHD^X^da;&tyV z5XS-c`Z7ouA+{!J%Z;_9t>vSnO?{PXX9^GgO*mx~UP`_=C-9`VlY*~?Wrp%6h(VO3 zML&k&Z0Nz)!c~Sz!O|9KtHLRYzK$mk&lpY!=*%Am-DBp4Cf3eKiPs8JMNS1oh8lQv z*-hShF1`qVOvB0G4r2^Z+7A4gmeFKC#Sc!l3kHB@hsk~eL$X_W()krv-Z2~wM#r3q z0nh|{YFruY{qgLAx-fm;-n`EK?k5AF6SV(!;un#lq>n~vpVUwqnBr#zYS8oN&ljVx z>@;$>`pgc9gHb4M4Nmd1{Jeki$$T0#YfyXz1aZ2RiFuUOnai(daa`c6ew|{%C%MJA z)yeTjI>k)BHGb^m{o$DSExhv?$GnNKx%8#1 z8NxpuZgKVWaQi(E=QkfoI=nXgS8qN(eCK=aFBy5c_7%X_=EJcA*sCo}W!VGuq_s_HU4(JJKBb$tvyFV9HBY)m#@+pPI!;9^OlP0~}uJn*{K(JHWHL z@HIFac43GJ-}AovhcmaX4FBrGFGdhwAD;ihXDjcmAi8iYUtY_0uAS|xr3fe7$gfv_-39x2I{G*U`4bQS|z)e(ZD2 zj45>GuxT$pN6u>BY#Fr8E|IhCHpWSCW_aHGT1g?8(mng0X=1_`+wzDS8g7 zmm)W6b|$&QZ6$oiKq&u)(9v(vH8ju$Ro~oSsn06sLt)`j>1V=|%GLf`;k7m^5n_j~ z6@pLutf@-o4dN$|rIfsSciHLJJ2JQEGbMX_Jca<-{ag-mb59>g)0H{-Ob^fx;?V*0 z1KmMKh{q6+e>W7AmpG?`RwM*YDGR0{nunW$_q}#EfnGn4D)D*`HxqdJx!-Tcin}F^ zc|=2MG|F8A8^v1=(6}1X$X}xim`j6G`u!+K>3hR-BoxFEI^(&oj!1hXU<^zqKaA7w zTl0%Eq8YsMze4+saF3wWNp!Yy^3%%`pF!X~@8l97>B!cJjp$sy^mRCjp`C0t)09Ly z37%7g&h4p2ixJ#4MVL3zLgG-?;3%Y>oJUWP@HH@lpkp3gJ)Zr(>8La7!w>z9yKhkb zlfwElo*w@8yG~_p(QHmWp&La)nasqu0!G>a?nawh2yYox!j5pJOdO8W)^jPX z_^O1@C`n64z9{Ib?OP#qjkMB^<$0Yr+FpF{wv-fMA7!+Y&k3swq0AUfZ6*TS+O%?O zO&0+IXIx64TuQK%DgunuC*GuE$upxr1&2PFSqPt{@cP^}*#i%QkqKVOoAJd!FbiRJh%p2+4y*11EEqn{ zi!_m?llZtKKZaK2n=-_cuJuAcW9P$^t^_ii;wFR1RWew(IUZD>~sh3OQ=?d5*?J5v00 zkM770H{dx<^zA6{6B-LsU=EF|;kxDLS@6sl@XR`7?RAF2BpO~EOw=tu@5IMse#Hl$ zR`wXR7(Qi)13n3bsjfL4@{~9PsT0ELi*2TOH zGu5eMUe5_+*WxwY1r#B*mTgJ45W>UP)d&XysR_qyOUkEwYsn!FhPEh09M`CAe#yu% zhh}VF8NTo9?-<_wP!!h~UdgEc&!gOotgZK(YWH=%-W!a9*SRvZeqY=CyeoLBYkM6y zI(TOrAh=Lz$Go(ZGUQ(&392rx|K0d5Mv!xcmsOVgbb#g#@7 zSKi8G7=W4LAHkK*Ob1xu6`VN}3d)0LKn<^yquJ%b2(Wvghi}Xg$zT7b6T{^LIXZdy zScFWx?49fvA$+(F;@Ph6wp%~1QPR54xMun>hMG9-)2$R%^ODCihjIjQEgvMVsdnv8 zY4Pm$bwEyrl~<;DjkFmMJo8OOQ{I#VMPT~6jD*zMmQMm-TFO=2yePP7T|6lr5B;sc z%v!Ksi~?Gu!4f_-?C&QhL6x(z&L7p?)gFig+vvp(T3h?!LV>1$rQM5HO zEj;pM>R1^*HC-dmq!-sz^^CMpi0Y#S8!b##XBs$V>I-HK%x-94>93p04ld{+RQ*$) zvh{+W$nS)vJnP|8TN6Vo z+X|bk$u>?q7}DR-0=J=?T>|2o^{@@Nlt1Q6o9WM%n8>5H91_P$|3a(vES;c%``T#` z97^USZq+e(s8@XV`O1U*C5z=XEo0G#yr;NbJ$P>bC>X@agFlzFW_HD; z(8cp?i?=xRg(?4Ooj|S&;ut8#$gm4Q3q!Ia+JEzE5=JR8d465q#0=Y)VVdCXcVfYv z(4YclF>SArHL6Bt6j1D*t@~pT7M-|YtVfN_GQ@BK?@+-rrs?@(7MIZ9`|UFTejB5T z)8bY1x*gxu55ah?rb&~aoe3j;b%d0WcULbwlMa(l`bGex&=Rc8;x_Goc%ku#N-KQF~K;`7=4LlOE6FQsUDo)Yvfs8-&l!MpOMbOo^b%^ynw;NDHc zk%PjdkmX1DQ_|kMq%nhS#(^QBzoTi7L+Ki&cR1X}CaOH`-#23cU**cPa84N=Cod`V zLbv|3ICeK|G?r+%Cv6YvD?d0hG~}-w_%i|?$aoWm+qe4W_qS)UnGr?5E23* zAtH7p4psn3LF5FCSWXOziNWUtV?e=JIRc+RFp2Rwfy99XI2d9B!i?D=IM|58CJPM` zVkGrQ(>*ilneOT7^?l!7^8MU;>V1FRS|ISsx=AB z?BYt76~NZCrJPdeo#Ipit#D>x$)4~NAE=Y@DAkmOF4WSXsVi6Y*7+L|R)ko0Njd$- zx|_?F{vsn<$0)r@r3H zGo>56+4!6dK&gPU{yh{J<+i2r;&GOrD151pA!sQzwsvYG7Nx#Rq$^6w)s-ISf;>{` zm2#K13IsSV1BaYBK;fX24aE>dUbR&-bzl4`cvJ3_ReMt^-HfPBC~+(^i6m;AXF5^h zR9>=U5{tu2@o2nvC;)@c`qozl@Afn(8|wwcH=^g5`SEBl1Hd8V#lhbx2;kzA5uSdw zfs-G?kqs6CCb`~-y<$e?c#fYeCk|46|ogFyLtAO6A@;yZtM zO)lLbBdMZ}QeJ4dI)Nv{U5GyaE=Ea6!2FM?G99VAdiNVwZqAq69p6OKbZwpk9dQTi^VO z_Vte*YwvsHR81M2&Rq4z1$*(~ozXiyDxI`X{Lh^DaM2SpaE+RhA=ptfU^;X9p2699d4x0l9hbpI!;*vpzEr?wL}k*Yq`Yq^3=0X&KhKqkNPNUDF7KQbvBx3 zVV>u#Q!V^Gx2tG2!1eNey(<7al(19L!|$q!k9KyGhSN}pL8F=y(C`}EDo<@U8XvKY zc_4~`1{W4VNP`7|g1`~zV2I97Tz-g27(aRXA<6`q+=Obv&l0tfh0ZW&qy%?5PbZm# z4fCp-{Y0xFZqLtXUZ5-KKt^%}&VFzs7Nh^(vEp0#1y^%-a*FAHC>kXocqWh9nv^@} zm)CaZB*G{?ZKXZ``3Ktf{e#!UwA|;=o+SLkqX;yDldx32LQ6W3n4E0+`*Dd)^n8|}k(>$h%$vf(n05Cli z%z`iBqs`GERlz)atT~jyLKHI|0uznK8y$uouVPb54knE})r9x@p75^71?Yt0 z1e`n-PCD{0P`<@a##VdRN8TwK1aJjTgs!0GlaIJ12nwN!t8WS0amst8DYX11JcXz_ zkTD0=y|tX$`oy`1ky#e3hLmTqQ|J!lk#J zs6FBS0Pp2YeO9^x4CJ(%`k9TJPvH`z!(>&70>tILz7tp4e0+~2%O`)7weXsWFN~y$ ze+1`BipS(e8scgj@Zwbyd<4}o$AEC+ z`&oHe3IJ1U&qRVZsJq@3fKjc3Og`>+=I?JJ&@K8P_%$TW&yS4BSr|%lj z>BEKs4{?VmG5y7uq#WIg5!DDr?Bo@XTrji0Ou`m*8C3;PX-B;0qM00XnUSNBgia?d zFQq!o>nD`_}vXnbYo={Uu5G4_`Ud zl&G5$_TFq0_>OOQdHb#({tww9aBHn?ICb)PM%G7DPD&?%wbfU?XE%V=`;L1h^cT{G zc6qFxWa%eg3?g zy(i@&jCrjt-q}^7>OLRbEnU`(SnX~VxOBQHcsijl4Mf1Z5N9bX@y*58^i)QhHBwA? zbZ#X-$HHLVzAG-$cS%ujiZ#QCnMr+HfF<7!zr7Zv)wBipq+C!Yto~oh6o7Rv;9b5% z=vKZi0h(|&Zy&!Bp6aULq5VCXY6-69#|OOkzlH3E2+qL|%({TeH*G54>XQ+~HAi2g ze0>{nMJOe`f`_2hO*e@rVzr9?4Uev9l_F6BUEENBdaFFrTNA(X45)yK-}l@5mKDAv z-|plEcVY1fbsPlhTi)G#-*GHcd_|k!;V~>V6+USePf;F7#lczLcu60S@GMZGq)es; z;yN!1PL*#0fR%+R&nyVM+V!+Y9!Wgmr~E2Dp3nze_^W&fZi6yT8NKrZ$DfNo1~!B~ z{w@t+Ec_$f33>4h_N0lY6aM4_|IW+1l3?H{ezpPHlA{0=0B#of+4reddZ6p|Z?D1Y z6}wJaqf&RMu;a_$kN;}4w40b}SOJE%I2v5zYH*E+0K8KO2z=&$b3TZ|_pk~u9a$?d z9A#h-#UQ?s4}V1G=Usl@%gtiH(?>fjoy}@|w`W;wV~(tth7Oxz8LjWi7O&M^xowU) zICI9Bj?NAT*YfT@a8GsEvzeRS$hEFIwE4xg?DM|q&~wremoxWzH1mEREX6`)ZEbEP z-hJ)hoiAu>>&YwgzDFK^s{Oop=5IdE}TyK$k?6-Iw2FbT^sUv811MTcWlPchh^5wx@jU@$nA zRU+TJB3PZuC$05-*EYqe2?&2M%0aSebD7h3oUgF?U-??W?_HP^DHHaoJo1CH8wLmb z>A)+YJaR8m<(=0u>4Q-M#HASQ3(n%f^@CBSo_9-Eo<9F&ceZc(nwPX+dv};nEb6xX zVa(4y{h=gH(C%rwZh0_DL#G7{_f(FR1#_IR8`~%Wms1(@QQoWxaFwtTu$9}poG*|? zarVkvb$#kd+t)DX9CnqhZFPHIgp6y7&4Jf^bD*{Wu4h|Z^_kEeus(D0NMaEQehx8%5yS-dlGTq}>az z_}MkIoNbf%#redgaG{Z|Xk;Ec{h!hxU32+e;px^4+cg(bA6r?YQHs`NNk}49FK!rA zR?43R#?~|Re6?|urM1I-Y6EPF+ZCZKzT1y<{R-}LBJ z*S*B!oyS6$j->EgLU{;d-*`NSUJ3o-hd*-W{>MPh;Es@&hOkEV_&)wGJmF6nkfwA- zKGFvFjH3XABh+btzPXO<&ig3IfX#mQP}j-dYemv^g4V}GV^p%|coz__UP;64Cj2#~ zM%LIGQNt1H8qd$@-fDl1YmQ&oSu21r!y14f5DJ2!GUqz0ps<~cs&eTCCY27Y$I!xcLZi5R)YBE7G;pkmhP{@~rsFM#nYvE4wEleS zH7gM)7Ik5;tJ!0{m;;CE6t5^1;_lviTgsF@;j5XtxOsnj^=IGTzVg)%ChzL6?O248 ziY0gnMMBq)F!gOkzS7tOPk4h7#uNiq0sW6q6(;C+cs`b9;KFj^sue=t=v#bwur$o( zD~!>-eBc2lZ@tU6Cpe+)TUx?+r??Qp<6B@j%EM2d1h+K~!dAWs0}tQII}0CH0*ZmA zW|c^=3J=D~7k={fu8^h!_;GLgg6FkQzBiVqxeIMQ=8N^cHy48pSC3%Me)cOdK}N{c zR?TeXWX&-$w3X1&zyycOVivQ2)0R-}ABvAvXLs5=BbO`=v%t@m!llqijZ!0&>>eN# zYL`f8!A=A8hNdxTQ$x-aD4`yKO=y8T90miIrueR-wY{tIorD&FEnRRzjF1%9>V7}z z`i*U2m2U*hQqtPSDS7A%HIhvqqe#H9!~5~Yg|m@vaIKvZseKCogG~Pp&iaad{_|Pz zHgKkZz)3vib10H6c^1-H5U5N99&3lPDuab{7V7DbwM!vZ8hzb?I?gYs!-AqHjI#ie zc%|*S;JT_gX;5yeZZitjCxuQ3M?Z=)^Ji@%91_#E4g}C8tApxhb?tEp)*Pi zL0*cH1A#(R%9NKVEK!!6n-D?nDsk;6Zsi;0iNdp%IIi}s@}!<*K#5@80jKnc>&%Jb zIqD;ATi1w35i@{LAKens^HmqlC)gDj+zOVu@I-^+xYm3vicg;^O13(+!m;LrHm`NI zfCA&w=u^Fq=itTo^5E~DoG{#21AtHC^9E+Nf#cD_k_Dayf+G*`VbwJ#l#iddkumGZ z57U;BOnOFnxe*@l?-IZ};@D2&Dt0%gFDIf!|OqQIX}Xa3i)G)4ZV z4>USBg7HKkV`Ptz{1D3!`o4ujG@jfdd++pKG!pMloP%ca^qS5QK$%-F+NzbbjDi3$ z$}-QU!#jb@_Mc&Xbok0fOr=&u>)d7bOlJWX-?x#P(O+$o${e#1Lf6=(eJ+YoR=4iW z0WGVS+PA#%#n3L{WZ@cK!lX_x5~{;_C-4+6XqRy7T`pl0haet7%`z! zM?*7@CpZ9|Y>V6pNy* zZhG&y2QGXB96W`Q9%rw9eOI}Yj8aeiR2>c6(-;L4zqd{D&SE_I*D>J1w-khgTgd$# z%E%H}`J_EYzGwn5_vx3=OX{WK1(!-2UP)`G+@TSQR_e3v9-+jg%_({goTB^%rC6FW zPztZ9!_Sgd!T3uT%_N?)1GIPDYcZMl)n#|-K!NRici&6W&ny0mr)%@^<2QIPKkv$b zpL^FA@NmK&+~5$u2a^_|4#o-~t(f&~C>^jDJMthDC?N{`sv&tgjXx>b-E`%vl9>!ganMR*EE8B#^Kx~oP$Vz3fWRQdd zi?VPj%ij4rB@EM4Wz_*Ogmhw~+vBHBw>N#^z3nqT`F6!>f1aI>k7aQ&p+-0|;S-># zj>5SFWc&#@W_0HOOjRP=65<4=d3JE&s_2PM*b|DvnKrP64%~=6kAe-sIlH}1br8z( z9{HM!ucCIeDz1F5g$py{%0#~Kl3z_Hm1*VKS;0XsVpTaq?p=c%`L4ch-@u8xHnkx?R5cWpP<90tLZTqv0Y%%kGRdfVKXxRFJ&GRu$2ZoMo zg3zzg_PNu?f}=G6A&wC@f(MOlCO^mS5=7%VU^pw!-*eQ)tZT=^TmN&FSj5@XJ%&u{xd~S7z6{a>3Z3%ue{b+MT>K%({c=5oM&A_DAhGa{tZJ%d@H(0f?`b2kCZ=U%jy_Myab|8zl z)hmHL96mc7{*HfhmDj|Zjp{A@e#0ByP=h-%Ksf2(`*=M+W`Bdfp)~NP7#Iv1)R7^= zkqM7K{`mYu4?XlRlTK`TC4*FWuk@W~kiRipdfyH0CRUp%)C^}eB0|xSo`^&PYB+oT zSpYPwDFGJ+Ar1uNBq*ApIN*m49V)F50fCD@2o3>xM|2|}1VicIq=C4^yV_Mxnepz6a*C3w~;v^>s?$waXEg>;o#gX9E`v;ch9N5*?d#2C44K9ykDCy!B4P?C+vVr zE1$LA;PeE$HecoO8*bz~z9~6=!-30>W3@OQoa0sb;?eTwC@jh|{DhIW>45h|Mp+PO zeZgyTQsDpjfBZ%}dh*F=wC8g+0CQv)?4>M*zu5KBcXMdv)Z>{GInwq>-U-EwcG9j~ zXQtWm`pn}Iz=T=v4@RG8Ez}$aeL6c3`l#RNtORLA?xucw%B9tfhewzto^?A5FC- zENS)i0ZBP^VdU@FaF)eVezYM)OXk7FVpLlf3HuROU8-+~Gd;_4gNG$-l_$?2lCozD zsI?byixWRmmhPr!Er9ht{5!OGZg}b#vE#pkFXPSluWx*J@MkfFGmUFRKZH69F#hjb zSTbXzYtSYQ13vErzu#CC$Py4avXuDifoqMc5&h`zUV!WP?~Seis9FuN6e3)qr6B~3 zM<9Dz>8Y_b^f3QW3j7cN0-@<4lA$OdXlaQry}>Lxq3_H?$(*1a%D@QgS*{pkf9-!~ z=tY=dj%n6PT=|qDN%$x9lm^C~$%XAhf-qG}oW&Dnem)YU+!Rkg4b%c0^Ov0S{&hl1 zg!AJm0LxiG*7mHoZ~2B-1r)}f{`_ZA=#5Z0e1Eth>{K)dLj!xc^PrWbHM941DDT$jl2h5;=*~P;eEjJTJ96U2Mj*ap2bUKej$<3 zoRxN}JDyn&kox}2yKN0zYv1%$pVhwehkmQAXRSuYC#hg_=1jcZ96hf9<-%C=I-iVc zzBqo1(RK=FnJY>DGt(E7PT+1M}QNS`KD-saV0zp zCY^*Gc^0(8jpD?+7S1Bk(_&#u8H3LBr-!XHLcJwKfhs`xmJllZhhX8|;jkv`y3mPm z@Lf1p)XJ;+aJ;J&+v!g6Q&*K&>bS=p`4Vh_Rita<<~uOL*=d66g%I4ySKLf7M3IX` zp5XFPmp!f#@+Hbt2%?m*!V3ne^DN$E1(ItQq+;!qS9u)L)Zr8U1y@K@8ZKwX*BA#zY@3vb_79JFr&bRJ~{N` zE(wAw$(J*F8w=5_Gl}{T_>^{1sD*@;S5gbS1bL4MIs;Fh!DCyP%N?Ch1mS%rZt5i8 z;-h(6$xJzf$|tNS;b@ui;~nGg7J{BN)3On%@JSG+@KS4GKBorDG~UT6TZ&8&(2O%7D0B29jgcRp0reuznxUeRO4fypaEi{ci*X z;MywrsESTwEu~RbnDifg^wDa(K?De62z~Ekfrl-F6ooMzfFLw5!9NJgbEGqnKs+3x zklxTZ2XTNcMab47z^myWsJl^ubcRYJt7&cFBCs6*q|cA+ zYac9p%=ugOZ-0IX`M|CIx5B;5{h1En_@#f8V5S(D=V!L}o~j5={e4fmhdzBa@k;Pb zyi3|F47!i7vvA*nnHQHHle;T1_oRZ{J@R`%8mJb zbM-?Ydn%{6(gLe|6EUBKrzw$fc7dspDszw(S9x-2VhMKh{OXH>q5OosZGv!SVX@^= z9h5?lCw$;4j=Fu*mprfi(Yuefg{{y)+HgHv-<;)OA?VqYM`~_$-Uuh=;(i@)-}!Ow znH>=KHi#@>>-c3TV8jkEuiw<|qSQqreZc11%A&bInl2hm{>bSa1{ zeJ#Q>q8>*E3*74x{9w`m&sv_G#ZXoPq!wJ@Ww!%UeAPwjzQ?5;rQh$)c_ax}>p`aS zBtZNEk7ZC@*BS?FflzDWZ|9pUj@2J4!6;9UE8py9$UJ}D8BtRY>M`-Bx?afj#b`u% zu8K>zM**^R5zgpvN5SjupiFQE@34_>Z)5za)+6a4e+5^4JmK(gLV7rYnje15-#dqA zgYnZoo<{sbxPwy)IB(~a-a_>pV#%Y?GV*Lci61iaC`IsO3~^E(>U58(*w0HHx78v59=W7|Zeh7g0a zF}^{FLunXVrf|}9ZvSNxt+ZUe-IZpHPLV}Ogf?ya)}Dj+Ce2J&oO~<-Cxmwe!!*iq z?dQE=K>KSB@$}P=)(ERCX-Q=FEq7;I&YhL`v&VBCa9s%GvY3r9@!Q+pTc4j!Xy0?@ zgEPOn5XrNgDS&4q1;6@>pWp7j)w+k)K9cD|f-_w>xJTGUpxv@7C;(Wg_Us8*oZMNTTqi9B5KX#>M12);LJlIRF%pwJD4`gNO1e55Z6QdQSND z%W_=cXT9W(_S^sNy=~utTiZ&uf^EetLpY&@Q%}CTR(@mN>p2HtF$YeW>amdQ(lOim ztY8mK1@4>xv~3l2zd-1HNh>S-la6x$mLiNpOl|(AY~_l=uoZ!90JfI+?Q9gZ8qU4 z9~qZdUD(UtSIUP*Bhb$|Zv)|nFsm-JMXy`enBsGGLDoQw6Y$ourEbYq+=RE?k0M4< zP#-H%qSlf&cR34r&jmKt>#&sA6YuN-lyfO3ln zY6tDkT?o$Sb0_Ymm|E_r+g`X){4}^%eKeWT!E}^&WC0w zF6a%+cFbM-?yNz|#rU5NT%A@YN|^%aov}=hm0RTrz8oRHISJ$;*wI$ecNi8wioh70 zY1;wUAB^aq^PJ}t|7Haq^ZxiYxxmEFdOX&Fc{eRgR&eA2^FM#-C4EH9VF|PD+V5G| zb@?9lcHO&B$H#Rl{7M>rF+zMrqvu-SYCJJCu7;!K4YNG~jZif1FagmJ5tGKH?P+{U z0Y!qpbp52mZ=~U!8{g8E27gSlBxr@0=z;_+nwg$aDCRK2bO56!cZTbv3T%XL1@U5y zT=Jd^Sj^j(DKs%`?^($R!J;0cB9?&Cu9GjE!LC%t%!zV)Gm^|m!)}BtVJ3$T?QO67 zyax(1f|QUmN;RS-m~8)p>gfo7LiIE5iUJT`WTZ@BrYcG)xGnwTC5Kx(6j@^AOev6# zJ@W))9j=qG()1&&DH9e77JSNwuno#3gvA9H7G7||CkSXyCj_d!?ehoX$E`$=8eM}Y zTHzs2evy;qSEmamZ8$2QdSj=bS@7)Uh!g(qWfo*zZ7A{?Np*;NIEF8S>FzMI1 z22;8eEBVH|TLGrH8v9J@j$*)l#TPy|BiYdBfrB~UfjQiY{(dW9jmpyAi#hSmNSUH% zuGhO!*)S2&QE7yYz5V)LSq_3bNiFvmMaXVDe1^!;x?-B_?^)cM00m0(dDh5l|79 z1g`qfuf>65Su@9#qO%+89n2I9B@xZ*2|ES}C2%r^-v=%T#DA zL!9)NSc%eMd%969LbK|FV~wG#q(|4c=@Z||SceCd@AM}@wx%g7ymj#7Nf1|{VYMB8 z6ac@$)A4!29{An<$P$c)2>4;PGF05f$Uj<|Sz29^{6UHKEaUbs&b z;yQqZ4c(A#w(_r}p_ihaEsjRkkOchD@DPH=XAvNrH7Y-FBmW`vhmaRmLu+)-lb<+# zgBZXDQI4<_4ROl?KnXx6*UW9n$4>`vooGIyZRgOItQ0nn54I2!AjVUFV5 z-TfYBl87||atM&lGfwofdY2+#O2Fbm8h@SUmAux%=+9>h>t}xIo$XMDrb<_*{N;rJ z9L@-q$(mXG&fcd7=%b!a?t8`Et-bV)F0`MDH9^q`))Kfg=@OKF1S2@1IkwnQ9^}cN zP$fhOUDZbzUr0RZQbOR(#6LAp2~=1562Jp4Z*XD3w1m++;VvKPbES;ro#2-@#RQJS zNk{%*g>zuyaKgfSz=UJYho|(_DJ5b2;6ZVKlX5E`d?*ITQ*YeMa|7e2y(lA+3l^?A zIyWc6g_#-|W5h=H1Te=;??;Fmk-1vd6ahge7ecl6eG`rZGQk#s(x;L_C(}H-xb|@q zY_UOS{UZ@5b^_ z%1CfD;w=ZS#1$5-O!eTD>cFb53a`G0T|9WG8>8HQZbt-v+Qi)pwer4H&D28Rw!;x> z3)uzG&jT<85Q2bLVB#>hD?^>dfG|>~OIyh&cy*k@2kan-K-UJ!sjigERzA2GsgLq9 zuh;E?lsRVnz%C~}>59wjFRh}Z>`;Jn;e;xamLsJ*t(dlm08IOfSM8K{enl6-?_#!1 z^3R{j-_(s{q+b^^b+SkubR1cr6t=Eh4*x1XnAnP?O%t(yh&RQhL|jV8!e_b8H~SM$ z=J0d;7jGW#*IEO>@q7GVJi>hp04@4+^Q-k=lnMTLIHiC>FxCW682Bgc5OA@S%0GW* zFdkm@oJyfqu1^=%bKSa8d9w)4`i=K1X{hBi+`Nl5%AQp0LQzoFH! z7!1u(M#3@mAeJHU5gnrO914Iq(iw62bG~Dc=!6=g+ji9fef#Ok{-wjE)7TE=#xkQa zBZXQEfB|jh>dqYDx}4D+hBx-`hUAmR<#y`WdveZu-;z^vre@4@&Mn4r;p}^BZa3#v zYuIK2lJhM)jU>dN%3UrpQ4Ht~LEJ!QlY#;LWZ5tykXN ze(wi=tu1Yyih_}&oKNQftEb*ybK8Wx+vzS|I3KIeEr}F!w{sw}H46=5m|GW)7elVo z*ix~khBmSWptknKYH;?%qh-D}tzZoR^FNqT;)NXhtDy4{Ok0U_A^X$wS%TR%uXA%p zGlI*$>jNSbjb!x=jGaKRM!-VY3upWK0YbgZ%`q7>jOfsF>%-4 z_{?ozh>(&N;Z~IbufY5M_vx;H;8wdCf*sm7(lkp@e#)1+>hs=FRD#(?>Qx-07ye*D)5@fAW{3#=4)=&GhFu+-Tp#y|!ktz7uOjRsox&yp;QQ)?r7G5#k zvnmunqEx1y#FfAE7bquPL5pG`U6|*oyq8WqlJJzjFc+Of8&!Z*Nb0Gqrro3a`Bt%%Qv|6f{jK2xIx`0$n}oC{^s{FT^e*D3peJNbqH^on+CSvPlG$|(cBM*ko*vm zhIdpXf*4x_5eqoNnRN(An&8~9B1l8nL2O{suJ}5~GnVUFaN6j=D+*n_T&@C zvv6{~efmotY+v`)U))~%nwRxJ`Aayv`qp{))&?Alz;mi!O$7uV^lE;bK<0wl_Ix-P z!An8le47SP+j%YAPRs~U0+$r%`@F3VJ z9K*?5T}gw2@OYGfkzU~?UIMcYP#*YE7K9n$q)WkhLfpW;XN!G%UKD^YdilNWM{ikc zAA0mJ!cfn)^I62nWQ)1ye7B?=A%E@zIUMLnp~P(37l8Kih4>=Wj<)m9pE4Uv0CILw0&v5#GgzrrHWzS+6+!iQ)$5iAuUDK9-&+Bz;k0 zEJ{_+Ax=ysc^HIjoYB#`Lea~kUMU}0Ie#Ivk@vFXKp?*LEiTJN&beTH=&ovRJIv&H z)kAp(Z^c&!|Hgm$6Ug{-(c%=Azd;}vA&&PG=mb7KZp1IVcVUNeV1S6fQwroGT~-0| zL^##~>Bg}Dq}Sf~?nY4nK3+{11*HKO($I55DAVLLAOfHScxq(CK;Ua=I|e8RR(>K3 zf}8?@P*@B!zD7qV8eM$paEJtK5DCBWEqw7lo_W`qb?o}}KNYq#_ApG0q2>oMmZa%l z<}|k7B{P>jM8(t+Mm~L-00Y!H!1xWCv_qhHz;>LKXzaUo=hBy~UHOtPdT}B1r;m3b zM%Z!Ua2`guF3%w-|NZYj+`jZH-qKEd_(+!MA8e}`{hvB>w*A~szPJ6{&;DxrvNyh_ zz4bfZ)IQ|}cZ*)`V5VR{Ge5%3$$}OcGW$~yR6(l6qkgmb@|)18-ZcxWg!6|VyreP0 zjwg>&UQ(u6_=rmgr>ZLBYtshfO89Rl*!}z^%sKF@(oT9~8iSypg~`e~1M3=Ql@95Q zEYx)dKcys?Zg^k#=Yt1V+pAywvi74tb){w5S({J$5tsykdHlpEMr;}gz0D`_V&qk* z2<8x=bpuT6&I`y~K*}A<65*I{MX~*_%*q&fX)PUhw1mE`Jy2P;j>5KPv657vr6k0& z@~lSOE=?B#rWmR}Sm34-z>7u+t}t;lTQ~u#iQu1qmr}-PI=w8S1y<4X#}oy@))fc+ zpu-hUfAD0oFJTv;ee~TW<$PDXJcX@1EB=I@_!JWV_;1IRLJtp1{hb)ysf^SeWj%u4 z;z9Xno4Rtl($AkBJ&`-CzN^duRlf2J;iOJDHR!Ljl-aYA)oP;=dcee&e+ADU@upw- zMTrS+qr8Q;c$_wuWg(-UL=bz#2N4D~{01y9GL&z{8PFcW-%9u@SdZUfJs{u>>J<5!_n=K0lqsgzFczOrwRZ7KmbWZK~#L+JF71q?_FHs$pVYS z@qY)vjr(D4yY04Srx=+boFBO`<%yGRmtf#?%~QetvM|>~`A`3;AUB%(D2fRYED+Fy zy@qGjM>M_>goYoh|CxID8}U;Hd^7V<8Z@?WzQq?;y513uZ|{f>K@5!)QGgF;bUxcP zsz3OXAf*ss20Gx>_i8i~<|YWUrUJ?bGvR6PK2sywH+rd#AAfmR$b&J~e*cUju*~@| z3b({9XMWhqFs+$B*}$(}q%InH&kU+cJ`WEF=FfdBZycIdeeR30@~m-FQpZ@wiX(=+YuKl%3d%fI%H_V>Q&4ec%8_Ep>;Uj<9?#m$eUfi;65 zHKLy6TE*qh%+H^hURnK0VaRjrJ}~t#O#CBXaVbRd7>gaH4JU14mjD4TE{niW5`;H( zpiINcFv?r9IvMOux)u(awovcydy)ds+84j#&i1Q+{CHcvywIL``kD6hM?RPp=Gp3* zd2qsgJ*M=P-3gescjPV;tLXv4hag?aw9!&7m$ZfS~cH^sz}v}${r`Scn!r{Hm`Sn#+*}A&YEHYt*zv+D+XIleFmr$(bKl z-+e^g@iM<}(H=`(FDv1g1VS58!&2rfoT~+!*`X0U%d(N=@eh5uwgFm~Vfv5NBCcCc zLPzR3Wv}%SA)FGrY2SfY-*V?Jg2@ywZpD{xKX)HY-4W=Vg^`p&>j$jM5TWy$0#9ih zlw@&oa8mGISK_8nI853=S z8=0V?RK~Rq@>dt&+7Q>-cK~=mhrjP(*BMg(f6+<9ga(XqcII{v0pUIf0}*IM8lOcS z8kR#yOhgET9|gd>MjuYP(iwz>5QO0n)F8q^a0MWhLJQ(daw^|b2L}O8r@#PQ-D}vlUaB z{mFX|zbH3vMLNaI_>q{kJ~xtOcP;?>)0qAV%e%tYkn71<^!!rH5^{SJ#g@PS{`-Hk zJ^PW%?a=*qRi}kACbjG?`6wQXxkPAfb-kT<`ib@fZ~fu+uYc~h+xNZgzinUnrJs?I zJI)q2y9gXMMEF_*U|!rDxgViOAiD0?t^+-YFg0&qBjms+4U`Fj)@Yn{fg(T<3q#O? zD+A?#S)L-mQ5wKJHH$S0rW54rXBWem?pO=YleRQd&9%Vq*2E>mIl@}nHR?}X_}c5w zDVHsM6sklmrNO!gI8i>#^IHd?49d$=qMkW$xE)RW59jxsdv0!D@OclkKl#%v{9N7_ zrEQ@-{o!}kRDf-NYq?czWmROi->tW29)C}0D5Dh&K0*{t)kQC%6K(bE@!T~KvvNut zA$&)zE3rk;N^WZc2xJ4y)@m!n5B8kg%)SLY5osYBZj79C2G)%tC(@ zf~Dn~vMuhe5(3I>q2Ptw7f^yRLe|z)LX9J=&u6NE0->(lBxhTlIv{Y*o%&FjzzIx> z$=a^mZf9pp;BHDhAG3Tvsy5++=eYh>+SUtL7oh(zkFRE{o^5wB+Q>8kvpgcBKvO8d zyCQA-V5T^-b|ICRl={tj6e4ah+YT?BKAMPD@~7TYAGYh6Ub!4$dOpYGI@h0qKp9#N zo+~LcegRio$mkNX-Z1$a(qC5nMLd=QR&5Xa(h z3IN4`j1b?{0hcxi7bq7hy6QQ7-Z+mP*>rv5TqOAMP)wuFYdj-&^EAVZs{5`Y*G!0ZnkK@OPb_`$;neKCZdgmzHQdzs@Bwj5ZL2-}c! zl9fFUP_cC;3?e}=g~g1d)?D+O&S`(`N*EE-ElpfUUUvpS(lFxM6-5C9AEOX^eO&>& z7-_Tr_FVlN!v3sJ#@Ji?VCesF_%K045iz>88r^8v?{N6t2R^*ne(BfW+4kOhe|Vv} zu`v1k=2#SRaEfn&W^O6x80^{A4&Hxf`{1KT+kg4BKh$3Prhndk|D7MIyv83}3qS3S z{DLyegB9=uG67s8={#?WkXJ2)uLXOn`FZD8){2BNf;XK&V8eBcq`?E;P8VEUKko!L z!7RM6@}(&7w-;Z!e!KDxFF1+IV&R)IA--?QfSU@91EejUkw3hoO+k@9r9?UumGGwR zGDw%=vL|s(4}cq7Imkg!t7Cg($y{I<^NN ztt*?0eN5r7ChrMfz3kG$4rJoIX=lhvd<>)G_5| zJKB1zdl|7ColCp6#RbQjGD%zu7$c>UcD77LnXYS=(>5Ofj za8Smo_Yl&ua|)85w1w;6A;y$)DV8GX_k3e2Pg<-y`meU$-nyu+Q%-&sCZY%DAE-NZ z0Wa;nlxxOqS41<;T)?NQ9a0Yto|;QrstfssO9p0u4*iabwv*H@q@q7I7$9ZiFb@D=b(k35R zb44opH6vrI>;Q9|+#2QP*sECyETPG(bPHY@*E z*Rqc{x!;ScH;*B~U{Z&*mn>^Jg-p63w8@eH9~rl4rM0 zgu%eS6a$PaquER`+;+z;?V*SMsD1t$zQ6t5@BE4O$dO5!P4NlO2M)G&Z+MoicXk5U zE+=0o5R8PU^o+9eC>Z?GPYWg~-{Mp?F~Unl z2Qo&5+FSfCa0}bO6gYkn0O+pzLf)s+**VyRPC=m0|H^J{++QWhzw0a>6!;XES+P`n8ztqI* z*%f(B2#$A^Kl|Itoc{}6AE&{Fsb7O5970?Jo7rW6R@6bWvY@XBNQBfk-bm$XlwWR?rVPM*a?pdCq2tE$rxXxVPYT8(yWWp&@X zKP@H-TxT^Z(lgz5#!PF$pbqD>L07WQ=l#N&lQ~K3XpqBFIuo~Vd; zy?fi2=DhiL9_w4`f-c@tqgPu2jbI5W4&Qm|sSE8Ff9~IA`&dk=mlGgNurs6S$l{dC zT~coc1UnPGGYVKKFcPC|!V$kT4{r-yWgEEg;1mjFpx}&yby7W5wmiz5ZzOLDfCWO@ zo`f}>UY&qB04YgT&o=6pZ^7edr-5yR@?k;1w!lWd#{-uaoCtXq2G$iymMMUd9vIm| zA(B2k>=@u*Wl6ky4lK9-_~BF8db!z79zD`dpJcj@Js_rA!m7@I$O6&x**@UPXOm6J zU>|smUSq9Ea@mgdbi%lLHOx1A!i8I$EKkm#aLOF|^()I$My5=*go>?xR-_X)goAYF zVttU&g_xJo3v6Q!h{Q;+IIM<(^lxIv!RQtzTQEi>POb_(c{`z+QqmRJ5!eIx)Q?(8R4^t+2Dl>;K*j{WW zfyj7SZ2?qI+Q&|jo@h^(#VKh!|G;#{)@HVt+P+x-QeDbh%0?NT1et0~8KWhQR#p^k7jQA-Q(h-K-;JkxV z0^aeCcl^=A4?q0t@ea|Ugz9Dx^7HL?LpZH>!@D%tf|2_m4h0&@fN21ue~#uy3mkJm ztOR2^K;!yxG)4sG$4|Q62XP<}!X9yfd-oiKDO`8yRf851r{4%N<>On2vrjqufkV21 zr$aOQg<}AVdhVHHneTioub7n4o__%)fGc62eewhOk~YGHr(|>1L3^q_apqWic6a8t zHdou<`Op7W!ex&6R2RM$on`&kwj+d;UcMRlx68SIVAope>aip3z@bb-%#ifO&77{d zl?7f#1M&`27F)gWKObw18aR0W{wP6b+CTcXf6{&?I|jbzJHNJl#g~81Re8Sf*4CUM z@Nf(T779{En9&JGLRGe&tOSvTr7*Azz_Z{9;7PE%%9uhyh!VgAw0Dlu;J}^%vprGT zey5Wz;mZ-e(#!w)N$36HWfT^5AfJ$f)~eo~ot7ool7p2s9XkQJ*~jaHfEqEE$Fz0R!7ET(W4ej-559JPw&5T+mkV&K9wAC!I%;MPQi* zVD1-Bg=666<}J7*TpUKzg@34k;L51){HaIF1YDy>iUZ|0wH3-}8(HIG{#RNRSB`m? z27g-~tzo&Gc$ANdo8p){+lsL0civ}YYU(2Yx)4uV`K~_1)E%K)LYvTvV=Xb~@0eX_ z&cdp|NoON-*;}?QhMozc+E$l%(%(vb^hJe~D+>zMMG{U!5v;Zd)@V8kIr0S4(1 zN#T{Pjp9_kVB&I=tE`XMoD`s{3iTX>04J(sqJU=Z0LJj5}S0^#`clc%R|3PAOv zVgf=T=7~-^E%tAI^*@X;@r)ueV;Dc36`(UkX{Wc8f4YEPmH*%vNy0RytuVEs#oz<4 zC=a$I**UP3xkPiR2lno6FMRHyb}IerY=n-L=iD%Z%Q8jScG>0EUi9E%d-FGZS^M^H z{{6Of@Rl+`R|Y~Q|89bXhrTc(!%e+Jl9gMC_MW-QeS6xUz3V;gjj#Lf+84d<^V|1) z$Je%3zU-5xFkRrk;_g<{0`CfMvJkH3-jnpeOD^ywWC_X2bz~cuGBBw}p)bL&nr_dO z_2Epd68s!t9`9-rPtnH{jH~L;bNbwd6X-r_-NXc+jSElw4qn0$=ByNtMY*7KS<^tU zkMam6F9$A}2B8=XxbmGy8>A@h{uJQs*-Pz!75`aOH@A>2u3?}x51*0NrKGW#qkW4R zmr5cJLUOZPZzz*S?ZwEGL^3j>He%IIHKIpj1F^K9^X#u&>Wj+2%LU#Qh#Ua4`H|F5 z=qw}Ss?5+JR|;q;2GQg~7dvrN8EFu-S_(kI*1mT*70xL{;B{(WoralJ>I0|33p|1? z3WvT1RsyeDY2X!W*<`8cqjD{nA3})G5Z60Jr=nT>QZDe|MOY_57yeVabqilwbWExA zI!>^OkjgrdQR}4;U77i-FHD3YwGae_f-+S2!bRGZwRcJtrNZ<>8hsF9Ac;`zQ?F^0 z?!?Wn%F)x7Mi>6cm#M*jeQ+90v*c{&Dc{0TI@(0KGdLAo0u!NLg>Mg9X-_!Br{h!4 zM1ynQr3lA~9CyOtbBSAJooJ>)Ym1S$GR(M|9!ebi6>lf3@#Qf%6BMt)xmWdxA~a^)$ul>gFwcq@O zx3~2>?yq{mSi0iF>M`ab;i-VE8^O023x38z(3#hPJ8!Et`SqXw)%NSZ{fF%vzv0W< zKl=8+-45T9;s4~U)c12h(H|Y{^+G6e1Tb7{0bcrf;XGvvXWz<3Nw6B<{RI{}{&l+N zCUe5w?gu0KVF4Iz4p$2S-D6-OpkFB%DUd0FBN@2A2Px;Ijx8v_W7GM@(t@Z46um=4p2dBC8{56Q&FD zp6^0dkrVFnER%OB2wK<3JwhOOv0AVc$iK(!`BHKgSF@NeE6-UfgoAfiR6~VXQLnC) zwR&U;n#2u_a!$TuMlXSEBwjtCc0}HvL`Hs1HPlIm0Z)KN*dzk)>Qgncm9K>J-*?Kdo%_3b;N(600@r5SbrEpzE8!m;)%%zlsHlls?LY_z z?^@H4p`5niAn|EWBMGmC2C$~!RS%1g!T z(IFyY_ZoktzkRvd`0AbGY!>dQR20zE=`H>4O!-V`$5XcA$fq^1LLYOgl zq%ep#@`_bJrD(t#-p#b`4OBu45rFsv;P4lQAEFfhVsJ1@uQ>W@s&yjsgj2`kD-@ItX5MqxfxBudV8fi4 z!vS<+j5ADNZO_5BmhDfQVWzH7t&`c(|CoYTW2WD8;J#v7r%yf>=0-!#Ho)Mtl0D$J z-uc|Nv~Q)o=z-jdxV+kq#rjG}GL0KyAIi)KoS5C2$c;RWq6yi#e1rX)pZ>n~wQt_j ze)h-T-p(cRzB>;U6Q5tmPKpSft@Am3EsT+HfwQeZi($4p_{Gcc@hkvF0!b88`zT;b7-@fIWUVjzwJ^xS_;=lF&bmriY>aMwT$^lcnt%SDX zStv(fnqN1VgJCoz4Yi>Dhv}%i)GXnCyyq;SqpL%o}0rwT>%h?9TX)|;2{j@r= zAas;1gmx7W$jtH^xoTKj6K+<2ukH!l4wyJ|<{P%u1)kX1>5_b-kRq&wm24xkMX(mb z!Q+;!BELD|`l#4;yE;oh!j;f+27p!O>W1}W91SdO<+R0+#X%W2&OT8JhJK0mRPneb5_(xGzcglM)X8$qLwR+u(c4?W%S0-hFlNItS+4e?hq3mpA zoy8FP>TVkzAxc^5r}Kqaxd^u9+@80T^%gbHpM0;FUr#>xi+mTSHd2Q*{Xy`?!P9E~ zeiU%5IpCA^L!Z69xuWr?_Ri z&iaA7)2VVb<-xnd0CV63gR`<(AD~&B3xLOKKj#Zj5<;5o&RtPrZ_CxPyR(%kO5XB%_EYD+_e;4e z;?l;29O{!38lxmyXlEq47?|@VjNmOcTh4Yg0)>zuljB*QMmWodRlzv{@`aPFi*=iv z(Ry$YmN2=TmE{C^DJZEG`8ZF2zzbG^6L7JF_?||T!qy_bq)iwX-6gIv$iszL`UN`d zVY4$PaixWZ3ACcm2ns@~7C;7O0pAe*=xI6mbfrok4ZQ^i-zAVsFe+afQ==CAV8Q!) z1bXrUmoG(#l1}*A(%8#0twB&9QHIo|gM{4az{#iZ%z{SBP;H+~J;J%*%9wKdc1RE* zzMN~6YawFVmz79a!S%)Eq=8OKP*>e+I4ia*fK$S0brM{#`;pvLat<|R8@{xSQ z8<(SK$=6oOesy!|q4Et)CS7L)XlKevDIKb*6c2Qt&YgBo0rOLu?#hCZGU2ayIi5}^ z6YBUcf4r9e;LYCo4}Oj3gNcXV`zG{RfDH<{BS(&uzjw-n0VIonG*}D7lP*88?Xo`7!J96IOHt|AGcW5Hz_#7#f*IX9XvM8H@WgFapuY!XpHWKQyfG5nh~Y z9U|cGCmn7O-a@_?LyU_VU0h<5F8Y9a((yp-+b$-u3~&7_Mi!;P6hOL~fEB7t|H;S6 zZi_MhTAWm)t^BR?!E;Ms;lmnbu5Zc%!(Iw(E(iM0&0lV}WTXF?^iiWvd(}B3YkbO& z&=FPN^KDe^wmoy$n_SS#!#++DaPjqYd zhwr`bco+1Auatsc{%_--;+2Ct>wuB-aDVcrN7^s{#(!wfo^_B+Ou(tfRATBo3*mBy z0@I?E^s9lDc`^~z-9}bxZ$-GuXC(}BCD$;|!Y`Z!KbKKdri!xvzRDNG2(FEcs?O$u zrrik1w8w45~nmr5_-ste!fKQ-c91Im(efR$61DZ}MFDJpep;eZPwt}-Pq z{v#|WpRy7J8+8#th}42qzzJ@e1RgqmtxL$qw#z&E)$Ud61CYq-CF$eW+!)!T|MBCG z|KrEw>AmnuIHP`i9k0am4GyjO@-4iy@pH1myRhOLP!3tbiae%>69)3v6aW@Cp1V;L zfKODjt^-~`42VMmYGh^`jZ0(Gn4{4Ndm11Zg+Rk<Y#5H>>4{Qrl{DN=cgQH$Q8B*GYi3R9U!1=$IRH zNXxlg_Okz$d(v5RieOA`j#{OqqtEjZLYHp8HKXNNBR1#SlR?D@nWLN7?q-f0_O`Ye zh2nj_ZOb!?&S1aojqI^XeYkJ^J73b?^p&62zW1N~V*A1W^`Um=kthP$uTJ5p>tVAZ z-CS-ep;nZ)S~)G_ls9-@-pVz_i`^W%b>T#qUlzFCe|NRhkN?j<)!zQg?`+@qU0>P0 z@vC1|Qxvw*Stw^)pJ|J_k~iOQgsZwTrJ+1!PLH4OuYdDDX+QZde$Xjoo*r zfJrQPwcM81w)ktGB)WcQ)cy>)r5OC$`N#5}N-B6NVEwMZV|L(7X%yTjFm1kadw$b8 zhKzdK8F7n31zFu zV93`fcW&M_wNYlXO5HX!qfK-E3oEfeh?}}$#_vZEhi+m~xELHAGL!Y)B_!b68F(1E zu*s`NwkTnIi zC!(j#+$1RdnzxSyLB5MQ5J%rozKR$Go9&5}Pv(D;2Stv>#0~(K8cLg~7U}gh59wF2w?p7;%W952lq}ckO_o48DJ4Of$!U00AvS2PhLn*95TY7P};)6Cjf7>59I4f8eGE>`WlwM(Z0nVgg#;zjcSgFAHuLE0AX>S zgZQM)c~S%haSj4B|6in=Cq~}iD@qcg&BqTQj@ImEw$o32Ko5vVH?5~D1&RS*$=vSy zGk^QxnE+&UZv6K(eK_qH>~j|7&nL~vn7o0|(m3&TBq{Qd37)~R;OM{>@=%WrRI zGN^`n`itnb&wkv1M<`)%&=Q9Khq7pmqVQ<=?5pnU!U)dX{%j-o{>2H5)Zo>QK_O|c(y0#kmdoKOnV!986r%(uNVT3b*YUB)O+xT91cW_SIebMW_ zz5UKZ54FWx?y6~$gbE(1zc4+F=JJ+BT?rhl)GI!;Ks!oW;r;PD9K0xW;7riAF8Q{= zPSGZK;tIoZ8ID=^(qBFpbM$AzOrx>92S6^qD!4W{%m{l;fHJAG=X(47KpPs7h;vb%&6bBvxGDHKwp=( zx}Y+3WF&XtwEgRSFTZ`Cv4B>8r#LitPioFH9}091OQXucwJHf(Pr#rnL&GL-bphFHPxE65!?L zJ)QbW>bMHxZ(#QMU#MFIL$40GH(G@p|nsggk%z**E`L ze$CIIZa8o}p1>yuq=o4*q5P)#j5olZlFy@;OlQ7&+2)t7O5En;bDB{bzbTHzYyDCEI z#4<=mj51qx3ilNTKtoR+Om9ZaB?WZMZWOz++5JlS$Z@Y+$iMPDe<>X<0WtH-;r`X|By){OWRP;fm%}tJU&JKf z!DQ-fg5_i1zU6jiepmb6xBS!gl23bayYuBQZ71K~aVGfftA}qXEQuy2^jRq`Mi9UC z2YxET|Lqy@KR;73ok<8$d)mXuz1K);JKwZp828r2r#cKX3{&fED-d}0-d}ujf`{R4 z!_}g#ZP83XF~j^QG~Du1&Og63P%L&PTb@h!CneS#Z?|P*wdalnF|l@M*{LD7=(+!Wk^1{|=K*{Ly5!g#`Ff7}Iv!3C6oz;Ob#YYWQmJ zjVRLF%@qKCi@(nf#)Ka{dGKSrSpDGh_&!HbphS4`2PYTCx&XYN(3ifS0itg*KzZyU zOFpAED$N`DPkPFA>;9^hd?gLFsPSFjr~&V|%njL2+fCfYiV4lJw7`q32 z)AEM)hcJedes#8Zh&wbvM8?rjQR!B+`ITj1r;b-pe=x-97g$dVqqFU=-@C1|?);)i zgyD=hl!_wg>d*;S>B=K-A!42Caz;v4*)C-iwVX5G=N5Oj+aI{A&1X^0vyop8ztO?; zu~}E&ljkfTKlmg6rhWGdUz)O{ehm(;!4ZC($G%uN ze)kW~w;%rBe!k7`Jv0gb0@t5j^j=pxzO!!wu^zHRq&(~IeHNb235T8VvmU08a&gP; zhub@T=MUPC{`5QAtKaa-_S6%JCRl!+st6VFnoSRzIhn!v?YRfwj{EOzTOW#vHRkM< z_3Q{?QqGi$1S~oYSITP|DnCyv%P)nl`;oGtqx{nrm%`ky~WK3|LUTl=P=+?+!7Ey z7m(gEJ&ZJm&v@%0LE@9Zqve!m7IroKn*6J*mBf_B)i{krJ3c$)|@AaGOdt!hNE+v#E`=KPul!AijCd!sOM{?pSN*s`8FRhmHF9sJOG(_4tKL zc~3Bj%TZg04vGg>dIcz0WztEc66t&re@o2bbNWnV^eG4$SQ5F%olC7b{veEa;+M=6Pc z_3l+k)q4#nG6(CzkC1geqGoo3g((3cD5aI1OQ=IAg9ERt~Kh{z__$q3S<3}tfA$~W*@b4JjvWl@)$RbNAI`Re^6|?q&d_Qu zs@flGR+PKdD5ctZZP)I$|JLWU1Gn85W|j+ng78x4(VYQI#1=Q+bn{)=CVE#a5lN)z z2OVMRSrD7KS~t#_pEn{z$0eLoCM&l4itf~7D%W&VFHS~ z=m)P0i;`9?`U<=jQHJ2H&>y=)Ok4H1U1?cN8`$9>5A9d|PTI*I0@fcaS*0J7d*QrY z&F~7%XSICamC&c=DsA|sytb##XFFss%hbM=cHk+8wF~CPnXb3X$g5Xf) z-Og9qQPeYC!fjg!t1i`BhpUrh6*|qg7w=QOm1QR16}BLXs@}v6Q3vv$Ay z;#~z3D1K@0!e^NJ^{?WK0T+t?#BbKcix9>aIlR}%9Pb@|@a=6AoKhy?$2Y-mq>tAN zKdb|$ijD52M<$H6GXNCcw|vL~;k=9MIAL*S+*Kbl{x`(y^=tw7D_39^_AP02S{uPl z;~R7Q8h$MF(}=V>L_sm|?PvOc@W1!od+VEt$d4O@f#Akm(og{8H{3|i8UVPsY84UI zSRILsUq$FNqq8k!mHE0Yd@-vry~>Xn-&1$kv-j3I3&8y2g{)lXkAZJ(Y_{DQ>F&$+ zz>AS4r=R*z%%CCYn4LF+`|{p>?e+)nZ_odv+#(o#HPKqGmamRRaJzoizIvlfW@u;c zGePT{wgBD{p=7?@zVu@mg|Y(Bdn2!E>cE`4YjVfJ!YWq&Jov!v?FYX1@3lXE&(rPr zAN*lk3L`6%du1IVl`U$7EsM#;l=sqR4(G7{Hw=USQUs}TuU^WE`t#Xq%v^VQskSTL z9r+6f^X5+2qu3by5|#&3p1W?1$vs;l=h80omrr!_YtphftPZ}3fKEm+6=z;I`C??u zx=ZV~CQMe`r7kXI-NaUo-KBUXXqZNnt6hO-UYp0|ty~@wc+FWR)Y4kEIPGIgqv?)Axe(~~2X1W- zzx!D5jyZJRb-?%LI^b-pjKSRvZqGdN=T+Wf$|>)zn?uV{1}~+todaN#uDttcK_S%lfwQMmEa7P8cHU<;eMc`ZlMT2am|XWJXvC>$>5zV@VhDGM&OPinm@ z9XWsq9+y`yW;)UL-Y87LpRRx z$liDYG&r;RExR5!iw{jvY>J!b$d@wH^9@c}<6%7kn7H_gx^ml~y4`Z#f1Pxg&X6{B z^I$)4DGM=EUdI_%x`{U*KDK0$XYw_bqYuKV!;P3TaEJnDO37LRcQ#bMQRFM%v;jrT z)J7eztbZ3?%9|~w+A#D0XG&kSU%ow;vsG1l)Y^$!A5zttKUE>AlPs>RH4DSPkH{%1 zgg2fH2cvh-@zcNX=i;4t;_sX|!r;e#1if(hwr_%-pZLO(9R`LYEI;oChZF(%k|jen z3@mTtXIHCkMoLhuV=-k5+rx7DG;5aq%|Yme^w zzMKz`j}L5C1>;@*JUgYIft#mOat^==y4N_&Uby!v_la2wMDv+nGL zOYML7r@z=9_>6CEfAVKX+rGp1C6PV~sjW~Mea}bWP;D@Tg_ST?Qx}9l>cw}Nos;P1 zr5wt1$8+1RSP~pwXFK9311rFR;4uWLsg3=?_rRXLz0H#LT!b;fL9v+6yHR7^Q0Bx% ztM-$h#cq8?^m<^q1SJf3KGP=rYKKPfnp?_uwqROAP>U7=a~Y1sR1^!NzaG~jyUa_* zilBY+F}-Jg*%i0h1NEE-?&&8PraaaxD1$m@S)rh*YXTqX+!B~~%Fc!8q6e}QV0~{6 zjR_M(D}?^VtOdBZk!h@0JXUYYUVfwID1)wDU04Z@nV;Uu{PSW?1+>5WViw2|4z-Fq zjCRYyv@pa)=Sx&WItRd&)Y&GM^7bom_onXp%6zNo9iStfN-KN&r8k85f(3ph46_g~ z>DS495xf?$IfzGH)e*+|CV=Ma+za)X(*uK_?XKWKD&MRvEDTZRLhG(2wpdQR>qo3H zB}|2`T^LNmT|kuJ3?3E$&Ijjeqr}blF#RouC#C(WeY4(X-l>OaV`Y$DEmE|o4=sdV z?PyUS=(kQPWC=*RoU}S!5q_zQ;JAHGM@HlDD4~|oukx`56+C_0d)24@7zIsvZ zRf06_Z)$I$&I>TY2JiJ@X9A~g7Naaw-w%%ZkGOM5Bfx^efwe{6`T|@6j3N*|s60ti z-bU!^vUc$#U+{iHqO%L+I|=wG($0$z&YXX*%jD~PiloPXF>!U!vbZEJr2$^^Dfbcu zlW;DoOCez&t4|_!;#aV8_(akT&-Ns|IsA19d^{O!@MgRlZy!8bcyQl-oONRE0>I;? zW$l-#U}+NY%>D9|4w-TIutmT9^jP7&|4nf>ssf+|W?Nx#XmU3SM{`AZuYru+C#_y`toRst(^F>VA|d&7n2uj7Y_nM!bUsSz@vPq6rLzI6w`^2#3q zwcrzszn|6V&JcK62C-lKV78@27+>pt>?eP@z3Am%)4u!L|3y1-GDj{)Sar8kcI61N z*{gh3)@{3nLF;95j9hSFp!tkp)NL;kqnK~bl zMT)EPOnG*nfWbz3Ghr)VOntx-timRYC`qfYO%P{-C8*bO<=6WR;^^fSF;2y9JAQB; zcy-LTae}+Ls&eG99hD!a)?{26mJfShM=}o`OxmLkq*LD&w8P^!1lO>Vbtv2rQFv9{ z5iZYB$AzO<2~g?4QDAK=-1J$vfz7(W%k?K~DxQjm4;~CW6au*7xA>>Dg`Ew@-vG|& zURZqo$dMyu4K`Rb=pzqI{~piHslu}gOT&7AVKrtUfCIVlH^u#b-2Hp(=UJNA^?mE! z_uF*O^kw=sGrRWg+M7)lBe8N~6B})SwH3gy3CLgvmW$*lID*(<0|_Ps$c6j?LW&eA z7zFtvLMuyHks^qK!I9VAwb$O=>6x8N-@9j~FVkJ!U0qebs>=KIobUN{%{U}NipW-- zs_*an`F_srIp;j*JeTu4=lpQb-;wQVpw2@818g7-pn|RGo3|AHVCl`xbj^EeEHp1i>oc4w1x5RE5nVO zStQvHzV~|NrKhhxk~=B$xNeNp`F2r=IwC`z@8F;DoC@G~OHaKnaJ{2J_(MN=IQ*V3 zEu+8{v;O|4|Jh$V{C9r#j~)I;fB2s{eEX{}9Ugn}fx~0t1&|uBV?^_fn~E*8H*S2A z1RDjkum#r*@p(0jG*BCFT+eShjC|*tuN|KM9nT;B<$wC`t`C+woHp=Ga6W;yfKfME zXC0RF?eDe)kOcj2{ONz7GOy1qh8Un(5K{M#Z+A@5{7xmRj}mXHv;I#KCdt{Wy>Zex z^LZ(3LP>Q?Qy^}ny$tVemB-e=%_Mu8fjN|^c#^*@jVh_#q^6Eq?Kr<{Z+!3Y&;O5q z?(nz&#AAoI>rXK2@9)Rh&;&S*5pDlo$2M#J5et+uEU8=K6PwseXG4a^X>NR%m|f?l{*PAX^!8!wvozL z-dxIRzc$@q{a-rL8p-n}+|4sVdic)ozXa1y>%_pcCVcL*QDMN~@m0Zen#9mbeny!#K1aFG;~$hT!a4bP2K)!YjP#83NTO9mRLXMFivBT76lt}_S3FAd3wvl{9L@SnmJ z{;@3@pZn38G_lOV%GD-$)v;j06ac$-9q)S@pZcF$pK=KmC%O09BEdX>S6?+?#aDLq zU!OA+8rQ~rwg;xnRqsmA_4CScDFeq#hk_*D9yF#?{Ii3WIwexMQ3sarmD*38cZfyJ=5ryd zHTi@^?)`1r3{qMkk1-+e)$WtM{M~OA9l|15CR&qS*}}VTe*JLvJKqkG(?VDPZsX8D z`Tlng@4Wi!O`aCPCeOL!B6l%W>$@$WAHVu~seU#`3gTXQYg76F}m?|bj6 zT|_Bx##4Z+ofG(|{eQeI%)kB11IiEl`Nk`6AO6K$|Ng^&_s>7-uL~7 zcfMWn`s;&;<=2D9VL*K5xiF6FennH2yBpvyztJT?Kl!D@zw>YZDjW z06+jqL_t);2OpN`(bSD+TJW2+RG1c;n=Sa$A?l{C&sgzXYG6>_%!ht0rr@%Wm#^y) zsfl%<#j!+nSU@!I_j|2b8#y6itM|MnVRT6YR) z!w}Q9E^g}QHBpL>iE8hC+8B-_T9bC>!Xk2m|Co}9odb8K6O+hSz5MNsZ<1t$xX7M` z+v1O^@Tqr8^5HAD#dRHU3{VWuj5)ZPMA~4h19LI%ezkr2Sm~u10&83_Ikq<7%fKAr zjzRmhYrZj37)%UHKNeim-tFgao*26&hz!`r{upMZ{vFr5>O<_bO}`JL;vGg8LQULi z?~M=Mn10?{8B_Muoa(&xIG?~eG%(3}T#MlHHTNvI1E4i(oibS+(_a07$-%j*&bY66 zpnl_Wwfi0P`2>9^RQ@bT%8PNI;N65p;BPc(w)F3{=e<7q-k+7H`ISIsZPy>xVexOg z@y4n2PO9G;-%a#sj1hd_+m)QbA3+g4*>pmBOvK$1?xdESqQwt&{;zH-kLv#dW32l+ zcf18YTfr67yH>sVtr`-wS0nlN?RkEe_WjnYXWNGTVdC$6`v2Ac=HEN~>;LATJ$(FD z3;O3f4%i-Ki^D3Pi&>PcFcOKDD|G&t{G~&HwL^O>q)qToUVS@2E*}2AfB5e`{BQr& zKX!QjnQmtczU_qoMhuC&0nj-Hi>ud_wA$dZqr)?Y!$0|t{N3%hKXdpu|M&ml;XnT? ze`CsDv_j_k^j=1LJAjWgQG*L->O1|v;8n6mMsCM8v8X>&njI!@P&ma@S$<} z(ZB7#b@<2s$R9ZTlmFP?Gx4v!vn2d%0S9JV0gM@GVGw>t86RtGtYgw*0^SL%bH%6p z?Bu`uTaZfE)xcLeS&b$@FP!5A(m^*>S^;elG^-ur^GO88m>36=cdY@V!h>YT=wtr5 zj{)vz@3cdFWtVoe7Z{QTd*$uDpqy|BlOwEt@^p+JxMD^f_G65Gpxz@~GzMYKlCoD{ zD4~w4nD)cVJMh%z&qB}Os_r>G5E4$jdRMvC*8EPpGUHwRz_iK$hrF^(*&ALJOuvOE z$MK!=Dr3#!%9qJ`&p$A$y(=m>w&ZV3-$Z?{!G8Pf->Td1cD}v0&qK_!b)7(nZum&Q zwa4KX%v0T2w-(@#G= z(muq&&Dkcv0V4jMsdg|42A8(LdshQ91c4+!Ow2d;=e>COAdKG-W+67;?7DU)&w2xi z!sPkPqi54-aJ=;Ww2(t~((oMaVnQ`p*%^%WZti`U0QHQgKqBID<7om=*=C$$k-Csk z(WQ*6Zl$ielu!Nj)`CF&0W@TVj_?S+Z@1>h7vJPF?S87Jel z05cLK&B2@Hnid{&drK9MNZ4XJC0yl2j2Lp+?m*mvE*R?1{?FoH{1~@IBu28epu=^I zsJ^ooAMQIS-SjXSFiGiXsRnbSv@7bd5|XtA|rkoTCUC-oQvq6P4kAy(2kXN zfSP*80I$AU2jCcgp91F2Je<=D+3v^-SA+%EnY=EfXQ1a^g`Icm&0rBTG7|CR1=A0f ztxW^(6zk7|%N)_SLvUkaPV4Qx^uy?TZf#ja{#b4$toC~dp3)A16%D-FIrGos#x5)MBgCUr@`qNaLC~sLO>!! z9QOwyoE3lr+<75@G?2zO1b|EsViS5Dri_hf-XqYn1#m3?B&v&B{sCMsA9N>Z`JVm5 z)PttuEm@(5r@!*d;e{7M*yiEo<~1o(pjt+BoI{TRvENLsj-ZlCtN!p4Pb}{M>Hqpm zFCYGyf9~Hp{NH}@|5_pE4iA0#r$*zz%KGN%UhN`2RIO`~Z(BkfHNS;G-2qN*&C>Y& z_frAC_07XGKlha(R@_NDrow?eM5AHCOc(yxYJ zAwiX2c#xld73Z07A$7aseGz*^m?is#+#a{2=MD;c{}xIT{e|4x_}W7fTMzbng-wLH zy>Smj2&jtflf!r8e?IH)wFMBEF?}O-BUZJD75w=4hb!DDuYba|ZCU&)+t~!H-4RR& zAf2?8v?S56E35u-$D6%*TOMs=q>3J*8G>J6ogQ;x9-nk-qx0@ZG9I|r4S;9!W|%hR zsy9aoBig&(qZ{D3&9(16T7%-oy>u+vW0u;Q(Vj(A5&Q^JjKR81kgZATahe330lD=@ zR`KISQQzyQahHtwKxA3d^GN8&*Z^R9h7qf`Fn!~7U^^u^Yz2%9Va$m7r(Q5eDA`%e zcF9QK8k}2P{b-EXaM0)kiq~r##)>~on*2H=?rrr;J zR+qKhdb|ZS@wRq%UhBOz9#JPC685BdE@8%RLZCDPK~Xu>|Cj^x;;pyd8W<+QUGS%+ z<&F=xBE;tm7Ii+U9*2ft?}0b?2tE$c0OJ5RH;7TN?=PMP0a4!^pPrEif(VdISr`c) zhy+1csS3`a7r!{s^7U^APqXN3>7sPhqGwy!_{ZM&*weEZSU5}x3pe+r2XgFBHmCJ#+ZN=kFhX z^4p2K3Z7|gd8+jT6M)bJ%3ME-*t(YXD@P*wpZphJJ^U>{^9vFGUp!oT^6|qXFMg>> z-oE-d*UGk#mlmDtXS;dv<#&du`BVSeKX>@m zU;01)O~hZH{YKhg`{G+7c34iA8rFvkK0frieY-V&@z@?j)aSQSK-7OD4Yacrw1@VB zbnmzA4BIMPDxawDg1KXEa{l9wyS1wrtAZ39r3|O{1KQT!XvSgs4f)OSSN|YORi@K z0K+x`aWmH9LV$kf8WtfP9Ihb_{Ne6r{}L$0E-hEZ z$Lb8lEa$l0%-!&D=t`Y(bJyhavA#|V)`Rr{pzPpxfoN$ z{my>9vS~^5EgOJISAQV3Lr61boU;k)OK!sIRo}#0UnV}c;h215V$5dIn7T1qx$iaJ z>b@AREbRffs(03#@){3U`!+t{-HgM<4u{efm-=vX^j^?kE-q4@{siCj1senP7UqDc z+H`RkOs=KnEpGaG>U}C$ADea?4`ogWcV?@p{_geqteDeyYp``yKOpcv7yiMg4H{t2IJwtedu^BiTLZQVFb)PCBY-J@B(w?MZNyT(kKeu_m=7cx0D2Z2 zydqf0780&`Da{1btNc4y7--qt`gbWmZW7z|IP#esA)DV8;p@S5>AnZX=l|;E_mUXf z>%WvQZt>T$xILGu_fm_giH;dL+hIVL^8LQv9Rib{&GX&jE1j9ds-?Qx*W6&}> zZJ-TsZL0QQ6vRoxzTi^o09vL?F;ZufBoSi2XM4z&PiY00LA4v-?Z6lW##-Uy5VZARUP+G85J=imJGw}1WRpDFPxQT_Q-<^taHwRM#Ugu612y* zz*6m3-?5LiN0|PgTCZQVNuQjn9&>rtl*V^#7=YkRftZ$M(@=YYk(+0Q*WS(^>DcBu z9g}p-_*9FvZ~A&29JDS0Gj8B#D-uCeVA$M!aq9BKEd?J=5%>3F6QU0wdy1 zcq9NSNBk~h(-oQk^yO{|X3?D-;LfP)4J3|@>fT@);EfEBWDgwT&gvf`Ao>Q=z;DA4 z={8as{Eb-Z@r%K>ytjrjoD{l^L7a{~V`u*ugm*eg~ zA0yDsR?Yor_^A8AMBU8d{OJfJaHyscTp-#W;G%Z5p8a3^TmSLl(^p?VJosEH!Rj|% z*MT?|8r*tZbgIwA7}cIsx74>I6_uJrePlUz#YFN9!~PpT^Lr2f`oH==IsEMJ`5nFg z!GK`9_@*0gCm==C=7^-dac2=wm)o*HB>moY0NTT&!GT7tLDP<3eY35N%EUxCQBT}3 z2$d)AYk`EgvKQDV?x|S&UoOr~e1_0<$j>F5Nvm#kzWn~`BaGFHl}(yQ*AR7<{qNSd z%2D@y*6Q*(*4I`G7e?jyzS7$NQ17`hI;|1Bn<=v;)1`}pGEQbZ>5!$5i`!aZDt= z@YeW|PBqw~em%EATRj4`?}enwk`)KGWlYv2>Ye8$>4z*evIa$z7cpspMpP{O21uw= z#)WbSUC2q}6+!Cdq@iA>p%|NhV5;yTUPF8%kT*I6DF}MMU^th``wRlu{9y&p4gw>t zjthsRQABp?%tm0l0fIUFO}A9O=2h|3|CpUsFYEmJDB{(S)i>s=t%U})y7VdO{Z>R* z{4J;P^@IQ-cG;7+jA-a%SgUh6x-PdS9ZE%nQb9-tfc z`VoKW(1jOYd~rO?l#Qm`P2p~6&6)Q6qrHnT$`7!wbT4M1+9r^5pf>;;S58kn}@f)`OAmzcj_BAnX64Oi~0E$ zQ5u2ozVhp70Nyz~dFCe$&;E`tnp#cb6-*0+>Z2o5fFL4p2&;wtO5gv{fA-Pg&;84BIO(|Caj6U5Sxl$RMVjcj0p2=kVJh*5*(Kb3=dHs-&%Ai}Q~%2U z^zc9Xo2{!J|t$_5eO?ke?*WZ-0Q=e!HcNc8+SZ0Vmj~^SIvjl<24Xc z+5*hLY#)>tbA!3C-GSJ$7nrtJ_DI_Spe!d13ViYXMx?=}Y)2*A7BSS{Nm!b?E4v|> z^q32(eRaJR9QsmVz=(MOv*VQ2D{AZ(Y7|D|>6jYC-x!D&Fgu)9HV=oZ$yr_hGTOv7$nPeTyWCe?3cIjwwJ#5rWu7TzwiuH z+qxQpmkj`XA>DE<EWYZFw{75*rH-o~zZD@40h*KS5)ksyPBqAgCAgf3XMT>0o4H%r zB!6yzbHZV8*w?->S6tUOrMZ6PoxWpIw6A)=JutzV0B}p>7#$Wb4&k0{zUm?<0KN8=zPB1U65SU9*+1nje->@MV z;y-zl%C*1sYc!h1pfTsx9KZv2fc6-i`mVC(yK;F&>9d=y-P&di_U&U0yj{psmG{VhNdD3y`nHZS0B8xVv9kOYXo)cocT2b%7=RfZoE#!= z&q{^;S){Hb5at?%)b=C;3I zi?;m5SC*QedK~fIL{hbgzpmTxGVoKA{sgn`-0=weD-qQFPF`tzwAEop@6=w;%EJr@ z@?$8r@tv|CC{8_s-|k63pr!T4IsH4(oO~0l~4Hsjl(w@9$PM+z4xpf-yfA% zAN+9qU$0Chtxxx14bhX=KwpUoIP=bH^W0Kd zApureSx#a)F`lDhkAMvR)Nu#~DgM*$gZB<`>7nM2dvH;VO@Kb0nbWUV$Mv z&56l7^-kt-OB@4QZP1>H>-mT*4Db#yGt)+89`jCrMCfjIXMue4KYX7saAcw>0864xZ5kbok$*70`qiu4V|#bD z0lV^PV-9CrtsV0aPR{rqactl=c82Ko&~Nx)4c`LSCj8!ch6C1KYq>NCIwI};Cf3$} z?=b)fJA1FMfBoz8j>IoWt2{)0;crV=H015KJA%XTavfh`UdR?&s zcu8?PY*_u4W`6HTb(bE9i0rhtM9LJjPkQk?pPvfy?cFiyil0ac%Ini_%_m^ao z_gLc^Q*FU#S^LQ!YXb(9OK9B?G&a-wf=~gegS@4#PM;L zwZA_r{Ma6O`%FE@`eoher~Linwg|6|u$_L37A9^zuCkBM3(#ZPC6aF7-t~ItW5$SE zU#EX(+Zs&dSRW@Saq;7WHds2~a8f zWzG;F5kB(N6Nk^I`;NwrrTHH0Z8^W)0NDeKwRv>G9Ind_KmAjmKm6EF{nX*B|M_1$ z-1}4)-pr&l!Rv$ekN2s1Yyj$l!{zT+|A+4!e(b0J*2BN>C;sT+fB5(RehvMB@L^iC zzxL+Zf49f(P63j!q7i?_hi(|8BDWvT24J=TN}%_+0n!wBPkRAYgc z(Z?+N*)4!cee4eG@yknFpe@>D3xFnJ!=*oIE?y`uo5_Ly&GsO^F~rpvpFMo;$*;6E zlofsI;!jhLf0RZ*KaMqjneTZlYwq^)PclIJq!Sjee2}W4axrw5?#}|hz1lz+JCmy) zwpA1US-i*6JGZ$WVidAF=_WwmD|2(~0haHnt;4z50=VrIL5RTR?tB+iQQNyoZoA`Q zCdQS|-n4qTr_lx!#_%nMb1t!|BdMn49SuZMr@GE{L6|sq&)NcD z53uVD=;D{KF?|`6=?Ld3x2#jI^~YscrMsDX=>P(mh2HT%x!!xHQl6^+S7h-$m_*un z8my4k$V$@x5q#g)dh7D-!F%hmG`_bGCXMIKI9QWO|F69A%9KMhfM$^FX@n8@7hZT_ zXaX9cTtXw-g77Ox8Fx#7jdy(5QnC^N)^Ws8FLh+WXag`Ck3{%hie_!qyuEZEFxrnt`0e{|LM_fdJ_0}P zg2lg5n@T=*1>(g$+}e$)P&OvS4SZj!-kH$!i&Wz zPrQ>85q?_{L%{p39gGwi0qU>cEU)&mKakh?1>!$nyf(e`PG$7FVH?In9GISa@pFg2 z^4HqCeDAyU|KnZv{H4~^>^>U%`yYED+`Q6R5N{3+xs~nW!`XeLRwsSl`^d8`yw^H8 zuv0JF-@WkQGpoHZ2V4Sg)~Q!IH4uOo?|U-W&Tjb2h|bM%v9fc7FAID={^ufi%XN>7 zpwk-LvKm9O#scvVHv9jr_PL{FXm;cEiMNk_{(+|!@`ZHg?+b4mXy^8`5SMq^1BCZo z2@OY2ItySCo!o7^vKh|#&ArsvP`{f`>YUpFBl>4!6wXDwZ+`ej<#T(>9WH!DlqPLf zpEobZEY%(aZ=FBzbn)E&auckMYvM5w+Mqw!7F6MdTwkxXZ$GN+@CqEu=*{up2w%cL zj19H=q|ZHX`lI%`mGIVwjSpg7ShwOmU7yGB-&131%c$NfgYCkF`>U6WWl?30A#z1E zoTT#3)<=Bn17YD1!*jw`!z==4Zo2FxMjO((9M{^n2aoo$b-0iVsj)s=A6&m2Oc=a= zBmNg2czWyuq`m%e=P5V?V%oEqgY(6Yg@1i}E87Y_{e%{)*@a7u!`xEXxCYOh0bwj6 z>gQv?xE6l${kD17Hn5kNFs+)t4#2JkF)qib)2}5EZQ{ELx;9O_N@wjAZ#@=vT5GZN z*7djY0uV^_(xDURf%V%*8o$vDX)p!?0TZ1-KhPDw@0PH7>ke-XVr@VXaE2X_fh4~P z{t)Pp1u}Ss90pn*0}Bx_1-LwUFbm3*b|af-={KTn>0f$oSl)Z5jGZpDtY?qdT>Vu3 z%Lr&8F01Tw)c(bhs!md=jXP6|nn~lzR|YxP^AI@S#Jw1^a4W{(B=}i_kMuwLX-Ur= zCd7k4e&yc#@T1etYf(LfiZqHyAyA0Z5T*zn$&|G@Yjsk%fLOiz;oPx^cQ@IQF?)xY@f9sZR+{WlYT>i+-J zFCPxS_-l*6kgn4?drdoBuxC7Qu}eBe3A*KKDrI>~IST zS;X}g;^lsY${9lD+GKUgTNyz;dEhd}@m5Uhg6SwlaSe+JSZ-mdcc)$|-iR*)w+P|j zT;2?^48^xE9`4h4oneSr{Znsnxw=?A(r{-(yb*^p&8socow#7i76KE*!(dKCoafb7 zJZo-YY=aA&+6D$%lpbvK37Q(T;^zY5$oz*!a>oU zr@-x!*TuN&l~x}Qf!8mM!^ue57_s82PkXrHYEvTq)O#bw1xyX%)GltewC#^ zlv}kG6Ye0&(@%|U^@O(f3;{Rj_-2>YEz!x&8a zx~|#yJAqQbD1DlJ!1W0Kc$si@tlm`tq(4qr?@q(gvR;gUtHZ|{JM}5Eb=$`~@ClxU z!NG9FdQ8xx2}Zc(W%%vA?EveyJU#?GX{`00#nB941gz=XjsX3*TSCj(-4PINM3@D? zJspPv8Ds%57smzAp$^*)KpgD=e(K=xFLQ40k{3`ew+#a{{QZe9{$)r z`%eV-xxxaXC@Yj|k&LvJ8y+_ayKLiu8Ci(gn=R5-O<}=sDP2{-;dT)A@`oT~2-{UY4%HoEn z4h+tY*B*K0nYg~C6|Y|30>Z8?LpE_9dzRO0^@st(ju}*E1-a8-py#r6^G!bW0jzv`F8$su~R=P5f(6{yUNM{ZF zxNkuK3_TvCTgjTs#Su`?Kq@`PK<&%8>&Je7IJu?GV5|?NM%naVv{TYVT#AQ%6sHb;w)a>YITT{K23N7XLvI{WFGafL{G_Mjq|a zF7ApjqGuX~r74MNz&L=VdMj+ooQtwb=M009ux~Ovt3A_Kjb-Jyh0t1{9Q6sZ8!z$B zVGuukb>F6U2`kcYB`sSq0Ug!_c#)3D6@tLuOfTbV1BkePu;&l(a znZim?J~%jT%)vBT62yGU?mFI1E4-3-2F9#KuJqz6WcAGCZ*a7*&kh*I*1hA}ZXB$? zv)(p25#qf@Tep3zzuvEPdI@EFeRsm2H5@%a{H2!`J=kl%nx%6%oU#ap-~8q`hn5fq zrB&YD5-cshRRe7B5%%-O5Lg0s-=F^EPyXZ|`01bi>7T;c-R|aR07?1=8aGEfK(%9^ z2NK{OAr-FA_dX=Tvpu3;?DRX&I6nv?KrDw+I9pzvvge)W{&^OzC0Tv=L5xQW(oAv_ zauD8P;jV{n!uI1dD@T=Kyr1X2kxJ z4hOpYURL4Ok0b?a`AK4<+u@!_bpH5kE{?4|_SVf;S^#I}gOs#w@0o-;#Hx5MbR^y% zYb#j#zw7V#U57vP_x|kR*{^*0@Z-PpM-RXM=lm%Yw`bXH*_iCzg-K|vCofiYR{x=t+URv z$Op4_fLUJg_m|h!f_SF^iU&VJP4cEGKv?I<-O`K%UR%KiM&XS#8axJunKAegYPv$ zJlDBJ#2TQ=WMeSQZ<62%f}pWO$OA9Qc8FnwgbJBv!8{?23un><3|u@0QhPVshQ~nU zrrz3z@Qw|Dd4m~fP8C_z5xmN{k?nvp2G;zGz+fcI#pX@1#pj~dTwL|Wgha%q>~d3S zyNQqr-t1Wy<}8C>u6k7Xgn%*^Uwkfjo%HP2KC`uUyk*HpgOd77{=fj*y`IM{Na!73hs#mqrOuICZ*tr z@0(-oUt5e(u#9E^(Qm9*-ulrJyxWU8Do&ZRol!aZQTQZJ3O6R6!AOoxL&!hDsPqZ{ z)+fa0_=|an@k4YUebgG>&xp04-J8hIi{l?_u{C+G!H73z;pcz;=SOwVkWW6sopj=q zj~=l9BKRTh^6#wy+W`beWnmuBmtX$nU;fpXUV7=zS8b{@z|T^uK|aR@&38Y4Ylk&D zzqMif{|cRfH%JJ)=dH5w8^;D=44yO)028p?ISjtvh`hnx+#%%HL4EdGRMR3Fr zg}a};QmErXr?l*Q&i{W=D`((5Pcd$U{FqQT@FBf=;UT-*uw z7K=M$w9{D&md09(n=vdqbfcw;w0E>?XBAi(7}w?5CCd#cqy%T1apYY#MdCmiZJgz|!W8Cq1%FUQjd!^78V>e;7X}K;oiR+vxS0|}Oz4iNciyUU8 z@~oX#+z=TP2UFa-IfA}&gJlI}6d?KpzmM;FvKG_qSbM>5-6fFuww`a{OkF-(n%_ho z4L}p5rxjKPjqhe6q*n*x@7sF&l-;j@Z0BZ31;6N9}M6g6hxn)hOmhBx&@Gd zhu;Q~tpLvec{cJGaNM0Vn}L8p8>t|TXA9{$>alQ_hGC;Aq+!`Q$k`&s5?}h6f$L8Y z?bIfZU;Qqvi8OA1QI%PoN^haR_tNKrF^Q?gV(tx?Ov*jxO@}}5RZh@Vehf+r_xTp! zi@5<_y8pq$y$^P&NKxS3V0c8p_SBYh;`_;$F}qh4nLNGh*9^7^eF#2S5-_x3h<1}~<<^JaGTIDi>LfqC&f z@s%S;PYZxyiY+|c^TdsNlrN3EzCp%_VTFJJn;%=t1%7~CB<;?+45rBn{@V&SebOh&Cb?c-dN~a6?A|?p` z__m9W!C1W{Z=F-#A*SB8pnpcxdeQGOMpKWtJ}Ylu!fo-3@GQn*(hOV?_ZaXp-j;XQ zTc6B{e_%S6Yw(1DOMHWXfHxOE3+9@BU4-d0?+l={5J7+1qR<|NR_9GpAt%ON7C4Kf@x*4})U8nh0 z%K1Cx-qwbx^Y-}NKfBJ`(w>&R+F(ulGzQ9X<+C-TEJu%qBdaYdozf>v|Lq^XTWc%B z8Vz?h!Jjp+wASYxyz|>S>{%Yq)^ooRcbZ-TA3+VBzzo;|MjMokHb^VoW&*YVsU8{x z;cnUj*rPcOyHo!l-mLl!o`uQ)8E6te)sAcDu0L~p8SS*EyE-zUC&(iEHd`~ z%uU?##f)j>5r5&R0%hflA+P}4j5;|!bk6l=;FQ4@2H>8w0B2|>+%IsPZ>FkX+98Of zTLIx2!qxM{l@M5n;{Wk49}a)t?>roSXx&?9-dFdAYv3%Ix}{?e0HFR)`N~Gzr30_-lUMxCivf|Blp&1(HbhaJXYt^Y z4{=wntpkN&BIH}+w&J9@xA>w?>lUv}<;kn9vn6oMU(}@ap7ubUV7$FQb~|VYXeD-h zS?5_lF*Ixk=x{D(?!Je+Tqi?2((0va6?*myrEJqENl;pi9*GwLKPltcE{_VYX_>Sk zbZqUl$rM+Tn%@98*Bz`OPGcfLl3H5_q<9kUGH9!_>a9^Tdt&%E()3b8ubw2`k!1Uo zW`b0^RrnKM;1d}=t=VN;& zxAG=l->T!7Z$a+MG+`()M22;YW>1rB`t8I-~p9XgMrfk{E zqdA{7Y5n-D3;Jz-E(xE#l(5#(mB`wRz;8mo8GyZJOY0dC-`ZenytRC^wx@j-6Q1^0 z`c3fn)xT(o^3eoa2g)P(-7VpE%(!FQWKaaeoAi&c3mAhT%sp@9z}o%OaCF_BVVaDA^l?BIHon#`&Nq&q39j=H*RY7wEt{Y{68M8`O@bWA*5y} z+1e)fdaCsY(-x5W5jn(8UgbD8cbBVPHVTXZX%rAnzWUVjTY9(W{d6!P^5c(x+-sK> zQGPCXlkkCq-oH5K0H7P+dF0aJYgr`TXb+#2{5=nS@o?#Z44EQ$pI&}D7tmLN zwSNJ15-#2Q@UwGHfO`Nwx%}O{INq!=kRt0B`vKPV z2=dI~-1T@yX#avKhG`^hFvoazmIk*xZ5SJY=9#u4vf!F~2F!1J=E02^iyLNpA77k? z;pSZFTT4s3;)AQcR@WQ_EbsIL%6tv`V3#K>ps?C@ArCdy%wbLe#ar+(%x?TO;{Ar4>ZB{@LNZh zL4u>Q)VGZYrMp|gUBLhtGz07#$7X=GKc~SY`5QzB|JdWF>PO^#XbD(^(jeFu+6E%x zAj@U|d_$&%Sni$90zV2e@56@S3PWb@H&jX7wJbh6%tD0|HrdQW#M%MCEyU+L=*OP1 zeNL0Gr7{A_$SVu~t^z)E7|;XvJ=5{8Z*=Z?i-<)stNceF|4P>Z7vHmU04~4#`oMS+ zg@62WPadB7u@|}^>5;?3t$iI4FoeHKt9kjX&p7}+KN17*wf5ItkcK&MIL((^i-C`r z|JvK@^UD!@*VO*V6N_l`+ef?@)gfqz?^l}t2%mZw)_pat8JmJ3h!J4d49lZu5N+{P z-IKREF%!~qO;o1+b;S6&h#`2n&^?;)3N{4uTxl@@n3YGPOY+F8414__qklV_5={d+;37!Tzl#4pyq?&X<-h(1?6>II8_bDgg>%Gm}y zEMBNATPf;&IM`mOysy^J3?adwF7B6pgFR4Z-@oLCuLScGt?%k$Bk+8QfBCQ8d-(o) z-;3}+dARiG^8uYfS{?A<6EB39R}UX`P6Q%$Ap(By!%wH?PkJf--u(Vgx(f1>3<0@; zU3~DVm<-H9Ok}R57b7B${~ZEf+}Zry5smQ~j{x8N;MLIvxc=5vuow`Rx}41yog_bJ z)z=5EAx7|qsI=H$xc{lC<7S3){NefXk91%A5Nt&4r1SJ?6fSfw0IrHueBNF5b;kAl z*X!Bh(`wBXzl#}|I{||KdVc6-nzF{dt^IwjXy+q3*MnJIm=66hYI+RJ*ftbLyU|R* zbbv)W7%L)DH$N;s<_9CA4TE68bK(B3vkqp4fF)e@-eb@ggK|BX80;;zd_*{y&pJd% zeEkmVF(AUZ+~O`c7a=Il)B=08D)+6b1s4_f`k9urAMdS@oboS)O#$q^w%pB)3cZ*43GFP zPJP;>|HmjY!f&(UQZPGL;p2=-T_(0fAnRRPfm{sF=&Q;-!*;^^Q0e{!~Jn8-xTH z1Dqh_kXC->LJrT~t@k+2)c-LY5Y4-Bp{W-=OTW3zQ#{tgel*EV^a&JL@IE_D_uQ31rPp^E~URquYmlzu^WFPmxE`vGg0GQCea{ydm)Z*2|Jl~%0eGj%! zM=f0kj36T-Bx!`oUiBjpCb!Xj(tM+4riLcDf{vtIQ|3|~#F}cK)Q^}Un2$%Swt9X1 z@xvmLHR8(Jo|Malk5#^U)v0W7*pF8yYj|<;Ag<~s^?E;+@}*O+I2r=h^xW?dXRdjE zkLI9w`Nq($ych)1^o9#_psk3ovczeV^wj+{3Wi3!vMoE{)K`Ld%!IQFw)@{h;OaL9 zC)Aj{+NX?e?46|wLxTz6!>=#(HHODlg1qVnzdBFjdnX@8L;TL`+ZE6ERk6kJ!r+O; z&XupZU-b??fW@ElBf(L@ldi+%US9~8$}kfC96ueQ#VnBgok2m;Mp%57+nG3$SMS2B zrPifluVdD}TczB0zwzxgsogUt)`AfTcx zyb0D;$Ch?S6QHAtpSt19bI}Od}l>n{`9!cT)%63j;G{S@S1*7+j0WotkF0-z*dN^;O zSH-oVtytDtd1l{=ohlZfz z&LjGdPaBX{Y$4_aWn+V zxzu|Mg#3Q*dNBl^H}Sk3F7SX6)1xfkLvYIj`PED1j-lC1jr4{H;UA)}?fpiu4f{uF z#5c_P!q$rRgB!8dhuXH8hhcaY002M$NklP&-rg;|M+% zJfqFkA3jJTebi|AC(hS~GL zj42P^DP!KL58)36Aj^k1E05dYz+~=L_7JYsp2XqOPlnZ(`a}HmXYJ)jUl~5jy|=aw z)0I?<*y}@M#1*gSVZ26Tv6u|`hQZMG>OrifS#T0s^c8>n`kJi;V&3oRt7&7|f*&(C zOhGNO#ux*32I`$Xe9V_|X}d{1U=ojM7^V=u75MtA6AoQZs{i1dZ2Nhp4B(8KMa?TY%|TDpa+P2{cR)_ET)eZe!l-P-})`7IFc6PQN^KJj+%@_>fZxKG%*1)H6ogZH2Pi%3pxBxfsrv)bdT8u0}P9?jMl<$7=BAS*> z%vqcAckbOu=K)-Cp8H4dwXfD$+WkI>S-ASq`_*%KZtZ*Tt*>__aQl!UIk&>=pM2Py zyV5>$r}kZXYWAlY&6yAO=P$1{WYplVwyQ9bvED4+Ep?=0AII&!OAR0Rb=xoi2(onV z1THtYiW}lNggROwo%01=X=?z(pkD8WXjdlNNraI105}jjYH&o4rlH5fYt_5`?e&Fn zNczfRk*{o93y3y?t328Sznuf%COz#$n6+ml^6J$lNA*fW4G&IjA?XWj3*P>ya)L=; zsdsA(`Z?G1vJp_8Q~a!t547Ha>;1~qrd|zfqhW|wQx=8*Otu}gpEd&Av<>>!Z(A0_ zU{#U6pkcUJo2~1=^8frBhhP7zFSTdit(P77d$qm$Yi%`MZTy`9@%`_9Bc?Amz3}*2 zV}GMgyIu!e4^KYns^CvPcyqQ|oh`v|bO>dT-UvsoIt~`02oINpnbh8ZdA|N}=jwOV zFQS1c+XF_R%{*IHpQ(t$+6a%ue=#1^-TBS8?`+w#7B@ zLzIVz#VFN&d2i%_gZV*7H(ct!ah1(Owktck^&0CwH(XadV_SP>d>ecmkiJAv< zV32WwGzN(M9%uyK$xqUF-UzWfMwyUD9q0R8tDI%zXCY{TPx?OzaWDWEq87FU82GJ# zY!pn$zUJ4UNPnVE_HJ)vwRVmqkQV^yPFh9*`0h_We5b|xoe;fpLqcb}U%l1-WWPU& z0XX};HwLzK4nS98p5r-i?;$qf@ba%*K0K8c;76YPZw`?e6b%MMl2+jB?*MGT7$OHO z1d}@3{(8+AP_`s0tu%-}B1lqI7UCz6&Kd79D%{OSJO%Am9sJ( zjoN#E!j|iRzx~o1`JBJs_D748?{{7)B7BJg-kQ7LmvpG7Z{F;*%dY#SDhB18C<)jh z#2J;ProGkyKR63SYA((xF4EHa-@;!VAzS4pl_H=BY55Vns~^5rwXJ(ChKtbDpavF! zAx&Pp{965kn3Bwwv^hioapjMHJ`M>~5gH&Z#+dP4e*PHXAvC1nh&#@xL_;Jat_ z4Pa_8&eVR0g(zKX-+t8Mh)AE2=GBu{sA{cH^w%?5B;ZF|(- z%EesV=&phxSb8VIJb4kdh$-gbdiMr^k7lli{_CqU4g=ww0P!&`!BN5eUr4!_jhGSV z0BEb(E^gY(&;NK1fUE;}O7zeS+ADAce(p)V231g$$`bk_!Yg{k|D?%K2 zCF+0WjGuqy_TyNlw#u%*;Y;Hde#pn(iIx9J{a`HWk@oPLOv1GDI05~x>|5@P2ydoi zRXD--@mU}KP*}~sHH6ywEm-e8TaT^Fdu>he2r|`;_fuw?15Iloi?!j2F25wO8llKofbn z0Wx^$_Oy`q{@OLfN;7W5TklB7!o>ejoMs^Kn_z96_g;GHdW8S~U0wuQKOn|CpL*o= zeyi9?(O^=wIAzT?LC@6q6+iiR90G|@N{6W4o>v;uv$7}txaReG%Guiyeydk{L|R%z zp0T0wFb#G4DclIPye|LI76iKgE3YiQ+h+(U6I|XcJXlQ0M@95%+SJ#I?^}8v4ZIe_ z>#unbSEROl+8CVcb5B~ShjTNy5{@$7`V>K=<{l9^tL|_ksDdkPQiJ0#pO(NOfalKQ zBB-$Y*P!ww7^%7(B?tvcRiJ5+k9aPhctF)LLp)|ANy*&CgfYa3x`0Yr2TH9%R-LOT<;uU`dERw-SO1SVr&o!1^B&*w07A4Vpnk^r>ucfCiD||H2C|%s{#;z2Q3I#IyY3l(D%;&kzn$Q=#JM#X% zjDfP&q;?R-g-Z;nQg@Yr2EszbkV|>zFOqCXE-^n`sVd8Df#;i)4?ObV;i0VIfQ{Ji z!8Y{}KZbJ3K!kvT*!4A1@))c&uMwx)C0A-~#M$+^h&2^D=@3rwR$=$*26-Y-?I@*S)r{zxCDt?J}< zXYZZljp(aa+r01A#q=O|$J17HmL4X$&So-AS7y1XuEDVEf%-f)Q9TWRLhzR^%L zIHgst2Dm*DvvTu#C-=>s`I?2+2$$*TXO|W z!K}wUduP4ggny^m-{`|mi;3_oy>IkEJPiRlL5pmgKswSsqOTn5zjp-2yU7M%(}d~N zJN1vjLCC3f4446B#6g{JkPRRS-vCqZFzzt81{(qx)U824crg;20Q=quqaKJlhI_Lx zHTMzZ%I|++sn{IaW3tRmXPf$ooe3_T#O3L?yT~tQ z0~rA}>8`eryZtTQLB!|!;land4)}A=OmQE*^Ji$C$g;YYsw z$RYmW@T;l7Zye_$LhYV<1l9cGuW$buu@;BeIrs;mL4>KmN3C9Rmi<5a#M+-m%)XUZ z)A+@gmNYFNF99v&=l_l3ty>5pRrhZz@56YOUi-EUfe7m+1P`(8abR#1F2d-=mmXa{ z^_JDA`+#lE-S1o9bH^JZUV&)jQh+Fzbuo9?W1+CZ@?&1f~h`7iX^?L!;d#nJp5U6W0iXMf*NqIhY3LCg?Y) zpuNsT@LN6N^)-e~oU;qKW~%3f8u+V!{X$nlxBZi=)xDqlN;R!T`a(EF>b{ci^;nVT z`gZT@3DNDlWaci4gnVCmmYaB0uV!+eZWQcw?{xfb%byKxSz4$o?G=I zirllVe(*}=W_+4E-GyApPVqlNar67H4grJj7jma_O|7&v4lK~GT`q5gMwu5Le75&> zOo8A1;iK0h$CWn>MYc$?X}?)E{sLtTrPdrF6R&_*E(*@Q`QILoEW+-pHRmxN>@nYa-CToVn0pv;R|`(M1@!7sR1i)7aU zKSVMqZ(afSJsKlWKV0qLj~lo00C@DVF-BDQ7g}q_wJp#QDuf1M0-4`@{Sg_GbVUpi z9tpQOMmlzI42xd=MKy)_cvVI-*YX(SM4Muy5(_oLMXR@XHk zz}lf)A1Zus*y0eh*ZAzbqK{$Q+Z219u(Rn&enx*Xp)bMn$Sa?b<#+BbNNK^gVY8ei%#n;Fmskgq<1Y=8eo#21mg z=zjR{hM)YBNNoee93$)qeQ6TU!CIRtm zPJxTT-YPq$hh!aW`r~X2j_+;H;A-P@n4a1}(f(O{7Vt@?T-~_QNq>$Mz2T}an`os^ z>(Uya56?yLrcRP{m0%DMe=t|j%-`uNc`-!A8yE1%TOm_tnalfVeMsY2U!@gT{i?m% znuenKO5E>M?%LO9wp5PwuD%UnD&t(t$gS3pNNvv@WR%rDn5s4y90Ihw1GH28#1*eh z{c3$W-?(20XHJ6sO75 zE=+r56#B+w$+y!_Eh`qXTjQ<01U(rqnY`_tFl0HK3y|jYEAME+O z{PN4g*+CeA<^Yo*Kn(9O7V`N(Cj0&*?W-Zg?IsD08BxgM{y)#^(xOxW%P3x0&~AEnz9GnV_HdfUR9EC zm7@-IZ-q&(R^GmqBQ4`Pbs&&aw#rHfCh^K`y`1uPJ9O#9l}?$;_j_PH=Jg(oz6I^k zUd8)>Pu#KF*Oo*tc3;f<5=y7+{n>e>Q?EKPA_DjX@23xfJ+zvpn*Nhxp1h*!bqVOTSTUB#9jl|7IS3`(8qWMPNlR`a#tuw%C}zke2kw8 z2TB+%u?R5v_9Tz@Q&7bm8*D!GcBPV1me1mDkAcTyfj{xeKGr{(RvpehScNT3TZmtT z@@mt-=UHv5Up92BkHl?g%+uRoZeS4EiLVanY3f#4zP0_$f=|D%+E|>F-_dDGb4=%z*_+pVhnIu8e`Z zxZPIeYH#_{sf@IL<)aMc+U8N`+HwpYLEdBf1?Rk-{1}imd9+~~QKWt`s|5Yk*J+&g z9DfgTuAirWYZI?3TU3a#Hd*g|ZvwxBGTpWazj#c7^q#Hz(x3&1x^3cbfBV}*8@T>$qOW}KecvtNIHGrUa|{@c&K^JFzX#pm`fVT~3ypxm_6#|she+E1 zP&u1f*!BPjKje|lXOOIkvdeMlk9X?wfvE7?k*m_rMA5y)p-wpZSzt}<)M|6QXp+|T z)b}UH>o+Zx7VeYWxjxPP??%M@lkay>MK`#u1vvO~`TOXdmvaOAsH0xrIb80U3t-bC z7_J}QfBUt=_rLRQu83F0?QN{v8|@*sF}WHv_IK0D zA-+DI?Ntl*!biYCr;{nklT`1adL_{w^-a>1t_ zd+C0QBk{XBSh@DiX&2;0P{9oLU9NcVolXdTL%{QZRzRHe(t?$=Z~KEf-_}*}ev`d0L zx!S&MR{}f9&24`t-Oe^g$tI!KJ>gxQ3%8Scsjv|(s&ID#P|+`=z~$B_9nBT#-u^!o zGs%q<$u&%%Iv0PlJ^q_cE395>-`RT?*Qbofy4s3JRV=OcOk8EK9~d=!WmCDI##c8& zWv|{$L)`574?9v@5p(W%BzOjJ-0#L6Ph4<}dz-pQ+vOT}wzf*fy|KE+Mxb`BqjE1# zde7q79^9;rqd{qo>6;;pq}j9{-0BehVY>Y8R6vM6?N5C^+a19-3=TIs`{>{ZR&Id$ za9}*CU$3q@sD{ACICyW>M#TJ-&~tkh6o(R(&Y_?mnl_#~n!8eEqx*!g7fRI1??6Wh--eD4?RmKjGO4yv=T)u;oZ314rL^WqV zg=|f#tzodRhLfg1f%Kj`79>4JV0OK`{z=AA`E*;r2DTR6Ga)>wO${Hs{jJ00v#%!H zw6Mepj~9TL3cwV+`|4MxB8-Ovf*1f^?0^_+tOF{*liFr0PWk-)Zh5 zcHl!CN!5ZlMs{4#5GMpl8q%mBtz(1j=X>5nSe$ei3xo~v#a!%iWtY~TKbrwkG2*Y> zDZ0!U5r%`_Ijdh9`Nboq2tCy~;*Fs}R0p>HAov&>1d}VFHh^DXoJY;xar&ng{TPio zm9TQ`>DvmZx*_n|tZb;FE`2faCBT?yx3Yb^X4qB-IQ1t+hLI#9u07zeoq-_$$8N8> z*iT?SFbKXe6JW9ivY*g@kECTK*#5>}dg*Za&2NR*xdDFo-r>EsUJA&if}OkOBcij& z!>XI_=05tpH2PHb8M-FL%~nCg1`)gV&Nou~KUBed&?8K38?|x{9$m|r@Lbm2>8M+j zlbpmMS{UJ6)7S&pMzDY*CI}RqBqbxRe8p$WU>JhMU?XbEvbR2Y8?_;(jN%Z_(%Pp! zcQhDeV76S%>KG$D@oyc@9SP>ji+GA}UJV>h59|oz)bR}NqS)n33a$?O_Eg)aFdON# zYD0)ClT841Kjs`koB=@C)SHW-`VhhsM6Wc9m{u=hSoy23Vp4|biixRwMue{9-e(2e zYL zsiE*>G#8D}@;+FMM-4ojTz;eeY3VO728MR%T7B>QkQ*oM``30jSdLYma{D*hA?}IX z`N})>A^rt1()E9he7eVhLw_;LZe;7KP32BJ8k7sMWfOvan4Y%HJbv~6odjNa-v;y+b5)%p;fztvL4ABo|peGmtwqt0- z-4gB!2EYL0&Jc40X#lx+Ko*=H!p#PN(VzPO*awLB4mXGcH2BgfM;Q=HdAL30Y(z8g z(#nB*`NnmdgfRiKl=*xo z!ki81EouZRN88oDCwstF@ge`stt^czN{=Z3L!9dhf*xm!@Cu>2I>ujcC|n~| z%dJDh{c9hmO+Yvh0@A+k8Hk8l1Yn(aAATnl(-x3=8_Ci|*dvn5AT3O#MS$O+=-UN7 zH!e2_h(|DytS3Y)5yvq)6K4*ncaJb)8qrwBY}Hj>`B!{E_n+qC#;pkQv`4v+qMtDd z&L=pD`H*n62TVf0!5`7OzOOi*HZ@pcD+?3gaG;t{-s(Iu9aDFRNduzK=kTM6(}_ag za4hCQzmJW?^u>w==h#ccyiEU2-W9j%tyd$+idl6Y^ZA!6V z%Z`;c0i*F!_l-VFqK#>q@oohmPg8be=BIzKBwENrr>TdoU;vbH#Z=5EEAt@rJ0oS_1!f0i!PpE8_ zkFw8iQ^0<1?|h$ak+Dc4_S_0-4BQuRHi_RE|5SC8uEK{gahJesShsVRAq^XV3oN}e z{JHeV!-xChSk0BzpyNbaP$B+^5C(&ao#b!+3F5p*L`lP$I!xM$JI-$>=gB86;w2!y zq8SdN7YM7MEP-L2I#|TB9U!sGDjpFeH8V(59>06U6#;H&CY})?!#SD*8UO@X(ela9 z@DGtCi7VSle*zf6#K=y2NZMf4esv()E(eF)>+M0Z^9#WQqUZekHe#IO2hK?it)&d|*zRwGSQ`;zvKi~l(c zL6-3vh>@5Z`zFqU&6@wo>W$b_2XlSXQH}6O&cVkEfpOos<0Y|5J0ZASax>@t$7I+p zm`AdC|A9; zHzLL;Zng`OiV@_|4wSmgRkIBC5M6DO9&w(4;P(DpR`s?h)^>-u)sH2vng+k$qX9r% zCscOuVY+6!#B*@Y0Yt|X`u-G-+B8JJ{>2O${~NRq;ROTHYAfCvr!UnV;te4`!m$^H zDf{;L(yh$LT4jgS+Fm%8bNtos`mGGeJ$P5T)7XiVXX5*{0tR)h!PXP&EaL3jS}e}G z?ECiLJ6;)kooD2Ya1#Kn{}=-jKBA9SD2H?}FM$%_mxlnk?ZKq6=F&XeE#adfz*Pw+%TAIHmxxcS4|VhJjQ)27MEJ<$2y*AdZyE9R+doSQt2n z11TU+0OT*bkOV?c_+eZ(m-<+w&*cW#^3noB{H6YngAdtmblTXZZUelO)wff}PTI$v zo7gIo5#oK1d?7;cj4X3gpre1A&4)8thCk3%u}}Tz^M|i|C12JEq`*26rsu zpNse)zV@a`&zJzjlA4_x8Z|#cOiD#$1%yrTQu)B#Z*Glw$}OT^8@~SC z)b$8%L4Dj0!KiG<8-J7bwz4q{KmPgEW-xwGUvUvsFPQWNH^D90^8onjch*({;{V%f zkE?{ih#`{K`3Cyc^~o539c+*Im~_VM%jJD8xB;auaWB8$@1C74ps(8?ll{Z|y@W2;_;N7zS(t?Z#T}=&+IAS=)bb||4Ky*BoEk_qjzPFszVj^5m0V|X zsheYWhhWBBKOp|mi9dg2#QZc~Um_^&PgDCZrXy`j%+PEfR5N0Ky}bHd`?wyu9@(5bAMsbN_N+4m zc=5P)S$yk541l~#YOj^`$A#L2c|fqQ)n3fUme?^v=eax97uT+2({a=k_^ocYC+=+x z?H#74zQRag(!fQKU>`xFGtxd4KSZq^XU@0goR0yx2H}pOs52M41BHsIa&C3>@faWu z^AW;MeAe*A+p;*YV?fMne+etI$zf}$bW?7O=!!$g(>#oqKt!NWk57#Y~sJU zKY4CM4IvLdfA3FjO9z39TnH8xFVw7XNQ%quGYD(KFfQskR!6Jy7hdjLakS-P&}SjP z)U~c|?7Am6zYE;Is&7<>sVeV%!#U>N5H^K8s`3nh#|o(o+EYwO3^>?aW(>i@x=q`$d?o@QY7dovE}-`wF2 zXR{$WcPSie@uxPo_^&(bYiNV&*|<@eGZ-A#RYbe=2p7U5!Q?HTd*QgsDJNn!x9s(P z-0jk2&A~p+7ev@~x#O0IXcXoEotPCG25x&?;TX4$-+3&QYlqc^*kSR48kH;0X}q!{#9Zhc3ZyJ9a_70!N!v%h^BvAJC;QdE=kJYkoO)w$ z=676Xth{o#?Ku~rNxtCV<{Qi;ccTPm(*I})%6nlnBN+e6%Drwh5|vdaSI(35Z*~-| z8Pld1EAi|SFjfv^0dep|DBcAT|X{FdnVUOx@5G$en* zA!9&s)_>pD`0Wy?3=9IM03)%tjcDZl zrw(ESf}11lV*<7T;Oz(m86d&tDwT0Q-7_hNsviPxq>~QUEx)?|=Fo(I@H>=tem41r zQy%8vvm~|yNHwIdRZk0|38MUvb=ij-dJ4DX&j+b8f%JwXX^Nxh9Ug^cpHbdWtyj=?fQ`v+~&%K(h z0qepx0F+l*KJqDN$AR10r4B;KhIgy?F#z&|OPsv69(WnhBCE(KJ$1P-T~0E@QiL&UB`o|U_+y&~@Yo$nA4PdqVvju)WiM`A;DXL)}-v z+uXDe`vRJHwZlo3KM>l-Exsv+QAPL4mCxq*<+Sa&MsI<|p7zk1k*8qMDWgMrINbA~ z(#7ky@$4FqNq1=Do4_r64j;l#SyZULlYVD>m4NA%NxQeMXMXa-uY7EDihGvszNmnp zcjkGN*TnIW&Hv~nNlKs7Pw?;;&!x5TVq4)oozXO?(b7_W2`S?e3O3Ly8NLY+;y!3A zHhw$j~fkTBaoDD-tc}#UPt-q z1n$}DHGrTVmgw!ITR?FkE4Mk6rhyfp1bpVTS=GZ6?=0;zuMUKP6V*DfHFwRbUHk#- z!cuSBC2twoF;pW+uzWXNVE)~RnZG%227wItfWJ9zaoGHw`yS0?b{SiTKJNW#XqA%I~mH;@U`bjn6;FTM!^b+5qc^M zJSrz~r7g|jrDxL=vG2lmA z8S?AsiTd1DecVjV-Z8-UZ+BXq5oU8cm(l;Zl2}YLV*QnZvo!Z*8f>H1I_gY(ouD4w)z z&IlY|(w*>QjUMf>2LPaLx>detCpMlc_`qpw0v2E8_n4s~tN-$FY+hfwjk4zqdu2dP zA25zVWB#*zP@a2d#l!;hSyGw3!T1+{$}iRTe4PDV7XAnAmI#y|P^XV3Wve4;Pg#|x zSzS?nMo5US3T`X2%I;qM$BlMlycOu*xpSipdp_9R$tI*GRNB=qRXssqfj1R907s{~ zu2YGn8YDr$>Wk`P!Wwi?(~s)|82{?2Fmq2+W9#Du{PBKj#fVO^K5k9}th~yE7tzX( z0HdFDpN3`gi*_9rt3cc-vY&Pi@Ht^P?^i#~-#y2OPgsLNfDgpi zdjItvMhN%LJ1v2%?}QU@z!iPzFC0PVQE}D$!|#?vW(r_g^s8vV&CmnLvjJfJuQFA> zN~TuQNZx+??K$yDI1R#2V?txO1@Pjp2B$F#r}^>sGwPl*tbzPzoDS2n8xerEPIH#~ z_>g>K{jvS;X?)ef+vw%q?s~`k-pXjp$HNkvf7=h$U!UxL_3EGRuD|UH*|Er+&z2pySpcUD?5SGT$Sy!Fs~0}fE)1Ta12lh2UO1h4_Mlf&U-up z&L6zJ*#H1Jae)+X;P{vCZ7Ou2x&#R$WoZNIAHB29naA>2^y5o>hIQuFsobRnWPvI0 zM9Y#nf&kUIG{>Speh4(w`nK4`GoU79us@J)-rJr5^?9Z>fUdm@fGp5v^!FF>#E?%t zvWHME()DafqZ@Poo-NP&B!B4ucuNS+p9Mf5TFU@!>-)mK9F^f~m3dV-`6Fns7htWIWwehe~T&E1)ztw?6fGKe4OW0e>Yoh?qdi0j6)zJe_zj_(8Ji!c);E#`uHufif}k9T-NRQq(+&6r{}s7VJO%7dMT0-s}d zC$EaNgUu4=Znu2+B#i=r#eDiE9PF+5AJhnI=%YOZ=;NY0gN{C`_>TAn_A?-nZnWLk zmYNrdhk$PY8^~&vTYt6rvseo*1_whKesk$Hk$Yg>{o4Tk zknX;6TAI!&gGsZ%`qVm$v1bURIsL4@d-d_27Y3}s8UbL11>S!8b?=SpfjC1yxS&7x zeoZqNNP4CjfGM=c=&$(t{71!Yt??nx4b{EMQ!zGkF#4ymA+f1U?}5APk^)zwU=^wn zsAv^zI)KzCJeuNj8rEtkI&qTz?8=rOx`4(AZ06_%s8RZ9-<*!>Q#S~$c)ESP4z3r;!*w8?6xWA+rOp2jli)vm zqw^8o{>tvj-`Pgtiv<8v3InisTAG2yp=ZDkXa~G~s{-bLGY~a`B|HGiF5}M+kOONx z@nBdij6^{cT1>{&*jb^ zVJuJLaD)#+0MJKFxuDHWkZ9PT$MVF_`lDgb0YVX)cvyVl!`!_+6KE3%9NtZSBSl+4 zAR;gg|L6RrEj&ZT%kg$tx%~3Y)Vdx2e7lkU?KDAmK6q{Fze*Rn_LH#M{j|8+=H1&r z?YV@@(~K+wra5u17Y_pNT^mnnHRiUbP_?bLdNo46`*8vWN&^nv89gfK0li-oT(_a! zrWxbMjbOWhqIbRz6}91>?7=^~Y<G18G){{ zHF%i1j{m9ql`aCg?F7R;ALsolj}5$QeBLYP<=ms4MrHC8U%%!iY;`w6Mdfim?vz1( z0r|KyKjkKD7ea%wIOE5A9=Wr$JbOQH^VW7YApi(#H~L$Bwf48(O?%ph6P|O00SnyC zBbsE}-|Qxc%4raA(J8-j7pZDo6zbbHag2Q_;(x znqN2?0dqkrTji1{H7HsH0s^-h0{``HK0xibc4nK(6pRD>-cR^xy#lOutU>lGoo!U( z!_!F>QwLgFM@A$G0p|8eyYrj-{c^yu2Mk;ToMq^*}qoI&5v{zi--kBEhl2EeTqKg*c zq|2HAimx2RHKHd>oKF{BLcu6>3RlxQOIQ3!H@YM9ea4?({aXfH2@CmM{oHvaDc?z`*O@{ZSp%V`jHxSS+6=uv22l>?k2YkBQz@6Xbd>8!e^MCe@ zEYE11`KJ~cAeGj*XsmRHuXt2=TduoGqo2|0&^gajulR|7=D&USe75j=z>MA|I4s&L z-L94KuYvodDLOyl+=^EoksUtz>zmhmRIX8o%y!PladoI}{oJE3-s)SX->BZy<>t`l zN@xq&_53^U{W$g5ecGSN_gNf%y&pdf*)tlG^5*B&xP7?wcy`^VIdS_lwin{>X^c=1 z&u4t^y%ukRow*@0PulP@yw-1XYoNB&^3%@ML;UOih4UjQ=+_PE)@YsvfS#cC{^Wr8F*svnKv%{Ski zDFS{Ph43^28jv_D8ZB-$s;zC;$oimtmaMWhB5oUfY#qqNtKod=gz5L0SDO@17$^}Fzo}%TLR8s>CogDgclEr}g*)e8nB$i|`n-m5wEXvT0=ODt!M( zRS$1i*$Yd2PMv(e z5%RbS1yEhG9{+%vmnz=eG*FI-I_^1`#twvqHE+GGa$9>#L$}g znO|3XfVHE2C*8_IK4#;drD2E@X|oMDYPy8~>}^m!M*~s1-Q@SB;RR2GluanA0hM1C z^=v6-cf#ZHL(tkGWjF4nbsH;eQJF9dC-qR<_Ktn5wt6>{#4f4 zWlULA2hrYuzx<7=URZqAn3e;u@qu^cF3zv@QTQ9W#p5P!^h)#W8BJg38C_}1^ZuPH zcjn*y;$!Ft*M~4p+d&WgMaMgyo^umtpZ@02OL?ud0_#nH>Wy}o)935s^|QcSzsY%a zFPxueMt#5YJHInR06{>%ZeU0NK*u1^y+I=27YFdu{w|~OS6_W~Fatm0JSwhM^6)#r z4g6OnsxDGuklsr_q&{hw_#YuF3| zMcU@jLb51Pw2oK!|VPZ<*rnet83F-Zm-vVR8B4k>J4J zoIht7FzGrOsJJBVWaF$2@_`PkqfS~iOXEwe!-_i)veqOo{^i?JHTltUeLFw!g z6duc8S!-_UMmZZqN&AD=a{ll~Zw2J`0jP8O!dIhFf!2sFJ@KX8NAG;UxqK?)%BbaC z*FOL4%Ds_O?a1al58nOB2noRM@>5?=aJ)7h=Y;^;#XO^zm&$u8#?62e50Htr8pm4bgP6#_m zdvlsGU;Fz;ig2HnFF(sHWq1USgsu6I6hLLW{HKq)o85x#kN53iPB^qoPvP0DY1aA! z)AGbv@^V_i1{JeCu`;ZjrmoeQ<$DPp@^czpwg7nSX3Ac=mip21oK{v5+4w@kQNgn` zFfCJi2$b1ahz9^(z4P-;?c!$)0ac#-=nLgJeos$s^lp2-ZU+40P5(Q5@-EJL2KeWn zjn%qnz_W%Jhuws+SzGO6yl}0Z+u9SrN6G>E3mp%9sU6!GN?q=H>G3bbM;|7E zqfy+I*8c0zFLqS$)u+EY9RPnF!4qG4t|@?PNxO%$=KqQMUEmIEjamVW5x!Bddn0=D z_Z+YV@V-?51@!nC@qVTIFV!!hBaRU)!GWg0D47wTbbvHKM8_yv{4WQt0G8%}Kid3_ zxE;|e9V2wlgplXsLz;vRBWZEi5GYmYQuR~K8(}{iPtsv9$KO5x1Ni$qR86}Z#l
gJ*M>IQjBRplOtseWyE2|TvcXH8^Bgm)?dtsV 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

8P%ZQ*59mmrUWC%gzQq%ADXLkf?D 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 dOT@`a^VQh@>0h`dZ~FJyx@({VqF`sU0RV;=6> - - - - CFBundleExecutable - ghostty - CFBundleIdentifier - com.mitchellh.ghostty - CFBundleName - Ghostty - CFBundleDisplayName - Ghostty - CFBundleIconFile - Ghostty.icns - - - diff --git a/images/Ghostty.icon/Assets/Ghostty.png b/images/Ghostty.icon/Assets/Ghostty.png new file mode 100644 index 0000000000000000000000000000000000000000..49795c006c646e8a580759f1790d838912ffa932 GIT binary patch literal 106126 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 B$OQlZ literal 0 HcmV?d00001 diff --git a/images/Ghostty.icon/Assets/Inner Bevel 6px.png b/images/Ghostty.icon/Assets/Inner Bevel 6px.png new file mode 100644 index 0000000000000000000000000000000000000000..678193779e122f6efb009a72e42ef335335317ab GIT binary patch literal 435672 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 z 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�bxE6? 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

Vb2iD^8rJCOf@yC7Gj$ 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 z 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%0D|QRYd>O=fVi}OYMpycjY;iSLIc_sO4@RvAo<5Vy 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≪AG>@*d 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 literal 0 HcmV?d00001 diff --git a/images/Ghostty.icon/Assets/Screen.png b/images/Ghostty.icon/Assets/Screen.png new file mode 100644 index 0000000000000000000000000000000000000000..2023b6ffabbd53642e0cdf78ef4c0c7ae6b49378 GIT binary patch literal 143481 zcmV)@K!LxBP)tgNkk z2EocouoQd%A3+~LWC|6>`(-S&kkKYq!M#sNJQ!7Nb-A%w6}Y~cl-<0UrmtaAffS)vfazrq?W;2Lh@ z5jOF2IW`4V+xo{!pRLBLtJ5F)Rya3ito1SVkBy%{g}y8@rlr{R74^l6t(A$NISW4j z@|?vTtYx{0N4Sk^xPY~!QXz!7S;uAE!~<+hT&UD-I(0U^_UeB9+G@;hJJf3Y`E9Ce zKYbrfy${WAOZTL|-@mS)5uYETDcY-Z?`vRRCY{&xW72P<7-RhW^|$r!r$J-wjz_4p zKi=tMm1B;Ny#mfK?->fD4Lrb2T*i7*t`NfCqQzNU$2~lqsDP;_r)mktz=Y6(F$_pP zEEr$mTqS0`_!?V?6xM6N7z%L)wbk$c*n*&<&U#<-YX|pZS$)#6#S`x%|gG zgizu*uHZi24k&2)1&X{j5Mzw7WSe;mirp64+X=_i{&t4@HLCD=i~G2W<4Ng4$SY{) zaSM;JJ*=SF=|xN%>t?NDj4_TV=-R?@J6GYejVHK;^Le!`g#UxxxQIJ=HLR#fff8ek zF~)_8rP8@&7d@M}gNxXmR4|0qVHYmpF5WL**rb4ozu3E$5No!x`gNaE=hfZ+f4yRK zAcEiv$4b27$bmZY5eF&?I#n=1C%!-At^Iwqt57Hu3WX_g0Y|v@fbaJ- z9`qZH7p;mSR;qNK>CF-Gi){tN5H)8mW-jNzsvS=h7w2nVW0kxwE3+Kh&$qD}9#etJ0~ekdaT#u7I97a}KuBnOJbdGHBC z;WRNddDTSO7fUv|*Tiqd$|@46$f7|u!M^UFwxh@5|3Bf2WZn0i@I|}&w?9tbwiX_m z%xi(`!mNw!UkIBQ*hWUQ80~Z0`L-`DI~TtFW1aZ~(e#4nZySGlxu|5NN~g8m^Vhds zMLuB(8~+8vEPT?I7agP>1JJi+$a|jL=i!s7)eLh=>U*SB6Eoj)K**O(PDq>SRcV7{ z*g#J;>PnTCOJ5KXKN1oDC`C=o9&)DK`Ht{Ng!Zfqq2v9|3zCL>IEw2j zFv5lsf-^5rb74o?gQAG7OBfZ2^#z6YaOhQhUu^heL;G3c>&>MvBHaI*5|Ba|knq^e z1-rcqQs3|rpdFGAbx8e$VBzC#@aM|+5H&!)>_?)HwgAKaK9mP&D#7!Qjc0v9QO-)0 z=1H$a#P3AJC*N4ugd=Ro%YX)ql~{w66bk1KpA;nslSMd|7<=9S#|cKRbGCF@Ao6g{ zx5uwx9*oy2gL6j4WeGW5Mz^ovw#(Yb^HUN$pKQGAm7<`PDovldi1@CE_|u6((Gr4& zt}K^8DU@h&NYq?pko3i}a~|RcNmYrjdB*Cm_WNSSCCtY2Aq0)C2Y`G>Fd;~Jl7}KD z;{hUV(*8TPiLH4BPaq=xtnsm~sA;82xpWl~Z;gn5=I`1V!p4FXQZU0G()Bp{cH8*{ zUK=?|jFcz+$v}^h^$9@cK(~wam<`ode(Z2>=LEKY(IERr%F8nBH)$X3`TuS%h9LIr zIUr?tA9WclughMf|3C1Nf1X$Do@=}Me&Vyv%WJz}8|~wDZLdM+!I*TtP`&(#J|6Kp=HWTkRpJKAX}efX*XQHV_936QwQe}(jn!+om-t!xf=79L@SSDL zyVH2wkM+E+sBNXEp7s&(!x8ZjDQ@z@hI?RCY%N|hRsn6o?Z+(}Bu2+l`(Yoxpvs3t z#WZ%bFmz(hG0*pcSfMyR!nLD>+^Q2^km-qCIE2I(M!IcLE`)6qnCDNtWAc9F#cZ73 zTxpW-i;!vTV4l}UJePI@^T7_Wt^1Eopkt(Pabdw>&Z)2fiKM*ZlbN z?Z*Q@gQ4eeS?K3AT?g~^zXiO8d1$vI^<*EYJ>3qLYY^k;R2jJD&EeXZGY~ldA-u@> z@HhPZ2jK%~Tt#|&rEHDe7D4DWq?Th`*m)++h5ve%X&>rq#UZfrNf} z1QkHO01KBCN|E9d%}9x_D$#=xaXm0%_gN(5~GM*45WB?+C2pU0ZjMPp@McxK7$&<#<1IA4wb57{<@B9eg&> zHUjOid#?M3_Eh`1XIjq{vjf+}b3&d|II6y=XOXo7AU3$od|9{u2I$;D{tV->Y~y{K z5a{WV@WqZVcrcVLFLoLa{K}%ll^#oaDI$J3BK{jaH}i;_CN##bfm_&)Kh~>)4Hns? z#HraN|JmNH-vH+ctn+rF9cRJXyuNnrlf0#{cE(TYtQ#OtT?c!j4#A4$tA69y&;}_( z^87v!kaB2?&xt-)V>j~cdxGWBKFfEXRR+f%n{S1D-8}s9V1B_s#@qD3o*pfD0+A3q zF+|S?e@}|}&M7}f8&FotvoYQr3P(efaGa&JQyPpt%LlqGIRO#uL{? znJb-B`kILNtI_vvP}B^L^1U18k%4^t#|*!nU1vmWwh}X9r4xw&zvh!Jmn3V_?h6&x zhSjeIS75o~M+-qMURZrL&OG_fmp#q)@+5ZY{^r~E1<<(=ZeIxb&tQp;!VFkk_$(lH z{1CRr7hfsrTACBSX(X*vQ>m)<&p^UP0$V1)^3J`*J^SWd5_5Xwu?6F*(nrGMgX0O;K_@fPdEPf zQc>wjrPX3WdVMV*4ces_Spvwi1G8lMp`O-2tx-;u6FT_3WTm=jEc_mF7s_5E1VOfwPRb zDPdD66bglcOS0Q}1LkQv4NHoZt(S)&DkqiW@C(O4t+%g<8q3IXDGUJ;NLT>E^;EPp*w~4Zn|D zIR_2QHYrC$jWLHp9Fcy}cJUg5+d~X^&OqEqbOf-W(-=_b3`5v1Ew9e&jfZZFl2@8C zeMLn4MZ$ZtptvbvQz#S(Phhsy>a9UYExYv$OgjeG>!FBi!aK5c#gHP@P*&t2v>n|C zybe%vscmmm9iv@Rm(FcNw>8G$&O-xo9#8COkPodBv2*E%ur)sV6-CV}O_9DYBK||{ zoc7S6X(en5g|ovp^}=$#jV-gM$P*(oGt3nwgpyR|=XX1o;B))!i$Tou+tG8(o*VYe zWxO>&kY&F$Q3fPMi4UB+oS4u8GuJ=e4-_#7Qbu88^od~AuohxxZM?@rygCTatJ8St z_Z3C2^rGny5%0`+Z>ASFo2A4}t)SNG{?vs3{QK(@KP=;~A}c~@kRAdyE=@8RY0eUQ zdmg73Kij;((&Nd#KcT!C`dmN984_xY382U3*P8(wM;PSGcIp0t9p!n+&kJeGvEPaI zy1~8gMnw;vqi075pD~`76+1CR&r=UY*(*8eOC#bhg}_OOo0&q=rYGc%+dCE8?UR9R ziJUpc=M%GeSKT!!(|yrI9m+3Q3bBp$|JYL^? z7Ha?#J`F>WLpC`Wa=Xhn5>>BGGED9HGhU`C&Ik7*%4GSd&6EwnRVe{$$A- zv+bN~qLU|EWR6AO{61tv3C#EW@ZYP*hyP>=>xAe~ARxJQ?HT3rc38hP!S6{#=S<&-_h=f68WJ}kc(!sRd{JPf=#01!G_>@cCz^VV-I3SVg~T|~s&VfQqD=d_`q z8JrVQL&ePowmJksgW|>@phhT)A2MRB##)3zjZcjy6Z_0W3#;#t?)=uAem}{%6o&@k zGzqw0Hy?-IvFi!4Lg2MWiCmU!=e!A+=M&8Q%5!G?^UPh|10u*E9KoLNabR{e$@SY} zbrlgd$a{yt`m9}tXtQ=yS>6_27xi^rjWy5H;{g~VMYX+?p>o1GdS9tyLcZaMWHh|4xok35j~%MR@A;ypT0OE{u;v52Eqo>KX3r_+*}&o8o(fb zP2du(d@O#R@O1FoCD_;>UzB9LIjS84rl3U35KC{gYdt@kBym>6JWDc_9Yx4g8@m0x zs8WO#fnzpSlVL0w5yJYT#tEQh{QGS^2fm10CkQLCZ3&2OYJx26=+*Yq#M&H3JL<9R zjJe$1({r&SWmP+dm>^>`p+(DZ{8$dg31#uV5ZGIbBUT$j?10d5!q@(~=eI@ipLTjB zB0db>8zyj2+)(e0#)d(Qn{N8mY)!sAA>*#Cu{Yk8Zv)c^g?m%fLuuLPXF% z?8=TNi1`<04WwiH6^S!q{FCF+L|h9LZClyenRATLVL{4HVh)UuHi79y&pIU*l7eE_ zgOoF|&i0QGac2xzUYGTO{n2HevEXk6*b?>FbzK&b+_KsiI@+s)LZ|WDuPv(oG}HG) z#3!->2S5JQK)#L(UK&H(Ot-?Q#0!*3ykw~C3a?Fh6=Ry}@}w-NJXgkmJd=y@94 zIWovREn^4;N)Yut_%K(uwU>m1L|8=0k6TCN3F&$&;+gFu!02Nt490yI0P<4p=aGAk z)=PU9<4dZw(-Y|k!5+z4nmX0%xbqL;C@*y zQ1tkmcD%m(Azgm#yB4`q#-n3d{mjh@f33^7{*OPc zBH~v=dv690j_}^#CIaL`QS3ug19T1TJR8EG>uUn*llc5falV|}XI9=J-CQX6a6KwU ze^XHHm_!%z;e1&@?7JXsX%g)cJl^O0*b}50%Cm83JGx&Pf=)=R6`rJR`*ZEv)*{9U z`%&#_GOYo2C^WfuJSqwMiLsL3(taLU+m2V~jFA^Rd9M!Jfo&z<(`o#7RZ`$_ro-(W z)YQ&tBs>jae3X-*y9;aE%ZcKOec(#<4#=t|hB_WTA7ayWmcZKJwFs<rLd3i0) z3^Jb}v%2p51RUFcn!q`%`8YkXGvJaNE_BG2)8ajyKZuA!NrK0fo=3zV-PePI0%y&{ z&C~+NC3kbbOz4w+9fxZWV2iu~EJB(OyD@A@vaicdFJO)KDcBr4q9Q?fp^g$Ox@|vn zMUf0+mDv!B*%fka!xuRk%3GAPrSpl6Ga`-tys`4Xc-ka&kur8xr%!w6j zK|HlhcO}~)*yJ2+CW(WNU-yOE&Rx}JwsPVxPnwi{KX?H#Yn8@1w5gm)|sCXfxKs$QBektK+egLI=G%TIe)h{P`sj&O3ckMEo5Q zI3zS}-5*E4PK)AZBfU4c&2obiGwrY3xv{_gOPKl9V!Khz3(p-=+hiOd(~H9$GY_vRdIiX#AoP7f3}4ajfsJ93C7b_}6I z-_!Z~o+p=7INy(az83_J^4_2aXJi}bTMwQ6kxs-;VTN5kE$_^p-EldwjyLp-QWCuLXzl0+tT;R@j7UNtVt=mcl^4pi_jh)mnd^_q|Y%A?c||F z$JFgSZD_HR4`0g*o%feV=d|C!d0$@ObZ>+bH-%b-pKm^v_muc;_ykt3GP69VJx015 zGMiuZ*KzoIo~9Qcik$QQYH^_2X5$7VpD(>?ukWKDeuePMYC8{Ep7pVWL5Z5jBy|3@ z-qAU|^o0@e-iHx5XYIW)NYR2XLh3%`+gbi)%)|=4K_urNyHDtJTWST=_X=nNtMhg2 zxF36tc@A-K#^VzZ9eTpbvo>9_ujU0{j@c=%ZTZ4Z&C`pD1V7Jz4iUZwqR4y+il>BR z_}b18It@hZkj)6bu%yLlq|b|pe|T7d10Qa31kTh1-6MGUFc6PK_=3uH6&FmmTR)8G4wt9)IY z-y*<;!jr62) zVIG{jE<@P&93Dub(hZ{OkbEPCnY59M>u#{gA}@pR=S34`l21jAuAdKo;I{mjZZ%G~ ze~!n*C69S>s@pt20@>|~1fSn{$_r8`Jb4^YXfVjCMa)#k(-4=dJx8kOq=fY5w7*X~NNIThZi2TZ?F6+;MuJ43U z0TS19{q~=+Wk@sDErMIZ0x**YsYF_#@Fa1t%j$ZE0q{3s*N#otAjUW+5jxGIvmOgw z>!Ce5jb|T9a?G1n5%CA@2C(on3{g9Zn|9HN#BnG=fV&;ofbIV))6>E6qzj)3WdU%%QXca5JwWKZ@$VrACEHF< zB6Q-2A1w*;u<4s4;#0?Wa8Te}E+lYD#1smJ*+M*u@IE*WHLuf!5Y0Si2S*sV-iW#T zrNxF80Q@)RGn?u<5gQb;oEB6>T=4QdPnT~%v4iEH4xr5$2p+Z-wH7)kc49R|6FFMw zydDwXT~g#>(wigVKZU>~Voj z$TP^l*Z%{7F<)3GN8I!9$BQ0}e7jq5ZEK2>t<$#UU4eS!9Lh83a#weL?;GG5BO4d6 zEvGjC@aV|z=tPhIiilTAl1%@x&kvQrDb$MU6B?%`TQiVBgA^jMnN1vM+XttNA8(Ij zP0f$2ujlgM#o_z+4a?>Q74MgR)>uD{xujx2^)ulyND*{02Dk=9l$Q1T!0ttBb1`T! zuvPViy{%Ul?ZCVeabeiRI=cT`1lrMMP^9=kJNpI^28bS=hOOF^06aQmd+Fi(IUk9L zFDYp<-M4VwT>>YA!wm7s#D;e9i!#fvFfYH-dw8S*=P+j<9TKk2-4%I8jEs14X@K8KLv;`i4$ET|~t1 zEhBLDYJ-7He6Om*>^lTw4)W^~A9rrtGFkhHIh90Bfe;5vIOcYx(Kg6f={4GB{)OCw z0_!UuPafp{k=0Ej3?@mCm3^1cX6BO<>1~Se8vnk`x!5{HU54n)h`m9+O%dY@AnKLy z+h(MHh=eCZhBoQ3>V7bA!J)y%%*vfQuGDo96GDWbU98XBL0b|{>Feb{}njyBxT27?%h74@x2%=0foD#B~jm!#WW zU3TlhxoF!US$4P%Bk`FzQ~hFXsB4m9U6LA&a@0oa@%A#}Dmp@UmXzrCc&i=}Uih}ZSEaMlBX(+vgAP}Cs0 z9r55CvGa(%Pd>%DCegZ2R$Q_XYLd;D{TV{n@#m1VX%iY(AZb$N&t<-z7A?uXXtClG zN==4*a>&X$Hn>equt=UHosd7NNI;UL+TD{?f zLTBd+ogoLmyW`rom1ObKmqo;Dx5Cu4z!``f@Z6xl>EVkTgJesjigAqD+ZrE7eRrS57rwFh^B=gS#<|!L~->?nWLt%IWtdJIG#ny#E z)>AgfYOp1aEW$QDq29n45<+Z-`(uyu>S4+E^0xi@nv@#^ToQfO4g+h$f8Roj2O=EQ z`N5r|gqOmwL&hjzl#}Clgo5T;mqFn?K+BUJop#49Ow!)T?(b$6p%Ovh&c9}HDHuD!D)3{T(NCW;H3)%u8mz`5nc;oCxQ z(1U}*W^k0G(O=0OA|Kjd)OErxkO<@msxGVB-%LTYr<$WgUTTH>JUwyrwO(p3PhWJ7>>U8)312D z_rw@CEyL~jj4JW;0W`w8w#7@u?KP=T+lyybB=-sgbuu; zBZSWPmXrxh?ZZMJ*E^|!z-b@?$Nk35b|7*HiOh$*_$!=#yH~>2jA0DATxLbn?}Lt! zHpsPq|6BX24}fOF>9Zno?uxv>`kfE$P<`;povx$q13S;HAm@pxGX@8KNQ^HurY1#M zn@r5i6@Nbi;iut9%M;N2^ID?fY;Zk;ND-m~1qRrIGH6#Hd+bo?^m*;r0C}x$1Bjdk zy*UB>mQKKC1Tt*xWA&j>OzVjFlNP2nv%onFjziDQ-XOF_Om9vExvRNGsDV6J_Wj*Z zbpMQgO49G_QsWZXe9X6=BM>;GKYr**ezn}#cGK=Vxt1gxX!EHO9>WunLJ?vDWA1BJ z9_<$S=XFnbObxoHzWjr`4?7|IeP(;%uyY5SZhH$Zne1cGt{%L!O6=H+jK|Qm+ z-w#jN<>RA?ZL7S~UJ;rK38{H0oS#_8x3^Rul=p#v2nk=PG|1mWG0+3fEfIv*L2O_- z;#C>e9Uig&L!eke8vtmN;!fz=MlUX-M`s{%Fl-Hljt*P)(fbyDs^4SN$`hL$BEH9xP0%0mKIBtDH|o+Q&r+dMBVy#6tl@9{UG2i1%Wc zFT%U9&v;FHKD1atu|xZcWk~)U&_V~eZWB4C(6PeS-rIQolTE*6gsFJ~r?Ul4iHkyE zaa=zNJIl9q?GnN{R>nOd?7uK{ozZ7biW?H5497>#d4KduJ0+Pw zG>Pb7VN9$HkX2ilNoDw*T;JU{5n8)d_n9kEb zy}QlSV==-hNWZesE9AP*y5EY_W7vl#dP8JFXN>rLZU;kOWN6D&|CZD^pN&%g4l_qw0U8=&p!>-nuQrx$>P2uo5<$|^o{DkZQ zSQ`yGE*=C3vB!z0etyIY!IU&L;5Fz1hNYGn)DjvcEt0d=ajT9g`Mg@zvl=P4R~Lb9f!nE9wMbZ9(nslDA-fP%@AW{ z;E3mrhw{)LiO|^%g-#E1BZBDh;fVO$ctYuS!HYu$&Mk4nyf|9ipvcJ)bsbl$;ICf# zK@N`-6N646CW4`$|lnuV{QQ;qKth#-yFUA8PtNvh9-bcMMOzRo* z1fd`rnlK8l03~$977-0lR_*qq2;!9>xTJkb&Ujs)bQvKiI0tY}%IiLEop%q|{Ul>n zq9%_SY!k6!JQv1w$nyy`5iy3iAOgmP@oz3G9*EFf@|oM7jaV_n4CIk(L=3_42*M$T z*nrR({f17DP+Lo5*xGN#6G`9B!_?M2ZV8;g_i&n^K@U#5Id@!eSGUjgw!qp=k7SLl zetLx858DCAaUmfep5t${sfaEWZkn8`KNgbkvpyIh29Qtg5nU;k@y9ryiUfhJ7bWd9 z9=rka3HcXV@42p5I3aIKLezi_CVY~(7Vjz%p|c(H=roa|-p}cQVQb$I zk32n(hz~}@QQ$PJK;VEE2fa5#rAa(DWZ!Te?<~keD?{Ax+AYmOQAn&TA%Q%WSi0oR z4_C33Q*Q+e3BD#mIt(X4?u?ai00~`Sc2I00G)ZTq9xzfK;1VdGd}|@#_roXpVh+y? z+eg~ocA*vGZI2?LvtwI*C{eMveH179Itm*fSsVKAToXF&2+>Y#GlCcmU0XFk*xElu z#8o`v^bYXiG!G7Z3uoPf2^k5D;AKf9IW`!f z9uMsHW`Zs^2fCi0pC@y9+q!HKj=}?CTcr3g5?v&1^&Bpb8}7Nt+jqqY598A1hS248 z{`Ab)jmHA>CU&2E$<5hKhF>ob{~nr zfP7LH%1;R`dh*bMWk1Y+26<5L2pvjy$D4DFACAZObdH>S;L#yrYxt4SuZ~BS))Dbn zu$$Ut4-h!$#pxhSZQP5a1x}HrTE(hy6%r(3211f9d$TNoMlxWONniUpo49}TqV(1m4pZxlFf}G}b|rFZrMXZqf~LrUPn>+hX4sJZ z14uhaJluY=Yfk&zre5V`{d0dCyCWI*F}F>ubKl)Dk-0VIn_buTv0h$$xc|OXeSgkz z?#OjX;0@bQ&Jh``ypOy%nh*O1$XE5yh88ne2k}gn848=BAZmFHv~)vP8?~#h4~~i7}*C+>N|MyZ%a| zBCjqPa|MDT-`N;$hb*vjB?=gvF=j=?Orasy#{3%O6Oo-ScLm)g-iED7iMk7Qzm_E9 zzM#ot`8nKY#(6zWyZeL?SWtjqxEADrXQV$uIU+`&OtaI@M}U1oA%Zrh2fa@anoop| z@6ExmwO@}jPhZ708))LDK?f}BfFamiqU+C% zzLpJ8xR6#+v850-yQ@G zeArV990%vWQk!2TTxdQhAxU6S;_ch=|G-uJ^`r#BtFOreCk}by>)Hg6a;iUBGMyoo zQ-;rEo{MK>PIAwHo_l@N_IyF2`)1F5Ufl2fJhY|mm9T>^d}G^tr~~s#L!EZg+rT^w zAP`tt?4Pm^V+4Dmt`Y}C%t)M_ILV6|ef_cl|2?3{x!hgf{C#5^*mzuO>Jaa+5?Bihr?bp!UtdCp)?^!*^D z4(c;;KmcQA_nGw17JXPw_k%qTNJ?>D;G75y7@zLb9zgo3y)`Ie4BI1K1DGQ?5)pyz zFmb>|3=({_hX7kbDEMV`y+Xs~;dzha`5j?1%pczS9=+f>9&dVlhPPby_jcPKj~GT$ zjlZMQyg9wdX&4P#dr#91XOrHBn+>cCFV3jIK`+iu3Y^7|-+FLy*Sfzd>-U2YoH^!C z5wiyfXW1*F?5s+XJ_FnpN|Fy`g#2-*q=ne!tJgq`$OGC( zUYwDwqB{^cZ8C|-+1-L%h043_$?Br@f}bB2fO(Q2>lj(Aul_iYwix+@a~LnbSDJWg z@udkW5>@~YSHSr)R>(C0(*lXKOYWs4IXYxQ$4%pJz5vh?-|xXaiRJt2p|)-eExMGNZ-7$6+&ETJ6fphcMPaT8~denNP0h8`RgIh!4NaM~o|u4#A0&G92g4M2d%>gfpaLE=kS z;20SowuR`}8LM)~Hn5Cb!NPW-ypad}VkA?MPR#drMxjJmlMxj*K<**=Fc&A2Vuu>6 zr-+6ob~r!UmL?EJeR2)viqvu1(rqNjl_Z*isPlg2=hqMhI{rULHuZQtyV{Q1Z@iu_ zW3*4girjg}qe5n$inP~w=YbX=LRj1)|5!)c0(&S*07Rr9@R}~Cp@mL=j^3Q>yJ2e$ zyE{T>3*HPH?kjM%#|ap06WxxtJU1wA`XjD_U-uYWaW{yO>HbC= z1~HN=s0Jw!WpzCsuZvJ~K!g{AEXzWGcnATGQQJnl%#JzdG;}B*!r&9Fx#Ovqvb)T- zo<5oPkzYa9V#zN*n;6JHw>L$63ndV8HgdL6EO_mspkN*p@NPhu*KM@&FSR28%AP)+ z-4Qy^hazWqYyziwc3_KX+*Z0r6FEJUH|MpcBThE`JZv^VKKdE!v2WpweEWuc;83`> zoz+HH8~~P&VZF(^^OqP$Mi@@%El}YqUf7JTOWLL5EmAcpZi-Z%C2s2ZEj(TzF;{Rr z4rYBS8WQiQfIUw@VZXqWfx_n*2>~PTxL95iuqVoba5AClzr^wfBIkL-h*xJf0C;p@ z$2IWg@J$G!$Ir)!rq7LtkJ(-v6gWMYzyWbXV$qAx-5WO*7GQ)35gWR`-?v&(E-ViW z?Wp-EJP`qbggXDiIOa7%uF6rH%?6w|Kv^L3v@d8|zX(t5pt!(taP&PV!)sX97cO%` z3zT-QL=Iro{{9w-&=KC89=3fi;*j0c*jCXPrgkrZQ>3f#KkS`PsAb!B z)~jyax^-`z|EH{T|K~-pt)>(0*-$$wXzMiCUU}?&c&e=S6u)bf`z0dPoK$-LFNH=V&7`-g%j~DZ_fnYH0Q3!Z} zBZ$AM1Nm2T29eR?qklqJAifY8LZn;^e-SSi2nAs?z*vybM_daivsmfRr4~9LUy5wb zf^jzIU%Y>NaUMU5bEN+vz4|T_U6J;l$0jb0jid!cA@)_zb1>d)E%scb__FyNh6FF4 zlQ}`Y8u&?~smN&1zKk)LTa-_K%QaG}$LtBUpJTtNnX%}v+RIq-Z zI9?=q-yByq&Ky3QQ&8EQ!XGo6vw+#0|MkA@&H1N3i-UbQE{kKndvm#Lbe9ZXyJ39fPj`3w?!tVje+M!>*M2pYx5%ENpV!r2Oo~7|w3kU7P zaN#JxR_5kXtwH`$$_A z%df@e6)>bJ&E}N9AhBozJ_SiileO`J>;U4eGr>8}-(HiTpf8*&&KcTMLXqcFlX&)1`2?Z^u~bad1KvNtRr37sIGg%cAJ0nIyoAW<$4&R+rQ6BJ z$mZ;@cBJ&85%xb2TG^c6ukUU?`rqGoS)8X7IQ?Uvbv?U3i&GP~Oe93k+yBrlkZ%A7 z1X~bY0YQ2wJS@5AJ&BSaV-Cz7<$}r2Yu-OX`6X|nIj6K!!kE7Ffn8nA9J=+_z)G8p z!?I*ahWj_G$Hp?m5~RQpW7_+%pkIQhsuuN{dWVhm4ynjpvuJRU5m|vK=P69z;+Z4XvQJkr| zjvJOUPSveta;mI2cZr+50|{!?6_%|P4zf8Pxoplqcx-|5;SN8rS)39$3%E?}Wuc3k zE^sjWL zuCrzt?#m|l9Z~|Wg&qG*XM~Ay*f!@SB5-D&=#!ItEr4jBBabt;o0IW5;V04Biipo+ z&yRTx#HU3dh=P3xh?S6d*5x1(R(;Cb^8{Ym3LC^oghNj130I%>pW{dcM-H}kgt)=; zM(skV)YXZcW`Be7x;9)b5dYQ=zo%2#90;A4dVfyO=5TM$4|aI|m?G!zu&MT)Y&5%Ic!x#>Qu zLWgzkfP%{cvN`5h>2?T#K56ayk129~omrd`Icr&*kDADNvA++e1kQ3Tfz!|@vI!jb z=66mO0mPqUE{x`F?Kf*Cu{0R>ghwINb7Hwg-vW|o<4npl!DQJC^K3v$ z<_P-a^OTcp0 zbWF4({Q7wn*VPmG-1y&QdqSFz-H+9Q@#o@U8+cK6bOK=e{@e`whqhjjh^z_fQ3iW0 zdXP2gWfU!YHcC7xA%VCn0z||>-4M63oq0CryhKi+M9yJ0=gG?6oYEVc|NYVq%;LNi zI3;rGumNUq4n@v+Ly*PsgeS3c>w>q(y#3)C-|H<&@N|u_in-=H*uZJ+a7BIgmf4Tr z6T)C@gWtyYGZlpHzF>U^VgWHloOs>+lw3~Uz$bQD-{)ge@e`ajDW5PT?KfNZXWBPK z{0HfO=}HIeg6TML}eclg7l1N$PU1P=G&WLcaNHpCS~PC$ZHSwhfM zjKQ1F!r+Z^h-9s?@R!$)bgnWX(UH%SCRn_OuPIM#IEI{j4+wJ5ci36cHD7`yA4Iit?(7~I#v)6jD$ zku`4AW?P|<;9Gy%cmXsQ5zHi1nI-mxdWM}B8HBNg;1Kq(@y{$H$)`^)N_@SyEz~nX zd-bgPBl^}vW&^W1EvxhPQ!g!>v!Jp$IE27wbAD#aW21iu2M%B_4nO+I4}R_~Q7a&O z({QOs;<0?NX})GVw?BSzMzL@r!6yW`ISGMD-_DLUj*+%3uLvqiOB|e3-Kun+= z)Det@dw}9Y^@%=SjDY-$xe$rWLKW%xU6Uk}W)Rp5^!0*`l)8fE~zP&y6vyTID6gVC}v#mJe z;K}`2Uwna=af3U^389I?g9sD2~weaEG zuwRVj$-O6+ljS*jZvlxu`^34E0-(S$+BOI=;>R$^E)13>aS0CFqo1y$T}19}9sM_l z5C#~7BHV#s5w>aOAr}*ArsW9ms$E@u-JjR<`GRI!LZ_}g=K7Pu%i`@Hm(Xbk5#SI4 zxi{y7Z?r}oC;clM9XP;aqnX875NB~ZC~(f+Ly>cq*3C&R%QboQ@cuc`PV8<#Oy}ch zaU%re5q2G-|BiqY^ko_P!g+S}fe-^}6z!ppv?W{yq{_uy;vVAyffoN36`2PKT>x?q zp+b8h1SnEikN$%cDL`AOeA3>}U*Cc&sIGgYLx4lQqP%C1$YPN_y zORF{7uc8#CN^46gMeK?#s8KPirLDb{#wJRGDq_Zt8nqL|_~-XLFYY66b04{`^Zcyy zOrNu+s71FbF~)u}L!J?=z^*P=u;O>}YaEjEmxGGR>v|-AIx$qXfe1EDgSE+v{Y`8h z$yOP|WK*Kf*U_TlS=b9l=rH2zrSO?VIdH0^9Y7Xs7A0p{ve@r-ql zSwY>s)V|uW;bmDNd2$UEDVzZL*}v9-B-6LZZJra z3Yf1Mt1!xyDU^O)90>cU)3kQ?+S!OrO;0^Hg?QA_+WTX1-yCHuVuOqOItAX=RYm$9 zmOdTUZ@U$p8sd6oDJmWAIRJx6)ruNQ$0c-qK~)Jmdt_f+k#kDRo#D-)e`ftv}#Oh3N^ ziqVuCQ~yFBee6o=o!8|(z;V+^TFJZ~36D<(3)8sps!y-3bP~r2%ZojQTG5A=To8a- z_KroQDU#)}Eix*2=za-fH@%K79PlSzZT+T7d}Rbc_le0|&_nYUS8ez>$T>1d0Q~o- zQMmY*QXf4g`7;o2!ID_k$|6&(1Wlq;&K~f%+YGzz+$oy4Hn51>s4oae`ay|JJw2cA zW(#m&@nSeuxq6Br?lcspbiQGsd7!%yWX8;D$8T=hu&Gg&ncu!ZJFg=A-(=E zG$Aj;BA8DnL$O%ii@}FlkxGxMXhC#veU6)4jU86^+91R0f6^PT4ytG{=4Y~)f=-zR ziC1lrR+43?IOudt%E=^Sd`Y<7Uq;3Ar3?;u&K@sF(qcpj`?I2(DghbMl0FwS>*P>b zE_0%kg{Qfh&ul5RvPOV}x+KLt zIa?vA=-4u9Q!i_kr;>uA2HqGHSvb`on@}lD?K*M3f1?<3xmmGZ)Cov(=Z+m-M^iK0 zOVvEVjqEI@B(FcCmS;0$Q&yulHgE(hJE8X#T@H0bQlDFL?CV%{{L_4{bx+SH6Ireeo~{hO!h#i+!qno;-~#3~`S<^o$dc>msrV zs$mny>(#g+cnN?8gWyu0zq|c%W^#J1m;(j;_ zktrMqzU}2EoC+1eityMLHk&Trf=A;i!TX{Muh?huPFo&jGjzrzJTib zZ?5yiJa^T$6QJd^U=owRwY}R5gR9)PB@+Ft(VuPbK6mA}MyDcZOc6`U)Kxwe#J$yy zMbhBuqMD3K)Ji~pc}>9QtLt~JQ&4dboH0J*b> z)HxXVirE)Dab`*RgWutNYMXZ^F8R-rj*7dXGR#rW9S&=iWt?>i@n`$7_v}7~T`$i% z#|OiR7Th!e&=fPNpb}Key9B(B`kIY&u3liP+jv(+x+(WhWQVYCIQ8pD!FWcbz1&AvUUm8z9d zYkwL&^rB{%F`5^+w|{;oaI$_|13r}#_tf?oGWb~qGey+9@SLm(HE-cyu-o82*`qJ1b_mYt9=&LVpxCJp|vvh&Pj;$&C?-1 z2MNU(Jk`pz9I~f+_>2KSGSnapHJkcHd|&W3D_ZY`Hx=xyhv~K}Na8Wg*?=R%^3F+n zEo|JooEAFbB}BBg0m9{~JNh~CZq#fz7pJ{^)pxJMMuu(rKw08YE~ezPN4Z~O=6y-D zK0Sf*ci0W7vHCbUSwi2v_uufe@LGBDx`U25p`xwH-YxCaO=DA?`Psbs9w}!ZwycV! z%tm%eFn%Ogmdv9vJHMpD0ANYQnINo`sVKC;gp*gfBA1H0+;4dFmh6({x% z-S+#wr;<&8Hk+yrd4Hy`!5KDx^5Zo)Q}T!|{HooM4V4`ILv0zo!Krp4oT6#Jcuv=Q zv*%l>a4$!oq9Kdk+!zpWTofjxlPkag)b-R(?C;76ddFHcv#Le=kb0ec|9E$ugzv-( zt6UOdE@R$^nd!py9YOnf2z`tm;ax6jcX=li#ez;$-_35$=p_!tt&2k%N6s<_SZJno zSvC*Qfgy+krswA-OSDY&5_e)Ug|<)kmX*v%+U%Q&(Q7Yb?VkJ5K*aZ5 zAe#n`juxONt~)PtjQEX5zV4^5cuJOWu~^&>rO%Q2*n9*o;l}vikr{Y%a!faJDn#4 zM;%T*V%YFq&1_EumiYj)W){tINBsVz5}zzFtVn+4_!~gAfv7vXSB!FJqUG4`s^dgwP@zCbKGjtWwf&L&E=iD{)Dh_19t3xoiddKV}n< zzOBluHjw(Ih?LT?gVL%}T%{7T;Y$7f_jmT|zlaWEK(NMws>CVdDNhXz1V^tY08A`; z+I0SsEv@ZW{H-mO&7Q3tMr{{!FXKxi?%16ZoQZIBSX9em*i-qKB6n#VZM=KJdcqDs z{6H>`QX|6a_AIE4vXC$A{1HckR(noy`C?<&i|5i#($3mDuDNI#i`52CHnS(D*%ey0 zdv5~aSC^}E3fTKFI zvuMneyf6d z73-$^z+LFzlbs>kqkFK|N4rZK7W5HaS& z*vqa{QqxFM2&J7=T3cb`%I62eT812FZ$t+#W9A-jFJ$+ci%R-OcD|Kx@$)={9lSAo zDy3UvAVeWRef46x!;;q(vEz|O)@}8r7+NLcV(KhuvICGeIPYDW9o?9%jIU6JjauC z{?pK2u(v4P*FDk7X?5b?3A*`Auj9H~#q~JA%e4ou6?ka}`*a)1?qRILiFUywoHLR}Vze;V2hVb;6R)AVo5O2aF z{B3XK_lmb?-_G8*tck^9XhTN}K!ZYi^;A)%mCitu-x7aIt3ic)-vAJ}(NgbaMz8fL zlZ;#q%2%y9N90Hd_N1l(7ZV0jOt3_OKPUcDA2%P9^n9w(lF+huJMb-wpv!j-K5@R< zpUqltNdM@&lbWX*EKO~&sxxWWHzFv@`9ok-Kc_weaIXGJD9PN8P*~dZaU`!M8tb9L zr!!L-%=sLu?=NHHZcx13M;~hB39Rp865-$qpmgd`^gj@0P<_s0-w*EnkET_^T2BBp z`=+E)57*lTkt&XLiTEe-|gTfD>5%>dJ}p3zZzY*$y4W`Dgxpn>INzl;;o zmENd+@9o&lE}V`m;?e(fWD#wkEfNJR+p7x$;anj|*qiN>~^v&$NBZ*#QueOin->9nB{H55$0?`R%z%h`;hdWK?2_lE#| z6+pA#k4E}1>ZGNly1zhtXjo?`49Db|5hk8{c=19g>@GMqHHY3j@R>Y(;%AG|w!h8Ej0 zZ`8#N_c($>c}+@GRKS7`K&j+rl%Je>O?!R*=MZUsLRMvEsIsxJ#6>D6;&3RDEBmX~ zKqU2pMW@^uIogRjwF~jvo_s#ydj!-~jc!BdyXU~m`4mM*=3+_?t0p+TPQSr9&ogSy z7!LvV7)LGD*~>Yjl#n68c8NGg!?ZCefDv5z!2-lPTQ5Rr{lg_ZHRzXh=dYW1EGc7d zjGmD3wmUJiLCaj*HVfPGHVRx;1?qkG2jVP{@hr+Ef91S*aBprvo^<*zvXpDpdTM00 z5PLe@1G(EFwH_Qo+hjhrbYZ)@Ef738&B7F`A#&y4c=Lq!3y*%u)Q@CV%C7GULwX%1 zNeYi?vL(i}9niOmpTD#SR7_(m;0Ek8=TILqw(T8P}CnkerZcAEwu7e2= zU(WveWp_E0S@2eb>r4CJhPBHkdXGmAVgMyX|BzuQ8VB=$+>eQS5XN5hu#K72IGfe@z$&S=seku>r zc=+ebhG$PjNlMKd2G!7=wuAPC@Vt_Fb|t!m^ATl^ueh4Orf;9KaQaE8>4qkoHxJ}| z*HL0yo0`?ydpcw@nmx^MR2>0X!eW7h!eyFEkLzA+B`?iOLQL&}e={<1Bd7^LG8Diz<1THKw@zuwRD~e{`O!ODe6g9IMS=*2s{+Gsofh1ztE-p3NXQknX zS{$yg^~oqLnZ*t-a><`_HB88dVr_aaM1A`gZ1G}mL`=J7<3fr{jU?PL;m0W&qCm>ME@0rs0yfa#{m z2MBqEX%yJhRdF$MI%{)bO}?#vp2)M&Ja}D+n{T3wDTG=%RgkIt&tW=~mY38!5frNE z2SW{AIekbc5vq9k74D%f7}q*bjOoa zMKAV@>@!K1zj5;49!@9fhEmk19>+UbmUu8Qq);}v%Lrx~0QCOcn$;(+bXd#1*#?)@ zLENTJyv;ORS*HaBC4P+G{N%We>*$9G!UYS;?;xN*!2X83c!rq4v8D&e^^lLvSCCWf zuBg@9c9MN=0EaoK*7wxAQC}If&LW#f(~r8@ofu_CEAhz^o)^!}G_mbFVJ0GVmDKfQzb@QgJ+eIHWbG+s^1^QVX z(QfxEraC2k_eJ63Jm)#NddpQ-5{^srMlm!9c{H#|LGFhmdq0p<_g2pvIU!zOKAcmy z2Ne14!jQ9U$a}FDYN1>o(%XBjIj6tl-aW6onoazq`R_Swy@M5>RP>|yIEH24&@O_9 z?Z|4RihZleq4TdwyoKRO?V2|9B&YCtVV6J9M>%}lAxA`K)8v?L=pDtHhT3fzUP-vX z3s%0wwLRK8+1M0isgWAiZMXdcZEujecHZ`M#1&|=92Qa&j%1h6@8uJ9_`XqogVtoa z@g&Je)W9zqB?#2kX>mMleydkJZe%8;J6aFnhK!KX8$*a|=T;K_myCp!3OB#6ODGZi zS9KeHB9x~d{YK=~y6r!6>5 z2t@0~)FOkR-8XLL#lH&`w)${}&8BrNaT0c9j4#!e3P@Tx`+R6lOr#~gEZEux_4{HuDkqpKj>KnxKoiqer z&yl^?+(G5U?wCodDD2o$(>_{gn-Z?`U}J7+7GjQL5)zb}X9Fpa{CO|xHu(05yF^2b zGF&i}qQTYg>m!YAGGckbPccT1K3?;#_qkWpo=h}1`3$^Pz{1s<4>VaY?xVNZMJsG+ zVcCYDEq+|H8H5O$CxQbf8>%^6`^fe&qM`Q2>|*8lddsY{RtGP2!S=UcHU=wC)vE#{ zVHe?9uB)4(3>Ruu362pzxHzf$F+`y54=(xb)Cex`00Rq)n0h!<7lQ6x`>lO z96HvD#Fc&3TWxTC^LDrBa^rPK?AZag6U+MgzMv=U#fTn2ZyigtClTvfl5l6{&? zBK*6!TQuGhKMLZrqwqPQ4vExsSirP<$;V*hco5P49>zK=23@ysK6O8GmbA7uX1kPb zdRD#Ztna!VW45G?=(&KHkNB8w>`_qt8w##<=MvVg*~od{F?(S^AN6P=6Akf+W8Iro zknl~>eJ(h_nRhz7cKTuld20kAI}SjBt5UN$7LizWKS28hoxRSZ4%RwafwaXNE7@Y= z)o*Hot9`Aod#vFL^poR`v)nR2V@D_G_?aM>w$~0}k}KEih{rT_6y4Tbz7DFC^>i70 zm(wKf=K{mM3S?zYFUue$IuLT8)_OCRa+B$IQ;}z^d;#NGNTmPM2zSa4^T779lUG9% z*G9ZaN4dZLg7NyH^7L`+bK4Oe9Uyk0y|S-XWhwTn!?;azbeP#_{Im=NCJWBGsq9lz zOrWM>Zy^ZT;{vXrlwu~ng38<0!g>4DB>@sYEkzoHlE-H;Mi0B*2iK0T)2&jif!+zo zaX9Pr+9S>kp=d{Zl8ETV2f4$|?>RjNZz`u6ZoAgw4duvvka6NQ>G>h~l^csNf8lfXxa($6YT4-5JwjV@3$*4tp zx|W|(vOih<0SpiBztTR3=cer785OO<+sr|HzUC$USXhSaY_HW!9TJuls|Y7ds4?ZR z!|5lB9oKDlfs1?q=FZT_#oCnT|MhUW5;cx%yW}I#KYM)^V~e7Et}{hdMC4mf7wp{F zd7uHq+*f%f{)$h7K2(noEoyv|8153`A;OraXr0IKU3EHgO}uIi&28Odb#l_ z&rjW-P6pw<@4}{wZyE?+)VI-@22?4Pm@#M=%v}W84yavAnp#@^qVAga%SyP=&*W$W z=e5P8arW_7c{TTSfKpA@6R!rwy7>#e&M}9*EDi8>3+RG&P z-pk*Z5RK-7Kk4^>vx%n%qJ9hvxVC4aXGwe|A|M|*Gok<)-&J`6X61^n+t^uUC9+Pg z<&b>Ro)vEt?M1YFISAY#wreY3RTGf3$z}Sh?VMnIiHO8aHW8a6mMfUo)o3KyatbUr zpl|tahtn2Gd;CCfziXt83VsVjJ9K_jD0t-KtWR*vczFiD&k%ntEHgid&hRt1Y0Rt6 zo2~yKEO#J!UTmeF)!ElYa!}ig*}F~0KTo$O<{h$o_Efc+l%1)6TL3EJmyId5P z_5dYQ;;5UqvE5bP!E|cZfSGyt0bxOBBYd=~6?3++6aDGoq}+U33U-z`R{o*g?i<#Q zs6D+O^hODLySacYy_`RMHY&jDk3h4f*%e_Szh@pH>jKA(FjS%Pc=AM4(az8*yT;;f z9AT6)0lBF=wCwcd32D!*n1&5bs_m?75`>W1_t+oC1zTh{em92 z&}%oDr8#H12FRNB8H}p7If5nDO7hh-(i*<>_Sw_ac!yXjrCN7FJ0t@rzwedb$a?!M z9{AIe7oN09?Oby?^xe#|c76Y`A%@MS?lHMzHF#p^eaJz&W(g0Gd?7*Yy|JYw>W&a; zU%6-ldb0GC4laWm1YJvsXzt2e>!i09Rf&*|ULI7P+Vny2fQoOx-CUqDVNuO{<<^Qz z0!PJw35jEG+3$0+3V{ncmTu?%2*A-)v*G~W?sVKoSQ*sZ{bCZ>+r7Jj7S+o`8YZZH zR9%A{D8?(9YEv&!hDbfMPh#;DJI+VE@!@(-tGh_gpX7I1>ZRzN@oQ0#CL(M-B>4tu zI?R1!-y(+(p-gXtnS;rtosb@`hR)PO01)#$beHAtr>lE=kwbF+m)mUN!>JLIV`GK( zM?chJ^DaKU0+LP77ig2?5?{2!jCN8fJ96v9OLu57*CAzI7B-Z*lN)@j+8=+d1FwNQ#9b-Wv(+sKkN_-vsu90!(j-V)m!uoUATst{r z%HfB8*QwHf+ofKZpX1M?3f(kKFzUYY?FN@H>Yt5X@AvP8Tx!R{Y=(?*dG(6|h(}MB z^X_AsJBj`^@_38Yb3-5m*WtL@ZbPMzc=&krRwOjAz9=OL1HBJ3b00csc+^zz{E&&kQRh++wJTU(1Kba|aMIkE5}b0yeED6;#FBuWtr zSDvJAMhG%T>X&bK3kEydx9hc5K%EWF=_<{h%Rdq1U=BDHeEKMJv_Il9fYu3^$dUEw zl3EuIf4dN(;6Mxyq$c$Qze5K%k##oUGj1449?GbVV; zXula7J3d@J+Fd?k!T7I5QkwD_C-SnN(C??KM7iB~qWems>LU!Zd59WT91;HySK_Mv zXlaSTr%+yx#r6KM*5>PqzcUA&Z+uy#yUymknczZR9Cnu zjZfE2O16b`dYZfoztw=~Q++$l)4>e?W{3uWGlDmFTg2q{=As4#ymg!XtY2wz>O4MZ z&qp^)jGG>#f<}*yBvSh9y6k;$dl1yYtLjd#s2>_zXVfX{1o1ixD_n7#VqSnFjTU94 zZ;tA)eP3)hBzFZ>AM!QL4oJF1Sj$A8)+8be|AFy9f+5B^=|b(^>f9~FArsh*(ughV zv5;z&Dm>)rs7lmPPhl-HN=JODA$g#?<>=$Z?HJt-DU;FZGLKwEJq^}|Pv(&{RWOaC zj?kZ|X@+jb!b}SX`X)^vZg#xzFhC33@33btbyHho12Kk(`Nm$ospOHfbG%jiudSgk^^Qa4AJ9KdSwNKbbRMFGs4h2tU7i4 z3Xywaa-Qf!P%{5Bw9qs*=+R*v=42=9Rv4U$YOPfYr1w()I_##IGbkO7xrx>xnNj|C z!2t!;DepJ{?jH$IeJU6NhJ9p>S9htA7mmD&6xxXeMVLnhbkhgWis_onkbdm>`B5-Y zrr*7B4dSEUu&2RrBr#oEl4SUPQQ&OBy1_V25VyO+s9qSqC~a-9=PreIj;lKK8M6xE z=4()NX;V^(0gZs6(J1bO;a^!?0U=A#g!A@#3^S)=_00LhKIK(gvVI$~7B!rxSSxbM zd9x5@zn%vL{SQbz5*EAo z_H^}pQZ-iO&;FR^>mnMA?G=Tz5$3cQ9W0a}m`36-IkMy5v}}%`$zLrjy|_n4|D9&= zOy06n3V_1B9FX?%BL9jug|ZmffHGY;g0QU|uUY@}XUC?Z8wfd!397)BDWY^cv^3+T zltN$?_p!x}2SY<__SYU20n(=t+H@yWM>pUu#;oll_4JWYyBJ8X8+ zIv?9jY4vro(_TkVQ$1s0LRb}3i9RB-$3_P^W_5n?ASY#`co6kH)88chUpZnvpqCVX zcT5;zMD|WLW>V{mMAS#gp_6YYkuo>`x4dp^EgRjE##IknEdJ;Qxfko{Zx7kH6~wm+ z_0f8T@o!aFaCTc_-c!)LE00S?M`)^OXRLtsu}rmCix@t@^LxEf9f>O)F1lCGgkr{N z#$im9IZo#>v)ex#5(Sl30jMp>L4Gu7O)8*&m<9-V)UI_&qUrSs@b z=1L3DD349+Hs-vl?nU}#~8z&xxjzQaG_Z* z^G0G9|D5b2FK4aI zpTnhQIGwW&YTsQVJU{v7<$@vd49|XKFAUp;n3T`+LG|?ViheBSD%$qDJu(i8DsYx#v*>Q?BM5OQN%SS+rBM3&OgxnHq>kA`F!h9`Aqo#j$6igTJ8O z*Kg!Wg=gT(2E9 z+TTM5v};rG(A25(XDh_(qg6y&nvT(*PSJc~;9bUVFHMOP^3al?+*B#S9zi~X_pTQQ zLkN{SQV`HdC1%%lvBN_u#lqZq`1>BJN;5-;2b6bH$XN%+_|AF2CtboX*)XOq7vvKi z_`w3-+ay-A@AY~QiyeC?fD4r4JIH|z3jlUoZE}b{+Es#3j`T!$ipfR=oU;Gdj#HvK z1M|t=y~2cCX69XGqT9Uvsw`1|^$$vr%nr$#29n4%`5paNs^a1gn>nnBT*>~T(0@sO zfnD-}CwEr2uZ8CI$@q=432uPh23NNek+c&2ApHhk8w>s7-UnJ@De)3sn`-Tu5s8HR zLW*C@@_huT{=rI^uDFw5YqZ^|xobubHas;XoV*!O2Mm4f(TtFNJe?5H>BHC+Md*9@ zbwMO$#fv}miH>NJ$+jx4Ojl!at-B{NLIzRTtN~=uwp&u>k;{q(0zB=eN9w6!fLze- zct0;Q0#xIA1_&5GvzJY zyEFI4Dv@P*=Di}_)-A}Vk!$~Xo~<7<>mKococ%r0gh*@xNAYwZmgy#55Pe+vJb+Z7 z6WWYtMLO#=PYS@~nTFkOqJ^K@ zIKw_|Z!(?uXBFSXcGF*aG|^%^9Yr|qQT@Yz)J+#P%!sHfJK@~=JO9Pt#^tHNWoYHa z`HptKn2GdH5s&KVYND&5+3PS_udP{*wJ}&qd9uD{f7F3>+4H_bH)VlKZaJPFH=Xm( z=f2dMULfAr{6oytlvLr1xX_&7tDd4QFg}9^(c`mr z-pyuyxpQD4_3b@6Skw?>#RXCQ2F6d5KP7zct%6AU&c^z7+LR_0VRkiKJ{!|)cdL1v z0c;Jw2DM!3s*ylKyi1HzWcjO+nppN_)ifty>0+cV09=|ZQgSEl;9oSX)0pd``e#3r zpkA+xeftiuyi8&17_{Aj&oNnjX*!y6Q5|^A(C%m#1&{Y@@}S;iXozm@2|5)CIrdW} zWLO*MBLR?YjWaI5Wsw7ONtBrDXMCp2farX!Iw&l?M}lLnW!`R9d9! z6l*o}LsEZo$^s4_@{g zlo#>Rm6rr1lUr^Gb0)g=9r}w)sf<5wSUriPZdg~h}}$P-^qoP=!^~WfzCzW zQHN8|WYt6&pLB_g*xDOyGhYK8!CS90tn!52;iskFTpaiM0g6ON2zhzgr`}dlH3Aws zkb{Yv64SqMY(PeRmNX4fjON2|V;JeS6bd3bS$nRgxkMyfoNmEri+L3Fw&w-kgcN8_ z%npZ#$g^qKw@U0ubBQ}dLE}`W>0AuZ4K}w2^#60;M=)_t25%%W?V5w>bl3Z)?+qJa z{@o)3yi~A%!5hS(hlb{CtYg@z(#N(lm~ zQ(W_>HmDCN{D!hIlG6<@Yy4u%Bl3rsPFh`B#fJVD|5YG|t!!zrqIagJQ6u}V7G|}} zUJW{4IJdpZ8-v$9OD+Dc9lDrXu{7ID#Yy>&rRU1fyj0eX;nHtHPRBH=o~hXVx%*mb zBI-3!WdW;xpdEpcEKiEeRn}W?q==ATH-91XJ-A5}z~s^DA2K>xAy-7G<7y~3*`mUbBB>kytIYrU!q6;g z*o}l85Oshr{t7nv$*%!d2B?WQJ7_ArNOQ$f%r;~v#s|ylv87Ugtj7c_SkF>df)0cQ z?bInEUzxHQ`uu&0yAa|wVkDJXIY zpT2k4eOWBTG4zGh_vWh9>XTe8fUSb0h-{#0|J(~qfF%)LLwwK zB!1W1?(8Q-E84RAQE9aKIref!B=g(|_;E@=0Zypk^M>S+QUFBl-uHN9_S02+HN;^w zxk~#6W4RzBUXo>)$_2--O|Ri#JQ+Ia{yxeJm}G8CiwJpEszj~#f+pa)H*bcbVX$t& zv5zl}xWlE!2d=G9!J}V;q@oeO`ww{e#e%Mp)sCT=G_x58k$Wfu_a~M zivp*4!4sli&GSlfd(=rlpO(fW*>P|rZhmR-N)|Dmk_xL;6NDp&)NLz;)O{!G)o2rt z&2g-MoK!#q;3kKK)zEP_36;!|B6CY#7qc|{R)Lh?=ZpO2HO3!7S%(Usj~k}ntDX?w zH|dEyD|~Uwu$B8I%?b=?a;BKP)8Kc~0DMNmEpS0u)16)Mpc%G0#;6+hSY1vLSL*Wp zv2|XQv_X=c2X&|U)KoxCMN&7-F-6z{2TYJZKaK;UszG+F4dRhNQZBOW>8k8me6NAOQ6#X4DK2 z63Yp}k+Uv!5D9;R4g(Y7utUaw^JGKLU%M4civyBlZB0GR{K%}nNVH7kp+w9bt?1Y3 zrP&YeW34=K!b6WeAJ}>`i?77~;1gjy^$M*sZ+w|eOdwUxR|HI>j&?j1TJ!CE%(4Qw8Nc7mBiOCDn!W>@$pxq&AJK?i}(Ne4k1T zi#bbE^D)-AkCPBY7q!i}8IzjOmT&TmzgkEZ3NEvt!msb3kYr>@ zPR?s1pjC#Lt7-C?dCCKk|4!a+L-zmFzb7Iu*uy7@CLqajvfHZI9(=ytLtwenwR6&eYJj5IARV#71!oquEle_!DO7LLvQjT4W()srp;e z-8S*6rem7h@z%ckp~#()laZa~-Be=XEQj+>OT#>ac+-UHgLK=f0!y~e$KYM-j)OO> z=fe*{7zr;dp39rQyDO1uZUxd)6!wSFc?2~D6{}oh&%2YUIDm_O+PA+Pa{=S}cv_sw z%@bp-R1-xCIgkGv68|co1GydJzlpxt=tJ@Y}H&P{}`D{qp%YAsp6Nk1^0p#%f_vrB9+Fb!60Ap1eim%Gb{Ny&pda9gSY1lbNeP za4nvsR9MC);v$#Qu64JXxJ6^|LeVMiM(FQj66Ef$3z>484n@TJT*UTYSPySt&*fT7 zzDly}NBiRklWRU#mh8V%lxBc2TD{#<+!V;f>svGhJ14C>6vfpy&YflltY9}TWHUu{ z^VV@B^532;RVEer%FskbuT|v9-+)HNSUWZ`B-6qlxdOxhGOW@bf%+Tn2q-h6J~S~@9kh8Lpr<6N^w^$jpZ+jRlrC+C|HTC)NCLX`dQ*j@OZEse}b zDY^+-Nf{ylQr}a*iqH&jFraj4YFVdHd3IOZ$_iF=9bpPh-Wg%LYwh@5dPPG;9>C)W zSa4X~oem16jfj)lo7FqQhKd^kXl(|_KfOhWDqkF2V$+0hH)m=+AoaiZLd%hzsu80f zaiHJM1&>W2y%cra?$rY?1h|24s|epGo3SPl*q@yz6S(`*3jK!2)$TZSok+tcK#|GD z8bBT(L=(e4>a4I(sOfH@z;>IC^+?V0g@lqTVX2_iOtZZ>A(>D!LJU&9SUn{^+J7u?@Ul-3LYnkq{3) zM7P^ySZWgtlXycdR{B?FJZbgMSU zKyc*RjYDP)iFAb#+9iCpwV!89>aV~Qr}6f$_=_u--Ql)v$vSb^wY(R%9XwnbWmK^( zkuTOs;Z3}E%q@W8CCgI3jyPpf2%*ZI+W-E|Ub>!jBe<*ZA_D=eTGaBYJWw=m|n-Rwc7M*cHDB z-Y6(j?P#~Df&=_Q?pi?;27RDXKF*w8MunmLwU0h@;%a(j8MHW)nzX|3lm+W@sX{x{ z`?$sI5*+byKAItqMy_+j>hV<-_f!*>AElI{CXM;2r zUX6lg?0Co@|JdW?SXsE_=oDA)6N%7rN^VpuP^L;uX!&G9E?)A;ImSVWx!@2c)P0ib3x!2x+3}Y;#w=#X7 zY4b`j#pUFQH=9vP0Q8mAK*xJ10P;o!0VQwDWs8*dFEB)WWJ@t*TL`+%1<4<#6X>BM@}VG zBpXG&IV2w~vyhhNx^ZqGwFv(XHF}!D=W$z+e7{a72bX0WXA>G-Sa+|P*w0Spk5{yD zy*54wsI!X?8!??d4oE+TBBA;y`E7qt|7DQ)+4s*aMIE{!93E#%^gE>b8%s~zg*cvp zuS*`54RGmvt&;QK6U2w)jTWQ#$;6RvclD&%{~tLob*48;9)+9Xg5-5hr<<&{6F5dI zLGgki(-95=$-D3GGrnrxbuJ@W7>+hgm)~|%xh7D-;nGNlxx&%M4l)`J+%+5AIhgDXy)|EBqhnQGx@t+ML*TH9&m zECCtDx_fDm|HG8bgh|Pe@K@;%x>cnH#}zrdPn-GmliW?0{}AV^6N>(7QFTq&fZM!& zfv}cAY3^pY#TXmVKk-jV(;V9ZgZT@f<&3tzDb>DKZKiBO!ap(llDHq15tN`uDWM~#mq!@q0mCJ2;KsEir`3{ z?bobFjSX+N7J@k2s`X+lrIwAB6Wb&3&&+yN?a~bj4u!{nTLyw>d{kXKv!N}L4slO@ ztB5j*F6W+}@m-xd&E=@B(#Zg$%z0(@YHf-$oK||Pq@T0sH6`(%hazFaU49N+KNS;x zyc2dS4grI&*mO&JJdDfMOe(M^zvgN?wgYHxS+8r!Ewls@$EMoAc+5Y6NnznzgL% zJ|l5f^#}1e$|9aQ%zjQ9fMTmri$4rCUz`N{obtIPs5Yb7{ZAp=*`qF+TAv~SzA1cr zrUR(#Ldbd}n=~o2!s~7U##>V6unI|IFe5lSWmHY1$= zvX^s}+r|W(MFc2gC{+0~46 zkIQN(YFU~ZNl`5smEwXvcG?zg9Hrv$GZij+C}Yioj*(HegY(!o^-z{xKi5YN<3` zYTiTIk5pUKvKIE4Wz{Cn451WWswhVF41l1=}zJ4VC(0;8-RYTo`GY&KjawCJ=G<^Cv2X>79& zgoG{ZF|eAoZrS~T?*$D(;Y9vA-kynwnjaDzhW74r-7mLn0T**FYQX2@W+31IHjC|Z z@*x@eV4Sn`-j!_3Gw(a99VTD?%tm2>JZTqG3bHuFn|U+A`+unz?)MG$%a^qK1fIZX#5p*Z&MG7$w{ZydLtMWcwdL08GQ(5cps^)9*$lK@A&TOch{_l z(`=Z%Ql5u&Ye!Q&MZF{vD>leJ8x#dUmoY7}F)CAAM)C%~m72B0c4WvzhdqE_8$Ax> z0q#fF+(!53gc^S1opO?ks)I{kZajLC@2s6bNVYofEJl2iU6>^maW$Ts?%1J;S_Z-> z*kt_q#(xygLvtAXKriHFE(Cy4{t>HX;RrwA8XTvF)^Sbi-M#stI_JUzxy?l<+6!@a z=3>p({#gyR*uY&AfePLr8icz2{UWKe%7YqqBK{8Sr$3-QpsMmufMU? zRO$8%tD^HE+^!gtKF=_XB7!|HvPz_-(`KMUyL44KZ%E35KE>#FCCIpb+2y_f9T^&CZqtVU zW<31iX&pXko4$&5gecV{2aXxN6Ia@fl=vG+)e!>sUh+ik^YWr=6>E>&c)}ra2{9_B z;Uqx*1UVO1@+*7eVk_EgXSFg*x~JLe$!w*4*)F-|$v<9+n?D8_c7P~lSKEKTtoKL! zsYw`4e=x|;}yl-mt zC?|$pn=ulPd(mkAyE22TDE znfTufk#q5$sKZhC7(Tcj;Zg^;s1V983M?%s|JhCIA2Fus2xIndBx_<=CGwK0)b2zU zxf$$Facraa!JUW(3QiZB!^=b5O*foR2BQel#(eB<(8V@Gik()-eBeG_jN?$!a&kBA z@ZH@U@Mv_6`f*h1i~WVqR%>G5x$~t{oy+E{UcHFVQC$q2c8=@BtNy31AHCdl^R(Dy z^RQsf6b5!;&2-q+8M#O$5) zSD)EfQ2$>2t9x&4dUwE>zHl@sc;X!gBXu@MwS1gRo4v9z>B-pRnur~4G~ZTU0lKee zKgTM>Sc?ML=H4|Vnjq_MeXCQPrF;**sxkM`{L5+|mtW9{A<@sKpHlwL~t8HvpoDF?$z#TjoeQB zHl8(n9lnR|jOcgeQ!5u-uV~VfL|zO|B)m-^PkZ}|7>H+6g?O;I3~w?%EHyMsFp67`cAr5=a!p)MPF}bLrs#%`p{fpiJmK^e z>*nog1;F{{-(4gmrld94e-ISb!9TW^2BnKd;A2ey$IL;ux4W~7y&f7PcP+^Y*@ zxaGq_CWV1sVU7B<-l@_Tna%#!;jKe|O|A-gH(Mc$r`1~nS_QK}J+fBiya=HC+ck)J z2}&(}uFq9_5;qm;#-SU1|$Q6CQJa%18y&t=C z?u!fQ)Cw;eR~(t2RnRzeD~8O=;$WhkW=MG zEogSv4F1*I@B~q@+J}_jnEtotp8>U2%KCt#u3ObonA^qg|>A|6Z|1XHHc;A)x zX-p?xFsYq^Z7R2--IRPrjYtRQgXY#+#fiG}?gGg>8E3UG3Vyn>hT$3fx_(QBTW_9w zP~TniFC3OnS!9Z6OU%Jm;*v-UX-gv5%GMB9JFmW(kb55mgaU`3OZZd%73}1w z*B9X76WY%Tk_fYm4J%i&kM%j3PRU4kxOU6PhKS8Ze5)}0JCif`mFYKuW9mk>T=Mgs zn!!N5#r1X#eUMNNNkb;E)lTIfxDDI~nDayZ@Z=)8o~;XiNEsNf#N(PyA^nzcQUNNg zq*|B^kVQp;(y4n$BH2QL5eLY3ls)0pdbY*KgCxs&QM;L5*5`AAol+`W;z{aH*sFSG2lvZ6ZEWHIHOm2SSEo!ZZ;6<_R?iR7TgEHa+NyhtQpheN!e^T~%Lk$n@< zmSPy-k{C297QD|zdwWP$_~Yi0G;rfMcpgcVV)C<7hPbs_w3Juo%mA}o`MidYq=*G~ z)MO6jt1e)_cW}kwTbx3#$#6FsUrSO=4-r$mwKy^IL|8m?dvmdpv%f5@yLo%?^O(zy zTF3L{v!Ra)A%FI6#0A`0{B!ak>rG!hRQs9JPSEGoSQK5*zw?zoMUFs-TyIk!>Sx-J z1IELKG5WIYSU8c~ODRnnR*fV?f(gb8Qm>E>_fl%ocW^UL+moq*62?}4>DtezwI@08 zWa|?giP>U8llOr2J)^d6lL;%|loiX*x>|M^%kYQ{VsC;g&a9pG%e?@kEv=-OpoVQxVuxbn@jANm%)?F$=nMQh2I2f%0rZsb7hJqDFCQ8AG z2;7ZA8j7p@-Ijp<*HB6vM&P3>H;oo z>5f%$qnbi9D#s`0?5y#A5LJR|U%-oY{Wi*3JrWNxdpY#Xn$NI9x=Eb0e=m zmx`5aewnpr+i=J-hJBoO^T9d|k%e7iP0TCRUM*Fawk)R$hI=m1{Ybb|RmBrwV=SCk z{UHSVvwQC;+}D4*)wSta(CBs`-Ow_yAuf*}x#-+u(3W7u#>v+G6aZGCo`=j9c$Mbl zmgj@N?CUQ<6^7o6H&h+)NDdc{Yk%$QWLvs8bizffko_q(yGrDU2-Wm{*cQiUD6Z?<6QO0G5*pH+upk5`}J0q`S+KV zy~L$)QH>`DOtwuq(dx5XuqVvAG^%W!y_sWJHR{^r(9?<1v+QVZ4ClOyP8!YhGetZ) zZisqIGGY+MU3cIzz68o`bkTRZKgAFqgDOGJteNrc@)RlLJZULRfc*lKJ{ut1v~+8r znv>m_=^vSb1l`(RD_V#!=4ptZ2ZW{AnFd}y7D8dQRxv*{_k-$$;^h!VR>NYx9 zG^U44TAW$ten!6l9j|qANs@91tXx%UKRBKmTGFC`yz3*-&#C%FhaR|VM}}RHhc@&9P$y?w|52BHhTJFUl;TAAE6g`Qba9yUrAxm~^!4W`R*Dls-N zo^9S==9rLjkXFYNN(ETLNu`Y72HQ zjXxDH%p+!?@qkw*;f&MdF>CT$V3q8k4XLWy`wd}^z*UPj*%GvQPjZ<9Gon>f<`XB*I6dO!6xvJ3WeZ}tQVetg$VBB0|8+iXl1BO94mDa(%95TLa z_k{?)Z3n?8-96;)7CX#1CXhZshL}NSu~jCAim?f)P09ZT#dhRyxCofr%MQ*MKQ}bh z2<}9<<0Pwv)j(QVV)>5U7bu>MTG&Q;p%aK!CtYVwLc9=T=W0`VrH{ItJ8>b6~1c?gQC)1bao+reM|UaHkuDD}FLvp2+%? zv~xky3Rj$i;h(tPsPD4Yo?e*pOns<7!IgTA`OB_G<|x!Pq$n;l;-~4S#I0c+Ff!P9 zQ(2nA8(5|uRRPJ_lV?^OOBXT_Pqk+ce8So!Wc{0_{?rWb-WF0TKid)(mL&`%G0(7q z!x!i@*kpB{M`)ALVrEVE8uG3@h%UoH&9eR`$7*=?y$Q zI~4Wg9$_2(0aQTC6V6Cb0tFuo%0xN4T>=46rQq$#WPZF3I}r^&SP5w?J7p+c={ zvU0Hi=mon`1~O z)2a*Xc_mgSBpiZZGPvm}8HVh>gP3u0v*}Yay0)D#W>pF{l}2q{EJ$Hp{v>K(3c{^@ zampN1->UA6kdI`KV>g*Ic=M13A?^z$uKB7E0m&0__^(`5{*LK-KZQKl#GV!@(>EMP zjXZXvYS|zu>Uq7R!CLFdmHn~J9&UR3ywse&+X_UbXbu1&vtHy+XqDqZu@6-L7%JCs zUWE;44}xo^TfmV?<=p-c5Be#D26B zyLqVgwcv-zgs5q48kQUnWBKF!O=!+6;k|+--GiMGt|W}vexObyTaFJe#-8!r)H79> zy~KcMX9&Xq3vNt*uT*=Msh`2Ui_i2@xTiN6tER^l{Aw*~-Tdm1Z^@8Z{?`h9e~e&# z^3@NwC71Gt;R7w7O%PXN&G-xjyO6p*c-uu8Dbp`^p{UNUXc3XR>i- zRk3>2?ol0Os{n8p5Sq?g3m~3~aEa1YAv`1g$<@ET*1Tm!dl5(eEJtFF7*q%ULt;8Z zFbnkHsyK3^V8ms5QNrg_1q`em-6Pt24OCTW&p!*4;?48Z&M?pAk5Hk+RisL~cN{)V z=JXBIyeKrj{-$G*t~u0(USpZIGKAM!GtgZB+P2{p?q%ZN;IF!imw+hMk<1#Mhw*>z zJ{5{vosDSvQs7yNYpRs*k-N#fvZw={r%$F#_}_b_DY+Px&K|*-2s2ELE|1}Uot?I; zJIJ(-=Iu%-&*Lw<>B~`G%+!&gpf6E)?G}q_7Md0s?1ga=%=|bJ+Q2K8 zPIdoRwK@c24DVCA=kZ*&7fMN}(_!}gsR7vlg+F#kXL!`&R;-s7@(a|IKPg z8svO+Ym`X^%a85p9#jOwj&h2udO*&e#sy0u6TFL=sGZCNLE6Uz&iUM_xO(2j(8820 zDJ>pyrZ+DF-AC@xa_p-m>6~8H`Hy}MoD;qGW3|G%1AmQ$Ca#ZXhbgo^ zA~%I-X9D`e-b?GS$h_i@HofZ*#Q3Vm_YX@fWq@FW$4;5kVE__t2EhObW5OI+v(5{c zr_vN-T0xn>LjTOZLq=NGfAgwscCa&EAY(TdwHnm z{yNc${juzfo5%cSy44CZBQOlYi&bt;$U!Pz4PUzxs%fUXi)uPJ81Nm&IPZN5i6_m9 zHZ)+q9~O42ohr~1E0}ljegTh z=5(^-l_C$o?ZNS0TL#5nH*_*|%PbrIIHq~~Nreri#=o8mVz%R~@T4>du3U54Cxp&oNfz_=t96%y)ZjirA6 zv5u&@F%uLIDkU*jepDZUm81j|${}(+KPcxMM8F*R0?k*|g6wF*_P{LbP7voEg?W3s zO>Cx|`6gNnykjS_S@$}vMLWb|v|@7f$caxOsj90%>iv-W)`Fr8U0DCC^Jk+;&bxx) z7_jIt4_4`BoxDhpQxH(tlo-2+dhQApQ%x}cliN(0?DzeqGSsOunzp)BP}A&>yGqwS zvRtsC!=@380fRzwda%zq-xX03b4DkQ3}Q{m_a8QDK8^Ig`2&XrX&-MdB<#zhVOG~H z9{18Huoop4jxnXy+j_dYs4ui_G!C}gP!h)jpq66=*N1G{{E z4jUk0@h|SR!x$Do?xK@`m7rmLpK|}Dy;ImV34QcA!B$v9j);{O_Tz&|NmY?SVYu#x?Ea!@8{U z%ZEcDXG^#k8#>AkDkD!&n?kN4>Z<&oVw*?yYFy5$)IBQG%VD())g=b>h2I=nS!7NU zv$e6niY5y;7N|oDp)awd=JLK89$B!HCUBh^z&P=V$Fm$r+3QH$=Gzdo>H_{;$0Ni8 zT~+jZFLl_MsOf6@6rEis3anb z`E{+_FOwOlfFBujvu(`MmL zI2dHWE@_nGCSCfv7E-`XHazwgEAf;)v0x+Fc+?2=GKX=ohZEL@9PGwJ3zO-MBdubA zfN$L=H>Bdo6f@T3(U@iw55xNk*eEdMSj9#L@2ks?P-xV>!#ZBQO!Q=D9#ys}VK#<< zoGuwdJ;+%NlzIeXENJHn074UHogu1zuKj_z-tdVM3zRR&Xvi1>Cqj=dA5QYa*#o8N zg3M0PY+hv5N3B^YuH6?Eo2Uyr2Fl_EL?^qI9aBp!X2c;cc_?J&#;GpRwz~alk+xdW zzG;s|D(5bEd~8KMyyaSdl;iH%?C(uM2~fC9GHBLr`@1kow1bbv=Ete6v1*|(%=SY2gYsKcw$pzPHIOZ~%oz7=f6pXoac@x8KnAvJ%(9sT3Lr7iCJ zOYDoSwPQBp;v(JvV!D7|`apLC)j)xw2WH*$C}Y}J|4Id|ESTrbpy@2KQN;Eqwm4X8 zc6B#=UoQmok{VD^*Ew-jfmRQlV+lbxw19sI-uTGsd=G0mnuxzgw0=4obaRqvkw zPlMdt2YostFxid>!L&hI@~NzVF3kgv5P?TivD@&(?JNt zq~LH7xXRa-`@2Y&jDz}VDi&@8S;8wKt$M#9Iwk{wh-CLf)y~yGj5P|F=`;r9HIO6< z`w{xb?7GhUKT`vU?3uRy9M1%IrPxdSz_G+w<3!8 zKup>{2Hvt8?jffea$8|>de|=AsU+2B7nq;C$0u}fPI{p}9M;GDA@8rVAwICIX}EKr z`>Z_C^Rr`_Lh}YL`S<~x2k24D1CMyX;H+wKS`B;c?s{9Tq(Jy4t@-*JzdYgf?@@8d za|eau{z(sdLj$ZD87|)`mfckoj-=IQjxcmFb{Sj3Fk(-_PFy{kVnkvf|y{*)^=yR z=3sMFL-yyeqD1D}6&)6 z770V2*cL2a_TVm!Tz?c)-}kRgLyeOJ#A#S#05#=*=2@w0UF@cF67g5GbnC9+4u2bx zc$($csJIGn@~{z}cf&fwFz!$1thRIJZr$#ch*cYaDpu*vYrw`vr2nCrl9+rlKphel zbC88#{K==@j-5S;))Q^4_c4g*H|aA3J&3rY+%lo3`*=x*9l7No8hO=2Kj!s?1BgY5pUhyt z`BLKab)Ob4zoaGy;%;n5XUAZEwBn(X98F!ohR*R%NpGJ*C{FyPU0_?xH6P50j);OiZf zqN)G9BhWkEWMc>CeuU`^K8YYU_aJk&u6q8swd&j7oHvs7PnX{!bzgT&1zyJ=CqYp` zU>qE^T&n|03dRJhI>OCct05iosfJ##h%AYRQ(@88?#Oxit6J{3A~uOXOM#61nUY;7 zj%0K#d$vv5^~;s*-m19rY2n}?ul?SEBUO2PO%5+lE08ye$CESbg7gei#X<3bPZoo? z(r#6dE%@Sp(looAJ9O&qms#(cCcnZorxW;#1wm%Nz`blMebxU6B zTko(0BmKblNJn8#nMnG6c7eI*Z=VPhnwZ;Bwo-Mz3FIfL2D@d6^h8%$Sv*N77H^7y zFqi#hHlA>qS5;J9(>uaQ+u*)9wrLqGR`}4;0bf)Y2C&d)s&LNEH43&blAa{m0N zlla4Be(yq(>+ydFr<#9_4{+--{h+oX441|K`hG=o9zug+PPL|TT2bQMLr(#F^$*i^ zIy3fJEB8Ed!#EsLN^`&^n%9_mVw|>=Vb2SHedq}DJC2RUe5sy6S zLyw(czyCY;jepjoRzqgg?y44>z$nQHlqr9HVdyZ(p4={B_U0w#yXq#@aUjf7uu`y@ zesxUBAmZkO?>X#!N7@gFd3Gxd%xxn(Nmrhlm!3u3hzP>BQr>%0TBqlRH!_9YCyPJX zN6)o51=(O$_oB07DL$$f%{GJjahz?#oTBR=CK3WYWa<^~RVQTGFyHWQTyC+WErxz6 zPSqu}b=Yedw&&C*eRrm;33F2)FcCb3|Jc!9H2LX@!=u`5Ez)0I#0O zHq0{JuE~HtzKU>@TpIgDOVPv}nzBkMD7_^RfsL$woF_LuEZ5g6K+iO`15SmU^-s6P zPNy`$r@bO8TlzYIbB*Qhzy2{y#!X5lD!t6b^?e(C-o62dzrXd=Bi{OMS`IJrM8l1p zy8Nh`4F~UIyRF|l$5$swTH@83h=<=Yf5Um;rkFa`?+J)7lkRQhs<0Tx@(%!>)7Tk} zT}|@UdG?_p3R8s0aZyR-uw6;CRe2R#*97~NV{)y&x#vn7ZJ--${EC5_ojSUftYS0Y zCbwI7u>Q}lU*Y2ThM|!Sq?6}T^1?9Ze?q7~+LXc+C&rCtfXuLs+8(}$vkDk;dxvxA z-TJiT$`vse>CEF214{qfiU1L)hywB`&y)vL*5|$nD;KPQt4#`V8B#qleanwke35?A zdMqW-peDvKNTD!+yc5Z~h#7J$FcQcTN-?EaY$r`v46|(y6T?_t9ytqTmjyXrl04W7 z8;W84XJfkte>Xq;F}Il&G+4O1j>`j!h#^HZBqFnBr?XM9L*H<_ztsaK<#GpyJUq|+ zyspJYAYJJSiAygMV{hO1B7?v%x+>PUFvP3 zq2-`;g{SrqnVQl!lOfkUPd4RfSbk_r5F!U3(YAO!96>ob_-;aDGeek7eXTvRqOlsN z?Ic(nZ0y4WgqzY*_h*jMqd;;d!zU44@EK}enKl9U_uvZ;2)ABPTOi(&ZT?+R%F$wF ze2c@pskPM8ll8U=`&geBmjhRoKOj>oo$bK5ya(}VHSadJoQD_0>xBr8u`BKWro&Pq zOE{2ArzZx7g4s#e=lD7~L!y7*u}cNO*Z!=wqn_Otav~z69(}tb;y7(ox#EUZ4i!B` zRHe#bB-ceC-UI`;+^$DaI+0Omg4M z6^K8NP^$mu8MMWv;0!%Z_F$+{i(QMplL0(hlhaYJPwP>k_y`S3X+;tI%XsbuaUVpK zOVC?tlhswV*7jfCSfFcb>B|5cPktFZsiD@UQUkSD=&(ejZ|D)^Aq2CdXC~$rS%;Q9 zjOGZ?1tMVx4t93pn-PP%`+lf2&-(sZSjAGcv=ZJ#EyfDu5%+omv$4+<>P=yfT2Bmb z5_R;Etey}S3n(A=K;*3uqV9h44-OC+Y__|apS*5BHaS#t6)|E-mE?V_%{fWXJ;&Ylno=jFUc9T!a^q9VkV_!=S%16Lu zYPO8SFnntvLw5!YH_H(Ft{x&DOA!#m^qAbWbLFdwf2+-YnBSrmX5!!{=SyRS&HVV7 zhHJU`mu~l(1sklZibDd_J}o~M!GMq?7QI!HR-htKmBSzP%~N>y$8@mHO)1e5)Lgqq5EwnpgC+pR?u`z9J14jmAvAT1p6g9{NCR#^@lUQ(o zOU#cC-;I+>khJkYvm$tyg^JMG9WfWFuLB!C-UqcDmF(r6>3yAz%j_P6X|VC|VXwwd z{#kRIaJb4c_h6D-SJdP74Bv^(MPz0cbiX&+AmgNPV_ITMP0*q`Qsb?L&?5pcR7W1V zBv-LICnDr2ZPv5stwBw~0p_S9!Oy}thxFMD*9iiNsnIWjoia<0sIdJVO4zs->$K3S zSi_Vd(5~d*&+Y+#bur8mJ(%^Ty^E^avHYBddyqvghWj?8F&pB@*Np-VUIvB)ehYj` zJ4+s}*5+N0_F81rNYe|#oqO&RdMhXX-gslH?IlIfn-_lAr#T-bW$1JR1oe1Ilh*Sy zfiO-5;~FLejMum|W|q~9WGX+2K08tjD1RGX!J)rU@-6a?=XhV>Jsput$mb=XCL%|U zqWoynq1r2|_MDo$Z|+J&3o0tmVMp7cj4{6t7P3yM^%^rt?j%S-EL_aQxWByaeL|Y1 z;s?S8Nx5O4Glz7=#3w?N;~u^q&RjERLewmYPSQ4s>}5u~16?UOPo7Z+ir=g@Y{yh` z9IAg8v_kkwA6)Vc&7oGP(2}WV={vvUG=)?pEgXvrc*)tBctgH>wnB`0eg?rtviA~O zTIsi4#CtuNu0PEzxgM5iK|`t-jvLbA;HfTTn=8GTinH!d)puvku zZ|PWN^`1Uoe~t!V)*=_|#W5o^m}4OvZ8r9oJ?yum?0afsc-6ZXj^D95BI;QSJ1VAf zV?fG`@M94Id|~Ti5KlR#qHiL;sVddo0LkYe$~^aT&5UAK7Lk=9BYSUHr`ujU`9wTg zAo@y`?bXP?whCrwmgdx)&JtsK->M%e-F|CK`?VYgYt+p^n3bilvX^9pG_|JMPea1A zgf^qCwO8qw4$AKH=hfnoLDzy0B*tL0Z{sk=M)M(Cg?{#RsYUiP!aJCSskmcf5vNcC z;8jlkZg0?1y*|Rc#%)jQcHzTmJS#r=ko|OwbycC_!?7>%Egy83d-d5jHjkF1)?^@> ztbXo0lg4SJaIM_kUG!O4)pA7|i`yP8kz{vflNEUUbwOSA;5;p*+GO-}T3Er40*2c% zY)-w8QGuEA7?jOxQQ;qaQ;=hnzB>SrB%T`Gt!){G4Nbkco9%d+?(}VR!2Qjy?%I{&t&`-6P*5;n^!TK`PH}zlV)lSZdv3vbh_aj> zF^+DQW3|b=>jU2HTE3R`^B+fHK<~RJnwpQLsx8{AQ=7*#F$200Eq4&4ZnqbTJAp#9 z>_|#=VA!=~$l1Iu)3$;}h`ZP$2dI3{)XD=;MA-e32HQcu;m6d88N!?r0Fs4NtCpVGgSjswFcoi$0b@vkX@Z%ko8;9dn=gtiD zcWZlyh#7KM+R>^{pY?~DzP+H|qS0qTMcourc||BK6nw`U8m1$?!a?hOnVRL%=rG@8 zxw*?6R~5rGe%ia4=BAs0ZW)GKDeO)>k#LuKRlS?*Go_jXAhlxJe;eL(o;)LaYcaQd zqi|&7lL}lMXJSL5_u_Iwn_TaQAQ=q~t5JT?RBEW`jYJHDO`PKcKlE`|z+LM*lC8n- zRc3`yp8&ECzo8Qc=3<^=mtDGWLK_7&dlu&TZ-xg76Z={#Yp76~!)3ZhICUi4ina8V z!|#93GDHmHSRBc^eKb4}6kWgvmE@@8gmiwbdoQHYx~p=m)+~B-WP)WSY_1n6&zIuc zVk_ZXG?3!XS$g=#oc5uPq=FJN=H{Xl$KWQyMn5-O5%+E#G)#K^ znAKN{l1RO4=66ke@mg+U_&$1mF1`%M;UeyovhHp&w>eK+$fGG zmu4?VxFRCq-Iwlmv<4b13)uiFg064GV88%y`KKloky}O(B$0P2PjAL0axFPJiOt#m zQ|loOR<;bD>PJ0ld-ud9enRi`=k^cAZ`b6Bk_A&AOX=|HxB1-;tH==!9Tnb`Q!(;@nbBFA=$^)d8C`x0 zc?(I-h2QWSeU(bj$co?lh6E%D$7}74RrpU;#@i?g4ixu+S8=%9Ye!D;-o>h!jd}AK zBZKMMXW`+i0@$5V2#5h2liN#Qoeg)N*0lSwW|y1lq}_Gup*35@b=O3YlP;YSoYH$@ zx_gCy^!;+*6X7cmPCc7N-eGkR4Sv4aBbmPhIJ1xDiqayL9}A=Ux$!${xYF%943h$Yh!1tqZGx^1}l2Naw9eYL{nVGhVqlHLP#YwXSi5v=(a> z^XtLfsRl}-85D$yNG}@l_%l@fa-fvwnHL3@d{i>WUK&q@Zf;vGvI^*bETN*!|K@-T z^x(sV+?#M;Q7z2AsX$e+XV8MQ<8?auePn?OOYjSubAf8lxU~Bz{D=1{53zz2sV@v*1!?O$@{mZVZ`UE@*TF>_E`V~87aV% z3?C?x3k^<07;cvf!$km0cN}N1ncjTVe*9Gev*$F>6as=sf8qRdQzcQhY-D8IN;>|G zgHo4MaVlHWC(gKvTJ@edZO`C(&Slgqrn9#Wv2l!4V#o(Jy>Uy1I?pxFyT~3WFy;l1 z0;FD%9D|~fz8hGr@sxAg=i^=~M~iT>Kkk%JRN;;5tn*uGNuLfC$axab~tXR(Qg5Oz9~C|E5f7noqm+H25m{` zlVx>b*?K(}bR!OIqE5NH(Q;(Vqu@xFBlgAn4gFFEi8&;}@MexG!ws>(-@|w1_nrBd zssJ|>x_ksO#l?;bDJgl<&etxig8It%>IMgZKVs%iyc&IOo+abn$xas2w0N}&EqBc^4bZuT7gRK z(fxv1oQbRC*u7LiCyzl6TZ3ztQBaph((1sx%~AD^U(z!w1b`w!F?<`smllu#dNhQB zo}oWHn2<_jG<7R@@8kgn)E^7#Mtpf7l(_Y8Q5CpLCD$5apcjkpPkz(SSQzVM>w7)* z*tj$!rAh>LOKJY1-s-(w3G%tS(oDBwI3ZwVNK~ODO_z8HzFO0T0W|A&RVvhn<~&@L z5(#I1VUYE)b4?mmdw+`-;l4;87Ap6z>}%?m9K4~0v1j2{<`&x&%PPe(^#17F%PvcN z5Np)G_p3-Q!hM)sRvvuok@#E;B9lik!Ch zSM;NIVEz~XvSe?KnvylicVuI~U5- zi!ZEH7n(n|8!+6hpdL{b^WbN#kukRin@1+?FT2Dh1?;+;Ab$LmAQ>< zX9^@Anl!Ou)RfIX9^!hJZU9jaw#w(>S2g!6cPxiqJYNMn%+vRk-!TTB2J~UfQd=%q z-3b#CNe+7}G0z?YCRo;@c2u2HCCzq)ZmxaC4CA2%atyT9%)cz3&i_EHak7J4h&zH& zaKQRFd=f`KUAkocUGOLD=5;oB(C+tl1w+~?ryplf{#Grjzg6MxH?fgFvb#B&@hd9! zHwY?N0Z2U*Pq>HC1_}yE`N|y=%yUB)2~iSOfYkrOXQQIDA_bigsyQ6sIcnT3ebLL6 z!mR?_(brAODuy~8XJ&YxrLLMCy!bMQNUTm5Gth=hcUw<+0jK5}Z_rScj$YQ!5dqjq zxjId2_E>+-Ps#nHmOIDyHHZ<=Hb1f`u^cN_twu0r zWWmNX*^yN!i+Z-8Z+X>y0z1h4j8QEK8vcGh-Q&-Wukb$51{e=7 zRj)Ei%v$hk%L`lca-MEA1i^XBD4V5zY2Cy*MtZxydaE%_Nhb|=&NmxG!o9VkjZD8L z*Q@xh9Lf9Y>I$*+EMM@x8WCy6$&*F?Ex)e>Ph`)YiHD84Pa4P~qXY!zaUdr}a`q47dMy<(x5sqJ@$C@ISPp;yc`3yW{;o zd1$lWba-Y;c(#t-bS3MXr6pt3*VNgCp`X({e)=;uUfxXHdV+J*9Y$co*gWY;+WS&j zEEF=@w_MXS@UmFtpVGF^(#AP+!-Q49O`RsvzF%j1-os?~ru>_AAp0 z1S7KlYz?TeXd7Wx8{;ehx+wqe2OSIDxz<Mm+tenN&}Fpd`8ejyjiHFS}>rRwqfA7C-}OBFlw zp9-_*o>d-y(>nYlxD41Wk)=m3U{IkJJFgcEeViM@cRX**X&QP#orh09ny*<)NDz-d z{p``+0t~3jIAfr9Co=7+gK*-2i_~`AlHSYODFV?zrgd(m)nu&(to$1HN_2xQJ7qRJ)e(e6yh+!wz9#L_TzusqzztjkA5a|(H%-5UE4~;*~B}RNG6Us|xRPWq=PeAF@P4{t_N)aDzbPyz!euYA zMmBR+kudLwNT+aL3v0^zg+4ixbq{N`JJ_uSURH+Aa|S_rBRt^~vbw&N`xe7uOYWAD zXgybH6xM!KxLjtaUQJ7X2P6e!D!hLup4U9TU^Kf@`OZE2v#`)S9(c^_pGT8V2Ji1^ zH>?nd*nt;S)?BQ(43^mbv?gXBu4qh~v!owRvY=~LU7GM(fmFe6OK`H8%~d4yj3f^* zB?8;aEjs3Mws4vuJ=8T~AE6fwPDbwbB)KPFn#teQ+(E@(kdiePkDarcxA=>BfU&&^ z1!pW8zRL=d?l}_#78VA`O3&K-To|7Vq(o-1Lf<@(;HRSi^Gl<&9pg9#qoy>nH+)mI zAU=CbB0xq`$lzuJT(fjqSX18ixzm(Z7a#FV|FKwylJPk4*Cd%uJ$7Gm{Wl(2W+(wF z_lI;zTp+E7Ln8gH&i{CNmHcb#LA^?mOLF#5+)i?h&-ZWI;@*V&$q5wemi zj`tr5W12(3tkYz|l0}>r7tUDDhJ*cy{CDLB)_#v$6V2GBXIorf!+Bf)DE&ju&X{n6 z34NmEoDHnMZ#qBU==fBkn5I|*1tPM>k9A%77H@CRhK(2Rn$a$s@aO1Y_n0tkX~>ey z=O60RhG59TkE$xSRn=LlFDgd;;wqSP|^r}sjI{qqIQj<-bwxN{DD1Y&_iXKI zYc8k)>!-(T|MpMy9y?w)q0Mnf>#$-<_RbT@zn351)EfJR^kGd}q8o4X%bfhHpa6cY zs0*~?g&2v;nFp(8Qk@wD+^O5(a#!d)V1J;RSE!4k!~Rfm8e8Y|x8e>6#O~6s(^^US zKaQ?Fn(6=lZ#K+r=6+|(HA0xLhXRU{`;^ z&SkTYj`S(P_?&)cxC^W4c0o@*_((ofh;zdXgWRC*j{iH>(~6)uq!dDf=Q< z$u#keOz>;w1cu0?Uv^Ak$gfa=2u8h7^y#VHnepn+ z6d$dQNK+ox^_G?oFT&qUYJA*0arwQQ3bM^VHVlj*I&5zJJv@MzNa zpwXkDf9cMgV)|k18PkJ5#4y)$)OfMy(HoAY6);|=oB>*>o>ENRrlV&_P8i2p)F$=l zsSxPv&(vvHP2|dNdkzQ}1l(a0pWYa`^328g+=Y>@;J%$7P8np2TI-~)N_*DD z$`HL>4;04P;u^b_c){1dak*{^JBXVS#_u@ib6`i?dX7W*i`RV}wf%lK{`++O7I*l@ zHEoAG>wA@{H?tb#1hs4Q4s|7yV^wAK@P6&v;sbf^9A54 zEeocb?YU%-EH&PgVy#Yh>9yK!P_*gx7!iLg96QicNxh2=1gX6n)YBrjd%>AZ?ANT* z81?XnFwnMr_m9fUR9dtb!=iLEdl&9@BY(C_{OGz3JJ@*d$D+Ml>B!H~Fd-LwNrQ#c z%`QW)GACySIo)foCOu-VNu}3;vt5m@!Jknz$M{;ppTj* zAb+nx`iclQ4w5aU2JTu9HaLZOzepkxcsO4k2q#2l{yY@iF71EP9lkqZD&9aaZn|{= zQgzzf038AA0i(z*>Q7kUn=mk=IhlM&a2m z(+h2hs$)x@krq4c7nwZb5w5BBY$epN)?G|aLeDYFUwb6grERV5)O-1_5kgua{Iq2~LM!7mJ^H~zk)w1qxgFuUv0%)E)ctmMgH4ZY8p3e}@NR9O#o0kj zaT$lLRc%g%vQ;;<5q(}3N1H^mcEpddf_@DcI&P~nOWI8)JVlLKxE$M%M)md;lR$$O zHRp8h=;`vg@m$q7*tn+-Oq%0pDuX()7-wa+*Ox9n&wn^}iKCaKef$lx&;oePxn^M1 z(aCYUo)q`hBf*a&z-%4mK?u}jo}ysyRR6Xt;E4(eH%xmztsV?kas=hy*bmrxH=WX4 z-qX3?rQ4p@8cS>QLV0vtgdXr;5>cyJpR>4E_{4R3srj`-P5Cq046YeevMCk?F-ZJK z@Zrv9a`&hfoYYd9><_H4Yl#%&ViV(rpoWzi+*TbhApQoESA{`G94-$Q&zN3rbSjMc zKiK%jh%G}>E=*NKktc1t?`t910voxzkNO32h&BFpp3K;pr#m;vel3-**!2_Ndq-6o zP$aXz{pA6FbOk+7Q^?_)tCehPFWWzkO!Q*9!<%C^exAV;{r`~o}_is;A zhM@RN=Qk(bK+AJzi$3O7Ge>6rE^-UQVz8J+&wN}{F{uX1xNfRbbMn+Kn2^z;^fXs| z0FQCoIgIU}M8}HU_o^@K@reeGa>`bmlbp_Tsv6ms#IuPCrP{J$#A3n0C ze72#r%_uD>RGs3lZ?QHi$-uglJwb>z4J|Gf9BFA}LKeiiNc}Kk?@XyjF~@i%cuX_` zJv^@P&!K(mx9H2W0e~Y!r&ALvu#t1$S3)li{g$o@Rz0~8yKhnv+wZVCVAfn#D$`kA zArp3*jLZlq0b&B4E)Zkla%KAfcl*8F-vDI3R4Pd7QjxWr@*}|b1F(22yIbAVvTu!5 z_x=4#bMrr#N49?4|DsQR6Npmpp7*UDbpTQ>To=Qhz5`i-kyd-!sc<8@c6t<%JI2Or zb`S2m;-kbh)xEW=AquQAtslKr@*n{JY`FUHTVLbyOO1P*iWP#rjR4l`m5iC|;(4}e z#cOK=!_+qyX0gsc>Knbf_3A@glpeo~Z~#OhZ1iXgG!_Gd@GqeBdrzJ-{fd22VSY% zURTq57Wyt-|8PJQYC<^0zfy7pbJ|NEZOl*xS~W&yDDAGWNHg|%qk!bsTLW=fwRsbn z67oZb$B(yYDoT1c_jm+XM!$Vw7T!I7598S+!j5>aliiBLik;rf#_dzJA8&cryQDy6 zB}oO#u_-6g#nG+W9RQ_uRHKUun!!`1<2pXZ;*!1*Gx*rV%HZz^B2q#*cvH+d8r7^U zWBmG9lSRZ@7E`2cK5KU;tjQ@G2H(D|qU;DF=BkVPnUAtOoXc-^-=sJobSh_?VAn%ypJHEsnt}1pWkx{D_ad05VHI%d_Gm(>jJ^=Ya~&f z87`}nPB-rz-%M>r9VgPu3#Ie%#HGwEfa}kF0Rkl328wO)gBL@&5$+4*AC$K2CpgXF7#qVTRa(YLToDY&}lQvTLLHeFPG{yrWWhpRc8@aN7;unEOtrf1 zxGx{MCb3K>>O3Alyp`mH$o}o*D>IxhfR%1%T7z5d{F?LQ?iLyg{ji8^jU&EJSvXzJ zanH)mt6X_|YO?2TGx*KQHd?p;pX1@t%_Y0d{$r&|vO$Fy{P2AFp#O&>5z0!2*eomd zPiire68aKOx7KS?8riz(K9qjS1w1B)s6aoCDB{v8p>WY{ru65qQ}lMU7dt#&Bs3Lw zH}?q}uPiqp-e&-3(mmh!RgHl|Z&4{f>!cK16bbvF3=FU3 z{jK%&vT}L=zIgFzl5mXtl9PQ6f^y#KAXy~-C5J|=0@j(iD3-a63XexwWnPKalemF@ z9*L9|OgUrMzwFKk!mCUs;^wBFZH*Nk_kHv*wol zza9Tn0mig~zx+;6y5}@k9lCBcHLDL@g$oecGg*K|08J+ThdR?=BO%4lQW;v}(fJ`A zN+S#RF;{9%Oz*|3df&)R3W2zfSfhp>e48BGw$HB4hG6c;_Qu=mO9hig6r4 zQSX~%IaV?TG|7Pn88iX&}Ty=1g9I5#^QGxpA7E32p9_ghyv zpQhlA$;19_xX64|@ZQm|8$5RvCslf@THmt`qID&gis!ltn-{E}E8d?9aGNHs)o@_> zgVm|i*-^xPCIpo;gh0#YpqxT;h)|@&N4hsJmHxxi)F=icU*Nm|OaR`t#3Z$$()};| zXwYh#?)eeav%efuE&MKTd9(~4`Fd70E|MPUpv{Y(F9n06n^K{mWCK^JUWBgtGSS@k zm88}}Z%trFpW6fL?a&El1sp*9Y?AQX4~P=(eoQ=rB6^?O|J@D)<1_AbyWJ-qiGnRf z2 zpP}nMv7#OS?I8WE+dDlr_J(9gxDJo0vXJdg1ZeR{UXb6bpbb zYM9!U{dE6C8hS6AGht!=uD=Q|8=~1Oj?^HeQ(j!Idvxgt@-ye9E(4>qSECw9r`+4D zf3gef-NYiX91!G`(3;p2SioeAwzTG;n;pAcb>ak{#DFtJ%oDt6a(r@^( zQr6MUFSef9G<{tbtB83VfRq2tX_;=N*XhhC*!q&p*MU5@fFHiTa~@pM7CNHT%mA5rFc__C8F-U-}U6%0w0j zQ-$(=->7Jh2qHPRZa5Tn?3##dNs|XV`?$j%e%n4Ul@1dNdP;7g*Ye27pd1J5mS7t7 z5CiTtzo||$HtNcERlCJ}ygOcvve4A$*U~Rg0cmxZPdbWkx;OsYs!VNrcWq|1-n7kz z1^$`21#Q}q8HO%EjsDu$W|qS$A9yf(a8roFlnb9o!=l(3dK50OI{gY1xdx6Qrj@4C zj?UqH>A(n#WSa|;bp?se)ck+i@I0F1Dd3a*a;z`- zy)VSs&MKh~+4~J7qN!YeX_rH7^-Ai|_k9~MT%sYxf_wFipS}e`l(En{hwu;AJg{uQI>SZM%xmpH$ zRf_IQ$MGjDQkU8Nn^z0}2)0z9hSsKxINIW-~xSYquF{ z?2FQ^(+Dm|i%2p51i2{4S;_RS?ZJo8S0^QvZj53*?(QDVZ)sb-_nUeBhbMZ1fA)?4 zrZhfVbc-SeM#K^S3C0m?*eIvL%vgRQigv_!3+~%3(;U(0>dP|Gc~WrHcN(#aSludG`&0hb>~e*+lxJF|Nj9DHb1&$j>#d_I0c+EJhtU~W4> z@X?|HP6H`B8u6?ngElNYMQdt94l$`II9&h_)aLtsSwb36hS3Rfg-JT`ntfN+TwuPj z1;gVg?Od9f|1AriU_VYualL zSo3rog5fNRbM66ND)WU99*3HxmpBUs$se(^?viSrjY5ICr8=bEq_y9xgzmf>BZ#q= zTl*n8KRz`2fvk4~$w~Dg!C?C0x0!45J6{5)FIC!y&724YtjxxXNAT|*i)od8T{$l0 z^Ld+nTt@8Yz@lsrM&-}LBb=X0Y9gaVMXlBdv<3juJ4BW`$fk)L>8vY*rs_fQnChJ0 zZePO)JB^dyRVx=40;UwYoDD9IJ)UFu=b6lM-|G(hsGz14#;C>YkDk;}ZFKPE?g4UN zbI0Zl{xzixRPwul=ZMDIJQx?%hebYg{dQQHFSY2^=AfUv9zfdvR+j0))MjAIb?*p0 zaZTxc+swPVbnY*sn2F)fheLm{anW)iGj=rs;W<#lh2Y{pM(r3G_PpMdTI~9S^2qrv1 zdvw{H-qq_Pk-s3NM|X~O;P z4>)Q(P!%+mi<^tivdH`q6TH%_zWwxuzlV(&0Js2Ds8`#E_Pn1#jsT0E-Tr%OPzHvO zLAuxyvoOU-i-m0GUefV)EC;XJN$zZf9! z+6YjM+h2(pa~>U=BD8oEBU<*~Hs##Fp|Zc%OF)ZL$aIRZ1>lP zi()50Y4jw}W~=GC{hJA#V%!Y}%AU#JsFeujRbMg1)vWslt3Hy9v*+=V!C&q}myH4$ z10b|P`e(_AHoWG9u!LDkbsBU(uZVn=(x0(ib)H0f;Md%rWX3utg$E$sx}PR+7Q8!K zMg(M<;On7&Jo3|11LnpHb<=G7#*L*ObU%+_nocR!R1o9VApw7-#~zlBl? zv;qiS|FpF;0s=m9Yrm_8J4B`FvUPFY)8FVcn!lp4VlAFFy~+q)^Hl}qlnbOD{?bI| zv0xQf={*lfzZ{~vS;oRDWhIz6I-*GaM8#LF=xCJ%oc-9Z6-H2<2vxB#27_3ksHDmB zt>g^t;}LdYP}URR<~$)9-e3*}d+&YP(g^lBab+nC-iY_|SA^ z5ZRndO-TaVps#L#>AF$*LqEIgiPy3M$7lCs{Ews zx=)dNGJ0@pO=!pNgm>qf#y#F}_aecimH>#+)gVje@Y3u`ZW=6I6AVLt9QjD9&YT^6 zMcQj+^4%N|OAt<56m9%IyB2#Yl;g6f@%AWK_29|j6v#b0@twqKwF3)8&2*GXMRJag zSLaE375%xtJ1;L+iJS`*X;3TS5Te-ay|12R5RDdHqxg5%@oOT5u!lFvBJuBPHId$b zf5NGSd|0riNOv$)<5E46K~#^7N*FMkR(>3LDVgJe6bLf$aPn~YF7Qit(|7z*tjbr> zA-k*19-o-EYg-KSHM2oX!`WQ(m|M?Yf9yAnNbRf8e~fsnly)w(gL$VMuIsTa#3r|3 zt-QxL2055leNk)n%&5w;#%o#ieg8GvC`c(IoU1E97a$LF0$z3utA3)jm7>kSviKH? zAZGa58HF0+6P3d-<`QMUdUuEgePzqp6We_TCKk++|JYxg$f#9mxTzH~hfBac0j#G_ z-4+K&rk`uaR~B*nld^maJ!DuJn3+GX%IKw zG%AIk1cC@vs{;DuL*MFubP{X^;d(y6p5S+SR6AiSp+SN8_}iHp4TI_1Km)qD=1S^8 zf|Z-`CsI>u--X4Ed?MMeDmAx9={;W+@mMdpU#S-FO%S`+8?ewMwml#!(8}g#o%SM6 zc}<%M=vs08nr*&@U#;8$J;cHmUap)U@(l%)Tr%y|-A+Ab7vK9iLw#HO_vn&p_Q&Vy zCwt0eNdxHp;E-=j5(eH>=M?CL^%20;3h@qS_OUUMQR;vk*gN93zGiwpvYP5xRK{-_ff!qdSojtLgCi; zX9QZ;rAXp|8iCgIKk6`)rTadGbLI{ccWIIVfzay>dr^;?=>y*6x+m4f==Y$;`k?MX zvwMzEQee^Z6n8|Xk7o>Y*jan=9+!;+#qCU3>t$^Y0o&yj=Q3TU(cs!5g|8Vs9)5%f*cA!W#Xp`v>u^@xIbZ^ZgAN<3or(8BXaqtw6?dhWAGA$EC=t9dQCei5dGE zx-Gz?61|4e0v(Ud8>aTv_YPT9iKH^lcP!Q|--g@+a4-|M3gm|!oH36tSIN7o+vWdm zLf{T39+%8CTe_6zuhWa?M|z$IXwt_doy_{!1RK&qs@4uFl!4q*Xa;zG7dLB3m)fXv+q(E-KueeBkzmNfK&Y(%zGtp|(~3n~4VQOA zEve94^5#vt<*S8%%Zyu-yGPV$J zuP&sN8==oNZ}yR_^-?=|Vw}`7CmPL;$@0-e?~-&-ccmFwf*zjnr{^%D%*d=7zn~Pb zDS$KInIwT{LcVMP;G!yIn4#qgc|RgM%A<1bKB~g?G<5-;MCB=k9DvVm%-oHOZ#4RE znKCnXW=r^~OuPT_)v$mTw09hXXkQkc6vx`_sM$dx27G3g<=T`@KW;;;r+lwpGmx$8 zOJ}N4%|Xo&95sSU@7+?<1Nc#apd+As*0JFis=+ob%To;d`8W;%8aUN1x;t7J()D?> zb~8ix;9Y$3T6TbAbL+Dd&Eq>PK}0tilrpXU328JI)WU2&sn@vZ>Ra$ zmrYTlg0JB24jn%dip^c6LNLdDkNV%}Aa$}lA-bH+ z+JEU-Ow7u5Z>E%k650epW=!-PjUh;m5}pK1jwnn1<M}4NrE}iL+!;iWdG_ zU9xAkhr^RAhb{d~**+k_(-KP~wHA(;YK%@vA96~jl4%*3f0VhlvGzyw*g{0P2*e0j zTPtMBuPO)POtfj_1uA2sQx41bV^<2%wer;|pG;uACZ{RCETRi=olx~1PW^KOo!X?} zDuA6il_t>4B8h4Ar%-SVQQ<>D`XK&ok`tUuw08sp;Bof6m&Bb32F4N6G~;s={5g?? z5vY=~k8bRE&@43hBc<0f%$-U<7Aw&L$7zY6@4PfsS$-2ZG?t-zC9*)ZKyX-|HF8{8>VZB5sq2EjheuHpodUd*F z_tBkIO0NNwuJ=N)V2!Qm3pt|k#0I{5j~8`F&O8z>xBC6$dhO?ds$= z^ir()Jl}%wyl70~+WCJQFuC^7o#qUtO3+%{l$a%1YUvjfU?4Lu-eUeZHN2}NN@u7; z^Pz$0I@67N(Uo=|_5cL>z6BvXvC3+?2gybnMopv183O3kh#smK8oK$;MItsTw>>p^ z^Onc~{R$5b5=`b~MS=x9zGe%ikz>Z;9obIBL|Ipup>5$+i*JH>-Jp z2OT-pxJfTIbqHI8I&MqK^om$gpZL5`4=uU2Kid|Mv3>|5*DtmVsCQ;gq9r>&3vo>**Z`^8_(G00fm7{-8}6 zbTd=H$_I4x;~GUwQ^XVR=#jM~3AB1RwUiyHSvG>8zS2v5TNBFxU|C%Gka-0p3FMUr zm{Od`O5(ThuMtJ_k8%SJuB6&?`8z`-)+@l>LISPJf6a8p)bd@ND$~8Q{o@7V0WE26 z+^8|-ooczb154c(U1mva@JK;@!lbqLf6=M!kzL#)Omd$!0nnpU=l-&)$oQ@3Qb4rJ zZ;|+vvZirrd*y8{*0>X8KCnNfis_p)C2Z$ld7%dD2Jg+p%X=iYGC`o|@@TU2`7#$)aUd=JUSz&yn zg7hi~fyVbgfIJg^mq0sBLW})RA070u+sNkg8ChG#{lqi--#PbIsiwVq9_lG}RT!>R zHha+Thc>&FY%~o}DI{=rXe83ECny}jb_Wo^%rB=-pquNX{uXe5k1in-jgkK<@Hm_f z1P<2FD|4)Cir?;$z&1)Q?BAh+Q3sQPyUcR34v42LMzz@Zb9yEt_lpF8ktCI(E#5l~ z;)y9rL)W&kstFL~DyMV%9Ak3q)us=+V|6=5Y9j?Z=QS@5#fE8Y-TDM_tS}u)47ZD4 zRgP==Tla`A8RxmAD278P$TIM?^`G*GEM|6T>%SzIt|bKTpPK?p09*_EF0Gnb<%m$G zxG14jE3Y(>Ni%=n;INPWr?(ITx`X=>ROH-++X6=Ug@tZOihyLveBgoJdFY=9etibl z95JJHPvEccZ974(m~%2fPGFR<<|^ONX#NRUF(ECu@vEW{;I+)iI-Cb_EipKO!*~0} z{EZ%Q8)By=tTo$FyXHn6xBCG(e&nv69M15Z-FAt}nsIh5a9^|(GnWAAnEmTp6?tqx zGJ8A6SqTP=-SFBbr6`8+y5BB@MP?R=l38N=!V_=M9z9+o{B$`#VH>)8kY|wggw`Ss zcYPFw85kZVqAOGmZQtXQQ~WY`opm){caPJUuqb-=?Y$mZ9z?tYOodb1yvWMvcEH<~h;hwaa|(z_X$F`N zR^w^Y=E21+a@Rh1oG*rpGXJ#SsY5t$$|=SV?$|XEzeWzMVMt6 zdhdhzX=w~eqjTD4hc7*km6@Fq)y7W@K7u(>c0bAzPp<=g+LT#`jQ_AIKJ0zkbacyZ zGSheJKQ-^LLR_5aV}7%@uLfT(cUKF}j%2zSRMeE+7QjZ_U9Gs9vvevxi+OG3?k`dh ziISlGlkEsV)*gnPMr8RZWUTpXvxo5d{LSmo? zK?$wB`FDqrKzoP7uGdbSL#MVr1GY({P0FYBmbAxwXBU*p&Q0~U=qHM8;YEQQo7AxQ zNP;ectd;SjI>0zzUwhS*0`vjE|Cogy;iM~!e}1j{{pcVDYhfYUKo3yZ*#kkft~p={ zys*dItwHR4P~|5*IYdj4XetLd0eB$@Rex@q8FpStFKESwSB*6j1Jxj#c+Hk9?Q0k#tUZvSgW;^%SfkHkCI=~sGaq+U@_~iYu0n`&wMkP^I>Vo^YyrG_jwJVs{ct zs0zUT4T&YXUt&gX*#nUMK19{sTbR@rJvcLkm?3P~qOm>A6Xr1$_sL(scZ_qp`-5 z(-oUJ4yBU1#O&a4L{vNr3{lB5pZ`{QS=p9Bj2QVRYo2{ivN&GQ-=f0I-=f!iMR0Vy zhD%mP79nzcWS3mpUqj>h3$8*7qnIT{NO1IKX6O)yv2@E2L*o-Ipr7jk%bt zex%Js&k0#We2e(p;_9|(krx30k(v{1Qrpz60J16C>0)I1?483BJP`nUWq{K#so-_f z+o0{+h&?d$(~zNPkDery=-J%Iq4d$4T4%aZ$>^BPh7lxdiL;z?*5`115p7Ws-H@!;Bk`fs7zW2C@xT5 zg-iT}AdLX26y=XyVPh7c37~Y>uH5)7h8U-tz94Vhbhu)kXLnlSb@Tvr%}T!G?ifqu zPa}N(xuRRig&WS+MtJrlS1ZQ4a0#?jxZh<>7@rqJv6UZxuA|j(W8}T~bz9?e54Nj1 zn9V#f<-s>YJ-rY695z#vwI3%R`ARsU|61_)f-g01*|Sex1qvIk?)ATOkLUF8x*(9P zcXY3yENzl#ZMDK~7v&*dc9E2`pB0uX`(j*)xhwtYFWs%vPyj)^Uwc^u4Ck+K*-6*E zGXmGh(b-AS!5;n_lPQaYZhZ1?f~wqp9X*gfIuUuHgVb+AcT@x*s6%k7PDsk0mZK0Q z^d6i#ENXS7`v^^^9O!C49r8nKtOn-&G)R8GoBYkVETe4f;^M_gi3&g{l!P1xA|A*eGC}!@Cr0QWc&dq?xMugn{#u* z1z=j*~lPQG<#QCp|goAKMo;p_r_hSc_aK3H;*)q32~#=Dmk_=L?>qoRNm* zfz6Rdv1}778FBNmVnP!Tt}xWH|B40s*7=d$YH@%te{@!iNRt{bilw48-Xa>nBXT(4 z>b&vgiTNA=!H+y2H_iJjpe=q@7mAmXm;+cubHLE_xv0^)e8u~ZQ~6>OaPR2%huoXM z$lcp1NFZo&=E_nZo1@vp6mxS*_MY8?TSSKDBG`z zw#A~@d-L~+NNJ5qCm`8aXZ^erqcrK(R4}UY@UKpsZOiiHjcu0-o{+r@_4D?s> zVw3;MKP}0>ugKx^^h05EV)2BuewQ*J*>mDnL;uE+eeYtXRie)?O{LNsZDYAs@Hi(# zADU~Gi#grU0XLrv?UfRApASB#1(gPL7a&yKEH58=Gi|LUxN<^Kd?i^Qw8 zS!=#JT3IBPOzt{g3Qsf|xkn#w zK{XZiR$j7qXi?UqVF;%1j8ias6brfo4Ebzl$8tf0>t@NL@6Rm`oD(_4vd-uK&Up@1 z(K=9N7G{FzrFy*R+p3ItvkQ-~*qZYfEZ|Vhw`eYE4ry+`ky!YYSvD#msRcs=IbG;d z+X*Wpt#rTa9}8E=(EFeZSsPUx`J5%$e9>}BQzoGnpjOuqsfrtOW?ws&!H3_$D|q|? z@PNb^SoTf%qfMpNKUl=DEpK?bcoshEL+T3nNq2C0S(*o=)S;ebKNz{gQS44r=vpgi z0>dF}o}KwIdZsBX|TAUD*sT|sWtPHa6&D?WR| zjP(+xOxb+7Fyx@=M3Bs{Q)f_y%Izuh%iHrU)3g0At(WprK6=)G_u*~N`V|Uj z=MtO+y40pKqu-cg^cgk~W(SNY{nG1|{E?I~P5I9LiI|vhM-MR-h-{k7D#`=47{%e+ z*q8(q02*`voiM`>H0Uh^GHGcB{%`FkESWxlf8C$|Ve?y~TH?|Kz1z9`}_-pKE6 zuzP-1y(*JAyvNOx1cqM!^TAqRgnw6h3=$yHnx-i5w!WyfpM7AQ!X53B5m&sNr`!ZhNECsD*a2gz@d#7p7yhPoO_f*-xZ z4^G*mOI@itbjol?vAeDe5c9?l&-P%>8I#Qe;L=pMnA_hR1l=+)0|=EES#UdnjtXpB zp`b{Rn#kmo!w2!T-9u%uY{w|m-ISxBbBs9x{gF&s!l(~jMjgwVU$_84Ib4y^St}Kd zZY`O4Nz+gkSY)9C$orEsJD=uxL=)QZ)39D_z$%_-p$=dLw(_m_(s0Td7Qd*By-tO( zDe0XI0Un@);JcUnnKg9jJmN;_9TSnO{+!$6(E#>(7tl?o`3XkmMk{tIN49^71nw5I z(;HrTrg-pqkZ-XmgQ1DA-Nb#1-JKwgNW&rntyU7g-6Qx)8kF!L7@s$EL}*S) zdzFL~g-vaSmpdfZ`R0X8_UvKkM3P&n(oQTfEQRyn@Drq+6hoRP*vZGU5-P-cxJn5Zw-@Xbyen}zD@98%&i(fXThevIX);?ED zGOhKu34fN5qPgVHj%tW3cek_S>%|3HK9!jgTu@QT3;eIA=M3Ef{;895 ze<1#s?eClDxxcprp;V*~=Jo8DkyF^z_ zLdY4@6P>RoLO*uEjT|@ySzdRbA?(J#a1Mbpmd6)H&yKZ(2sAWd(c7Ab(s;7}5KRsd z={_pdBa@hr$En13>5Bw<#1~G@g_FehW+Ssp2sdW)GbbCAIAt}}i$Dp_G!1kFG&w3j zGE>X+FViqH&{F9G=}E867uw9)iJ+=zD&(B_nuRlMF1$9xMO9J>4AYs%<}$>g-&E zEG`5R$?Z~nv1_ju#T;SQKXq@_Fo76TAj?q}wZXTRP|d!)=%$1@x9tI^uU!pMbUiC0 z(#^EPZ9?iG3h_)!6B*$kbK(O+s?*nRnh&$GlenPNEKv%ItcX@P3*8RJ`PN=`-W~zBVbdmFz(Yadx4ue38pRI7 z=yQjN!-2?;`)yUi_r>I_t2|GmG!OTXxqDer2{R9^`P9xzPn2g$^Bv#hpi)5^>@9?L zVVZLD=AdRZ)ZWv+s1->s*cYE%m)O1{I9kwpo4GD{J6J|J*O&XO$4plh*K08voZuo> zG^sT(@MmbVkF1$~$AN1?UHeU=-S~E!(&$8C+HElh(=fAmx}Cs%Ey4|HuBtYMlN5T>E)GR*f&Nz`&}l}VcUYmoP?}QRqpeaYXIU>7pL(p+1C$^t-?E?6nWJ9m{YE1& zUn1)G9YJ>c@xWq0Tgong#|x7?$->L!rt-)rHkhzvT;%v}Y+x7;d&p(78hsKYPdSL6 zwU0@dLOP3$u^?vKNB6@%KNQrM5LB*I!^#Y`zNPlIv3iOb!Y18r_3!#IiFugVdoZ26 zk7)v;pSU}VVg{Z8(AMfLp-q+c6dWh7`W|C$D6|ZtrM7WY7w%XS)BjHONE3im(?u97 zLy^7X-J0hf@pm$VWH)u_y-(N;|UqcMg#gjLeHMBiBIbTVYmC z9OMQ4=`2ukpd&;ytYl4Nz#mW`Xyk||)|s)F-)4R_7p=|zRgi?i2=c&h?%vnd)aUl- zHZUDyzpA!&g`VWTVy1R|XSYGrClx6E_|on~(V%!hJV*7|HD3uDg(`SiYu+#*HLZ5` zbjdy~>3o27$+#-N)+~bMAiDp(Px2JOV6w3m>J@eTzE~pmxAM@Y;VXd4&Q8tNXONnj z1s*P+*$w4-&;T1+jDohcIEuU}OYcZht_a(Pf>c8Gr0%emcgnjAbtKRz&za z5choKDqyz-V??74YbmhUMFE7TyN&={_*Z2^4|f(H@jY7kkfY4K_AZp-5w`#l%4|-Y zgVn3vof%dV=|Tt`guobrFJRfd;7Qe{+Sm#80R<95PYrORwjOd}>n^>&J1G6e z%6k}!VT!$l*{KLfQt1G%$OSJ}D6?IrS^QFGOL$`Su^rku6+K?eI~!T(1s#9q4E3u+ zG@6LO;hyB+m}i7m(`M=u4#g;jch>S=ZD%OYKd*lv^_xQfjK3 zF+ed$a`|^4-OBPz9@1Xs2Y=!8 zrgML4=9y4D4>=I2S-cHHGyHuy=qW0hOZWo8M8~JFUp{38I_S%SmB9?n438l)FXn(K z2aJ_rwYEd`bj{9IQ$cKbo23|w#VW9pTWGCnEa01edUvO5G6F2H{H1`P_%$7`B3PAjx@ z+o?aCG1C!AEA*T)VvP7br4(RNvQzq=Fh*DGCR!hE}*Rei_e`1%~ z8@seJ2BsR2jQ>N9>!_qE1()EZsjQ4_OrFta-=gY~pE@H8s!Q=6C=(#KB2l!t!)N~{#>UIut}#%8U-|8I!e_2+u6k+*g^A?D{JTXWD*cxH0mD_EbYXc z@3i@g*Q99I1F)O_qr*dFs8_Vg=rfTxm}5pBW`k2#0hGpX=>OH@d@C2l(j9m5Kr%m8 zoLl4gxl-qy^$zVQu}UvlB20$f8Bq>m>$Hi9BdSLdh z>+rlF(GD0Ke&{1{$~_0hbd|EI*5o@+3%9XqA=VSuquBKr{l>;(tZZyV3mCJa`9^+e zGLcm!z4T9wOcq%HFXpl%)1atdy|@0W>;q}>CnE$~y!FF87@pkNW*BID^lf-)xu2B$ zTa32_+{sbtJ;P#CqHtf)#hSJaqGGi3dpwe>khd}_dueuM$lf&HU1#x@b0hjK(pRxz z4tcAn;g;hEg=wmvoAuKs1N2yTe*K-jvMu?49GzuclkeNcH#XR)(LLBkBT@!1a)5|M zs33^+5R_0Djl@PPX&@-0M1FuE-5{MxsUY2xA>AF%{eND<%lotIzR&ACj_+}B@3Rl% zm#uMOK~>>#1N@zRG4ZrIuR@vLdxjUv`akT#K15TY2^=a|B3W|<*XIn3*sBcK^^4uZ z?}cxZl=^m#o@n(w0{nNws@Un=w`CW1G7S1?ltRdFH^|%K2+_lno?~5 zj4t}tAm6dwZ1*Y@=v8U&JlnG1V&JvfODpy-18`sdY)gdf&EbLNz zJZGv&L)T;*n5WrkhXp(I=&3sdjwV)FpsE6LiQ!ITiHAKH%9Rp_$hgDgXU_%S8*9Rg z*+DdRJmH67VX{s1>t15H2mUl<7u73US<9>At4ys5FbdV7SWToEbLY~6h@#UXB#(~X@1kNn8I;Hb);=G0xm)*Vuv?y1U@V<+T`TA{-~cST2p zT|AX-R#~^d*;n|aGZhcMBW!Jo9k* zfA9}FS`jE9o8a}#C-=|~mw4(fl|Gb(zDPK4y_P%EfdX)9VJLq{^rVhPB-LH8de~eZ zwIWbV&+oVJdH9C+vs%{sN{^tZh0^?%`dEF_L4mQAPux(HZZJ=CR*_{%BrD#op!Ln@ zec4rB7zVXevNqp;!s>DTYU!GWA!rp#+x2yz;22+^IVR)Twc(y$WM<`+4t{yBaMHPF zx%%CCX+qiJnMW74#(UpSf=Zcu&eK&>f$KA6q+FC!da>;RR4g3P6RZHSqPNK%Sj#Uv z{^=f7d%NA&E7(`% zhKsJ(V$;{vYDHln4q zz}I)&uK2JW8D(8DjCqP{@jsD~S$X&!BWkneb|qRv+pJpKR*3Q#HD4_55^?0fpH_jjQRo4Q%lV{ly?qB6nDi# z+4IvI(06E_ti*B@%;?M0I`E6KU9VUD)L6~s!`5aNbFy{#O-0T-QO0GaRoXIe#gu}M zXVE|AEgmFkpB3(*eIiqXt}trfsmiRoWRaEse90dM-n?4%{Jo`A=O3cqQ@p{wINM$l z*?hfpTVSH6XB6xllq%JrWf)BgM1(LX8(A>UGb1UQwXygqNNG>MIl%GHtc(_m3`7k8{<@e-wx+|LkIPf)H)#kO|9ktLomlr%>g&SE3^;V|p5WA@!tr`pkH3s= zZ-x{P%e_=}gUtj>zrwQ)Cdz;mksX5%^H|$ZYNW!&|*YGQ0sp>X2ntpa#g5QN~ zoutTFjT2u%Ub%2P`i1bck9|9Box@jE$wv4{o**k-z~Xc>AjP)5!XHm^J^>9m6O}bJ z0jJ8dFzC&wn<@H7{!H!qr7qvI2mabJJE>jwnw8rF*tLfADtKYDK$s2^LX1RylqLL!LC#taYSHm!>h5s$jc3;ry z6A2|BN3Y2wcvJzno&XT^$&9^i8%nOyumU;y!MhsZgVP1#T|g*=;&kl1UZ1aVOoC1Z zctlygYi;XenxiR=fhPYSqNK*fBCjwqTp7gP&(ic}tE0`)#=efNPU7B%l7cr4F5~PD z!z$$+%#wn&kB$wR4)(n_rf_ zQO*XzxZi}{|J0tYM-hFV-Sf#rnV_$&oQe#^5xquc08AyZPNrFrS-|}F75f{ldbzBj zFXD72*;{)vJ7F2bSnodwfyaY41xBqx@wtNxEwwFymOhXOCf^vXUjKftSQ;h|?4C2L zQ#D-^`|iCY$pbbe@Ii$}Q9c*Aq^w!-^z0S#M?fk zbmzlYHQx*4^sXt$Zd}{)y;DE-20y(Dum=5`ptb^tTFZij}^;6{v$2P4EA8lcw`-aQFNJbs_ zDQtb-nrE~cS7Uz|RD@;HV2ZN8z42>kTi)<{I1BJ8pzORvI}YhAQ|{pUx|g$3$)RX! zyxe&AL(fM=2^!}Ba~-DiIrD8P97khK%LPjtxC$N|QTB1?jKt!Rfi$mWVn9(n;(Re6 z4db`Pc0t}om+F02r%s>93pY>MiPuV+SaB#WJp?7QPS*-U-$506uTMYBn^)koXU{F? z<(T>*S0}h!YPKFFucsL7%kE`U=6Ii?w}0&tDg*7QKc)aa;ztga&1lF{YXc41X=)21 zt_)zb^v7DUr$J-}rwrjoAQH`$Fs6|N$Z=D|b2Zt+%zGZ<-stn^nQ4c~65+9d4<4~B zU*g`sdrFP!|E#c-q$xqUqy0OkBh#T?;~hHc==S&JrXj5f@D0FRS_MqFtJ+Y0 zIW2Uvd#BQ}#&54y_OQ2#L=*G%fm)~RDDvKNR0iEla|biG z{q0FO{0za2$$93spcGZ!>r}a>c8As6E#9o{8tX?Z)cSeapDyR36b+V+C}ty0>Wqp_ zq-OMH()qM)NFup4`A{UVC){5U!a={6RUWfy6@+_pC>A5tv5VC1yBtb3i3gU;1_>U) zFhT<>CBP-YBg=;X$2Rg%$_@H*h-BRmavd|_LJu4X;sl!|M5}a(eBKDcmnnF*nE;M{ z{&g>li^C@%mi8{X#&)*%Ah9jISZ^zu7$zj7js$qw#dSgM6$ga~OpGdHjjpNKXCXk5uyvkZ!y^T@=M-th^(ij((ed7fYkvkr|Gil&wjxI$ABqK~yo4EFcUCx?gd=YLMvYe8Tf!xPVgCuoT6n&=<* z7rC$uz7It@Ohdyh3a&d`xTCts*7q~)Kn*&=ien(`t>%&B70A_s^EXrJhith4rq$4~Fn|DHBrvbtB z5tynazg!&);SD#y}aC1B!?-!E}R z&%5X`=0ZBp`B8_9;q$h%PVhTnEQ4_O>VBI`Q<*cw4FxVG9E@!DIAVov!!d15 zs4%kyHeaS2Ek70NS~}+O^vb|@3|YA;coBZFG&^80!HtaZQnr_xK!pyovV4vFR3P`X_Z73Y$q# z^R)Un0D;5?h*JS9ed&YU?p=PDwfdebC2T)i1bibEkGJ;!KbNL+NQHs~E7_hvhYQ!) z7(q)KLw0dX%@*7ax2+XTgdiW zscGy-MZNZm{i{KVOlp^|h_Y^FF+Cgh7wf}U28rSeRTa()beG=uxI}2XOrGfY&Hoq6 z9hjB!r=FgAlC}Hx8-#wCOO<8kzPiDlpZuJf#qx+boS7UwufgK+G^@0+sEYLT{7@l& zU+(~|#o#RTE$+&O+WWtY-#>o)9rohUbe{@$-N_qB+{)dUefCv149-R9C&l6bw?O#lj@QbzT85NMcphfQH0lpaG0@8>{ zgh~*3)(KByl)L8XuYzyAg9I;i{4dWFE>!J5VKS80*^gv+=If~A)q`rH(`bUbipMG> zt@P;BAM)Ndb9ci9_1zBu$o|@I^nw7%+8DSG0=S4XF@1qV{1Mhsjp?}tjBZqo`h;Jj zkT&<9CHul2UReDZ`$ff+SKwSCO$No!hH+!Y?pvB(aMi!DI_7$Bh44NK<#L$Dmr+3pJ z*8&T#Z!4s^X^nSz$oGH;pLncmFgU+vcDwA(RM4J|;ZYpTD}yUp<-h7IMIS6L%Z)zd z`~5JC{VCeihTYCBf}dZt(Q?YnL`xj>lQm!lwfBkjku#^+>o|^7_~7Ez2R_Dm~dSMOGC!5m9q-VT0`Ia7Q}dWu)D#r3lhbW;@*#w%Z4sDRux9InsAcEt@i51@b81kGX6TrG<2< z*4}9KroUy$M}t^@D58CPsc=xa+ZDt`G*}GVDI3~MtOOz;Vmfm^`6H=wW+C4Ml{WpO zI=LEO$_%u`GAQYk($sz{dput5Wqk5QRZQ^?Utzx8KG8 z{UESa1_(5DZr-UeFgs!U9}PAg)>TtA+^x{%$5c#OWOVPpjU(j`r`4UdH!nd~a-;jR=FFY^ES@c^;VIqv$|1%yMDz|CT{7x(ez;*yOE4Q0_u zW9-U%O;6WLH;j5nMiQa4ot#ABgA|$!bfHvR-%^pj!h3Y4FAV|>o#Y;6{M=>ewrI(i zQgpt6@MuBJ&aZzJw-W{-{R~qUboH{e!Ae{^O4hJM_wW-^oOW)0aKdS^@d|FO_><$3u4do+5VsDCz7m$8lOE!azaGAmOrd9GB(;Tf zK7f?3)89!+xD0a6&hlQd1av{&Ff@wef^U2>nR=v`8|~Y+@qH~e089wtC6b>b39^e6 z@~HdOQ1Y-91EEk3$jln<23UrQaHOEADi470_6dDW2sMa z*b?G$XNzagqH%3Ye1pnNo4LtzBdM?Zm#Xz`=8P&16wxJqe-*NQU#7BpTVCODJ{YN! zhjNd(GKbMOem87#LuF<_?nI`82Xc!9Bff&zop-UejFzvT(!*^SQ$K)Y7w}Bk&tA1c z=D~CVjZ|fMw1KzhZN+VlOGoZ7Pqe4t`yreljN`uY8R^B~cN@2z<-&p~&58H3S)t7q zj-Q|R$-lp@=vFN^8E!*05muX-Qrs*MIo1@Ey$G}9uA>n*(%FA6XIr2=bXRD$t*A42 z$V4U`W=dZHHnrerj@~F1c@*FA{k35R`R8 zbC?CV_?3?3c(6P)9i&~mul8q)zk%Bm|Na=&>(FpQzSaG6;VdEmjIax&pW(b3?F-eMgDpQi+_cC=p)y%HTzm3O`E2@JBf*mxFq$c%0 z?5MWCnpOzxOV^v7?{+;EcuOaIQ>fn^_WrfMQP^vZ{{MaxYqXP^gR+9#u9H)| zo;5LFWb%|GY7;RriR;_gcfK-Xa8nDzN0*1^Lr~6`Yv3SW33u{&zyTI~+mzNvAf??~ zYRY-G@jiH@!*uo;6QN`IKeGd;q@@wiA_^hIzs!(MDG}=Q9qUN6?QE<+EMAHP^fz=@ zjbp<0E)CY2pAt|GfWiO6j9mGFspB7IF&bAi2?W8ZU|9f)nC;m;y~jrVA%gpY-ivRM zPW9U~0+_Jkxt7;g>dY-c5nfLglX};BgRYTv!j}M#?YAwPD(QI{L(@aB0JjLOq*mWz znS^hpp1e(kpt0K2O2V<&k$#k`2L=ByMg|`OTmG#m*LU+&|7^!Q`JjNY7S207ZPp$~ zH)ns_F&8Xv`Q6r4ZROTKRO@B$yVcwwH#I}DkMZm5#SoF>wlW%sQ^F;XM7`$C4Q)_@ z>;x3%3*SQ%U%gXYuKm~}k+LK^mpDl`>EVG2TZ@hFeRfqJ#6y#$5n4nIu0jqX(88H7 z?1TT~-R=(+CO(}k#>f?PF3oIz7uVFd?1bhXXj@A!v{Y#DNxX7i9|r-6HdP<2U!!?N z5N+ph@O>OZU-^E#++%FElZ)VH;rd#uFHoy56%eHE6R8UuKU)c)CsRI-U7 zcR1|Ka{bu%3*XQIODQP}WtMD^Y^{H&VZ4WZ@T=f-w-nv1oKv zBOPGhR5zM@lg1w=ZRYms=dZ}pbpFZF*ZkAPOn@>=^~}$yu?Lu={_rjdD~%W4S`6x8 zEH;^=zi)B5lPrz)xuj9aKFj6Gdk_IX4je0X;~ zov3tZqNlLM7GkgZu@7`f3-k^-zHJNR-AwW)0vY}nC;=q^&d*Gk5+sqUBGHklDRB#p;h*h|DYqbGk0(U9mW+1OFP5@H(|ghxPUJ>U-G1Od>;&Ry^nY$WxMx_uWND z!4Q}W02Nj<8QdwQ4};4a(}*Ab*p>;A9qS;qIvHm_V?1eAgh=48`Wp=M5n(h;U|x9x z?cvY_h-y*&zAsW;=iBS)xKt@_`A|QuoFlF~1>A}o`VIg2dNKe36&vnvo0;{Z9W+Q4jP(pW$BdVF|W^LSpP z;n`5h)epr}UNOmRdGFVJmTV?8e?!|I8;L1{{gJW*e2{lxUQ!18?-?_2`XfG=>xy8q z^)SE2bp-mBcYKmzsX}v0wILh66cKf=DRDfjVhR%@N)=+oNu z=S}%_f)UDKw_9Q>8Xz@$T~jyo*yn9Q)XD6zL=o&EJ7%&|XlVN6Z4fuZ8I~>P61j^i zfUdedx^T7Fy;RNfj`xc4t83LpYSfN}v8`&Uu-=Y)(_O!KK%rj$)uF>UUTVaX`Ze!o(f*)A*VP|u7++EHs$sx^SyrthREKI=IE3{ss8kC3ot_EfERZJ!8ItD)kQDHbh%ZqMtuXxyX7z@OyF;eOs`Y9HE zXSx~bXUnR9DnJM)KUSE&$XExMgm2S$Sw%na=h~{_z7VGUzY6nrBW-9{!CkBd_0HPe@n!-kt3{=*I9>0i=p}~{ zcUB{rkwhM1wx_1?F#bG3`TiG6yKDri_xh6zH#J}o7;aOMt*rl-Bm;phd)>%1i{5`i zz15W zMjSw2KRtVSu*nZaZ#(AR3GM&|PX3lf)hhi5QtQ#}MGq1!cR?34B%lWhDIGw?5y&tG zLn$x^vU~wpM7wVvfsMAp#RXy(AN}b*3=APFSpmAR%{dw+sUhR;w1hw@jm>#f}c1klg)F!1Q9XrU*-=Md>qN$q4PJH zcXhs)-TWAVnKE%Va<@^~M6nX%47*E^qi^c>ZLV@iX2jVO%e&_6x6L^Ug+qkN&`%`+<@@C;&|<@s30W zA2wY@nwH5yWjcp~q`PX4=o%y(1$ika7#|>I!2ZKZ+2ecvgCmwG!2h6tlE+IyrqgKD z!mp~7a)%Z6i!I7Q_BF)Y>itiZQ;VEmYekEukDt^Cc$-||Ui6JE9yJxj>H7W=Yhot- z7aHBMGYxWSLJ(~NiZNC#>Mq5=Aisdus}r9Ma9imscK)R1WlLvoq&@RQkZTl-WzV2h zd|{L5;g+@`py9gKs~F%t>3X7x%o^%R(U31pX@~UGd=3qL-O} zA%5}5e)b7@=wdutBJPaFe=af{knwV z6mEc8Jte~NAiCXnBe_9zL6`-6)97F6qKcFje0)C{l0lM< z?qsvDmutN0VODIR27hD|TA|+QymqGeR zRDUY4P<|NtZIFMWD{lC0^=KL_P8qfQUG`s)eOBDj-3B@ebf(1lAm*F20`y8j?~7Pf z-p3=|lTvwoVB1N)H#8@?2pnvyQO_oFg!FG|(=trd>ILjeyej1&NsW;Z#7R+m1fu2v z2EK7zpX)c@8EG%VgRa976>Mj?sezY;YX*?f02u${&*s4Y|DJqL3*2tLsrb_Z_nF^! zuX++b?~BFOnb$AvNB)D%;5HI#b2Wcz-P{M;&GcVg+!wL&ebCXdn1%}h{jdx-FsM(0 zt6BYa0UKPL-cdqj-M90Omq>_4sND1)KH zghny#1c=u~)>Z|j2Z3d35LWN-uTqqDeK}i_Mq7J2Bm=TJ>v1mEfjm!ILc^B96y=!Y zKYqsJt6<#B_KO8)#3U7Yb_X-m(tpEyR6bIghS6j9vZE{)$P@lRbt zz=xBCPjbUb`FU^W^@i5YnXoV~_r8MYG7B(vX$)i`u5yW1auL-JRvy@IW$KD~<=4sG zuk8J3B7UtaP2aQ(d=HN0+y;^mmJ>1*h;;knlu@s_hunX!SKGp1?(P%TK6e!4+915F z;~sEz{{5m%9)8+~6Pm5?R|2fpJT?G7#7&n(mTY1|Rs8-}xj) z|J!(rzgT>h<@O27j04{f@e++}Gnn+~?EX;!=FpsXewR6hl2l9=O=AACT)o(z-KrAY zx8~SeXpye4WwJQY6gl*F`nf}>rFMZ9&xv?jbK&vB=JhAkAnPoIh!~{r&Jnp+2hRs2=thvFWS0be~p*h<6ywI$vt-yR( z^dP5J3ap~N!n}PS^ycL}p4rAMa+3&acXpY3)MiwcYQ46RadHNFnkV8lqgC*fhd~8k z#?LnOm?QaaVsnQTHxQapGJa1zG}+T}S+4(OEd8!Hb!d#nVcb{tzh9=cnNb^S5;>Dd zPMFr}z$;saGw-*;8hfQBpG+bLdzT+0IuA|~{;*NSM4zmv9HXL@FxDlCdoMzAEOn@i zB?mo=ZWuX9t>3xHIsKnL)=vMsCg}AXKU!&Nf2h{?STF~qm=Hi4V&Q@I#CKbZrW_w; z4@6Qk@Cn-hsPmHs%OVFXalYaDdcPU;K`He@XlkkqWx}iLVV!cc(D=5pVYcJq6sIIf zPA&hEoc5jg)qy#zhg++1cSjeDvk9RLpXB;Mn^2qr0c(Kd--Skw-wB5G`0B&BW2L+u zy_+P2{w>W5lzLUn+duM^hnM7o8RlWQFhxqT%mj~oW`8@fD!oP#TR_6wZ2p)zFmeou z`7;&i(C_@4dLDIe4X>9i)ug5IClfjHwk3c~ku`J#acg7)YPMNj|8zT6^0V)=DGpKh z`+B%0F2#eA8iau5g0$k`0jj4}jb7tNBFkJy+ST}b8&3nHy0^WpBL&X_`11R6%vwI2 zR0f^Zi}m#*lA=N1(|@1qPNr0j-X)KY4G#smdR6^<)`ZTqeB{(GQrX-y(t{So+0ik& ztW+MWpPx&R?>rs)DZKu@f)kPXo7yTYl7(Cs*{C#zhwShj6+9KAFIsNzYcg}X#4~Oi+VVe z31RT2w8SgUeA0${unt!~YepC~BLyu!uSm?~uGi489_?r7Y;Is<;7*+5RYCg5V%QV3 zo{ct2OV4x{Qp~AuYUPj240qjo%J``1&gSb>i9GXPtKZ5s!7|l~M84@goYAaA%vQG* zCi|FPz~Zxf1mhco7MFwB=3+)`z)MEG5ilKD0@TfoJm{{gl+0tU3Fg9ldSJ)xj#*+{ z0o}7w81QwN4;cwy=H|?LG12oluqokC(%3(_D8E8!A72u6nU)ACzX@WWNI8EY)j@q7 zoAB3_e)~q6;lN*C+qeO5ccCV!w&_-oLQi&T&El{^e9oRT2)zs|R+z5uAa({OT^z17 z$a-@hL*+9j0PHsKmYwDcC&QQsLMJ6cYHkeJAD`njN+t%@nFz++57BywK*HcZKcrUN z7o|+6OLui&pA(4eF_7@@@WITmhBO_U=2K{ej3tqusNaPGagXqMgeUSoxG&nmxUIx$ zcP2RFCe_#RkBbX*lSWADFX$rlqC@_M?PjJwzGS42>soP!p=s{HEMw&ZvAmM7@G1^a zO!Q$%?VQ`s&P+2IOq4v!^Y5S!G%|ZH=fx4HVjUhei%|(8wqP;8-B894#je*~Xm^}$wIh+SBU@eWG+>3pTp6W>DEZkpd?DG^<@{W?Ce6naZ2mfW4Ux5-X!l;NJo%B!0vNWB8j!d?0+1tDw)iq!bq!0gFniOVOHnI- z0A%ew$^WPWgs4dr@luLIL?kg$Mlm%p4Dh)pD3~C<_YS?JOyzQvf@3)gveS47>@ui8 zFN};%{8$ARQ;Z-*gCp$3;!PXc7r(Rz5_w}(y=B8UcP@*!M%&R#MWy5xqs2)#@>}dn zjzWTnNe^~;*%qWTF2S+u$soaEM}_HpuF|YnrR#rdVjrp6WPR%#=$95nabBQF;~*}6 zt0vm&equ0z3%m`i5W~GXygXQZfmP!#OJaN}E4Ag}CFNIk;q7Y@avQ1#7D=p0L!CZ{ zYLFr&8hwFy_ZY*yOXsTZor7AYn?{(81f%ZBo?FkazZ-iqcUR_Zz(rK#r&L9T0j><_ zs-h{+*+Mg&+bnN2-GEeWM8oIF zG;|-GK1h8xNtAHe+zfxS;&hu%TtkuC_DR-+wKSHMrY3z8#GETz5dWvJ*iHR-Vmka} zKz51vn`&>>?>Kd`Tq~Q`8&q5Mu$mFSb3R;Ks5($!m)^*;WxLk9o+qjrl#YSzev!W( zd$Yl4HIIQcRJo}i4#iTc|HwE`H=KrDbu|U%&_gPB0}$+?^93;dc#1nB3FVfn|D$v{ zyZpRa2qz>6`vpnMB(Qki*X896eHZ-{TAsXC_6C%*5T;*G4Zl ztM_E~I7#Bj+8l~AVS|WD00dLt1ePG<8&?!7U(woVOaRe7 zs^2J@+MfN!qt^ahun(hB5yDhpPjZ58;z39o0RZ!9m_hl{m@WBOze0s` zh3G!l$()!9lz?&qtg4!^d9#i?`-#GIV9(o)|M*yVb;KgleM@QHObyl)rF(pzy1<9D zt_+%@@MiA?O8+aHf-RxzcjgnwcO} zav7Vna;NX97&VCx_;O$<^_7deyGukoAs5r-i_AvS+}il|8Xevslr;NUIwl>|;XyC_ zEC;R_$0MXw;`VKR2#Ww_oKI&TxT zr@PElouM>D8wd_jyi!LSVnnJu5uf<| zBC3;Q*Y;50tawE86aTzX2ye(;GviO@9+P1frlD_`bdC8h=S@Dh_AUE$7mQo295Aez zwPOEVAE`{SxoZt1lr&@gHI9)<`=eeW6cA?$`wFcY1NxfR$fpkUQFTquSzV?YN+$?% z(PjFxqDJh?YJ_~P_T;cG@2?je>)_4#1dqRa-WAc$83^T%S6jYDvY3fcM|B@``)zE7 z>jJmP(H3!lGoV^^V<7}Y2zh;)M2@7z#;Y}e`Y!$RJB}kW_UFCX{#2PSW9+@P1@Ka4 zT9L&VIPj2lRl#Cfk%Wu~QvX10WOS2W)K_9y3A*Rz6WjF7f*4<9a|gI}`=LI#V1x^w zRf@-j234^+sr?~^bMeAZResM#{tWeZ9vp-*UkL5V&U=ofGlR;L{DZ3Qharztd%6|^ zE!jeyqW9@_i*>}rUA1nssB2|9y_qkR+fwp=3G-9(?k4KY+Xky2)wYP+me_jlya*3x zkSm7PXvQomJh=ReHu#pj z)sKIVeRrpI?x>ZopCNb`*MXPw>(;0gUyu1eOfAe!A_4rbTAOxPbT!ebn6Q0lVu|^) z_`h=%(Tqpsi!R%{zF%Y>ytZzlVQ3Hfu+6}!o)kp@nrVKG?~3b+(UyWD=++|4y7IV>PP^}dHV_{Y-{4mFX8T(X zPuJmOi%{b?W-JQ>;j9-!&A8RaNjX_mq^O;ExSDcM)cno6{T%LhKYX@hpNOVblgK|B zdM_FqTxVJE0g=8nA*ur13kc|RY)mjm@f+z?WW8zeY(b-v*2FwqMaLBJM%=Eb4{fQ}2_d@i+abewacvZ#8Y z&aKe6p9k)O(>bnI^*P7EEN{^s=j(c|V=B0Ca`O1`ykFp%6>V1R@P}86ypkoBu3=)@ z33GRHP6eivz)=oi3g2H$&=Cq{YfDMwVeW`(um9x%*K75?4Ix|0UEKP?gq@zkA^It5 zl!P*-a^Q3Vhjz%d%kNr(#}t}cLLI))=h}s>FMpErCX2xU^mZ`q;7Oj@1e8}eGM}R6m`IkPoK!ym`keyypJAv^L&>|D5N~lRx(Vyo+fSJowe!Xro6W#j zyMuLCrSHAC$6NG)^MOSQyy*zf8Rg;6J6B_pMRcW!~g&blyxY0jB&?2f7O>oMh?<$<@L z#{t%as(7SmdyZRRqhb}-S9bai-m7i9H179?f;$3js)ig)?yL+O$!j;6w(<-n{+BNo z7XL>Pg=sn!ObECW+pe6a!*aE8KyK(DLDDUn=d)cqlX{QSJrwd*hkft@Ja zn_<800-@1!uBh)o}+u**nbPGI^FvYfggFdK_aS`G^ubCu79N~ z4{Q})bh#!F9`hR69`#12y`jh}H?*2D?qHCvc3#BzmK%mQB6F zV{qKmuyQSbR~W;qlj7F*$HUk2#fYIa3gsSZUr-TY-?V8@S?9p=cM$@-hGz$K|4o1d zH97|V#4xd_7s?Dm)T)|iqPsiU;6cE`MNj3>1YjSoS9$Mo1YUr@>sV2aF z@Z>v2Z+s{X5I+Fht$|hLt-enps4M8?O@31J4h4~+n8Wr*kphi-;p*I9qZ|eB$uykTHb(haidh4m;4dCc?%UEJ zdr(w7f|GEx{P%=4pcn=&@cg^{cxagyjIgP!)8AO!Upf^qqA53-GQG3mwL7xRfq&;7 z|Aa%$03-|&*|l{PnBV{EE|D_?!~p-VD9g6aJd}*$rC1#3p{Z?XYN!836Ho<7hdmR- z#*cmg-0pf*cjNA#-d97B%@OEM8&R#;b}*r*P!XC;k|~D`deq87u8cG=9l&eZiQ$1` zNab3jh4S^ILas=fNG9@q1tYiaLXFPLb=2bY4%PkSE{bc_^A;z!^jP=N!+!5Eqw z{TStqm-YqKJ<;j6z?TMCTFhAO@Iw1mjnR4+)4JsFq7Sm*Q}DcsWjMLiguy;e<1p z1#D=kRx?V?9UcloI>p4ICdhcq_^`qQhL)5g7?=5H5Nz+IYjPPlaxGGk2DXyT9-=U^ z&iJ@8F@LxZ`7ClPK$~q{tA?J2ZpSv1peQ+ti3JDbm6S79B`RVPlv1XF&T zMnOO~`J5JkoYjg~A_IOaK$;QI2_+{Rvv~p>(Z}P3iVRqmf;fe%lQO;R_drKPu;g@)#pr%w3zBI!XP zQUMZ-M7*QL;T#b0-_&do$XeGFofe<-G{%=sRNqBz<(V%Ngh>YpnqMMf!>4Bql=I!|M4wT0&YqFq2J* zQ393=G1RR~Gc1aU&6DmcA2*@Nh~zNh-7O~R0<8=5Ibk{KueJI6;vy8Fo>oQr`YyOX^JhcNGyE~ zO%auxN11k8X(tYKN%7a$Y)Ho+h;J1;>)~Row&C6j9sy^zQ#3z>Tkb@lVFGI@Q6*>gU#PoIIoxI)I(nuQ_%68Nbo%0mju%s64k@oo<$+JHooRO`gHZ(UO%02mbdtL=&*sN)zdmeu3Sx<9Twfg>))cV801h|Z zgzXoAEt3x0SaPe+kckjcm9Ji#2S~qa(5@1Re3{zCM6&6cF~Pu-n|kn{PF(Z%@!SzW z^%zl&>gsf!7QTLPH^trI$0|ZPEGbO~B&G1~#ByRzw|fml@xHaE0Ji8sM3MTvu9#t4 zP!|-fD%=~}yVImax-luyw1y#Musq+xi|iQ*m(_!;&Gru^7k;t) zz160tddTIktkD?}J49w+0Mi%uT z#~*p2Jx`}S9kTVd*`G*iCseTMX?lb*KyOaWMO? zbq5wp*y27vqk0z^sgq)bd1;kP6o!0C>M(Fa&qPzh61Kn6{BMxMtG?Yn5C-J* z93XpK_&g41eX`=A_=-_w-kRV?gu;bd=(k%w@b*8NFHG%F9=WlkQw-ZEJ~Zz z`)a1T+osSIgN#OmUf!fy-(w<0DTETDY-l^i*WP;LC`XG~@s2F3_rqv+qEkUys$!^Z ze-m9(%I6EQ!6B5u=hB^lrJ3c=6Mho^`olQmCUrqKGGce5QVO5>d0<}pb4=(ntrJO}SmyX8@Idb*%$~Ofssi19Uh30%82c;$9aH@gz zmskSZloT3i3>&9Gg}k9AvVG&hmGeQnd8`7i_#yQR&4UFh*91*Jq-N+yMFxR~`lkI3 zW;zwIxd)&tJvBff2GDQ%KeZ-DM+}zm_5$|2?^YkA3f*}D+jycvA@ASnW0an`fx!N{ zOLdQXzFELL)Eu5*XO|t`DB?*4{|R57|*z+;UlAUf4cH8}33I zmMfAO74*_gI9SaSRY>Hxv3Hz7Bfr9-ElIIw-K-XviePc--_X2^5_8{AxflVmgB|`K zN7vyG_5a83ILy6IFu;s+Vti8!7?LZMzI(%V(AtQ49DI_2TT$q z4J>mQL^mg%!X!@?p14qaM5RgmODT|>%vHNqvqDyMC<8I)%_)Za?lc^^x@vu;&gzh?sD89b!(r_s`Wu z)ge*xZ@|E^y9o#_N&q{?I-ozJ6LEHIoCxs*R%v)XFQn1brzx3ooXht{a96yfxyss( zYr&F->|$gFxSl1JK{X6_Ro;MdBOAv>Vt=MV*v#EH(~M6l``R;MKcTYVCf$h03^gGO z*uPe2w7THADlS*cPwl*wkc*T}^m&T|jS!IeT+=*spHVi5rQ;RVKq}Bzs=S!EQ~^$3 zKycyY8QH`(!Z$B{`1~F7jczLcRsk1^wTmeZ%z}NCF8LtPIX0~aw)%NMRjL&#);5s88e z$KD^4eSOBu{H*CU#GI2z3mF=uNM}CPI+xD?bo(X6g71R{>FP{TavqK$`&+JpyQlb= zVjBN~``XuHnFmc@{vD=rThv9j8w#H^U*qt+jJmu4C|0BmgoN#NMbrUoC^&LSb%K!r ze{A#Clbu(34GW%=!=b(W-NRWIQDDc?_ZRGbvDVlWS9M);O13ZoUHx&{oQ7x#n~1(x z@k|glkGmDhJ>OC2`d<8S2*;WYwv-bX)7>NRZ@Zd(1RJXQtCX`nym|3zdk?WT?_Kxo z;IG1fAox11PYPv+f5o<0I-z&#(?!SOI=^s1l95`^`W(M;MdHAa2V;ga9lNA#2I$5~ zFw_b$&~ibHR3auEuw0gtx_}0m?asW2{oeW7mgif*D5Gw!H zWXj+`bFwetT?QW?5Sr6+fr$8B`~+WZ3W)tm>ObE_(X^?cX(@EnW|x69}6u5)U1_ zgU_?v`>pLGnHEl8o7E1rd^)gnmTh*Qv+LRJ4`q+@Quc|bDLYTk1%0cO%+Wgept-8x z3}qq&WHp>v)A?>B*5mK^h_dCjYJLj>B_{bS@wHMmb4&g)fEeVY2|g`&i;WGgg^tmg zNQ*0Nuwzjp06p9tU#DD*qCyn9>-@gC$tsz&hiy;eE~2^k#T3Kln)+9iUQSXYa(9rB zgHU!LbgJ2`ctLStnbD2U764kEX%>#jkOdWQ007%0`F+88n*B$kyZ{0Xf^`7SE*7Q~ z>$`(vWkeI-p3sX%vniln9Xe&i4rVKMGkG&e z_ost+xH69yvvVaOE<>ucNQhbl6BtVljN50FC{3$)*l8K(Y#b)(@ofv41GWzjuHfST z!DW5L+^z_ALs%i??-7FUaM{9kqGzoIB)FWY_I!mwkXz`4`Rw3LWy`M1G4>G3s)4_C z$Vi2!!8>y?OD+68!F;xC$2ECbyRRVA%l=&ZLo?c=Fl64ouCm9zdYaqJG&N;L5afOU zQkZ6`5Ed`K+qpTMbEn)Q=u48_V=V8C4$asjcBV$|VQn#I2-@}r@qzz*`}ChaJyJJd zXQ3@l2C5Ikp_#w@Zhq)(Shj;uCvxRQovV4)-tQ!+8!APVAHZbWJ=e-YWpXm^WwnM} zY|U;9!s4X5^+Eg^di6ZzIR>kDRu0n_p%}IKbt2^ggM~ZGBVabp>JG3g{$~`~t^jg&sirZX@A#Ac zrX{d(*!1xFeje;z55zXhKg71jRu0{oP16wluLG(+IJD$uc4hnsXQRGJ8)rYMf&~&* z1fKz|a&WZmB%q^#A=G}GqJ@-c(JeP&hzX#;)Laa}4W|GR6M!uXui+^lci!0d6f0U; zHduo%!zXa9?$E#&o`L*i)N=?TE_R#W+<@v3yeRi3sPXHROg%%JqhG8=I!}^K(U5;l z<=llFHo;oFKwHt;Jrjm0JgFS8oC&m_7 z28SrUz?AdWa90NL(&E+CtjwfDzO2&Q3^V+n9XskXX{SqfdKddIK$!i5IpdC#)^1yx ze#bZ(3QuO-S0b6~GTi*J%>UK!-yhQG?B{Su>Jq~!<5=g^KF>3M;qxz(LmnYdrQweU zgh3S{HJC2VOlNABJB-s+l0@YSp~Ycr4@1x2n=&lGnPp!*PM)aJ4}S9OV{-L!O)}-5 z7e88vno0tWo=PC~5r9HWmicWjT?j0mFu`6VCUIsz8(hiOD9WLcYHLlAv>~WtVw`fk zut{~v9J(OsaN~>o(VQrMmAahXT7*^g=O3%qthcXt_S{>S-eJ%v{VvCIzt;c3RN0^D zDd+ee3^vKTfGWT{aWVVS^r`?K^*4cEw=EngAy+j*o7P-9?U3)b(5R`s=aa`4iDB@4 zb1;8!dMLEtOBCJu>hV#ty=T~m-enHc{)?~f$L+`*Q&t#Jvvim&s`90B9N8uvBmpM9 z=6bg2^D=!-)g+6m!Ya{&O7VSBG1GLhyfyr8BI8MNUjxBzQZ6j%xW4%0)ub3yRFGEo zwoCGNrZ!9$%S=nP;JJ$^tc&6X{S zWMtNRnA&oY{7TE{8lDoTNxGm;>gMro`VWas{i#P9PrTc*y7p35Z7h#4kSS{@qM0?k z#Ei&^39~$uVw<5UYLH$GfO}i|BpExXOGWUz-(e1N%e&51m+~7Ax@P;SvX++$5}@=Y zRK89xzPjT8<7#ut4GRlCC!7riJynQts>;3YJ}<5f;WM)WiLV}+eLI0k^)QLo3{9gP z*cF+KjZZHNE#VVKl27xm)*ddcwZNF7W#le?V;;)1IJviTKZ`!3-i}JMY;V|q-flEU zDhRo||5{IU&x>_L#&juy%c?#v~eqK*Hr-TY?xl!xYJMxC3?1`gDP%JR# zdu5MMTxbW2ynm`&W|1LZPBdY`#;D(~)W_b}ZV12US zB?hd-$s>$_h1FLlB?6=0>0=<1<$Y9!xEUaCAs@dKB5SFW^y{)pm+-!GK&xc2ChU2@ zsZWn6l~uJE`Kc zl>602b^C@#EoJ65jK;YEF3`JI3{TkkK(t|A5(x;?K)u-EBO77XRRKe6Zi6$ag#9u* zt)OGUsrHSALhGPI1|%n_(4&#TYg?T7G<&weVdG@byu|V||7hVoOVE<5J`I@Q*CtTR zveP|xFa@XFAA6Ze8)dU%aq655jsnN1M?Tv31MPSR-|5=pd;2Pb1#KplDBuIurhFN*G;sO4QY0=E?5DfKsH)A2_nK z}ym%)Hv`F?%_YUE#0l0AuDu55ECAtE-44+p00{M?-qWsJ$WI2k|V`F0zF-r z$1J`VNEgLyLztI%w#v6CI5e8h?2rhuM4{sY6PYHP5Z*s#7FLwedm>l!23Vz`;>L+gLX&%blDrjevc zbXO^vC!2d^gpp8UWIA=y{lHX!s^nV0Sm9IZN>(Vkh=-ZqI+nwn}l2PC4GU zUGhJr3lzOtIRHw}he^8*gu+ClWOHgs)A@hD5f45yabf7igk*fu`Eovbaa0Ev72T*X zky>?elSZ*PM1s&Oz$@~5p58vH;<^RninD>eFgLoh()VKxy;-DN6fN?+z7#Wmd>B6z@e_FIo7@~M#Rf8lLh`%_}BQ|-+SJcUpbHT!t zK{#dGm2m`2rti71sn~YOLHPkF!&`Q`49j0#Eu$DPJ%R5jO9`g$aGMtTztFe%NJKzz4os~&QxsD+c^oW1>IVWl2 zKitX-)q$0;;y-2S39adcOp}JdMIqaIRz>%QwJL94Hf$H`zX8UPcz*LJ&`sV&zTx3a@5%L;JE#1b?zAmo)IxZNCV3zR{S9>`|cMn z&iM5|bm)`yyD`lXbR2YRFjUx&5Eq+z8MB}6@qlZ=+Nyr`y@(E*u;N*D3E9`xi0iXXo3Lf6F&G7ik z1NEmfw4!gFOd{Th#EKmpD9G17^=)Hte$+41{uUb*h1N4JR%ky=4Zx)Gdle3_YC5ucgILbdV}sR^QQI8! z5P>OC6Glirxo@MUjREC)v7`Td(Mu3QdY_u9lY~h{3&&3!lI?y=5)tPXj#o+VfEPfL z81VAbf{I&ehMLr^|86p~jFelvE6Qj?7H{59F|^pEN8xO!JV`A(5Yw0@OiMP&^07LA z$1>o55=1I$>RD7Fyl=;ErE=`>I0f&fP%p+eYPdtv#{cT8MTaof(#sF4jaPlLV@5+Cu=mSE#z<}4Z* zuiFHYGjBc=X z_*cADSpxNwIOgzdvg;zt3DuLd17+{1ouT$nxz94<(Jy z-?)HM+COr{Ej^N?`Q{bMnT=w*Ws*S`jgc> z2H~2c)E52pHQQ)#|CK-G>5ArB3-VSixvaXOUi9Y3Fby+$#EzhUkyk3GjaW6UhzQ8A zB*M6vT16}CBke928)WWs0D#LwKam@56>^oM&C)lhVOf(EQOF=<&({4WQ$BO8Ecrwa zQyP%y-?w@w+o|h>Nox=nAR#!@`NGWKusq!#elVzG7!GPZd(C#V{m^1JFn3d)sllwY zVk`4$-iM%g1S}zk`c~a}>g=f(*W7n=(bD!urPvS3!RvdBZRgC?UW}DY7B80q3>5$P zbF-$29}Na}!J}v1#DJL}x?(_rP-@1lwpsr3b zE4ia2)~W}@%H9*xmb(|RI`kpn?y-XcznpF*kcf)qn`or|g1YdV`+Eo5t5H#A`I!X= zm)dc>rJMWRob!yF5uxTo3|3#+*+ML9>hyYv7j95%uuw=w9&1B#PpTHO+j7O8a&z1b zFI#5o42pIo^Fwz7)ZWlG#(!aOazx^!dgmY8IWEknUJrrZJh1}tKliG*3iBK1OnWl+ z-A@&4)A?)>1GwZB`O4g_klnbRXm zunO0G)a`&BoU2|Wd`XUX(Q$W#V5UJLB=o@Z68}A-Bg}?3Y(H1Nlyw5$w}!&w_TxW1 zPwG&>ecg3?RKjPUYijb+ww$zMz4vrJ_Z7mL0j#Zo)_SEL>`tBQemayPbEdN*NAU#LeB>Y@=(<_bF}Fou733vUg#T&Uo5$+OSm>PAa zTj*R4+}&T_3<4OpNzn&@1$e?q=e(u!*+vUIGK&c9i`)QGwl?xbCb^5 zJNKm&VM@vOti;aT`0_xj9&!e+S9v#}fIbc}pJzYkAXxg5F1og9M;(k_d!gEu`~4c; z0cLYi>iLJhNuL$*LVFv>z<&a2D3(db!n)@V1WBD*gLI$%l8klo4|I49S*trW##~por-&?B8eRzKt&y{ilK_Q!MV3a{P57sF9{P^{y zpd}mard2xQF`R)$oP-#FNJk&`Dah|fUb9E?%@kmn)@Tw#)1=J}>ctF3S^F(96WV@P z+gKn+*_QE1443+yn{F#-=Y4SK-Le6jnwo$Y_$%1m**nAEz+^c?KgP1p&DX8buC1tU z&A3i)sGjB*__hm&ilgW-))f$uL#JZ&rMB!ud=gdNZ=+s+H3p^=D|xl7RV8d&NtdKcX#=#8}Rp>1>LITbVA-w!x>MIkQr+TY&C z+`pH3htezlV0sNALfE?bm35!l1+pU>#a`QMw{7`b36u=3zE^x)5!MAH+TMea*W~>%?CgU{TWXo<(9aKIfFmk zqC=FI;<;)|;?-fbCE))A<)Il`Mp9hNXi}Cr`V>fS18R1^04%$@xP>WUIS+cDbDIA`2$U7{O< zDE0=~icP4>^oHhYGMuTff(L{`_oY)*Fh$hLTW&oA0M}hj_MK?TU5}=3_X%KunGogKbB5Lda0E;{* z`Kbq-fp@^yVqY)eLvO%EjRfpRT4?)6b302LpOEe5#Cl_OU{V-gf0wY@s1nt}w(9Cp zr@tm;v*b%EXR9%E=7Upxcc3F^_3P7P?f7HB>h(HdwV2P32Q`3 z9;Vd%fTr7nUpV!ml%G_O$5`(36iT^8)~JW=iua)gjyZU;>akym=M{1HkgrcYc1K{$ zrn-KMO7>$NKqSkg?{F>u#?jmu@5(o`gv5aRwch1OHT&L;??>B#Wsc@P!FQ?xvA;zO z6yli=W>i;VwoYshMm&W{~6Phsh> z(IIRs4{wyYc^MLZvK=^xS=L@Wjp~)od4K6DL4-cY2FSP#n3P1)vT0}AZ7kw|vvD5z zaA$Vynj4>&)YldiNjVm{pEhen$nkV&+ndCIV1PT|BLcDwHQv*M{hon{j1Z;$<==pq z=sJ+T4a{SI0Xgkgz@)+VIhpca0?`*QR3`P(3h(<}q=)o_-*oeRZS*eXrp<=4UHP}E z!1EUe{U>K3NNS~reidfFF@Dfd!Md~k#AAA?j|cw6#DsAqtr$KTdht-sFO)lsZOvFQ z8gN2r!bBtQsf2d7Upm;D3hw(?@ndeH(C~yy%5~?+WZRsEZ!JA0Y-LWV>|){7$V8;X=n( z6&CrA)22T9@bod=QrD_#F^d|0!lQ$z`RT{o4{7|e+Y-E9vCNH@4z6$e4iv3yocj+j zCA!fgWPpJ5hazOg@Qg@ijXku%uhIk zm%znq-SSyIco!`HGG%9q%3wn(52(lzYU89@-?cXp1`O~Z>~VVXfPT>+PwaI{K#Mv( zDlGOUT!XBU?&O3-(Gwgqj)HPpsFn70T30A+3Qw@`JuoL#z|0=R&Y%I}0`c5&D)B;A zgS&VGkXoB2BwL;yC$7yI=Y?b&jY-G53PKp=&HDSZ6JT4nysuAqE_U?OzgLO+(Nu(X zbdRU&EvpA9W?d}r1_baWsNo^Uy@L9M=}Md{8^-?%%?!cOAU0@(=|6g-#!DSgAp!KE zwN+iowR>XZq*2~xYZ0<|3ZC-2@$`wv|GeELOZl=NK;i7y?DOqLNYc$c4Xb-le}P zreqqoJHY;lz9@%++fKM^_Fr+$stde%EfWx&LENfq<7QN>tL~r9bva9j2rOBqgSFcz zumEI$~xDr!8~MEqc)ca{X&JJoGoqA?OeLKV;mjTE918mg1|gn4$kP z0N_9Au0x>Aq;@_BUq7Y}+7{tj(Xra>=xJ!Uc-Ft~GL_K5FPE zj@%+e!jCO?4zyKMx)p(t1cKR_nQsd;o!%}3|?FfWf@4SXW$qn1<)*6 z)SINw9YS^m3jL0T|L}U5zz~*AxgN|OdPqVqeJkUsCBnWR#%{dc#~iZpGZUaR!|w&h z4?W+p<)DpD`rxypULl?~YY93}^V!Bn?H)A*@6qfR*D1%K=b|a#KQ?OSimcg4VYpJV z8ERQ}P_cdX09-sU^&}Pk3c&XPikHGHW9{$ud1)#tV?&HM^e!U=j)uVi(DCrQz~sn* zRyH8-Nl+)P2b=@;dx5|dMDd+jSxu3VcTyHl21t6_B!Y8KK%Xw8WUBr*80Tkh!<}Ay z?FS+}hF+YKDqs^xM<>DVG>B3wxd!2!;L%5!zz)aBMD(6S*bk0C-)q=6XgAk9=@Cq(^%3 zLZn9$LALwq3!txyAu2>Y6LbxGqVsAivgt?JIF0FZfXby z#pze2C9X=ynkcJ%>R;Rn9O3R75dP!bPg1COX@0q<-bD}@7h)LnWq^i-5g7(^!iy_{ z$3T7{g)pAOkrxkmdaxQu^$6-7okQ}f?V8I7Ac+*Yuy_fqJw-Z7{$38rGhh+^x#F=q zJB`ArkDd$H`~*WX>R~Wk?u;5$3|!Y_JbErHJOi1WDz^3ii``PB{w*X%B<}Q{G%fLM z$>XoHvGf<%S@dEa6lm-gL}V-!uHomES)vYC{#A^J7AD>*Ka^us++t>PtjB-$pCQe zl*oUG(Hm!rBTcAu)7Q-223AGB@=|Pd4V|L+#veqYFL$;gi?!`!3)Vt-Ezu8~>&m9B zxIVNI*(RcV>{+Nn*p-``5|?vM?GaWTwMSJJms$!M+ba|y+x6{b@owL6GXj!=CBm*7 znwlWoy0WteEyI@;r&DsFMYmzl|QRX3f|TNr=eMb?lB zrjNfL&37EVZ=Qbtdoj3aV1n9?B5wloWBC2SN>@?`tK_oEHkC%PT#DKWbZGvgLkEiz z4`(|h-|`U=?jq!@4SMvcuYe0c%bc0xtC7!U8nl=fGF}je%mEk$WByO#q!wOX$y4ThSmJ;wt!;xd+fI`FiF_rfi1q9)YBVMBRRoy z&-|0opeUS9z-7!yNArt=C0M%j{Bcl*+U25^Io1AtfHAlfFsIS-Cy3trE@!>=7VsrS&#iA7k`M?Flr3rgxP-a&_Ou^E#gf}O@8^);PI4a72%6TOXKC^QDX`0fgaT|6L=C*;D`W2bUgwIS z)2<{N`7UN9*J?gj{L9=*&v-5BB$IE6@l^J7GqBteeFFj)Y;LntfFLj z8pOaF%CKnR8S&7_!@>=pCthOX4-gW!c-sQ>@xBIlN|`$8sD$CtdF>~X@-;(hCeK&Q z_+xyMJE60Y9-#>$ogkfwK<>)A^Nt`^v!FnJ36;`e#VN(rxPNdgyU;{SkS&b<(LmJ2L&UjSi;ZA%l$Xm@|w}ZqG>ZX&J8p$%2#{8 z7LE2G43vCOcAI?b&^K}(0GIxR3<`{Qil^(5;wQ;y>89#sfY2)0r$q-}A|4h1^l4ZI z8HhtK79oGj1>}+qFyc5k&0MrsV2ZsBxOMWmisPMG=qVC**g0P|i3H?@ntJ>zpyqt3=N(g{rFa zENg?p!v>$aAL;sJm4UcXiSA)3qQpT}1C;*pqrMR|dtZi3PkW(cyKeFOo#wypoeI`l z+3_9|gTj&6miWTyBSlMH&wr?#e;1@;+pxCpAE2cC$V|A*K@Eub!z%OO59*NsYYq-G7Z-&8cx!aPZsh% z)Xv22Jxi!=CrSJ}dfQNjrK}VK7=a)CLKCJOsObbDT5T`CbfiVJPMiKGhksBYK`NeS z?Ug`agOsQQv#C5XeWpIe^vfM3SYm2Os&bzMr6bZ^V&`&Ut&MN-jT(b$+2q!AR zBZY?OPQ|`rjn3D)-X0NVv-S1D=u-UrrLiPMFWL{GbRm&Edq(!m+hgV1Q_`dXxJ2Uj zv@1B#ge@_T)t@isJT%x#Tqe)ns@h%H++kx@(v8oQ%X?X{mtL$?w;%qeFlZr2-|ukb zt(4)$KimMITIg>4w9u3!iJ;(pfv=16|J?#I%xK$b6zNN~sLu2Nx~yHFk2I79;*9|h z1Dzk)SFnt$F0}U;6l~w+*v!>U^ociubUgZK@%D{lLPc!^&EuWkC&mszqhe65FMR1> zj-1YttKSw8{I7u8!ol^;c8p3ve~#l94(ZYl>QQp5;zV!-=TVGUGKLbiH$e*wG*#-c9u4)ZIb1PI)a zk8ZYmuQuB8uNWpAldjU$hcqpLQ=CRz*pFPrg#x%{jQMgb zy%QG)rH6Xz6oCnV3Wd_Jr=@S6EE3rRWAD> zt@+gqmzqESG))hDmpqbnSvREI|5h|(@yyQ>Dg;i2(JKKn8XNF3Mn-awTC0~QI=C%X znbqw$7gS_`G8Od%;3#H<2u5aPMXtFPEtmpJs&g)gNuXUj$oz>?>22Z3BO|Glpj44C z9{w*wI=kH>w;fXn_K!np!_PtA2l*!%tD4*$Gk>BH3C-^GaIuZ&7~52d$DH>EN!che zhZi#m<*^XA;7cn?zS*s0cH_a?YYysmB5G<}A#8e&ZV^`;%O=9VA_D7?p@du2UrJlm zjdyOL1YRcd&VND@nw07X$!KKl-+ z{|W0&1D7Tx>EB1NvJ2&8im)0t<0QoAa3k~|$+2zUwGfS($$ z=Kzumm~8*U+y3z`V91+>;c!!Xko4CHUisZR5e?m;k;zH^1F(d@~xqpqc4L)B1b_CtP3N2b@$^IPZY~$^cmx1swT6G#1 zyo-7pOn9?MO|!f!^Wu4?RNFu#7=}s}1~fG)Ba-+(JK(lfgKVi|s<){9q;t=|x8S zN&b@|rP?*K(oNlUGQUj*uA{y^3q$*U!dZ2ztKw5<6$SMZtaVymaRuL>s1nxEY>^di z72p4hH!Vb6S&B;Y%oM8|Ye}W@=P~bZ$sJOXTpvRlmiJ?f2ma0Z+h9JdI^6{cqw`PY zg-+`9u*mzbauvnVk~@2P)*Q9zOEDY+jG}MuS%*Y-+&a31=rE4`j?xMlFWVdMV8|-X zt`5z30i4J@7y?LNQVH}DC0o&nFGXU|vf}U_V zVY#y}f%Ks8UUzY;Nl^CSlAlWPgS~8~Yy2IFwV)hjd3G95sX{hWyUH>`x3uDP1D9oI;9NZ|D?1V2zmc7f5*dxH^=} z*U+!s<)^SQ_`+UmmETD^@~Bzsw~pX1T0pOdr))`>qW46}bm1A((s)Wqq!F*e;i&Mn z{_R9_w9vun^}(wP$9e$FL<4;Oxzy@3NN9P<{~~kf(ZAMQ0U5&^brQX&H@!AG1Oy+m zrk7iSwxvCyt#5l`MPRRf+E~wH(6-&69_J3&`9KNw(Q6Rlm_87#rFvF!EA=abLY}kb zI*yw6#>lZ->|0$lqK&~Ebe&gUMD+HR;A6%|G2yao7#^idW6Ms0PQ0vbx~dT&t+gSn z!PFl9nBeB87sZ1+0_r!;DeH95EfD9fNg?0KfZe?d=xe1T1GutHg8GBY-S_Db?kVRi zr$%G+64oeUX^|erYtFwn9E3=OwWcLYjXqF)e9Ky*<^uF{^Z3lu9#FTD=gBi{h) za>O{eIqi(L*TWL;LBA<1ZK}9ayxzK3G`3p2yb{)553#6V#W2eCWT@#sN(D^mMqc5t zx{@^%i9&}qd?G?7(<3JJNcx4T8Nk9=d+x=U0l{b(DWI!~mO%jY{xa(BD{xzyno3Tb zUl@x=@m&3ZF({NSh}+?|FT15*Tj$)uTMvz#3*l)FV1<|ua&bDXe=mVzKfFpBki4;! zG8`3;4{agnZ2|mR9B`KqTE+gX!4q5TV@LR`nRV|*Lk$}TJjUi()wp3lCKNa2#hV^n zR9KxJ(3`BQDz}hB3pq_3cuXyL`9g&qC+F%8$-Y$n=IIR^jaCiQth17#QKV`nwHkk` zJOJgYc0>>3I#-l$*hFy1{yQT~65ORcKMtIl)t;z^rpXCArfIg84I7G)DS!-_K%=;E z?WOZV*n%~{7#$VvmgK?FM(a~{L=ip*2h1JBvIgfBQnKEg;%G}g%K+$5mrWx4Dx zjS++p{StR@nK%A)IbF@67h^w83#9gc>-r^AMDU9=I)*6(pPe!T35Kq?@T0gbJ_MP#A3t^k^7O@zlvlJHawHgih(IbLetAst(h5xgMWLKK0eIvXbsNFc&RTJFJZMKVO{M;R+H!6IErWInLj*t zeAj)&6$nIaY4BDa`y+Ta;GEItqDz~oyWb1ZUqXG5OUt2uZv@8(RIqikc(x{|L4_m6 zia?wnTiRgrH}Hp62MAOQuDQAPW2gjvy{^-E-Pf9HdrBD zvCT%XwWPyL&QT{xfT@;#oW+Vs{a)y#l6*fBgl7WWCH#gNuxP5lCkkDtq z0CD_Fgd6~<(_hq4^+ zCc9mO!{0tjoygP5sTEVF#LW z*9l|7Do72OofsyN;VsL~cQ$9^4KAd82>r+*D;WLm*RrPa*R;a@cm{+^9-H!?i?lOoFrYx=*yO*fVV|$9 z;kh($B;1(otRE=O#~(2w5`mCqXFTNygxCP0&6&~2($tKy;FieB;^esASBJBrN zeT6CmKJB(bAEbVhKRZ!yN9i=B*=SAW9H^O~n=CK+lq} zep3VLJ5H~k!Z)^6Y3vH>cXZzG8`4$0@~#eL>tewSFiw1I-TUm2d~8$NH5IZ;_kDHj z>9KtY^9k7AKK-PX9rm??VGXabYxze_ED)LrGT#{dr5pv8czrB@};974I6AD|FEL%XT$KgGExU3LG`pAgp1`ElOVcm`vHS z(ICa1rHGIL&w(VOL}>wnf5$tUZ}B9*xmphN9wes);i4*aMKFEee8<=IT9F~Rw!rea zy4|+CTpU+ikw?$~6z`7N+}AvOZKgXc6!_Z5RiEb}jeVPt2;I3|TmU_Kcs-T>?QwHr z^T1aarlfAM&9*h2t~fD9tfEa}_r|9d|Li68OJ>silQ(Ol|7KMUXo5Vh;?|Hd$0_A~ zBkn+LK^nG7mW}*x^V`vlljdf_IOWZ+S3;}axg=Xt!kp~bf> zi)qg$S{1jzqu@^mmM1Ge0_8<;lOxEn&$he&KIfqkQVH zi$zT{M~~R^Fg9Xt)xt9$qf^-q3X7%Y&xI!QPC7)6a8-kKRbIf07_NPS4;WQ4z&-O? zLni&d3Hnc6ofupgPhn*3>|UN-Ien$((Jn;TU|y&-&KjO}kfaPp)(q#6FUQ?D_in>L&cC8svs2WD&D``!oEqfReDlN3mg@bV+Bq-MYnr3)&J zK=2d^oAH7UaSJH!sZ`?!+2@up?zOvqznWpJvLB|xhb;v4Sr&Zk(apneYaM+&@qR2- z7rV6?G<{)-Y~3;i^yyqu3&pkl=pF-!o%hWDm4!iJjCnE@FT+0k{#xW}mmiT0Up zztkGB@!Uju8!T7)b-@q%?&E`^8~|tV6LxwiEMWzN5nK{|Q9md5@IxA1IwPy8d~&=K zspSd5j-~wY0^x?SWqwJb*x7|HedkbIk7XGnLZNp1rZ(|0%TjK~fPMDYTa1|otl5{j z?S!+Ta;({bBWvkDT%HGfymw>s#M%YAqMC#s7I98hC-H^B&3uK9fT)@%faNq7BLi3D z1_1LNbcm|~o8rtCC`RnNZ3HxQvoAEc<0-$;)i0OZq!%z%OtKd$jRI*d(!|+EdQ7}d zX{mcWb7VK8kJSjl@rQwZ;Y?MDGqnCmSsqkT(A_s!I;;MPcl^aY-!by1O$@3Rp<6mF ziF9qoBjE0G={|Lp2--u5)IJTGg&xZ>gDxM3E#7L)HN*X^!bHjJsLaSJTLO`WBYm!0t^o%aphzG zwI|a%Nt4~9Gv#ddADbYLzfPq22jSxv4+FR1F%2Q{PQOD2okN0IUez)xb{tk#MH-)^ z)M~we$D|#Zg%?nx-OYlE!p(s0_Xp3QXykQbz<>zZK%LYF^k@OKqdDp%O(5!SU`lLZ zN|snDLAv06CmeoT`;qrgiR*9uT34^b!*E%COCSvzJj9B_SG+deOjjMgTcF82`K^%c zzlEIZ^S+fbCw1h`gbe8g0Vxjc^;VG2!T#gPjq~N*?vN`9kCATr5vXoJ<-E=0 zvhrL+ZDM_NBP1f*hw<63e|J9LFv7erHx>-X|Ewd~9H#*JJl`9!86~wgK!V*$AQ*w8 zLrcrh9@`5ni!(1AI|>|(_FXcP!d3&4oXnB=yfbg=c|`1=CR#Cd?2Vhxa8y;;xX#|r*7B8p`4(}N?0Pq-zYPrv0PytWxFQXAhj zY8OBMojz;(4S&jbLHs~Dg(^>t)kv>hKl*mGnWL89dWCK8eW4^odH$E{@hld7!a z=WEbjFQ1)2t8Ju*LqheAUDFRW(YW-bH~nYvf4x4=I0^5a?eEyNpYEH*r5Jc@{0tsC z=KJg=7oBRSz~_E++WN`MgRs^w%6NS^3P={YdTMX~4z`k8 z`1Csi@;HDa`oK%Nb;9rY^mN+%nc7dX+~wmkQTi?7{dA3ERr9Q@5S?bDX}Kj6o$)Op z@Z^LA#^0-|_BG+f%E_N%1l4hH1JDN!@Of@tbK8)4DB^r%gJ5gD0EnI(lAHmq677&; zClj|FTfk45kF+o+A}#~*m5rhBARW@runa!n2KzM%V5y0k#KUK_h%io@&jxsW)+Tmr zrmjBu=X{HcND3ArcQb*e{&t&*)Fe>#4ic}DGcxWRyVeFWhuo|%Ld9;&58e%pS=}u8 zjpoQx#OmU>sZ&UpR7j);6PiI3Y-(@xH~U8qklE~nWD>tP-ypMd_J*3t_vdyJm%SM1 zdmMGn$?;D;13HkM*YWaRgT1d{{?>Tm_b$5NFabtpOjl=urH#YS3j%%&mFl00FLoo> z)(e;C4@B7-FswTTfv|a65G_mhXd;pTnu8105Zoa>jal1MGlB<`&u%Bw zz4#wT*BuD;|NrkCXFHoS&j=ywghL!cMMe}t_TFbi8E0>5HuY2F?`Fu=m08hE89pTls|Auwx^YGEu`biy-)QR(-(j@9e;n!)+ zT2(+O^_)mNzZB$RpN)0C1)!pBjHo!OyRR(ZtFPs=@whc@bWjlu!(spftWn0D0+4)KaC(wCXt5S zdsGt8!RyJM$I;SJwBmy9uwfKAvvo{l2$fyvsLILJmwAC0%WdaEiJpgn$Lr`jc@X&v z2qMciY4T=4dj{jiL_~Z$%kC0PUKl<6K2u#ekzGr>%e})aXcUhrMoJRr ze|e!j$e`X#@^X`9ZW|3F(#Yg)*Ibm z0GA=>m_pQGOXS#&oX3SvfReaRS$=ucR3BboQVis<(!oW+o(eWn#z zJL5dgs? zX*fO1KB!IY$X_x|s8`m@s&S_~@(H!JN_pSJAk0A#RHASSnO(qbP5MnSDUE0t$KyW& z6|7Q~fP{jd9-{_eE%6{!#w<|m+v>*+$f~TpAI*N3T2mzs#3w%@7_;>kJnOsRXgYa^ zLbM>hXd%xOD{#zcLL79g(R7&Y7fu$apHihz6+WGMgX>%AAmffXrcuVGQwa%4GrQ4mF}xp zF&emXo6U~HK-9|*Nm^;U?oQf&y7a_xT7DZLCz||%j1#>VVW3x6@IRwI#-RVm48d`Q z#@o#>nxi>S)5zU&AT()6SwMf)rvn5^eUt((Mm^6u|IQcf_aq)5uT{5EV0i`Sug7A9tp7rn zJ0sOMg=y1nP&16@N*fAEw>&FgO8(%Ibe$~&==c%JXnw~oA`&-)rWvO3n zd=kC}p1O4TDUaFVJAadmk)ppFyXkyCqARdJPVMgt*p6Lj2MxoSr6r>SN_F{Lk;wl2>XDTS>H^k{ zrD57l_t7D=!(_iwUt#UH#;gN>5r`Kleuoa|>k(*FkByV<-#pkFF0P*cJj}h|cyIH5 z%9>BYwl=S31VT3|)$i(tMaqWM^nz9!qBj(0pQ%*<>hNq1y3T>(sT=z9b-AhDn1@o0 zrY*nb!L#fJ9wLDJQI!2co?Au!Khj9?{qOX zzNv1I>E$D}+5$x}D!4sqpidkKWQbrP;Q?>${H<8LO*l{u@kC(xXy`s509~UZ?L#i4 zX6_MR7j-dLh!yb`NX79ScL}|+iyu9kjlPU%*x`B1xm=UPO`i4fFCxxzz&8Hsn@#IH z*6G+P**-X*V*!YVyD*F50qGlkh}&PIbFg^hd`)M!Z5dG&MZ0W@pC}OgJDK>wAzJy> z4QpQK?Ag%|9SW7vsc+Z+rdoNO@GAd&O7J>phv$=Xvzxb>XQa|9zCZJ$KiU4?#y+{$ z@@1LP_hLb<`9{SfgRVjN6})6CeWyI=eAs_!S!U z(9F?j1skEWeQ*k6cg5{;tyb!4rf`Op?jPZ8F#^Xsbs5_}N%z>$@68yV_fn}@Y5kK_ zt%-6FoRCQikLP=Ga+K@a(|(0qTNa~MskTebn?90Id91?oC@hc?!{BjqSp@jF&VWq~ zV2-y;2X;2yU;m>ZodbbQ|1***>I&#$kswt4Q>J^5o%*siT=n3tR=PafWu&rO;eJb4 z=h!q8?k++V!O`1X1Kx|uE-d7Ls=d1L=EYWQx;n9t%%3|l{LGb=tnvBH<|E`?3hR;Z1 zRROnbVMvE`FHiP&6*F~H$X`!WIycT3$a)0PXKevPn%KVKpX&cO+KaiJzIdgrucnyw zmx} zPi1O?5cFAy_&};dP5q3~sEI5}7N1cq1}}q?@Gx$7=Y@C~))@0BiFDk^tJ6{XnYFQ! zscQpqDUF`S!yx#AhDfCdovyeG^k-HoFOk-O6^r6g7p{5OMs92rh$Mb-Ss6h~Eks2XxiMR*C zt~yvbRn7I}C_ou$mme2U-Res_RN^|en~s<^24A0g;DKFH^nm;E`*~pPJ@-xWZrM=A z2?l^LZ(M<{C1z5qI3WayCU$~Q@wsZ8gbDL<*_Ldl zz}qx|Ga#85_D|Dv4_a*f2i0_;3t*MSDBEHxc`0aMaaUACqXfJ+P|64dpFqOlXxcwP zu`F0R``-@m9iU%)~AJwC4*-KFsnIH6Sf zMBpU#3qwOpdd*T@p7@!vn$5YX*^e-2!VV$fjNU}JPv)_q|TEPuT4Wg$DUBEt+ zG|WJY$^E17?d%tiL-S1NYki{h(@4B1J*oA3fDvwwPe62V>j|_ozDej`!Y)>@btR$l z-h=*<+nz>c(kxF^WqI|y9LsDDw%*{pyqG~9eGZbN4tXHH-J-NgnlhJ@&1BT^q?P;^^D02cuclJ%zk*HSssDHb9pwXf#9B0( z9fMq7ZqVl>$1+j24=SC$({-*UoxaqZYgCCp>`Yglx%ahHXi!Ia^7F0D(&>{{pN8VP zWX`)gZH5k7>fa|HO%9*3eB}4*3}+9bmQ9?DI7=#kNo36{3BqEAiFe<3J8vNwx6)bv z4LoW#^iXAO$WWV^LQmr_B5F>s2$!1fnTlk}C>qQgw~d_`#Bvc71(PS7IAQTyn`Ee~ zfVvz!zjy|4g&l47q*D+8uLLpKu6f2Aw|B{~fXEP1f>kBx(t-Lk=r725-a*8w z^Ee?l_a8cn2RrYN{rlZ@{pvs98#_2XYnA8@8nEUa-S!d!2J#{8A1 zfk1Z$X&dh*tF^Uw17ytAKFt2D8J`M8aVyfIMkxs)0o0iAHAKG)h6>fb4zwlf<=`6u zLFxuNZDLx!!{^JeP@P;Q?IYK9Cr`x5pIqkadHHs&r_phXaJ`oJSDHbkWKyEc$|#UR z`Fi&Efy(R;FI4v@w6i1WQdX$2k#TZTRxX0t`~tCo(;y8#Uvu^n&V=ign~2th9G=Uf zDCb$ru0CaU$;sZ~yQ0xi;1pqXimS~J2CupZbPI09!BR7Gh55O~h7d-MT&s2tVF{5wxhmbWtch-ah&=_A;Z#!VS-&XYjfJ=YqoCnzb$wR65VF;9NgV2Q8BWY z6Dz%;5vfRnye3(8YGAyaLXYtqShb1B^VM`KTybE*Wstw7qO9Sy(`XZREgufrm_NJt z95@`!7~6#Lv<~)}41aR@vjp58@A=9?8ht@-msF6*+u2@qUx2yg+g)gakwRfH28%ZV zW72MD5R15R{#OMG{H|6zI*ZAl(8Q;Yfbzn;U(`8xfRB#i7FWsgEa#1kTOcbKD5Ww_ zTVGiaSyNhcOkaL9PnLop(=#e-Q%?BZ%%Q1Y#seZ(=(ukp2J!sQIt;U!61q+4>)Rn0 z{wPj4)qxB1w@+nr1`RLcLzJ6PHHon%zL2B@Nmzx(KbH*@bvH2!JsuX8fYKR7Ue zGm=!l8Jq{VB$UncsshP-v4B&nF*)=h&cE=k1>T}%ySEgwr=^0e8)Gi#$uj*XR{s_K zB#1Y@k%vJR#F}&wOdZu)kbDwtv(1Dk1Ij%U$Anr2D=eqxGZJMj;E6KhH4t0j@6qZ# z*WSGQvsgk_4>Gr{6I{Vh)4QKHbE@BuaI@0std+^Np!T7(6CmW(L z=gVg+Lt1XSB5BLp7qZ001GID5&~>#ur!04y4jCzF^|?j{wF$UM-z~opoWB^FD45}o z0Hf6DaCLr2T%93q&nF7ce-nslSwA)dWB7Qnc&O5ujVNh&9zeXs2q?OaqO?^pufYcR zP*K%JQYfFPE9H5IsCt;yxFA}9K#;2WVyi6f7rxsr4-OK`GB`+o z-Mbm`DA}e&5NDh3Oex{hyR>!J7~UHxKvZ}}3W>eX%F89dQVBP!?G}2DzSdZl%U&E$ zE;X?He1*4IR6PW(IXZ4gq@^1 zJGD3vh$cpCkfAoo38dC0T9WH{qyS->e8E=ivR` zg2ppIa=?q)4ZVzyPR|W3Nc1WEmV+~w(i}lKD9Zlrdz$>OOS{Q#+UY)BaQT}N<*|59 z2g?kpDu}K7m`MbE+f}GY$MJYO|F75aED(ivm6>~a;Y?eFo+X29Llr z-Zng&B5DWV>?p1QwBheODV99fEuT9l-1GZOkrbCw9o1oW&8c5m?cM^x=dElS@m@)n z$qpdCQ7!eeBKn=BqaoOuE@7iXF>SZdDi%Ejx>qwiDp|Y-wKp!YiOcLaBpE0!4jx??tKiACR~RE#w+@#j5g5 zZB?;4cIvxi^?n$mL2xFsZ{cD#R?~WWd3UrA%RAUbEg;Gynpz+*FulS}Z7$`k@eVoG z_q8`S$PKQfIbBZmnD0%>@bi_kAX~T7dsnUJTl%-o9)QjUXc!@A8b-%bV$K<5=*e^D zFlX^VhG$eL+WZYo1|;euFu6MD;r8ktqKW?t;cX2(2jc6y73EO#(?BcdY`~}2s-$7S zq0ZyB)Xju>sr-hiR-REnRFeWNGG(NTXX=Ozg2?E2Mi0{o^9PA!ST`_{E8WG?BKpL- zXwV{uPI59L+(Mn+j-Y<5!AXvI$O-G`y08D*U&t*t;sk#~BWn}$utcHam!Z&mL1pjX zPdyDwdZ-5Z?F4Of3f64zdt&sg!)NBL<7u6(+#A(lQ*gyX9{%TiCZ%YBMcz#P*FkTL z2un%vM9tlDGsRF@5b0^;Vlmuc4wRp|I1^mxcJ&)rz*HPDafs#4YlM? zu`Mqqdq6`c?&X&fmP(Uthp=Q%3MO|d;l+e?muE`Ojc9mwUn-|+mH2BRa~AK9p}AKqI)<9RzJ>T$+iFoEQVSSHGo>RHrt zuy`093FJP=C}gQC0v#WEFq-i0zNiBaLO4NT>q?H_m74$Jo9Z$1G*_oCInI}Sf!y}G zlhqpIB2umz4w6Nb6oVO#sd*VU1~|LMDXeIa$v-yDe_uG;g85sK5?t=RvC+ckW(bX zBo5#BRDqW&2M?n_>E?ozbVTt5Xu*~>Nxl8oa!9DXt@KJ}O-1D?mq6clvv(jdEiCXw ztChm$$>U9Dlw@T64kYOW;`vQe>?%F^(Dpo$MS^>so(sD7B3XWy@FIQxYh$z|+M1S4 zvqEXug_$q7Y>RjUds1L@EIjB_|M9leCUV=3@O6)&Q@Cz~_3Y>QYcuDgaXT!yfm1d) z4Y7H56S8HF7hp0@4fjS|dwjD6^EZ?R5p~}}g%`0r1zZ+HVC}t4*vY{I*JH(|pbabs zukOSDg&d_TL@Ggxym}{-PdA3aAdt~bPa2@rnkoo;^WhseQR(z( z202s|9%d!duP=lQQgtasbWjhjXN)$R7G3*F^lnMPPBT&Ys!$!lLn4JK|aiNU!7Hp-hvU=$M14MsJ3s&Jhq+u>JPc@w&yD z;vJYcG;Lv#ehwDU2jao+9Y$x|c&C=_`125bHCuf*Ydu|;B?HU%%Iw{6pza46GP(&* zGtf5sw;xlsrXazdNA1D8Nbuj^V%mBCo_FdpCh5XdmgND7Z1k!-(8#w1>|+kpm^VLi z@w()wc6K0>5V!Y{0n>J!Fg?!|+NeQn2UJYo5X&4<`1wyPw*bQQy>(CBru`ED-oQlj z+!AuR%6q0mY@zLNbLUX=@kOdjcA$Q+MlO*!W+r5(ew*o&am9r`C|@*xHER$u0>>fq zl|A!=dpPsyb&sQNbwr0IHv=VyKcbXfepDlVea|0T#uhlK@yE)BTi)p@dSm43^7mLo zPEv%yf@5DAY_E)C@vKpIcCxn)|H){Jl%uUP%Zq*2DA1FgeceL>a#KX)cl?cO<7Hp| z3QlNi&nh@5-TBw!$r8gEeHqtr{hr#)bkLo@U;ed zm3v-eObqOZw%-+$?}&TmEgb@pP7uNw@g8H-?Nj2}Uh$TYv}I&-cuuTsPRFubmjmP) z4}75Zu17d5MnfbcN=W=0KB#{8ni`7ek7>endzl{qCz6?o~hfXeDG z6bmvLNW~l;3Fjxf)10TR23o{_VP#aje5z|+Q}K{j#KR%Na6qkeC#+!3f9?dtRQuGn zYf5!n7~S)R19EB=_csc{-gwgy{9t1Osj{T+N1k~iQ(g|kCZWq@K8SB7%l3xMzZ|8x z@91~*ijuOgrL$x!57GmU*wAfIbryTP1yOlfZ!AqQD5w+K zJv;CIH%eP0M1auGm+=h?KsVtYr*|VOY69iVL0;5>XGe*rwh<@NW^}hx5wF9_n2+A3 zsn>L-6r485n-o)`hDktbmdCRJw81cG_>zloa#t|}@CQ|_+5)3*DhLG>wD{jQ%Zpzo za%SH})6HnaO46<^QS6ha>;$rp_aIK}^7QmJ9VJ$H(jJI1Y=Z-_(P}g`)et2k-H3z? zUMzZgucn|`btC)Bxl7Ic80HcJSSoh8qKUVG$DFl+IgYpCc7eml!%+r#=5eda;e~#E zp9j2XNM0lq;)Z2arz$HL+;=$r6m5>Y(|}_F==QrtDP}I4YZ$UE*yOL(I=As> z@tW^`Ne%D9Q8M(=cV^ZwVa$KY`M%0|v<8lQIeIpSIuDc~b|mk72;0N{I{$YEmkLGUwV?lBFy)QN$cV%9-zHFdVED{LmOlr{N=qTi?&9ivs4)sNv7_Xu zycSIc1VzIs^06oWwq;l<-Jnn>t+p#Q7GjsKO9L%j{g!tici()ZLa}ygHmodS*|97$!c`8S7^}lXUnjdVh99$8YP;xl zr-(Q8dY4C&Q_?DTqUl`E4$S%Lr(a!&%At5wY+j$FAmxl2_^d0{LKWMQ%jZ!bz!%1S zOTxvBZ~|bNRfy%0KrP}C6>9!*6#n@e4~|{?mcnath0yW6q)C zmRP$StUr5OPra<7QwqTN3(#Iqu$vxob}?17cu7aX-;iuGyk0l;hV~!aV+Ia4vddxa zsoqSHt!0yweCw6K+anzMAgpC^b;xk^4!{9dZF?z!`ssprNLCDf8z!>hW5Wu-rI^Xt z#MRPb;Oxq?4+?vTTj5`T3l~sY zByGDp+JpNV_>W>~YVV5VjRc)fYxB<-1Z?6=<3*!JDZoU{89T3t7<_Rm_bY*ATP*%H zH>p)dM+69tKN8w>OmEC!0IboF96ZGW4?S+2^!pl2G4otZ1$W)imUU=&;63|(H-8#q zp(D!zm~Ek#;ApvkwB%-Sr4!T05nb$d88p4M_;R}M#h$}8&7?H_n_FUFq16q#nQrG( zSvgD2Awv~MdyBF#vU^y)=FNu8+*+*@pIs!R#kHTQ1`?pC1%jY!n9=5CVMNv1Jw)wzXUrTNq zS>_8Z#2+dT2S4ZaT`8a>Of!-;)TaYlWxHztxT_tp+$KN>an8r>4gFY!xDnj2;}cS$ zK}u-iPU*IOZkN3LlvrK9-1+Ae+Q>M;;12K7%%z+0@3&vhev%yYNyZPoum0F$V2|aj zP;Rx7_e(fHXeF#VT5p)_0ahCOZ}SOuR^k6@C{tJV5cZxy3+c5M{ot&I2Oow2FR26c z%dW*Ne}KGZp7|?N7mMY$sey--zYn%mWuaXjgm-7pt~WSY&$w#x`YG|x3~{VINJzGy zuZ8Wq#Y{@hVqxD#Q@t$yO)wQ4=j=95!O}vnTww};oQiMpNYlP`&tKWm`kZ^OfH!gU zTHkgXqk~k=l&#`&q;&h{E&KlOv9aW+A6?DWvQWYnh z+y`O?+`y<2l#KNzH$YpDfk>@0h~eST^xhdkga_~9}EhqiuX!4Sy_s9yo{&KNGU7=7Z?SHQ*y zNI3yjxcVV(T$~B>xH=jyN=IsCL5MnI(kKY1Rk@on^qTkGPqUAnV~yu}XqBks`xtWa zds9Zxse|Nct#o5|`d%?EIFT_2n~xPa*USDTTg=Y!qXp-yx3|4ja~kfZd}#4=^;8CO z9%+t_O4Q0@tv)svS41N^g2n9eo%-M{YfoIw(!c1d3kazIaH``4`K!Xzmx8{GcL3$0 zLp0;$o?f5sN>0`BFX3>gT7wiB<0kYUtJd>Fz33Ze4PNWMq`H=q%8j?;C4n18K^#pl z5X<_2HWL`}o-8Iky~H%nG=fp7_kS>;M(Z=wZLoNef1a=AN>N}X5%!!+k|}b)#fI1` zH%aJGP>YsBpef5zccyAIymulfT!)d?BJ{G7EY7yNbY9B2wL^n4D#%EecO9=L-s01% zUp5svx4(0^syyqx3U`l*=lVV^>R=TVU1OYb^Dt^HOa}6&P9o1JfBVyzu1eTAB_AvRmspg#JkZHH%N9$QIpD0kRCilkE4ynA+0KwOCh}q=5&+Uz z?f2jXADHA&{J@D!?E|M4h3^gc2iM{bX6)gEkVTR_v6`3 zzUKnGR$A<;``{E^bbMrrzjN;7XHWRcF9`aTz}wT(ed%hA2Qp_nu%wNBr?RKtIez#T z!c^?ds`PkUZgZc{Wm||@=1}Y^zn|Y|hCx8roPuaEn~3$joPwTpJhw4uUWA{{aR z{Bd<(qppA|x^5^+-7Ej%ec<_QP*nVEBA;ax{`J#n9w&^Nr!uf5lp}O4@F9e6jPAZM zw(*kXG791i9C*%bxTMKIB_Y<85?8`L2($qwCAYXv<{3$~XcSDojp82zveRVA@j2I9 zd>%|We}bon7UWR!|7Z1To?4>D!SqoK{MC9A4guy`C|2TJ_{4JWJe4;LnD;|=W}h5> z(WohqSkVgVv9)!9`XwOSj9lolxCzK`u8uAsZ8)>eR)%cBoFIE?EKnw;o?4?km$nm5 zpEXM3l}#^as)(+8vs!=f+*IXL}t+_8%%@ zc6953OpkWecr)Ish5hP|-(bN_KO6Tvy8ax-GZlB)b>H@e+`6*os~)EqIubx*Dvz(%q&>&^yHfymg&l$T@$YG38UFvR zI%fR%No6lQu^AxOcPweZ>ulN|P~T;8XhtEzF-a*~xhxR36c|mft^Pa4cM#ZAC_cGE%#8TR5y^ykD^d^Ns`JqJU8!!eTp(pD4&Cbr^fk90>$WCF9%K<^8o%G zLJGAR{~q2j6!7VP(gO&!gJ4k5`WX;PR zp}r2{AF=RMXbvO=?|<;3n-ZeUCdiY!?#zbzGm9?LQ>M$-XfKZW3o1T z_Kd3TL{wYS`O{E(ZySksKd|AJiCe4g4l18jXtP-!N-F$a1djHZw$)WFiB#=vXnjPz z9LE^lHtg{qzaL{~{}&hB#y_s@HyoF7?>#y~)zw&XFP`sToQ8|%2<^4L+dVwo7A^bs z!TmjVDD?^x$%+o=@6AE@T8H_kGST$MT7w8wt?4OJ1Nov_X+KD z21}T;Z(g>b6LcWR$gtDp56z|K6}cp>X6_)7p8W> zVMdskDAc>!th|;icEa0AS~|M{N}nCWs-?alBgxOPl3D?zXp~Jrcl^65Nwpb20G#m{ zI;~d8|5kYhw(i&5NbB$noFGZyr*&<;0aJKw?wo(9+FHVXg;as$b?7*$FG=p8bu*2n z2_5l?71aFh)gdilx}Ha9Z8=b#+S@nF4{T!Q_cW~Z3kt4a&+Wt~92egHn(xm)qEe&e z*|`{@d*mNIu57CRkj?j9`=f%-xouPuI?$<<{DmqxJIC+inr}aO|FEqZP?LNVK5=a# zUsdLNotm+Tw+AA_zgf0>;D5_-UJTx*3YoF@6Bvk+SKViV(H8je7Do(`GC$*)n&$`} zl07mA5q-#KQ!MrKNQUK;w#s^S){kCB@8LIFxach9p5srF^(NaKnR$N=(SQe!rKks(2KwMpCfzOcV6>n9rzm;+RMD&<&6{p3HtThuXfK%TX$+s6wd_BBrI)CET-xf)B)9VV%k~F4Idu!RM&3i(#r1n5 zb%(UO)QZkw$sxh~KBuwPJs`>P*~nx}^rK_rvN^(jmJzc7r^#z@+4Twr$I#7!J6M{j zk|`VQ%cr$fOd6G!&2PI#$3aGRn|W@H3~0F{YS-Q)wVA!7@$XV_0!kT#`uKqgllua< zC!|6AXxR^IU^x%x_+RKR3lhaog-MhDBtIdTjAU7m)FP^Oq|{2@$1+XhOB`3yog2Tz$b5Tg1&Emi&E zYH78#e8*oN^zAlRBp0`{)Z>J&exXdaZP(Fs2q%zZbq9Z;9E@h0X_kqHN=jMeQ~n!+ zzhQx{FMhI|@)j22S&0xtk=3xWoP1kn%sn_Xw#P8(!Mw+wegB)f@WlyfCa-mqF#^(o@E{2O|9% zL^}w|P?0^P6#&Gz^Ui~KaeE1fWj8>ADIYc=Oqg~B<_UxgJHq7`DM;Lbmn+vkhjU8XUT>9HKf(4%uY1ZfXu@BYuC0_ z@;J`SK3CE6&NWnoPrhRceE7gZcc6Fw)KPun(Z)Cxz)QON!8 z%bf7kbVSikqyqoc(>3VI&j@|op4}qNEs5nfirgNpzYxnyeSH6mYz6cIVuTYnptoG! z`{W3Odis$J^9JbTD^=uLX`Pm;rbLy2P%)YQEl&0#g?fFHF->1Pp-YI4M90Ew=zc8u z4cT9ncR#l}HZuOP|Ecz`e$wt5z5L4>v#fi1+_>u?eI|@*)0obHF1DzTl2f$Dg0Qpf zU)U81-W>mN4B0eLzfN_%b&G$tAdg&S=3!yvTF+Dv^Pg20eT{~X=j$bN*cXv9t}*lL zQIfdrqbZH@7Z(>*$&Ai}Lg+O0e#VV`VWY3cP7=NMVgNeVMKrH&Yo8;B2TinuV#2>i z;y->M!#r{SmWx08<<4Hw`6&4!H_ z{jIN}qVdnT4<6!9)@^z_K}(518& z>4Px7Vb$Ddxb%2Oe7M3e$`m6S@^jPu`$)faj%z5}5ifw8qsw?WwDus4}J7fYE5U8YNW8VSRGwjfut9snfd!*w?!P^(fELK=bK=I zZW5y3P$+tYF0LXvn5qW3cOSziF3$BFeR~P{#FdsiP0c~T_T?bt@)QvfYV<-G5_)2n zoa9&EnbyEKlY6Qh7&zRJN$Gy4ebVTU&p_|rI-kr?hcFG~B}dR@WCM=`fq(PmU<@#* zvMZPArc#>;`do)6BS@6F_&7= zljBeoYM`?Lo_hnWTh|Tk02(t~%SIgKZG{5HMzcQ;vYt8GKt*&|1$rj0!z9Uh8?s!J zeY-r|llU_Q*ca^OWC+iUQnt!8kz znXY@-YJBYc&xt@gSm?NY_@*?_&bHn0Ae+TwLqlIrI?UG#gc+`{kr1&gs{NB}($Sas z89aR;#el#WN4ln8G(|oGn=h=pX42jF^F4428ynHrAoCuJ3nL0Qz}=-Oo=YN=WlvTe zV-gYk>61P)-RT9fjvqZjS9UtAM-RU$hC7Sb5mN(`E>|m%5`~C;mkWrWU1hc3=g1K` zk`)zjbU1%`pdCC4pRaF#uR5fXLxmAe{`a<)R$Rmbf4~o}&*T1f57FTI{FOw2p=hKH z`2aSE#-AOe;KQEj7-YW>n$$P>{wK{nkE2A7G0<4I?1Rx^&4X$$>D%fK#_{wu#BXUj6uEw2n5PX>e7S?VN;q@KJ}5-=K+F#*2KiZ_m~BQ9Dmgn!woVX=bWw zCNEEqPLYPCLVV4x*06bD!~`4V{a`QpC&lFLsSf$O9bHN=xCsSc6e4V5I2uPO7^NKe z>9mc#w!KY(H~zJH8m>fwr0RGr%k!2i#rpJBXwey1Dr`4) zEDb@blg%sLih)8e*U7jkxxRbShbi0C*T7Eqe>*&lGRDV)X)cNk_#J1upi3GaUsU|H zsdDVb%#UBy*5iIo>6vKnCYOYH+9k0sfnz|6lrb^8`trUc>&w%%1bxvTpg~K|CTn!6}B%tr( zJPFy^dkm2{@|8$ul|w3l_x@`Zrl%*;59*x?Y-!;Ibtn4iqe#TLsMj8vBD#+!cJ^^6~Fe(^Hict#xr^${R78&{36`0N4H#p}_&Y1NN(4CpQ=e`c9tB_wak zQtQ;yW$IJbP$;HwOMWt7`P~Zt00_zJu5a5uiAtb3F@T{xh4F4@*ShRsZ@Pgsv6zBIa@WS*N*K!zydwo zEiBN5z>^g1KL-arK~^TDvl9Ic&~|X(Xmm;s+HxQA+%+%4Yu}i>J$O!)<2+Haz}PFd z;JOfd7&yt;;DdxX`s?F=vZx5_%QyeFmLRyg8-&jQ6&( zXJ_Ms{x=|UJRJb=oXi2#*NLF}3lKDg(jW;P!wnOeg$N!S)v{E@o#Ca0uUhZweyW>Q ze10MD>RMKjM2(~XRPD6bwPJlyY$|`EbiDszkIU&^v-npL0jcRD=3}d@DBd>1D930+ zr->p18&^n6hP^J%J9N+2A;#M2J;tDz(P2j9)IRKT`sEffv*=0a1ka{Z#?cfqB8`iMXFpSs7)$EK@!{ht-iA28$NKv}EE^3B`>$sJFIb6)?!fa7iOtxX{ zSi5>WKq$}uwF3WGGajledeeH-cQFZ;`^!XR84ZM!a6fOI;v`M?2^s=mPJPY5R&F@( z^0-9dw{C_{S85U+Hg6k-fl&mKt;;9ivg8nO;S_7*#tM=#6vYPK3!iDV)&<9*`_QzZ z;w+{l%3!qXx`1|A8d!?x0x+5MoS;nAJEj*)4N0K9U?PyrYWqt^&ts^VaOjrfqoC1ChCG~ zwJiPReE!gc-OyB-Anb>K*=?RvL+7|qy0vfB>D$pB(S~cze?u}QgAomYU}mF&0aZqc zSY80cC_Nmwy@P9n&+DZ~)D@IqC$b!CAhLW%G{e7WRgiu2sHEvOwC|p6p^%d;ML1Q5 z<}qXT3g^b#N;+^kE??G{EW$#>gbY_>&vW)4SvHk@E`6bvj9s6$E{uzu!$e1YfAk>- zXCeQ`Q0{P}ZZrKY7o-SZ3Fi>Ez@m{sSJDd#j$e1E#cMy9D2bNZ{=P{$KNcvrZc3PP ztm8($ekkh&*ry7-=rT7~~b5h8NaW)_>^y$%2G0yb7V&1-AhXwFFOq_ zw&#z*&b}-+A?rU8>L32hut3N}i1k`2Zt6;$2Oih-pF8s?JJGV;EjXQzNL}7}pi)65 z7E?(lKt5SCB{r^ZZ)EfNP-WJo`lzI!AT58A;utx(V%s16kl{^e!~3ewL)a>IZ`bx$ zK1lBK;TWH{yC!9m{vVwIX3`=f8s8)$s!43rjm0n5ivWG2zX1CLz|wXDFEOCImm|qv zlao$3fWxPs+W)ppnim{1!cx}-^D}A<^ecUTOJ1G*?Ec13H?06cE0N<=PP3FkrnqS# zIclVfcBxM8V1z6bPsw~tJN+_H!_c|2y|K=_EtZ?pHSd!+<0;kVTA@9b^td(czp6kv z(Ot!N2I_2QnWl=H%=0}hYBVwrz)%Lv1v=!xx0_&$Fa*UH#961lPto4;=amV_q*86e6#q;~@gy*EQ#5GsgFw zTrhtDOaSQr?cO9$Z)CXz{EVI822f*&W!vcg>B(j+yxL3Od*J~@u;B{v8vX>Cl4tv8`uaKt4S6Cgkb+D?2T4Gr<6e1xW%6JQ zi>7{kr+Td%y!d-m+!n{>i>$CO&KhA&b|~DAiKNo4MA;q?zAdmwjsv1>COH@nP2@=t>9bMx|FF!+|!Qy)aC{cg|kXANigF?y5~`04kj zx`NZK^k~+3N{78&kBo)J-JOF}Mou4Ra!?eb7WX-;9l)(@%g-m7f|y{TQURX#_+ z)V?#dGX(zCfe0>ilbsOBCOFeCom_18yW6C)cY^559g`1R<;ApaP3?JzQ{7~Hh?JOC zv-ns+hT; z)#c%-&oJ8u6Q7pOSM<3sy7gkgF#c^X}}1WEX`6<_2m|!a1?} zPBfFMgH6@+R|DHhQMGB0Ivab(pD(G0oKqsgrCjaBVr_ZDXOi9O^Z*D0@ zCadv&sQy)==#}8aaEuDR|9?ci1yEc~(>A<7(BSTbK=9zUKyY^pE+M$X;_eXKeX-yY zB)Ge~E*2!XyW79HpZBYu+A5B8Pxn}#nVy-x6x4cdK7>xGE1SppJ~6}tWqQI8QDM<{ zjJgKVV5IQ~r^6cg={VzpZVymrlAs72Y)OW4>Y99Fitd!#*KYo5OnHYHKo&p=pRE8g zaD_i^*0}?^mRy_>!!rb&Y5EKG+3`nntvSc_?rm>V?lnRe?wsI2+{D{s%&;IPFeV6l zb{e4zUXT%b7*Lf5e=3lVgKdsfRA3Wfj}5?4^znzcd|IxkE>5ccvk*bjzO*~CYcf`9 zYbe$?*xS<5_l&q(4<95daE4(K`&}7uWZm;4Zi?Q$GbLD41G`G*8oBnH%RUPyxr)a2 z@#WE=zY0XzL}g$#zep%6wDI8U(G3vm@^K_Qv~#h3e^;HrcgAQlHgN4-Q9IeG;xo`P ziEg?%RPoE14f0&X6JcDjT`Yd}N)mew^cYJ2oD@iE2I{y`--;iU3Mk6*cE3bVV1y@KMQ!QgP@)-%| ztj6%%ULB}vXWUR@UPPXPl+^B?j_zjq&#SbKjxxVtC8w)J|JKyQf$e`ad167X>823p zKOA11sJFv%qlqCxOG%?M*JOFX!Ncq4L%S<74g!XVtE7#0ZDgfR9}CyCflCu13d8^eHU+X;T#P7Em0yR^+o)~| zAS{r!)j+rEn|OZ2oT7PXsE{M6&LbO9W)HRfR$CQ)V(qg0`wX}&j|pDooQs(>7aSxg zHkQ3%(bftbdn^SACk&r=NtK9zbINQxSM`>CKFe#aEUpbh&s8+UpDI96(wU0NeVm{s zn`V2J3khflJs3E;4YuWjMs`R5m|xo{*b}hdBXn&iW*h#@A|g!8x*#TVRYxoVh*JyI zqrwjH{xFh3LPN1O-59-Y&bC1?mJEwO=$+g%AVu0kxWav@^T3kczw$}zn1yV;L@{=nVSo|b zMdf8kb|&fW$JECxO}xDER~9dp|M1D(_YhAiQ^4Y3uwQ%aZ}R159a!-|cetewH%rCg z6qoy4IsQ9N5e(+fgl4eg(tPOQYkm=;ZgFhgL{8J|otx0??qK_r;^W9oEAjT~Jo84S z*ShU>J#^cC)m!h2ROMT5hw+I7*ox2Tg(9i{VK6!p^5)nuU-!rP;ZbPfZOXauV2kU> zO1VVJR+g-FrF5k=^*HaytkSTDP`XQh1b?4FiJ*CF&hPh4MbR*p? z#AZ$)-;4q@!#fx+x&0j? zfH>vqV=h2XU6O3$V_xO!H>EDr5nvqAz8Anm)DXd@=qI`IOMh7NvmCd7qQ12_nC`JwG|-#WLzP?&Ggc zKbuY!1WStErukk>+jlq%^cY{UK-g7y7X#!IViYT0X|p~AamF789t)9xnw|dO=#!#f zP**$Db#o?V`EP{_b^Ey*I#ZGIC-sk-JAQ{@4A<7RK0G0>oHGCl#vKq}XIl6)hnAZr zFVEwu5kM;A0*eYGHRFN?c;9WJ9Q7%8O35PpA}ZWPxF=X-K$tLKz?&mX%gZSatwUEC ze!mPby%*vR8}!ca`^FzgsHGZF()^||>{Q~AxN;%$3z_uWOOk(|jiXzwa_l<<*{ zE#cq||G~yZSv{csyWi`p)P6jGUDCh6+A(TrZeX88^A#I(n`0OVmZdRYhsM6N68Kr+ zX_y)3&As(ew`7!uc<8>=97`F%+AYLtJJy5p48UG)N8;rgr-qI6&LJkOi4)C4B!?67 z$3~j1oMg^SVhh@8<4b=wCjR}v|DVZaA3*Fq} z;XTrum6m)pH!DJU-$=8uZM*M0TYf9FW9dBmyt?PZhN9M8JF{pFfDRoMp|L7C z^5r$l#U?u5Z37&r=U;F+-~_HEq;s=`IhglZXJ>{haSO&Ibol%_{#daCz!Z;z)f#Zh zad^u;mFzFSdyB16O_5#f^YsH2h^s#dR-BJ3iu4AVsu^s~rANPpZEFmV7hgu{n0= ziXsQM0W3CIB7=Wi5IBZ{DDqv>9L(Sf5_T{m>_}YI2Vq5c6Rq1T_j0wITx5kTkq7)l z68Q>MDq%&Uz{4Ot3@Fx=gGzXJ>%p4_xx3OEm%^LN+$JmHWXGGhA?C`I#=VV*(6leV zDUp6dhf^?ioKxvRkK(_rvQVeJ2owM&TF3y5u+5q{3n(ru6xgPAWya}p$Qt8>j9@wd z7)y94y*~0&3msNRGxdnp$y^eI_{v^zJRoCLs9hHSW^d<(#aR&zKaPB?zjD#+#7x$a z0@o0HJ>!YTllCs>gKzWU=f{c5j zaA4@#crCo2Jq%Dm$U5tpPxv2PQ0lUbA1f( z4rG@TaKAgU%OSB%{@ITmm_p;;6#p&j6o0}V)URRKETThkIoz-z^dNMGGSzKU(Zp}zHKG7!N zDmniKm&rLz8~1jH^o?UU;Aw4+%S;xT1^szjavlPW&p_Q=Oi<{x9N6$Vd^ejK6Sxi3zCK5wYtJWUZ<|Cul_MDgO zh!&@_J0#gZkjua3IL|mfCj%+CLa9>s?QKhb5X9?FUe&j=fs4n#bfwCNwwL z0Y*LHSksKINFccphYXp9u=VyRH1FvHGm8*-U>u%1@mpn^y1jPSr9?xX_6*-Y#p$a8 z7Y}eSQ!6LmqVF43RhLA$LlS9T)BZfjlVt1ma6u|}TAp4Quk9%@92+5>`~zRYIyXOX zKV0>!vwPd9xqmsbb9*WJe*1dz!uY4;`RsIUC3rIDsQS~RFxkei(`xn|W{yDG+R>g% zZz=_hAt{q14(Jgv?sK&cJ z8@Zy>Y>t*!x%wN+TT}XzcWZn1<@MW1fb)a>EuRfzrezNlacf->B}$UePm$=9SMt?r z^IgdFJ{h(*KCkl@4d8-?i|yl1y~5pkmYn~)DVXbuBd2U*bYWX2^N#5BzHePYw=PMv zabH;d2Hnp0deb_yx(WT164?Nk8*he7r;AUL?uSG?7;4F#4}8kIll6B`^>_BL#`Mq3 zl}EnEN5M6^HwHVWLXD{R>*)t->4{oWOuI9gmLdl(yw?iGIzJ3C0_J+&eG7FFm4`8j zOYZwdVbS zi7jc~x#6eI3+K<(o%mD*DQe?+y74}TaD;;?RkphLpA1UCKQc4i#LsvjPrnmDa)}fT zLGuxaNrj@=ZQ`z;_v!3BR2dPNDfH-f(S5p*n`iVTUWwswiQg?ci)-dO2B=nA)6Xqr zsgW*$A$OD}Q{JGCL2(Ns#=Z?{bD`Ymp>Kqlq6l{V- z=B-O<``yq1?5ve^qqKUl=TN648k6N%QfI&Zvo`{I_QwnfIGr0LO5}SLM?P^Dci7rI zY=S2Zv6F{KS8~COd-&RP%-)6E8$x;H$F=Dvd2G#F@QU~}q`sS;v<@s{xt%C-rd!)- z;1~QmA35Vx6~qa{N1+2iiY6|jg!r*ey*O?qp@;~alQ2lXgK!Ce^1n~8Fou!n+jEz! z!>M|hpBG(X_ouD4)CwDt^m&5RLnfpB2zb&~`B%||G9@Gq!c6u&)jIP%zg%?8w2)Jt zyKqTT=9~1cQQGGQYsF4nF^fdR+=WkzcT3ez(pe<7kz~(mU1R0C@Q#&Okm!@q2gy*dq}UHe((3=QDdUqdhTg@y;0W3 zck-<8mE5%G`n&Fpz>Qz)u<;7nLoJ0l3dH`bs5tJiw`oQwm)th6^vtio%-(v*mwzYj zH{utRUev-xJyM^~rzWtuS z{g>+zcA>J&yvrIqplORq!4NtvgfA=3PDyT26(55xKVf2-<4Q9)o8n_;#Ts?f(r<@Z zz0W;Jl5nIPV34ixhzp02H8Q*j<8F`w8&$JS0zmM=a1ls|m30?eal;x0MM(-`B%As* z%yLrX$bUYR-$TB_8CwV;a#J!hT0W9)O<{I92B`xq=!R#ics&|OPz+#xE$08c=AH;| zuzkAugJ@goLOy-DLv*u+yvHVbLyqxSJ$3$dcdXR%9uLm=WLr=q_jYYoQ zP1*07#HLy^M&f)oj0~gG3Tr2Kb+*v(-IEk_2W@82+YjX zDR0SMD0d}-%9DAyNRbaNePUwMbu2eq#>BrJc;xal`Kz8#EBgwMzb*<&hN*Ma&ustZJ33szJ4r%VR?u-oRD1n zR62_JcJ+9y^$TKzDD9yH@ykTc^*__nDEu?e+B= z@Mb&g6bRX!>2xHIHczE%djC%Q+QRx>TRaXrT5WSgDP^{G%cS(|3Jwv)HQBv<)0Th| zfMsj#v3(OZUU~)wfpN?WDgVVY{My`Xh|Qv_rpJV z%%wsMlnj!#lHGq zu*`0>t#+f}!-S7+Vx{7VHF1L3#EqsmjX2|9-B_+ln}bZ>-hy<0R#*5bX)2$8jua36 z_@^AM1yT_kY2sDW!TkQ^^kYK9$upv1pt7g=nt>THWM!4$-jBv=MPxywHE{?3FyhdS zoWNiZ^ML%He;WobG{UaPK1J2OZ{F8Xi-j}|5?hpNyp!M@9tZC&=uNCnt z&s@G3;$2qHFAAI(;Y0;eb{wOAit7S`eqEeH!#9Wuu2hzMF>aAt=7&}nv|rd^0o%#j}>V2q=)WgCUKbYh2_5(}jmy>_CI z86J01Y6UZ_QrD=!MCiB(P#I2KP6g-kVNq0F(Goc#XPf8Uybo_64%d;|A;uy42$M!E zvU!#6j14Z^_Y$QE*%MnuWPl)}4`wBxXyDjuoQc$@KD@lk`k^f^m^{ii`kPQ)Fgdml z@rvDWlgNTCf+9Z<)=6R!QJ<7jlojv-=P9r`u7N0eS3uD`vn1}l-jFC$^i~PuFbSt6y2yx0Hcdenj|7k8Al66(= zy)L%Kd}?cuN-Ib?r}m{-tC0YmT-Z)7IBqK~E1$~NEB%m?cz4uL7nSStrb5N8{+gTp_j}b-t_!ymcxmn_mWSk7 z#m1pu28}uWCi@#lAR78(@d-ztaUz#+;CNRx1C8|0{+S=BLW#$jc{teY>I-8=5;MYn z7%q#h&20w7c~}`02~{Z3d|w&Lb6O0e2kgo#TUke_Q|GI09-o03T7e94mx+3wH-r|I z5T!0%9>W-^Pa8W<$3pz;KaFy07cc9M&-RYPiDi|2#rwU8)C}r;5AJ4Bl(=T1QLL$}VnsHC z7{;umKx8cPnw|A1T{B_qjgwVg?VnKTzH1)vlvBm3Ef&o%5*DWgF!UGyRCf8vTgF~r zB^oR)dZt7bTRsW@Q_p7IZ#R=hZC}t3kK)*uQx$jA|Jhwkukpuo6CyR4fWV~33G0rD zAMcIqxR6S?E2*k^3$&(kow@JY!9X!TiGSKr+Lm(hcOcXKH>^Vh_ylTJfd> z-DQKBI-SZaolz`ve2=mNRPH4F#hSzIoMG**v`(dUXpopJL(4oMyTI9LXATsLNk+%&vdsc5|Iu?=OFNotuCja(v90k`WZ6CYmwh08+jX z9Dcd*TWH)hha4pd3B|l&>!V7yfK;Ze4M!hvH=RaOBDbV;HX)25a`NVVzsnBfNv-&B z`o$|PR>N}NNWQF|6vRCXF+>lwp=u?38Xyotk9RAg#J3LO+IIM1tRH>T%P|LLaA>~H5W8+Urau02xAbZEi zS8v1pSSC{V+Q_cZiiT+8f_&zn5e5`RDw#N5@?VM9)GyX4{XhFmT=V@Fc3y@Ymm&RF z=4&5Yij1Uqn%sHnvY;`;E^{o!^M1YP`BdYLhp&TjHqRlBcQ3Ab`CVYvL#m6v}n@gP(Kz?`V?cob~vf zwx(d#fY;Ie%MZ_|gG@@PO#{Y3@AIUCy`U}ImVjT6Uj+mG5Cj#eawt^x=X~*QAt!OL z^uR%l)0YU5ySjz&Xx9;_Kghdtnk%#UQja9MR!+g3^W_Ie&n7pwchiKs#ErlU%gE`% zM#Pa{*CU;U>RVfZ@%_y(f6e^13LGO7yk}9xOG|Sng>%o0-&C7sRcHFuPrQZMu(ot6 zv~j);ip4S*T8o&zV?Nmk1;dAuw+@oA`FraAx7P5VhVXVa#iT#?{>lYEv?VXecP8w( zaI06?>h5n5TlwIac;el7zb*4{Hz_YG3H7&-v7QD@* zxm!nMoaqdB{X-HFyLg6->>i)ZO~K)52ZxH{@hS)jeSU4hi$_x^3%ezE9cj4}*&zZB z36l7%-1!z+0R?oc03vL=M;n5}Xp}4G&7h!KVqFMN(@!=XAPR~i*Wr8<=-Q-8#{SKy zerai#ir0sa#**9gIkWOt6(I6Qq*$F4{K{qb0jQ&|3|?jbwuRh(zo|xDRC@4$=%W9( z*fes&TuGN=zryx)-a{XLXXU%|*GEWka*B!q=i-eipQ*Sc2KqTW+JuA6ABsHs-~|GT zAtjtv`Hp?!4B32=q)FxPF)gWki19zlPs0>A{X$C8uJE4&sR^nGmU}*0EOYJ1C8ftx z2OExtNh4%1s;-|B?dRcqb_~i&MO#{gv=Kk4pnmad{|iwWV`$&te5-R4(Nr%Z_caJA zKhs0aV+vV()w+sClT}+x9r$t^)iG!n^vtr!4Y?5S=Gp7pLzMeCE1P7Ymmx2mse5!p zvS-on*oj4$tth(F;89B{Bn=!P`WXe6BJBhYmRm8f&8}X9erCs z(46u2 z%TdYAmAK<0X{_&vF8AYzdQj=RV5lT+h4IIUeQ)RUVrns|Ut;4Jk*Oz#&93>=gt6D- z)<|#YcO61INY*Yw6gJ3x1qy!x(HkFH=QKfeG$U{8i7JdoXMVkcgD~AxL+fFX%?IEM z6)A+fQ@v!Hb!(>?J}H^#MNb$gv`pO}ExCmrn<=!n857+(*CU)sM5Rq({!Tae{ORG` zhY-!&?=hz!7xN^wMjkO)0VuCRh*5z%z)$6U*}NPQLxXREPGjI6KXyqk-W{J9GV0N4 z9+Y@m7={;3QaNy3h-;b3J4{WH>pFR=QLAcoss(iDKsGpy_!VYX4SMidPS&Dcc-Vct zaDX>Uc#;Vr!E3a1=#CaKj(XryKDXDjb>qZMkLKqoKA>&Y?;U*iWxb-MUmg1A&R?jnImMCUx1IgpYqYfVq;w{*UmJ4H zpLb6@so`++T;*snGLw9wM8c)_*mYt@{P;Iu>6mWb&Jf{ZtK0B~Ke-t=vvjZx5MJ3h zht=)Y(u-9~Q>NbWs(MU!kZ8E-pg!iLC@cy0;yNRl`>6W9R>lqUDgWTdh=Q`HA-VbZ zTLsWF@_rrO97xZKf0B_^1CpW_qC!hH+#*DXvXLJh^J zo!UI5l%gJqK*@X!mzuR*C(Q05b-z3akB&ZRcAY9jp2+Z~rX%6OwU-mT>)+BMEt zWc<7_fl!f$zyu_x372m*T1@zn{lDiG@`cE+PEa8?(`nx1caJ9@ zQobnWd3-Xeg?Nkf#x_HX$9N1&gS$!si(v!*&nK);6YPetGQxUIKGKEI2rsL5-MHUBo~0C`20PqHJ*{yI7`QpZGc*w%3e%*C*&@mj`G*t;HXwy zQsh9R24^2|uwF&&Ax)G%Awp}NMI-e_%IWaV7W->Rk_2Pk{5L*w5q2KY&d&TrV`@(> zjla|~pz*$kK>E>V@Y-A+>L{n&cRr1au6#B{c1=B6>;S^jFab#)bsAz>UF1^K&x@Rg z?mwN@UD7qYoxNh;?rM!2vR*Uwhs5w~SB|{_KY5 z3++N<+q!!ozIqMx__oi!R<$nUM6^B`SsxATBtml1qAvE76J-j6W==62VHnAYhWf~S z2fA4wXs9n3Kq5G>Dg@E<%O+8pn77E@O~eVg9QO~AvbNh~Nn}bi^PQkKuJIO^G;U}6 z^nMv@)Vt!y#!tbPX*`0TVpwH_tcbW6E#XLamSx`%T;rn^Tr z+Q%qrNmiYT+A{3UbFyq)CW>tk5`6=p(z-LA^@!c}2KY7=+%~|Fd3vB!9j(|!(Nl`< z(+JwPMdP6vM;Q@jDGdwuYJe)Q@_?`vqNaCjEVH|2Yy-!6DTonx zRIx}e`m%~(ig}w)c208Y_4-?3Q{}b+LMOF4JZw^tTjhZj6qG$MmSW|0 z$>Wj$d#;Dhzz!`Ro?p1jYphWsr!g~?c)GK99q4-$+pF)h7Wru(pC2`?h3B?Hkd`ay zMNDi0iShvM@5M-4lZ2t>EFS}CpVnJixVkgtSl`Q3u=%P7##&CJ5=p3%SdpE)c{U(6 zj#`SIcuS@gb5+cx$tU~8q9KE)@p-67h}v$m!fZv}xFn-ADY_3M8br=(pZL#oWhXpE z{SkCuV@9@TZ-DwQ=L8fUtjH1rHO zt30wym~pt3I3`1r-!t!(QauqtJ9FpbiSL8?z4Yi-VT_3(vGK(BHnz8qrl$0@qR_Vk zr0X(JFxI55%eUnP?bHBCYi^vc6vTu4JW9oEbqdKvVyPrhvb(3X*=x%v0d|!idRR_@ z_fj8u-{ip`jj=M67BC`r9EgVBL?-!1HJRCdm-W!YrI&{xQG3v~l0~HCiNGWh3PB+iJ z)d`7lW^h?egUh5NQxkU{qH&(Er2h zeA41y+D=})cZOm1Z@If}KStQ4R{v=k<=8sy3N*XwEv)$tZHdq)mBa@%3C7FY50UOx z@Pq$s^nlHWitRK>XMvsP!bZoWFaIf;_@Smb!}3BcyyhYOA6wJ|8mW8NqSC)h=sj0L zVjAJJz;Nsh_^y!h*R!Z6$sWt^|IGOJn&%>1XOxV$=3nFU*&9^(_N>3ddIZ`3$GK~@ z+c-WL$H<-N-CnJo@n6zVePX&{0RO2M1-;qx`%i{3RG^-`$<=N6e^hJ(vJ=zI#?A$Z z*^NE_BZx`{XT1v_+neqq;nvsVPn1Q- z4Tb{MM*zTqZ*zeY0N9ZIehQ#n5p~4=sy90uo&}ZcTzm-3yKI~26@~%$R}HgxXHy~q z08Nk+t6LPP@a#lm23Pym4ZJ~BXWIohq|i%Y;L9E1tsI6~ zcKYlW7Aa_|s(+s4RZsJNpk;FB=l5FUX8$F| zdTG!{`A;&+l>VRIp&W@;lMEbk`VteSn3S9_wWAB9R6LHE0p*uGqv#}q)X~@ zqJ8p$UNe2ndH0Rh7WnbFPXA`R&}Sls!vqT$3cjFVHGoP3beYyP6j%5dzoA2K{I4!N zY9+l^Cxpfx1Oy}(WaRguwE#F}dg?0*L)^=5D_Uk)q!Z-Rj~o;PbMR*Tq>K3XE72_R z$adg~JO=8GQqtBo1L^*ymFeKQTb*pHt%?A>+xWT2XU6Eoo-n@C#-0d)J^_H~8ON@q zcYKzX(O+|q`y8863~|bhQqd(;aR2*dWtfNLrb_8ZFptg~Y#+tQNEdNHn*dlPJD#{zi&BD9!Q{|4{?(wKcHSrRD=0i} zW5O#o3x2lEDZPC5zno2NIxaY%eYvV&TT84h(|0}{>C134ORN5;@`q}Juj7>Q#&$9s z@Ykuow)Zq36(P=#D^`;GCRgq=U6rl1^{hK_;bt?5taw?#qeY@aSPF1+l#wFgJ#Dw?uY8efx#so~(DGJWp6e_3d9JG82?!u_V+6FomMd)1xzt3XPYe}Pcdz^m4@3QV> zSlc`ctm;MnCoar~2l^g>4RI=tVw?A$TNIxl{NLBFX z4NzY5D5Xg7SsN<=+D!mWRo!OX49i@)O?Qpt2tV0HAI0D`yk-(jxSF{adHbsWN@KW@}U5WT@bS=wBXCq|O7(ipT zK>zMCXgw%FKJEHWvg4E(#?UC9zqf~{V07VX&XV?Y28~Z6#s051+~wZVEah$^mXAt> zVf39&R~bWbt=i-)_)qQ5Yg)tU+nakm1}>p?53ph9#HT20M`(_k3Srnz1{+|_n1n?HaR1$ zZx!uJp_usnzp6NeeY!t;9q3K|X3Zj0aA%-qP}Ao3yd?;c)+KvZ|1D_>^tQP7KMxr& zE*Sr>Ir@9`%35&~nn$}H%Pb5P=9DZQZqWW27gB_Pnhpv%Qm>O4*q=bql>J+4D9i=X zJ+n!y7BA?E$HXSQ@@{a-#|m6|S#~_htHq&TAwUzxF%E6{{BN(j(g#r<|)+QEa6 zQ`=q3igRz{PnjY^D|763<9YvQ$Ra;mJNr!1(~2vGxwdJfHUQ7YiQGWGOxg<>3;n+m zk*yO16u&6|8^``v(&(jPh#47ZR?YJ^zja3GQt+-K3n*?xC)9?|M%(M{tOd!Fwy!0A zxinyeJ?%iX0i+UHC_evMzYG|J8@2kCFzV>*Z8#&vwk<9cr_mo_zi|z-S(6g$YXtjG zcZagsAK(=_cM^BGICUICZ;i))IjZS$AN+jO1<&%e&=?pDHSUz zNM3(r_p9qTg@*ZL%w87wjC9TWkI(?vcu$E`889r!+)N1rVrvt9^sHJ7D+mVzTvzWe`;y=?s^#lTQ1gL2ipYAF7Y2Izs z6d?WHnOEYuNaX6${??SvZ$3lutPk50`ijlw|31nNGTmmYS&ryDY#4KG-++H8 zXg{l1dr+SYS~eFhmz|M$gxm9_f7M@@MLSK+S6L|&%$WZ7MeO>_{?P7gVyQ#S&N_y{ zh17qw<_mUHL!gYp^QyCyK?i?9tnus36#f4 zJXT%Eg;k9~-^=sxL2U~UbAK=}0tN+>M5Co-YEAy@l&ghSwbRpF`*qN0NI%I^r>J}s z`USSzK36rQ-0sSy)io3uV{qfvE2}ZSp~)>kCHO}gmhC2CSOIrJ&UxsEm?8#an)}KP zxwfA*E?Z9&_z#AIDiwVy@(aAkNbX><{y>LZfQ<$hM=J-Sw+W2NaVIfiZ+wFs&~R%4 zxuWRAl;$j76RWJ}K~+v|l`p-QL;lpgo=MAp7Vg)Enjuc{&l~%D%i^MNucv3@)1fOE z9YrGO{^>9b8B0bNM^)L;;mYK%{gG?Zd~<7||8EqetJ30m8jbGlOrJTJp6BfJ{nUXt z__l>|&uiupk-x)8P8H~5`S~l3E?O>Nc&s5~Y=o zAa^GL}U z(TlL08=#23w1@L6F^=OV^~WD#|pQg%X-BmFo46rE6qy zq;leQyEJFa<_7Zl`+xY)sKh;V1z?&Wbl&I>NVAk?))t(Ocj(=2?{ip9V1d?v^4g}FhYnzAEk|0J#@5IGHHqC8Uasr82?d?X6p#p0@u|Wvapbaky^yr$9+=WR z{(6b?&j%Nm79IrK!7WVV8yjlvQ+=NQ|MOtYSWdP#wDoe+w}qK>+0C#gjMK{FQnqaV z>GK{EaJty|X^4+B)gfO!jLY>v4g&$hUExikDDywH-3bPN5myCyZSitT{3U+{R2tCPHxt+7*2-}lTOcCt0yS-)qF)^^}p}Iibcfv7CiY*Zn2S7wP5nw??dK zIB}upM!>q2Mm`ktUkWV!vNZbOsUIc!;7c#T*NNDtD{JnO*$lCc#l7fVKCub7VT^5w zh(i6xnLLE>iO=)Vt-u=b|0;qvNQQt`Khwn#ANaNqyGPC?;aZm7gF*eJDLYQ>#hi#% zzqq{rO2fJWa=P2M2N(EX6{r#nn(zNDKJepKM%!2)%B_(egAfKgYrS)^B+ z0y*4ue;dO5H)PpZ?M0y0_Wi{iGmp$&3DF7VMJ1nl3@DiVV>0xRS-_)HEkn;_z;Dk} zOde@!4Q1#$LM16N+I`jsry(A$z2duGhZb}i*bkMyYU)s|L>63!^j=uII$ipGC#G*N zGg|sL#Z}ho_cn1xXRG?tU+Q)5me6}tC%Crv{-8)~;=RlpPD*({OBNKuYX?}^4*ozU z7CB#OKSCy!*?oid|E8k7>m!GTcajOcf9XeE_=mUeUUZ0wYv{34%TJs_3|8f#;^hpo zDO!L~NJ_Ub>-tO_Y(p!bW_>s9-`xAVyj7n~{!`?`U99bi$4r0t-hrFv()ZuNgRA{Z z_13LZm`nYTFR9n-D0Y0?0?F6AO_{a9U22kYjdiK^q#37CR&qNvbr7wFe{;IF5q2*6 zccgB9e*7o+beiWctjExby0+}r9oaj67Stw5cT>v|n)Bx%LB@a(80^si~T zP%Gr`)h9LKGg2M!dIng30*v%HTPR}^N>9vmuIO+M@dDiZ7|$SB!KL5o4b;MIgB z%ZE3t?*HrQy5p(-{=Yr4l99bf36XWLy(PJ2hD+J=8W$Pal$6<3gv*sJ#I<+Vh|Fv6 zak+BMkQveM(&zj8^WHyR_kGTDyq@Pg?m2Iv)VG=NqfH@InKb;e+SUN=jE>!@~I(+t1M+ z_H6CGi7CXTlO8So$!zgS9G5QHIH=lWlw#E(Cr?94Nu}8f39+5OcJ5RetEC@f&Or)d z1Z{cLa+jH~qzqc>%Yp`bkvT<30}W$m;~A<44`Z_Fhk5i%rexcg$7JjFKx|0o-kyAQ#Qc-3|St)%DC-rq$Rc{-cmog+ZBz#4<}JnqHlP_vLl@*Vwqa zV#33O-ff@F-}iN6WVCO5Oj^0`fl0$(9h6Eiw+7oUM;+S?Pqg2yHOrjk;{1M-lC&5} z`%)HMM9(rtAUBW5eSC}Y+AH->fT-i8Df>)nYwC&V`B@$%XbabAhm}RGz};QuR`mH& zR|*HtVQ5EY_T(-K>|?ht0ow~)bXD3mHhdvCBNz}@SGFFUaQ*VJhJYMhvtzF7YYF+! z0dW)CF3NA?>xQZNWmUt3cSi|?wY+H~b~>5kcByW&W|AhFMYMtGHa}WHa<@L#_r z%}xyc=D?3modRk)xD;1gtpBr9cXPW@oQ^)0LiF+E*~MH-cszQK6ZMLLA2`Tq?dff& z_qBpgZb=S*sgdoGBfM>|LPTb$1OC4!0%%P^I96YTphsRb#yslXcw7ZoG7JFo0ndxxxJq%CFfpoz+YWFJ2lyNvL*r*Pn*l)YKT5yS(`~I)GIq{`PUD z&jqGcfYRH^KE|Stsc7>KFODc;(X6|{;mIOEPr@_O-YiAB2|h*b3RPRS(uw6R^|W*}^(E05s6M2gp! zwh-Qt_Qa@UcC2=qZKrVmsI}nOzkl-lM4tQ9>ShZ8D0W2@HEFAdzxkWmGk$i$kOYbJ zT2Bh(NDJjR7hzFOh`W1j{M)BXD&iUWmR)peyB!@9VPlgt6WrVpc`(!#x%)9ugJl*g zgsr)#Btny>7~#?9j%wjx{%#KUR&~+;#jt8O6agPMH_DF@l`py;aYaW!#FXSUnv-C$ zo17El4)K|`qEgpSc{8G%d{Ci^jO+j<7`B-JydyUo-aSnIA(#tsysH%1AnX5m(cNY+ z-29u2fc(EnVx**vdf-~T!)IsKoOtg`m61%1!()B1avT==o@VM)9MePyDp^q^3MQ_l zKH8wkE424FOk1}{9A3cZ61mk=*DfWi9%Cc`n4jg7IphG%Gkv&0MU`?75G9~>BV(7N zmFxsl{DA{EZe8xzq4)K+vRot2Scm9fVdcm=UFrL8`xEgdIsc{`gur|(_h+@NGrU2p zR92FUiJSb9Ra!JV7CgAq`8y=sNDMf*U-1L~Mo+AJ52iD4g2lkM-4fEIb3M~L48+8t z^Ishgv$o=WQxwr$9>3)1VA0eHa3Or~=XvpveJuVEY8S`cskgRX~|}2T?(j z)$_LBaChx)L*{Nf9{K#aEKQxOam}G3?baK#+E|&`?td74VeyE(xLBb$XKM^A^gLrm zj)*RkwFml?^5{X%P-p1&A&@cIYyVdl!%~i#mDOT9=cAGGR(}6FkA-o!IfQW;%m_oT&gXqQSh&9nvYKFyBo! zmA7nhTTJXfp-q~5t>)*r3Cie2GWe@B43RYG-VEwG^bcW1Pcl>iH$zbS1cRUPxG7SB zCmsj$P{kcb$yBn!2lg&1uB*MC8WH>-{?|a{r+GuFNttct9Q;qz7altZD?c;E+zHni z#5=Yp$yr3TyVzgHgxDLJXPs3_QR*b7RP^_Kuk_LB!T_(d8X$W`*8h!cFN845~NYwH%9q5(e$R~sr`Tty}EmDIX-bhxfw)90nCf5f5 zg#cqU!lZUv2w?D7NO(Cah0aVVRwKR7rBaPIlJrhk_OLCDnTE^%+g4ko9nz}htF3|G znhkCgc8!Mmi+8cD&)6J!aK;Q@PsH~Yl$Et@p5f^0oA}RF>m83V{ZfF2>-}q(MPl8-kL6LJsncXz5*Gy%%D;c{?l8DZKZt+b*Z(6H^gnUA z@c=R#FjJ~twbL2ZT;iLnjai`0oe`Bz^wJz@FlV>`Zbb2#A~ATOPCt>;)XtZR)5FD% zaz}L9c9h&&*B8PkFEETuTf6Uf1)6|dKWSm9oN%O(_&IeX!%LwfF?;t7`9|i8UopBA zVSmq2QsFv+z$Pf&E(gR;%VT4y(DFC$Pu_>*pM`RaHr}AMy3hEB4NU(j$$5!RLQJuejO0=*<4nUQEe~4y1PLp#&f|Su{Xr zSdt|+p|+gz(m?Ke{R-d%bXj_xs(P7b(~$_5B`S$h3_1&c$Yybke#+tUh6p2MKGc_<dO ze}~&25*Iel^NcL(r2aj$2$pPS{44c7;oF-(t)oTK=Lqhr_E0DmB&8BoHGf;PVZ`22 zYrvET(Y9yZ)}8z?Ugx+pzEA&i-Vp@jk4NW8)>py>s&f~xWCP29Am4)oG+I*_-41Du z|BgB${6HQyec`)#K3MLT;k-npXXR`$fB`aU0TB>eGz3&=>C+=dz!b z=$EqCh?|sBaGTwO@E;9yFJVm&Wv-r3%1UYA%=AuCJbJNI%ga`G?G|9l((B{GE3DdI zeoS9DlWH2=t(z=>W(pTI&sZgeG*i99KEtsyNuBV!-b0Ds*f4f~{hL)?`R$Uc<_LXJ zC71BZ+V8>id1e9B)Q$m3k5@lb;aatzgE7u%38J76Xlsmb%Wl z3Z6tsIv<9xVcp%QPT&cB^hKxXmkFYCdOk~AIV{~1SDF1(cxn?F$$3QJ(Li| zpf`{e9(F)Is6Z$Hl;ff!{z`lv+ot@P^R{TpK7fB%7cEBHh4US;+}3&HG7gn+w_&){ z0w4lB>I#jZm6*=*L&}_<{25rIh4TPqi;7Zyw(U7-d1X=05!)H7pPug1VwfR;#}kHk zt!sOZHr~-%9-i0;+!^G4qPY9R#$%?fUr!};MH}%xopx2_uU-*s^h#?%c0m+_;`yIO znfS5Kd81?dWyv-NDmcX`;}1o}Z7fM}>WpxI;zz#@rC@M*;fD)5DP4CwwSr|tY- zud`Rky=ZB~lTwPEPP)6b;tC60z`A|!>EvNa(ZRrj=@xm|Kdef4#FcDks_Yz$4=aK#G+{OQ=< z`VYspvtI2A&y}NdGvb-90up@9%P*tug^CRm&#zZm%AV$ty|pqOC|i^HfMb2~2VKI( z`n4v@zW;l)Fs|hL7>>ECHr}z#h}t{0>Ha<8 zux@0VRu2As>6-3-pNhnpm@e&!vYX)O>vx~vw8B1`Lv^$vpM1Z0<5;q>Y`TntXG-;` z@J-(D-dJppIp@wZf-K@@Mje=sY&}%~@xfh^vzTZmbJp0nz)4%OqE-#Tzh|23E&#Ds zJ9ArcBfsyJ{7aWS?Q~(vuUDvfogl7nA>B{ELR=SQLF0Gd+GV@FUc~Ed6&FBNaGJBo&OSg_; z;E|nt=n>h^Q6nSPt9R^2=oz2hvIo)6;-;eM@E*RMTy-J1Ymafq=iI73e$?HlkQ);! zt-bm@-$AV4;IFM3ab#FA2>!%I?Dj1MYJr}jkCh5nCd6;f&e9hj(f!cFHl?d5KgZ5Z zTv;FuIrQ3CKmNxE&Ry~I79>2h(8=p3dD2P@6{ zd!mlNr>B`PfW7n)=@}YG%+PJ(fkMz#%0tB;JUp5H6{ln`jHYMxa47ls@=C74Mvx=) zjKDkO{12fc_k0h1Dpt75kr1MMPx4S4F2B&sed3LAXk^!f5!)>g&Jmt7mxhV5K;`hM z-$=^|K91~Rmd&j>_-W}^3)K}yN_@cC%^opv=_X#bumpaYZl(;0FX##ZSuGFICwj9Q z9?S@^K|_8GzWY& zwu~K@3x3Fyc`vaKbUiiDvAajb?)jZr#ipu~-TN;t8wvC<-%(sPxpcr@&q9nw=|jdX zfN5=BS-z;Rl3P{YRy=t=$HB?+qb)y-Z06T@D_ebJC;Awr3T4tQNi|$& zQf4~M1GRt&|M#54ki;@b?d#o@KmnyoSnJabvF|S|AxAT?+SA}g6Ay2Lh@licrKmYk z)yBwKQ^bpRYpUuG z{K#_prFjzg*KKYTw3Ud(MT^;3Htx^9zSCG{ezgz5z)UQ(W4=+K*5c3~pTi>#g-0C{ks#IwD)kC>EQjU#ZaYC$&?t!!FrX@L|5wA1NA< zUZTsqFGtd~7uHo^D21MwdJIvF%3Cs|H2ga*KSkTM0XFF4^4}; zi^e_Q;JA*^F>pR}@>g_?7B>9h%%}9}@Z%`UBl95e%0Z zeh-d9BAqpEaMP@iaHv>|qEY9R^)#4j_T=}iCaLK`*>v&(b?iu0)d}^A%Y!Cb58Er- zo}++fTJ}u+Rhl(%CYwb+s1+JWb;|vPhAMvG$jz!@?HgdTcckR2TB$^ftA&yY_ddMN zg;nXIBSarA6LF7>fMGsm4ea&!BXS)Rk4X5lTA+KymA09;BnMpc6SWI_2Lsr_?_sMU zYl2NuH?!aa#c7{Jlw3S`ly76D1HNj1^PT)~siNm;Pb|vbWtpTEs~g#g$}m^mlZlOr z|K$))9IdvE|rIbSEfokQ`s{;4$@BS8`29ZGpDEX*!2JA=3VYde|u_!bs8f7)&AJF>t0pt&`JXfv!Ejk zsf%@)5c&`anjN-u&Y2q%aTS+(USe^JU4L)^B7cA&^dMgNELbCe(_ZO7c@meuzR<)Q zrLV0ixgJ&mcdpk9>b;R4Hvf(yuC8hLBW3%;7k*5LDQ>DEV@JPGo!Obop2RErrnOrk zQ$#Q1WWmxIqEozgpHGS*1CS_YBhE<6~U>igqt*500g(Um%XE(?z0h`pZ`hO6K?~{za*ol7EDIF_Dxq4eirh9 zR=53HvF^Rf<4E)C1#@(j_6zM67CyY~%$`pWk4Pz(CuGBF@&9Oz=h34hTqJI`boe9) z6#mdnd^hrFygF*Xy1TxbWO`51z%Q7?zMJ$r|NTck>uucz9u{eC3`;Jv6xfCX)%`uy zU?F!{c3YLCKB56nOr(@-h-{bZVl=v|%%n$B9%bqJiKn;hbm?7IbpYq!6bxry}$y${WO75Wa5-UeN7!@b4WH?a03 zCa+df3<&CkabB{+E@n^}CdJJ178U0pbQrr9;ATB#pJ5^F=vSKcqbCIY-E1L;SxN>u zZ{^DmCiEuABGtCwVJ zWs~r&UOP7)zxtPRnVT_ob`1lK7K-D4mhpC)T~lnLc}SS3g2pfs`lIgC3Vz?yA_*bW zpIh67v4}nRja}y)KGsC+yCtv4N_^ZoN+SuVgxp7pPzl%uvq-zrp_S8Dt z5#qXNI9>y1s@ z-RNHS>Ka5`u7RKp69-Dqa)^@3XHPwstslliwv4ev{EA+)2Jo~|)=l)RbYM>H{xrgKgd+5Pjn?bT) z)BJX)(tF-iGJNYo6!MY8OC0$LDT?34iYDrC)QJG2+}+1Q^?W|Lcb7M=N}nI%8U0BL zaEMDV(klDoGceI#30$z%@`gNCbAMk3WlevpKVMMWg*?8Qvx^B~ck*7KYwpB`oC*m7 zZTqo`Rr`ltyOPyWdZ(mh z8jJ&}@Run-d^Z?y9Oi;6HqVIiy6w!E?Q^lvFbvF8vx$UFzd4UMs0JjkX2O@CzikBM zldI&7+JI}t2WZyUL+#|`q}Pat)l89*v`$9&}R=TW^Gs+5vCoe*!` z27;PQ!EVOs%0ZVFb$^RxXSy`q0>(1i0JC6XlaMzFkT>xn!+FA{NR}vB)2;3S^=1kj zJqbe@1DNpX43FEBlt<*Pl=bm`UZG~;JaH}8)nIIhlh!Y)G+0? zq-Npp!Q>@NP*XRX6x-6C{sJz3p6EEsFH%iOmtG{FhVuXx>WrOH4vwZ?*2I6J`v$l- zn_w$3CFs9It=9s?;b$t<)$Z{=QE%PUT;HzciGr9jMU-?+9qoc?KNCoLmTWoqU2gb5 zKh%DX|3PLw!u*c6Cyt!63o9U#kLWCvw~>wlO?T-nQDpjv?8k^bZV;YHMnCgDqpS-#((+!T11KJgrLdbA`Q=4T@dx({&>a zdy}Wa^1+KrEgF>V%imn9l|y5fc}LV!BNjbsDy=u2=C$rLuu_WJX_%U$EIkbs04{g+ z{8Xe0kga}{?P0|}mnk*fXnGo-@|NDK$Cl*rkJnZXP7+7{*cX{6>rAbOv+~1 zjRrwiy@^d6th5hf{vLWcWdvC;aQ7j=pW&%{ z8RWn=3n7f$`!DpCyW zg=eED%}#r|KIYCFN`S|t-ThM1V`Z+ZWr?GIBEN>I?7E@uM96Ih;ZaHMCd4o6@HzFR z54TaLkiBm(6<8@5yYute%k1G`#gxnxT=X~c&x}Bm$W`f(3w-tm0UfuZX-*9+y0pkY ze`m34SpSILeg?6QH)O~v4-eeL@+qG4Vro$31Yz0R&M*$>3jiH{Z;tbX&slCb8a%o2 z>XUSEXwo;zWg`ctig73s{CCmy=Ip z-H#mfFtZHz?DaP4m66pii##|%4_zkNM~s6VbcRx)XDc??#-MkmGx_9;pLGf!91m_d>t*2KO^%;t zV&utCsgo|aMoR{T!E9)xYk(V6Z5Q$2z2<- zq6_jKI7&p}cPN}kh09@%hl%t1$mlZ1Sgn;|z`-;Xo}E*nKFnSDGTaWugll6D2fx<% z@06No8Zd@`&3(ngt1YOk8mxM4?-h?TPNmL(os^e^DK?yrgj+3#H#;5@`%rR4Vy}xu zz5Ud>BSK+36Fm1V&AhOY$Bshk{5K$^zF4G-#>JKM(H=`;MO?2^!k^jLdHLwsfEaS{ zXiC9ipNrLQnyA292Z;NH#Z3>#l2{KhmBW~r7|_62k!*`w)P_d9^4vpa>VpW!Zoe86 zMfO!n(_a)80xO-N=A9vP9rI-_lU;;PW;=V~Lu3}*UP44kjMp_aHUAhbg}>n;)(Rt7 zX4#1yOWyEa=E-d1oI~kbc8kq4T+DOi&LhY|uBXdP<$>h+_?Ev; zXd6k9a-9+ozn?K>Z`p1v4|pRN@M_Ym=S=!t62t2r#T0EHrc^J|R2LuV8O^?#UGvST zfx*p`On6MpchKNg#G2=(;bVq;;y8_dA!Uq`@-nBXPSv|021+1wEVErpbXidxBg*W> zM%B^3Bmf#(g>tY=l&QJq@$>PiZeOH}oann-H($I$Om!X)mtxtKu~ZYglq$c@yVXvK XkzQdf=Xz~dM_6>VK$>6Ftt0;r$y@D7 literal 0 HcmV?d00001 diff --git a/images/Ghostty.icon/Assets/gloss.png b/images/Ghostty.icon/Assets/gloss.png new file mode 100644 index 0000000000000000000000000000000000000000..f11196010eedf64765003a7d8783bca33b49c1a7 GIT binary patch literal 3353 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%0A0{dMk=_emN%B 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

  • -yw79IlhcyF2lE)qW50{>ANhXYNzNpfTK`W^IS}(0N!M4mulX0pF}EmpDk&2HgoMs z94GO(8|HESkK%gwaf`=I=apGM?=yp9yfEb+W8<-M@d=hrNjcWx(hS$=8-M?aOFiS7?%@%}@j_!~g$ zA?};m(l}YnWGXu;AWEjX-t^@= z;P>p`>=@$;e{A0d|J44${>2P+Kd1ctDzFEB$i5K% zMEphjPvz?$?H9p+9+~@`TXJVD!|*}>x4y0G6Mb12>9Cp^eYF@F0{ddf#VhV|NcAh4(z^8*i+N1Ie<9+ z`YQ1Mh%XyvM|A!cszC-n(xmmzvsEbQ*Pu!aq*FG??V#YgL2WMC65VNnB>(X*l|IVF z>wetgJChtMtEL^xWIs>(bGSN4-!ktXb;kM%y=C$bD^mMrPCL-bz#$8U(w260Qb#*E zG+D0uU20c}w@w@A>^irU<;X^6xo4(@3@_Baf=7%q zqbxhE@>WAO>6s~C+*!cWQ1$f##uv~32Kj(Jio^@+^{WA6hE+oL3(Cf9QKn_t?fr#q zyporS|6%$t-9`DmZ{GXnr!T&nhEKvL$)Bx#$9g(upEF9{`vmy9eNO4OZS*x@dlp`- ziKlwQo&~V|V!sN0fF4@N6#&lT{r!sd0SgJ7;6mer0;vxE)BRir{w>R6dsw0Veu@MC zLiRG$Lq@&yz}X*;eFOL${m%>47pUh2EM~F^HV}g!S_p|YiqHauHi!zaK;Caa zJuiZ9FjiYmJ*%l7xG)tz>-Y~KWmc%HF!f_?fR5}HYQZcOl4Xy}RDQL6|Hf!?Z5T$G z5eC-N7xyC=i2X|+kbOV+&uLfVfR@@=i^q<2kbBf{gF^hKaoBf1k{lM89mRd&_=R7( zaNKOx&6-(fPfbUkA}#XIdg&aNXYGApV#gOOFlpMz9+|e`P`}^d2?@{2ddJ>xb<_ zl;5#CJ9l=NC&FwsUtM2a^cU$t{h)mS`PS%GcMJAUb|*(CM~nUrj|s>^r0DNTMJ(i< zD})&yml)lJokzk!I$9sSauj}jF$3a*6w&`khuTB+p*s3~p#M)V5N5mEfGud{IzYW0 z!tBU4VfKIPgxL>%fk3;zU-`S08&LQe;E%v>+Hu{Yc+Y;{9)LfW{EEF{4CJ;=*fG#L z|6LO$d_#LLd|`ms?yjFMPxh-x8&eOeY&b-g&B@gg*Jfr;tNBw`{ z4-8DLrxbECuVts*>sX#lEoYp2QviBl46CK)al2P)9gah`bPJ(hm&5*pS-5Upe4xi~ zyv2i{@ng5NHm!^Y-i`L5O7&~#J(b`3po;(f1{cuEPC>nR0JR3Y^gGum=)hdBazJ(f zzoDq|3ZPyGE5$-DY=puxeXyReM^UW<+R8eW!y@Es`k<#9RRH7e-{3L+eDOgxz+d*H z)}7z*@q<&3zmlCZrg1|SQpMNOkH>Fh`7OQ5<0(9T^8@THtL68lq*T8A27PiaQC#tW zZv>vnuUQfgR6L(mf1^`JXY1C*9X3_oYxy|^JWiG;tI34z0_Rt)a*O%ylsob0=bEMd zK)}@dPw8n;JL)1%#<9+sA}!@ZG?jl%LeBB>2SxyvOF!NaouM?BzAgEcqSsvQ<&+iwB2s{)fUEkD_+FDeGAh`xE&%j6&`8m5*ELvL3v#X;A!eUNkn*x~*k* z4K<`Hl=3uZw4Td`<7KVp+c|%L2kTh=t)t%`l6N&BavWFq&3M^eODkxT$gC2}>Ocrf zAjuF+5K1EYsDlVYPIK&|E+KQsVIuP+QBQUG2_x-uvp~6-6_|KD!>Cc2(DV_3GzUcfaq|szh7R6TsqobepsQDCWTd z3j2axQqP5SwAZ<$34sD0*wf;JjR6I8SaCkNAC#Pbz3*^J!+se|-2|Czwi@>f>R0leG; z0~+*ScTV&pj1z2$_f3=i2yi1`;lmmLeqU3rLl)F~$>&_hd1!+}ew5K6939HYL(Y-@ zHWC91G-rI!s3WkI5!mlI|5;qm0G3*o*S_YXUfW)VaYQ?Uz@{qn*8`raaNq5!Lisl3 z?b~{#{b1Z|1t73sDV6ER0HUdq2cWp#4p2GJJc|Ijk~@Mu;O>aM!LCF{YzDq8aa5xe z@^g1E(*YXgvwr3-Y62w;2qj`PKR*zMizlkIxHhVxJRpq^fDJ)hU#rzOyC%t{9U{b1Y@Ko#{`j=dA;=Zr6$49}7oS&5lW0G% z=a%!p8g3sGNym}j3j_VU9?N|mJnzj$k_iSdGdH*1E~o8@$cDX z{Jt1*o%9Hxq#uO=10JA|v0dtu*vCYP^2yivep*Wm2q=TU0JSHSE96_odDT8nO@q;5 zyck!=vwVy%T3APGfW4B{o2VbACLow0KQVxR+$o@6@$0({{)h2g%O_*_BYM7NXsyLK z0B+sL_{}?n?-f9lTK~23wakG2lgaa``bqcN{9lbo_u%=bpX{r9^WpJNK6@l`_T97Z zpKXX--st!GcSPil_Ux4?WB=FwX9noYLOv3$s4MVW`0oCxTm^zY?tfv5$Q$w(t1thM z@96cs|CRj5kX<>K->Tf3mv66Lh+O;IwWrsfirlJieSGU&b(EF@PZ3Gm8HB^EUYV z^#E?MSwwk#XC!faS|gG6QzMoCj*)!sbicX3xUc%W`|Edq{^(EiEn)v4{?zawQe{9l z*1d%9Q~GIIL(bSwB4DE&{B=0c(N|;3m&DUrX()$*Y2m+Kq!E;ZU-|U6f&X4505Goz z)VILzL_)sO@|Mq?8g?r@s9VE7s`m-h7bsVLDG?wf#@FXc4eIgDHS|+VYQ+GD#_>P& z->#-pkT1aJupV;ME5`+ZdF!tq0MXsZ^uhNi@8|4q1w9(m6!lsH_GnLk>4zE@W1AZw z1!ynGRa|piL2e}_%Q5cS57aY>&^zFj=#}zSiU3x?KQYh8)p32S*H_1{zVhm$=}3_N zEML9=fTu?CWlR5+@#urm2mgHZ_W8}jo2Nghb=zq+YgwPLFkxr_ju8ORh*<8ju)LC$ zqXZ}W3jp`EZp;FpvINkt<^#T5q5jGE&p7G6Rcz&32JkmZhw&u;Hpml!YyjuG=Mn=4c5WNV|4lEOm+i|| z(FiyHlH=CCKN^{zai9uBJ?S{^6;f5WwKkHG(nc+y{M-yPk-2N%v3TtB;h=lWfd8?&z++))0l zdb8R(P_}y)dlwIMJa#wQ*JmQTkH7w&z5jl7`R4MQf5%^HsBv90^fPX?j9SWQ+10Q~aeeVqI+R{=QX`c#f7>~e{GsrQ4N>cY=^Zj`K9YZK)mFbu(m4uQl68@COCIT&_MMwq(BZsPKE^B zx(NbdAQvA3>4OhCxS9t`Q@5=iJnz_ARWae^ZS;k2{a)yV8@`_;!sJs!V4hsr|Q*vJ(~Ab)x0aMEX`?bLV1mk0zga<1<<^@1}#fXN2z*d1i?lBX> zJ`Wmndb?-W>I|&B1}Bb^!psP|c$Djl`5$28XAi4&#lJN@C!O2Q0n> zIW%Wce4uIV8``xK5`p7XVn+kVdaYo7(38!NMZUB#;DJmb!2u%k`cENUEe!$jnys}x zRyFrQhWah_V7(qdBuZG<1l-03R5kq^^N#vSiv7n3d1f-IEMi*Q)Be(0M0TzEp%eiD zDtA&aBgxxBAgiCDpDBU4i9Tm0fCU{0DrOL1(u8`!`%qa~qQx z19+blMLJE?K0KJMndyO<5$vFp{g^%$Q5k1a;r^PVKT^Vs3XEK`-PN-{IabXj?9-R| z-kwljC#4>O0D+C3J&k#hV2;PZ{+1O{Ra`8+%}K}<6W$ZHt_>(O z8UkE-0OV|4LL0Vo1lDFIhxI!IqHO$Jny6e$F|;G)$MZ<;7%)uZ2<)t~oiH%3OTam&l1c}Vf3<-Q`B z9WuDk1UlwH(=T+3FGJMBcAQPGs$cQqk5UO=W|<^f$qiQ7}@$A^fRQ!#^d)&CiY?d`p8b~+l`#q6I!{y@!IIb!`g>QDRIim44CjqO&gk=OC> z8ON!4zp{Qf{+j-~ATQQg&i8UneRJxcaXuYs9d%>@*` zH?jUR+c(yS*TMV3S|-rtTKyyEX0 zq>xbn4gn75#5KNg#B#B=$v<#Jgg%giWm4=Ap#56rzOh-APr2TgR_^c@9N!taJEMIw z>)RZDH{7ThRS2-b)6u&Cya3FN7Gk8Z{Yck$ri@72DS)+BT?pVHP$W4=uL<-O0MG!~ znPb2#DG@nb`oB^DdGk>Lz`Q;8<%bXcefIR zmU@1=BYXW{MdbT(BA+rd0387U@Nddh`5Q9>te6?#eL4a(dhOqqe<(66f9l^7k=Nx7 zd0yno|E`=}ITJak58glU^|$VA9d8{Y<7~dny&U_e*=Z)SG2TekfnhgO7Nhg2a)@kS z70MzfN6L!NDEsoGlg*ROaPEBh{PMpppZn{?b0$Wssj^7-NC5$_#w*Gq*UD>muiXv6 z_a~il2&mgBcZ!`t0_ETVC8e?zEimqETiI|2qtC~lbN^h<_RqxYpYASqmm=SqDX%}j ze=LvPW9Q|sE|r(c!8!auPT~qW%JOU}MjPP4c|IKtYq94uQ->YfQAyyvl;D`t;x7SAUEw(*H6!&M*TByT?q|n{{8F5jd;g4O$R&!GL4OABY99grtC+!{gzEtu1R$r=E9F+epK>59 zuEu?VoT9)!@wozkJsc)53iVC2e@DPy<;8reo}9-@+i7dyJTelNagH{sF-|2V1FKXY z=zy|sq1VsbC)E?(zdt^?dGgyo7s>aMzw|Hu=vN}37r#C~0r1n09)I+fe9h?1;_9o< z-Fxn5fBgMk;W?KtC2Y?efPMi$zxE#h6*d;Oc&}xL)c-lk3e=bQpb*q|bQGvpC4l<& z!l7LG`uZGqP`}c4tHJ~Rg_iqv1qXo@`swu!+Ia{(N4;{zl=-$n3lVH*0O#BoPPaC_ zodCr1z`;q&)c&nL$H#wbaGqfM=JYgjXvd!zU?ggb7q&=6z|6~wF&uz)rIG-U<2c$< zl9r?3<%<_k+e6MC^V}D`zFN_b&X>>uAYng{sM31cBO@uRpueaUa=vKog$;cm|Htxi z`A>g6eC_bn>4wPJ=xp=!LY|s#rZ>ko$09fK8{-@Pnsmw{%Lah5Jd}sahf92LNjd=N z?I!}vvyf!>ck&&#JHU>u&0D&^qexLPQS zY-P$KPv*+F->e#QP#}dA|4)vU{dmhq=_4F8DI>-I(WNGomxX6dmGlSC?}?ngq%4x0 zCjU>I1mJ%+`L+B|Q})YMd5>v0+af#L-*DedMGn&MG(YIQy=8m8TL~O{5b2+t&sU|t79Ps4 z88Kf0*e`K^wkqHtkb8bz_c!NXTU7R(sjpElTNOOW%kUEbGyViXw{qbC2EaesF*3X` z0KpNA>$r|w1o#VS$|T)$X&Hg75v%YZPo}u0=&|MjK%=fs2BrY$Mt_YmE4{%F=ms#p-n`iq1CmgqApPc~;;UHmO=8{DRuoZ#z zT)F_DOWt?Tw~PTa95<%~^d0S)3+#urRxpxd;W-N)@QAlB6>z3!Z7Nfg8``_0ef)g` zyi6|~G(b)~cTBW}`j#@95wud#PA%%)=4as24rrXE5$wjr2#BC>;93!+(m=Tc*sy`c4>0(jVhz&rhl8k?0^ps-0D(oOkqkhL0h-qKPa68`8>|NaoG34_ za|Zwe_TeH*aht)iZ9kJD>`%1Is2?2^ER}4-l<$qDct@l?9SOMZwFc~j@r;&9%AW>+ z+{qW@UC*l=#TGt2W6b1Ae1pmJ4WiQUTq=wZHg>iQmF8U7; z99+4Q20U7nq z?wWLc=X~{ihW7!|=IBS|E50w9cOkEOq@}bhG6Ku=>{mb>1`7P}nFuJl{Y)B^kL>PF zhMYfo!1x)*ZAVfh0A+3f&zt~yW7KoeqX;Et5P^SjeZv0j`mt1G9;h(}^v~AqZDa13 zU>w+hB@nCicYNa)&<_nG%rGdIXdpmC2h0QVp8b%0DLpknLonNThn{N!XLE3;h>SSy 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�xCbwkN13lns$U$O+wA(zUoYruRtVXcMzK!C~F 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

    &!1`i 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�s^lmNOxp(o^)Ki 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�EY!MgV8^H2hbJJsDWU^&&1TYoBux@SN)&CC#VAi z&|W6ku)Zb#uGJJ}t8~C^dwILY0oVlI$=^4nx{|5aPcqC$!i!S$pI7Vn3L9%X@nUS` z_cu$S!=Snmq2G7WPG75|+Q4_Nn)Z9QUL&6`*YE*fzh3w19l~lNEDYu@eeYEf0QoKs zGU4*Y!5mi!;#q-C>hV?S_^->We?-21=nh1^Dj2x~{nqwIA100CmWzL;fL87LQ-yXj zGdbH&jOSTH3#H(1^2hg;N8`uB^-D?ZwtB#c~q=$6LXTj&fFKP=KZocW1E}y~VIu35^-21i) z=3e~}^%5G(b^af_{MVUK+<)?iLSL^(R~A6fAo#A(acgkHm19o;sHDk1(qlQzL6_v~ z9Z6}51DTx%U$nvCMgc%1ZvQ5HFvqC(UcJ6@RC;S&;`=4SFJ9?=$1m>J6ZErL(7*9} zIG{JzGvvR2Rp5CJQ;n{EE8HKmJaUsDJi_xgrNr0ZYvUUTT9p^ygQjBENzTgib$K84 zUXM+J_BSx;S$HDPGokk>z*u<|#<58I*Jt?`(@P0|p33|b!vaV%ZjhEuxWssqD{vkd z#8+Asa4R1bbSXjr-zY6DsfN)jxc@>tWf0TVNI@4mOpgNG6fi$?Wt5?Ob2pxWkA&-o zL^r}XxQB}%u4hP_b&WpHc%PaDLFwcBb{rt*$}RI9pXSZS#gjz$Y1kLbddx39eKW^6 zSjY-Z=tU9z{&k`4>9w*0frH>Ty<87SX@VNS72td9TZN`V_w?ykxEV$A8Mczp0rBfl zEKLAdEd7X@0kpiQyxNsn@IcLt3r?@P!akxKMy`C?-RlW7-bTL8chyw|J`#0#V^;(o zdR9#{M<`FHVKzlSjd0L-uXTirfCoM-?$j&kR}0K%Ddy7`>)7NRKh(w8zRqbfzmJ2; zU1trTeGudrCr2g*?Wy1&HHSBKj_+PG8?}C9HQpsPr{4F*fq{nntQ{f!HQLEL!VO%W zST)(}LXqxk5YNDDkl)y@)s(-t2Ym_cK;o?ju3YMidRH5)6NX6lKGy|v`s{tr_TeJv zLzCJB77fal9;6<<8NNSYUg*|CTB653lEg6LxY);mURgu%z|L)j`OgGX^?B?&!0%q&LwbeTI*L(v zhV||Wc{GeeAH z7v9*%LA19Da@AmKfa3~4wpw&sB7JC16EFnuZI|B4*Bxbn7L0zRc`zS^jcu#e4Z zt>?a3qkYbGziZ=KJt1 zZX+*6{`SEH)-8J8Na!oInwb8uUVuilxPYFH{D-(dcdlm;{}Ftx1n2;;Z!^D(_MX+c zo?au}b-lto@A#Y%vdC!i9DdxToK^skv!J5y`~>}QNtZ%7+R>oyrIs6lja&CfZ7eY_t<4s6i}34GDs#}(jD^a-YI)6I-)=XOpE=Ga;=rg2ka~^$ zOk6#qlt!qx+)QzQ3ObQkwf*bN@RAetbNNw0C%{}YwAU5t6Z_ge*0y|JtR`Xf6CO0=`R?PDA|Vt?`zSskS4pE3AZnzWA4{x_W0y1ol9y-{n2 zef!o9B|M@A=DSj}09?=p)r7HozK}~@fDG#t^*HpF7_U|>^=)qa%5e7M_!@)15ol)m zH2_3vd%e$o{)xW|0NC1%H^sVVTC2s;X|3lwJEZ5*9SeN{7TX{I;P|V9TKnN!HVPy>CF^-mYjdDP|=8kZX6PS vOHT-@LdLL15Gb1GZaOh+)6_K)wpmKSuQy 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

    @C3qO==x5@|7`@(eAn^Cor7Qt)O|&}@ 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

    v@d+yyx?GDS%qrY?}=H^dSHDs&@Cu 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 z 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%0AupPxX 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�~-Y7Gi-7{jv*-d(0O<_ehxRF})qB*trf?Vy{5^2>|{`PYprt;_rh*WguiF z?3oAiIa6#HmChwR{!h_kr2blqKJVt)e88!%c}0jAka35^=Klblu7u$-Z92R-J$u_5xG(>ii^{x z6B`$}(6691Y!F^>HUOmWSNj3XG0@4WMu$)~Io)am3$hG==4QE03H~05=d&dN$mgNo zep(`B?*A}4Op&StAyAGxPT4uZ_~4s!2&l2fuiHY zl^g&?)ioAdP5k}1nnOJwr#9q4=m%H*sP6}?C%&%>33ZSQAk=kI0GV^dsqJ)JKCU^Z zDsVYZp#q3q&XugsACzIabA$4tV);#VHmGa)Wp&DX3i^`7v_*ZUzhKe00Ra9{t#Jwc zFPQ#R`yq$Zw=~5=;d$@5uWET#U4dRN4XyL9m~m5IP-{Lc$>_3Qz*SaCIRL0Ch#7P8 z*7*sYgOqwl$}Q3R8QgC-;J@a~R_gE!;ITxkXB(={TB4m-hdkataJ>2HCS2xcW8c8I zEMOjfUC*2E!d3F|vJeYA0KY;YSx`CUxIVZo&>3(ox z+}~0J{W=Q$WMWr4k2v#VUj>lAG#wj)gxerXK=?uV43Wf^#<-QMs*U}J^Hqdk@fSm^ z1I||PRs4QjMf-IuX~O;TrSL;q#(5I`y0n4w*Qi})0Kiv*R}o_G$R0jE;+`GL?FPL_ ztH*okl#|OiHULl`o-7PeV~PRf_frCoA6My|AzD!fgrqIhE7A~O#D)KAnP5IHIT?rv z8z|?Ld%aee@e#|zXXQDaBj_Q3;5Hi~;vA`q5tANBRTj+<3#TFPJYOuPbWF%p0v~E`R6iu8N7nlPZC} zKT#Jd9T017?1_lf$DAc5wvk6w^g~}oCHh${mIeB2qZGmsVO=d7*bn-tI#=cX`9pto zPl)Git{M%+-j{mSj^_)ZS^zw=RL^ z9PjxS5EjD^Bb3eMJq-|yE;$Xm4x=9uvhpe| zlepZ69D0wy5}n6Ab=vIV#r-4y;!FeUb~646^ixyGx>TBVxr+H6stDt$2@w_Up99|f z9uVo=tJ58P7wlIpdhq1wnmQmXUY*Re{H(vWH%ADI>coo(RkHyi(ihdDr;n+n<~*J! za}JHM9yPDC=Q|+g9NSYMl+nDG;Qf4+=zjADqbBb&1H3~{aql4{#3i5SU+f*+6EmRi zHTO)j2M4!1VTe9)@Dxj@r6u|e@2P=zeOl|M@2<~sfBvbvIblK*Cn_YXha-|8vHn25 zBKm%h4qM6Vkb7++2f#iH;=!6b&+}4|YK<}BXx!;lOL*QX;7RC;+n8pe#hNwW^uxA1~NR1)c;pg04u14^v(*yzHv)(!rMbvfg923-> zQ(B)VKvb-bf7Q&FX)WEK1}%6h>AP!_v3YOvd`23!upc26q{uls=+yC?uJioy4hG@A z4v~8?sDrrD_wvb4;QiE^)9Z22t-^}upCh3W{2M7=X) zZnsb*FPW3&9FYt1_^uMbuaj9(>zZWytNvS&oT49^rB#ii8bEE%F@0L z^gTDx1n{?_TCns#i}F3%kbV6#l!4fMsVpQkFsGPq2yx)q`-X66&~X6&$GzTU#PcH{ zcxbuiEl**7c}FK%@0#D5=JO|le3}UpOWIH{kUg^?(lUmzJ1V9?d`t+#!Bvr94 z9=Yo=;2;R9D{6~9oj8xUt6F~38F;6O)GhT+=ll5GuuSKy1^ulJ&P0PP&KAe&ZD|+$ zT}uQo0J;Ul{ewEs*;xAHTbzk*Z*jKx*3fk$rFh1cwCn2xxQ9o9&8hm04mH>W;ZJFS6Ji%P`5Ge(HOCC%#5o96T?6nRDipH0WG1H#8Sw}#*EA?(9Ydk zLh?{bM;EAH>X88|O!+D|7T1GBm?f+=I!p$-&?U*_!hOUY1-&9+VxYr$IF-0gRWjh_ zI%toH1%NYFsnHX4AW8dU8TbtMM?CPj|32-<-$R{uom`Kz1<->n&O~p_awgJ&{JUFr z;S~mwJ@$|-U~gQ8Sl1*YlGI}f2g5E!0x#Gf?6&&iNuH3qKYlR62oWb;}x*jZ_vpW~? z;fhan^?h|yJ*(w4^ycR=@%T2){I%kw!;iwdsioY)VwtSZBtoukp|eoV(XhLZ82vFLR`RESFGDXn>? zjAeOis-5n73^j-&UnMAKF-Q?Ja;<`mOEMdFXQdUZWKva}zFsL8h~?!nhhF*JnET7v zXh{rXmQuCsX8_uBl(Y^Y9F|l#&W+`Nxhxh`^)iQC(#J9M3cUm_;nDyWEwqGnVw2WT zZ&h6X^TuZ#A06u$w;FY1d7Li`SX8uqmJI@sgW3{UV(pB9zg9NzzZI>Y0QnTdwP=nF z-Gr;;TkBvvetnCRAplU(_s8HWY@H{|n0pLFzWM(6KJ4U?# z`pf!uj&gJ3kzkMw>TrcicToNy9<)IW2+c;+ARjas2))y|6ZQ*31n5VI4HOFzpaUX6 ztM`#RF)Y=xftIg+a?1~?qO8yj{J?Zx|`TKKU_VA)q#LIBpUL?r;=3VFAn{0B-FV1wrX0DO^06w|Jg zBY?PFLrVUNHxHi5WOqa#18Gp1lDg z(97xHr?)bqzs>$Gf1N#7BoZd)@HsfFC3^etU+tDB& z0!X9L!09ls>Zbf10KhbHwEQReQ<0nMcG45vGI|G1fmq^7e~{2R9I=cS>)E%QN)Q?V zFy<5k0DPd(79N@Bz>D5yz2K?95=gwl;qu=kp&hY`p%2=F=k+ZnA%>!zu6WGw63p-6 zWIZ^f3fEP04?jruMaC1rZ_?h#Netl6GGbTyV8W|Z+J|yS%pW`7@f~gF^RM!o1rxYl z&Nnii&;KF&&&g|Aey8|h{L6^w-|CtCi0v}%pBi}deQbh z_3nN?2SWV#O@3aP*b=`x^%C~n@m zAtsGT7|((dtjnpg^X6?!@E}v5o`mfDeA6V?TOt+O^)@EZ*o;1SKNcWDNU|Or%G?kZ zDp`QPKa!7WiSbSu(E0E3Ct&IS7|lcgY7%kDms@@B3;gF~&qp9&rDY6P{|Q_CKmX5P z$Y0UNg?9K4B4Pc`?`*>((HjMmYI?Dj3DM2&>-t_Ta{>OT_Ys6H(%&iDd|&T&cTj*3 z+#F;q`>jFDfd8G4&kt7mA%OpCnVC>-17k6?R<>nBv*jcV_>?){r>|;T;2-1LW2sJ3 z=A~MmQ<)2*=Ad1g@6xc0B_@6hz?)Fdytvly4cbIx0r@MGLN4?7omjeax|(49A&_*CmorVRF7> zB(+Pk6>>rKJP;q$s$VB6bmZ6>bDQ|Rcpm!X<$!UT? zm#VH;N38eDZo)twe4E*{r0QM=`ds$9@Px3Uj6N|5@j)!~ZVca)B2>GPDHJ&q&>z*8A4Q~Uug(NbvjM2_Ig+d6(0d)4OEca`` zzQcNphdl|UCkc89aifd=o)cHj!!nS0eOQ_PIq4l7W8mRKZmU`#1jWW(0zyN8%A8DU z0H9wRYootbs-J=0bYejFknD(Gcpxk^XNYzJd{9@ihCWtTXlgL8J= zcu;scFdLhvrCe)?MRpwdSVeG|zTq@salbs#!t>hmUp1i@QQz-V?pTR&A(HhaHPZgJ z01+cC(U)q~EfAak#sv3&&plA-SW9IANFimsNaoK53^rz+t?>lox~O0%z%g8b$^4dt{{Lflqt=9{gG&_~ z5`{xubg&N9q-XiLj>yUn3Gn?Sh=HuxV&yf=e z0YNOg?mD?WEpxv0+4Rw@1HH#4WWcO z6$Vxl=Tt32Iep3u;I7)XUW^;`DA7;qgj(?;5E@S4zCThaLZUPW*x;9h`Ga~fUReK@ zRf_et4mnOCWq2+!hXDK@s&O;k6pT-{47^ur1k{UWgr zDiBjf5Cr~QZQ#9;dGobU%gfH1|02eX4RsL0KnWoX*WaW_2n}5_M93!Q#}^z!{JG?v zt<|xv9UhBhe1_|_`dCi^NFe;3tnzd56SplUBb0;>X%#1K)Ya+$P!fM$-C^sfz-TE<(;4LO`kK zGfO(FYCeGgchZDDQ0Ib|@m^@7UzosR_F3D|CoMO`pmGt%N7OkGS#G#l*wpd^&f<7# zzHemT^DyL(O-%gq3bC{y3aU&9!0|Qc^F3-BJ(cIg(CZn5LTb7_<2g#1_gRNPge^Pe z3Vxqll@Qapc>X!B7CiPy@~FQsmGgXa&sIlR-tQ(Pfb%iu*=i1=MiOTD-YtSB`1^l= z_Zjc%8^bO-hw(b4$0-#XeR!z#dQ(hLAn!^Igamc$ZYT`^{i*@ENGr+^*Pb@t4J<*} z$y68X`!VP<=M}XkLIgLbc|E-7G~I&xTRcXIhc4Ya$$$(|iU|Ag3*$`mx#)MM3xrZB z{0MrG;0O(s32`OiewFdd%V#WJ0R0ZB5ctCpSx*+IiO?o3c#zoA{T^dqdfiX)J=!co z?2oSvQpi+G=;d@Ue|lqWgyNwI#8y{*mn212ibnve$0M|;j^laHFpp;Fqco3p3_xf* z>U`fn3C|Xnymh=oPtsKc!QY}y8{6Kv=C^?T)B(;G*hZ}XnvJzTY)LPnrseMzKXYoF zEe>W3Yi$SsaoH~bytU*PLs&`nIw@bI^#m~J>l|9WM&W6<3eL8jV)!ZvINgEZfW2R& zw9^{yIvbo}*x)%`TW@WOGwnWA#g{}(JMd5JC*OmALT0pU{MUN&RQKY)xZdKwgR~U< zS3wHSEBLocEdEO)@Lv-AS3Kwn{#)J`|HZZU#ec<9{80PLyX_y1e=D?GWm3MhzZ}_q zgMZWA_RG31__sp)9dwiFP;8`OiA4e8GJ(%a_oL$_w!Sm~9V9FRG#LDX0_P>xfOJSq z(jfVu&PfOa5_=(qCISeeL&VbaZmd27gz?>l#FE6qg-ooi2|-XAT_Qjg;(`GSj&bD> zNk`}SJGvDeo84`9TABed9Up5+U{ayONnZsSQz0@EhKi{-;Q?VOKiqi0Qh8xV)>DEi z%$EP%{!ieN$pWHlI`?STX|Tze#Fd8y@I7Sf3Z##0UGED(FF?7CEh4Tz?xsq}*}CeN za^-q^za(+30$~4o&n}E4p$24OvxEc3!$Kp;EiZ_ih6s@QttWzmdI4W1s{E|7 zRq1QJf2s2($Ij$T6s+rfov7dKU+Zf<2b}x(0o9`|xO#e8HR1Z|n8d1og=)ibzeTQ+ zO(9i>He_2^029@6>ca3Pmb6Yrwgq@!Rh_#GPYWPkrsE8St7B@->0p7Icg%u-4Zw2U zTn9cZeqd_Zl5)&(E+5cyj&UKmfcbx#x>$(XL!^dv3)+?>>^y`XP%!|qRkfy!B~1?> zo;Sn;NS7gLv?GPIgoZ`PdDLKk_@1StBwMGt_V?Ho|fv9hjkUD+(#u-soLoA{86(Qm8Nq%Mw|Wdg=zEH3^c+~1;tV%#5< zW`nq8Hj>Ez|N5Btc!kWUtw^8M2VjW9F;|3jAygy)e3EUi160ajtGL%5Em(z8Jr z>mmBLMfEZQ!JuvQmksMsXVznR03yVI`fa}7?YK=Guk_8|Y0xMO5Ck%=w}1Rju}wsG zI(ps6VDX>b$;lD{NQeO8?YPe|cDvijc0u&&o}1CFoao<0FJ-S0Tl8Jew%8&yxtZ~G zLmmKx2w;==eG%x^5-NNKMp6Jw4BgPjqdG(Jw2(X*F(9$On2i(wICuyE&}?0LYnePG zkb+VSaIYe`Oc%o1?qE+>w+Hv-3U`zlL8FIGIT_%bTN!I9?~&al+$XWXjYMg0B^BnM zlGx4)QI4elEkG)OzXiDWMN?rJf27rq9z@t%!4V`z>K5XRH zqsMYym;OQWP5}Soc|fWd4X~rtk^DWs_wRS&KHhsj)ie55OthL_&3{fr=l|~CM*l_2 zzxtbh7rny!Nx!-pZ$?D_{=3(52L8YMPp=iPCX9*wu=oWL{h!gblr5}Z%>Hw+l@r~F zf05lziTde?`CNz`*4J8;BZcvJtO)a&sUh@_ii3s6G2n~+u|tO70*?`q1H!`{VJvT_ zlt_fNw) zDn^Khgn0g@k1$n(-XA{>qTz29@4$Sn5<)}R`8*o%A0`Co1WW#$zt8?Qc{%?T&)fKi z#io|8w0@D^WDgqc{_or=cmv~R3!#WY0siBg5zAZkTR48B{l>q9kVR$ST4=?NIEbZfQGvviyy)`McBf4QPyA;@dCt*6|g4DH#JCwh2{uF1G|SRW91NeBsD z6N_K1Qw)p3(8X zD6#a1<^OQn!jlJp-2(AL_myb>s!AZ&9D=;;gqQ~{=(C`&Cjg~|6M<-Qk|laIK|PRw zu?(SOQ|kjgwM6|YF_J_Q$@OwSWL+%@ka-^M9j8rIU_NJ*3cyZc;T^*wa|=Z4Q>y2G z1M`LFF#vsueP1Xd3-oVUB8eh%tSo?Q(>k>%f=l%|{|N?k)rp`%qf;RI6qK=4ZDl-u zTvjdC3o)JJo%IrlUdHwFl666B^%QBZ`yef=7{BX|1|Nn;kBilYxbAIA|3t7frZNVA zMydc%f5`7(+>Sf2@GKXx{=C3|I_3d@eE_$Fn9{KlB0!lLB0x!2mR$i9W@(;So>vF` zHUnUE-AhQ4SU3wHhL!Hy>X@GbAYB2`I1TD6}Rp*0TqN_{)TcCfZ9Pyz^Dix_kDMSGE zW9LfHH6ba2glP1)xd86pQ>Oyf>p8XPy$Vl*4ddZKX2}#Sh)0Sw187qUIZRYILWQg! zi)i;JspU_zt7_G(Bxc^)FMA=hWad1Mzohzp7uTN+VtA6&|+>>bMJF9HA#|(w@Y4`tO9TC~UhVR}pIU+k zi|geo#bguaua!uN9D{Hp>+%f6C5Q;B@LvRwduj|sCx!ZH{4PLPS3(F7pt6PI4}ur~ zY1S2|S&b2jhblSVb9L$Wb!7=;e11V0!=Ob)AO>`W7?8_4-h-Z39RSm+;ckpIh6xF_ zejZ;X9utVHR5MPW^-zzx%kWfmP_34xKVve$dxK@!;dKxCBqRh0$PF^{|CEZH9Q|HY zxSyLs)cX(!8}MiWIR)U~&gWlJ2YM{28(yg8ul2Y^AXuah0CEY1#Ora2ej&(9rJ1i^ zFXelQdZv9sw^UE&jol;2%YQI*1aAEsLJxcvUYu; zab@TIoS6VuK&Zd5JlWN{lhj#M;_TiSH5J53CtEjBz-%vNn~Lp1Cw&N}gm43dA`vmSA=kA$uy64@w3o*e^7!kchjFxOy{nMc6iI^n*Pdvh|N9s} zIeuSa`W)@z$I(R-L0&p|KUgT*k^|qAO^&dG*bgaTPKiMvN~i@UciSu)uh4tVbVl=t z5|Xaiooea{20X6$S5XZxeq*?13c#wG=Qt!%d_UTXGxgPs5F(u_ zD+0$7F;y=>zx>N^1_lMhhe6o{K9QcnJ!Q zEj8%?RMKj>Z(TJfWzM{{CH#Z2E&@jU)mA<~53(p5=&q?^3=pG3W$Z=4GFmN;`V@c_z*Ax*Z>w*nYuLaYC z&(ykWLDN1hGnoGOz`>HZKxxP_B`N{1yF@GiERoER&V0VYT}ny5SpcXpV$xh_`kgQlWd!g|6BN9W;>$wSp06XFY_DKONjvT0pl``Mgh|alkG-Q zPX)wGv!wd3UC)e2~fPqAWs~q^x{$g67R3~3)rGO3`}$ThDG2KF{KZm z_)`H)pa%^qxdPlTrWfLBN;0~@#;DEH@l$5fwErY1aja&v(a?_v&^Xu#f0pb3So)9P z9_9btul+D#;PZa(L6QqOuOz|tHVWfSP!}0VO64)j66fE|Xhc(fH`1TRy9p5jf*)Z# z|1i7*AogK8Fpsbd5Fj0lWQg{U97_oR{9!8fi{YnY22K~!Ps0MjZ1T~xl2Q95PX;z+ z-{Ne#8|^JbhsPrX04@)~0LAkGhn+ZJyn&%wMlKum{|5X-|=UIXTl1}KZwayNlNL+yQ(-7)FW$-H|>vb-1$%s?}htO zLFtX?X8`QG*{$RqO5ga&kCOW&cYFP$lr=_y_9(I<1;ahcx!j#1*{PLcoXc1@J^xjWHe*m-u#me}n*s4?;iB9ZR%A{w~vTCiCD27(j0pmoq{{J6ZWr ze|BO zTX?+b|NF^qJftJvi#JkOs)#p(`;@~wZ*C_8CKxvR_nDBgm+f^28G!!)>x^XgF9!h~ z@9brH>NWlgCLY%J(;{Y5{{v{I=PSbmKz}!H@Or11&(}?ebO#oay0Xp)%Z~HuwgV8y z)JJ?!_Z(KYz6abLnG3eeg3Jp`(o-;{?PkmMl9O>6$$Gb8Vyr_`2LQ#-8*V`~bL+AZ z-tgyL;GgGVGypJdPfQgc_ziKBv;<-&op;N{QTE2JQ_0&#T?^&TzZus}ODrI@P>-%# zav|r*U&^RgBpbUMNO#4S#*XW#=D%+z+1PDhT%Ro$u@275xP%F9`7-!-cT+3~td$-B zXaERY@*C-MKIn2plvC-Bo$lY}izRb7=Uh90$}j__P4;2iF^wtijr=U_97H8KXUJ z7O4O|9w2M7px*c2ADiwqla9AjCHBu5SwN8TjE)~jEsv%tK;~k~JaOkh%)aJcC=Y|fce);^9TCNeOZ{<2+#=H-Iz z0EiV6_QwU7+>b?an4TE#QXiBm^z{{u+Pl@nx5p^|L|hW2Y?8ck73FT(Yn2v$x1r0R z0ljL?7~r0cfXG-aH<+hohwnM0H2|Pj7a8`dtyKez+Y6O0#_O`_st;-aVJ(ceZZ!qK zb*0h(!2pCE0r=IG#U=Ecltbm@arc(M0Jq${3t;J^SN#W)uiEL_aqq(j49QzA^sY<9 zboz~o2lg@>p#5%YKfI4HW#?Q9AbzFtEQnk$S7YffH3<%>06hA2y4v&v*J_62y~%a1 zQsPfWR6x2SZWCAR+^IHPousvf0)PPiHL&XvQ{^|#-`caaCdTus%{;JTv0p{o1u#*Kz2tY~ig_K=`Je7ADFmf^nJl~6R3GmOjQzXy~Mpz=9bN>B?1 zKQOC!@7=7tek$?AgsJtBMFN%2+3N?c8zBG5zQXNezh&ES(eje*n?wi(k?HXKB+Rd60qNF@Z1i*Wvg?2R}Q7(JEa;56)mB8i98Msn`%bHO; zB}PLN^Sekb7mps7iDq=jL@hR!&jc0It%g#LmcF;l3wG0p#e|W>Tun|<1Gr{guLL+g zhv%P@d1uCg;AERV?La*8*Xg*y@26)%?tdDWhU;lxJ=OBAMlimg7kP=KLH-xVOz~f} zo7E=DpHzJQ4I7EYml*F8ZhsA3H*bU}BJH#+gtwkaKtNl9YnUb5t96VL827w%H)Nf* z4Gn1oND1~Y%z8Bd;p{Tar)p6HqZi|Q%LJo#(r}COm2zdWPo1LPSF0^qFQgt_LA{@& z5+*{>NIb9%BFMkG_9!jqg^+Zq>WLm9)`=b0m3>(M1##W=Sz>mNrJX44?qVMqK(LMQ z{#>kN7>CPTPj_HpfMwHL9xyS=e?i-2k|2QJsT>QbN|!iKl$9uSgm0`Uv-PlE1uO!YG~WK zQq1xEx{I-{zwC*-cBaPptlDNZL4O6ty8?KXr8#R~kTlImBrlj1+cQdR*wCGSf6Si6 zIC_OG;fMvK*c=M(mRC?Ta4Y~q?-FE>VgiDfsidgq1+@2jg%smv$E8MtzR%VwtFXWo zTO%%Ejv#srYJ;i46uXF{$avTmM@rW?8nc^oRF~HtFH+5Uhe+4=huJVwO9GW?D5Q$( zX>}nW7O*EQY%5OY0ew}}MOtw-0rV9=vwe>G9CsGw5^Z%Yu<{i?8AZgZskwm7N_ z1pj=kug49Qh#+{IlurolPeFK(s1`UPt;A4nO0hj6qlM73nXI@1mg3M&2Lz^uX z&9zW`F$j===No29;k@{O7;WSmG!Q*kfFCrNn*4Xd{GgJ@+D<$yrT(FGRP4(SpGSBu z$|uZVza4}6$v`x|{!y7YmVLUrZcZ9xqELX^0_9?x$$x$`-55j{x994qx!=^@N zDAtU5vPMw>cnKgBG?`E!`Kk&2TBTm;>4YZF6Q-0NAJjO)hsoWCBwe55q)US%ECcj7 zDv_Zw$5HREA<*+09I5^djxY^MQ7sEF4@&Dp=NlBKsol8c_&Ikfn|z(AvoSAB9B0c{ zNuG1J%ULjbUomxl0og@&cf?%N&=(6Ct8%pKA$5YI=kgv1YVEwq3l4C9jtarSaq9^o zE!zeVzE*}XO>}v{>9)&cFEcz;`bFZL-yQ^RyBB+HqiJ}@M+qTA1~kQ@t+9Uyf1{*g`T0|0o*^u+Xk59Na#WKdkzfgJ$015jLRAAC|T!$qa z(DM1QsTgcXw+0~t%7acng~q;ED&U;u6_W^I0L){jL;z^Cd@JLIlXWc~piZTf;7w zZ?Ll89Fp8!-%hwaA7tC{KBs#RLzw2J)*iA805eDj44{7P=KxT@OT+#FrGFg%BISDL zhBZ%xp_eIubgXIm$Q&7-icZH||IbI~lPabEDEUlOqx7fD#{kfM+%!nSw>&5XQ>F@r zU>=mQ2cFRWhll|-^{xr>sK6U>5DXv7XL`YO5fBfGSX?|PuygW&g@1Bqh4?sM^nlZv*Z@EWycxc?!|BY^+V18n!g2hlKLVCk)>7tuJ2{wLX{<3CG? zaKh78N(7aVWQQQtjOA`POc_{uNIgn2-UHD8?s^a7_}-g48Q-@Z4e`4eCPm7>hj-H5 zh{x@Bg3WlF(%%pN+py{NyV-U)1kf@96r)kSGS$47a0Ic%MVj!02$ZijDSDrAiBN6m>SY)ye z!gJp*P>JPfh~HTPfYKD{Nr)|=E%7{(VH{#v{P;k>5-HGr2Ab+PekSxTHl8sb0TJ&D z=Dgt#)mHY|tY*}L!`Wy$s)Q4o&w-BTlK}q$O!G1GPITW47^silf{TiOHk%1sqWIr8 z?}bdj8peY-=W*TkGe20cyEroCp$+*Y`J~GgwD_-kcAs2E>V=nqoX- z1K?aj=R+FL;c0xJR8uSC86RYiv=m^4P@G3);>Sbrp2Vn}^~h5{KRc4p>-_+OmGTz6 z8uJ?kCvq|XdIqj%fL_`$du*Uz+DqH-ROs9D*ONMCo{uF@C6@bvHTwgM=Y+@e??sq@sIpUV@PtZzH9dR{QAx}hFmWO{NdYw&;szkFo5f$qLG^-BDs*q9{4VB zo$HqXO59elj`WPnkgk_PtaK?Xe1ygN5GJXK3K?RZyNdIXn=d&{ccG0pgrIu2Y~uQ? z?0`_&W(_H<`_}RNMApk|E*6+K#C^An5nz1*bI>cMWik*qmr<^pY)JsmpYxizWyHVZ z@>0>*_nJ}5u8r$r$gN^!(8R{*Op$mEUi2RmA47451&dT3PwsX2H-h-9rCHbQiWM`3EC$adLa50w>|=P6nKwa9p3@p zbj`e_md*|XlKLDMAKgy&XuY3iCBZ1{=RJG}nPD~w3{7Z?HARLK`K$a@gAxkvnN5`c zm>>YWYRrAkEZeqF;?-8!2Nl$kM9D^O6}XlD(sI1Wgnj_-FIAd)y8yOoA>lk)Pc072 z*##@E3A`%|yJce~0$5xxnx{hGv0Yev2yH`we`x-uxbHgT^I}=>bJi;kT=p8|ZbxCIIfp92cOOuY{8^3kFETF-`)@6_;T7kt{`&nI}rP9NGeexb(e*h5lDZoj)3-~`s;JHgDac#o@y#V7&1X-}vwM&)6l+ zSKCRYhROWxfvNC7OyGOho3~8w=y}j}4-pbHlnw+h%ohUWAB;;*Ln?9Qkkp{>Gn;vr zKP>TFdHy6Zp(4Ztkq1Eh3ql;jdIljD%L5t77iC6zUgn#ZOb?RA3*?s}(ZBMXISW?^ zwq+WVziR=q1o)pM{+Na@2T29=|Ae25@tTei3p0Ew9Q?JW>wd(qi2`msOP(5RpA^PC|x|@gG zaDpq98z}E>#$!+(NXtaHhSBi0TNd1D7VXw^w~g^c0P8K&zHZxIatZ0)1sf_s6w(|i zbscsfbu>#p= zz!KxdNII4GRgAx;Z5{2^kbd8CYqo{@wuFFuUF20+PrO8DG-!S5BZ~o{5I~FsCBVG* zI;V$n%vkTb>zqx^uNF4YZZz|-wA@nTArr}f`7MgyJ22I+fd6)%BUJ~1iZ{hk6=8i) zT*)CS5blpFz9a+#aapZ++WifV2U78}`ZPylo~lt)oJ|x{6~I3oa5NJ^@HD+nf&ZMN z=5wk-aZ2youXEITO8JFQp!tYJZz-QD=stGn)66lgxU1ryJvm+w|GkK(^JwTJLu)FV{<*9iXW#_(Tpam@cu z;J@am`cL4$ll6z%6YB3CtN!Lt{f*S$qW%?ZSE6Dz6isDR9I!tgy)#F-Pf;1Jet5 znaGfh0Axb*5XUi`WFX20stcvV_{=)R69+MoUssKK2?DfF0_b|30O|6>*NLOQ!%=~A z0r-VUq!Zb=s{qaS)DA^u7D-S-fPXF+Pcwy4&3_+sLad$TC>sBIo#dkvvM{)$ygEVe z?Qqm`4>)p0eU8GoYVd|5M@rA;bNMXQYkBx;zD)U?cXjwu|NAm5FJZ&&o9-pNTzUte zm|n*NY+Vi8w3W9a8Zg2Twk>QpMhtKlOZi+s!Ujo`Ct%YOlVO2r*fw6o{b~mv3|lzf z@*mjcW*+X6EV{$3z4h@0$jCHkh7G0-?_*zxDK*`|fPBsMp#gqzu=1cw`7RJ4054`R zt>B|eOqjJCHuUTQ#w8hatdcC3N|<;r?hIQG-lX(gk@eTT29xn0P<@*qpG?xRFiMXM z?(1$2@5!uhIs=fmwOL84+2W}^QB>kd9&jIVgV3II%w>>|7Y)QVB|QiG{MNMYO+PO z<)Yk{+A<}jWRBe<)1H!#_BFh`+th$N*D!dy*hG6s=!d&T2FnR~VUdj*# z4Ikkx4TxLrfH#vG5QB!H^Og+4*W)9M)STwf@Dk&ah9mcQXelLAQi*Cdvw!O^GvnU- z;(@VUVvCf|3(Nu=0rq2LMnyzMMn*=)_r3R$A|^SnD_Sf97!$YsYL9`As9WLtuWLm! zkHutb0?PyqVam2ZC|D9-HQfTEL{FKSrtfe2orFyWt@-OdeAN0y$gTl$Sdu7~cuO7a z4q4`L2F>Wfq5($xtsZ=&r}2AhTM+|Ht6rbv76DTQORoow)P6EZ`fT#|ffe{(|6#No zr@a0R6SWyB`q!g+(RUVLNCX(Y-24YatrQR3nN<%g)xYM3jQ)^dU?=RfN0h3%e?dAGr} z&wbH;jDJ7;Ouzu&f0ukgm3{IJ9{xs9M!qpa0FZL}J)rHQw^Z92a0cY~brU43@d@3L!(N*Z<;=nuA;-~xbjKystL`9?oN8uD6w z^*IKrR-&tM*Q0XwcYWl0q95km?~f4V9P#}e#DkCkt?+WRH)V(s&F^sx^5uwg6iB|5-(#vO9OyZ#k6#620`fm!Etygo+Uw(5EM z7TVPb`WQ)_q#v`y+sYHyRCd!#2odN9LomR2w*9j|Kz|W1dI#p|`@{WkEmDo{4c&lU zj(k31;>wpoLom9-zb$a$8{Ds$qX3}E@RjcF0-&!l0Fu8@Z^v6cji>0<3fw*D_EXnp8EH}fgHwF>OWb5fZFFR`M4=|zSYIF_r{MuJL zsvk1&YAnEPK08o3=HI^0@B0^%H2-!M#QoZ zx=_~}U|#6@{p5qjbw9{3ZhHylPXMLA7BDAd3NiqE^hY-w;Q4~xm|F-vo|OWU{vc4H zwIr|$z%SQ74D{Rn`lSC6yk{PW#zUSTKAYTwdHNrFzoAM{n7Q9~V?&@*HyY209nX;7 z2NGBi)m;#=t);pw$cG>n>%fMGuV){mTYg zLwua#2)+v=%HJA*P?OIMmOCb&8P{DkH?)C;ba5!}cDcT(JOL2ilp5-~ssm*$Q6*yf zAFvG8+jYoedP#tPW1*m>&3E5<@mYS+F~r&v`DD){c`RG#JYoo|Qm#V#PZ!-m6U5D_ zo>{NAQ0@{NcQ>14PGnpTAbr&FjH@oW*Arqg(Nj|-v5pi|{!3!=b3(o=QnYhYFZ5Yn z&zRIw%n_j6m-CUxP^8+~9ygTqkaQyf5&|YX7iR|hN$x8S_LE^C%}VX-Qv+x; z>iIz=8?>^qYuoYRB>=m_MO!8morGYgqJ0txD6d54jO@w%0+cDfugd4VVTP>p)`nkmleCW3v&1NXqXCzCCG~)*v#u7Z_53uK#}7N z)o$IcP!hAS3h(%Lc*>=hJvFY#XgGC_M^MdIoHPlZ-_a|{98IS((eX^R; zM1U}^X#PYUC|b6@o67I2pfJzdln#t#mFwdnu#&?ENIS2$4WO@ow|G9o^{UCdBKayG zqFsNcju{I=(!L2*Q?ad&`Z>Pkc7?WG{Jdv;{5)1_JKE*Se5h(WrEBK(v7&C~c@>#{ zawB7Lz*Uf;D;8v2%r`g=ljyDxsc`%&&LZ~pXdcX2){6^yYBlR`DxcBgd5impcj$xw zl#q0H%y-rmz>H{ePdjZ_0WkJeAp4v~Grodx_(Sz%Q5DM-Vu`@GYM^wiZ2hm&^A#Hx z065Q@q(1tI#vh)`85j79ip4_h493Nj09MCU?1n~`0!ar3XjeYwxyw2LAf<}h<1!(9Sc_|Dgr=W z)gksvRS|Q23KmGYeg@V}rMDCa~D7f$rQs*KN2+FcbH85aO<9hN1`_&tPH!*vDn)%AonuG89iJVZ2D zu!MpeS^=FFISb-#pikre(-Q)sFUm)#i=0zxZ*}kI_g1Y1=q`e_kgX(?`y7=jWgM*q z0Kt_6Ah!U&9JdOwU5a#k-zG;Z4e`LreFr&O*VZOje68E&sMKwU*0QzKCmQ@#A$Q*x zM@tA$5_$4bU*{#hh+<`(c@Dm9k0;J*Tp-vIyBA%OE3^$p>_jFO2UhK-W~t_m9F2x^&5-%EHRhf@cPw`>sLe9Ka797;4uVT086etp+A!Q7y zXWD_|u>cxM1_wKCIHy1)?*-gp$G>FOuk219fW~)zsmP* z&;s!POuxBNg9cJENDZ@Z2XInWix_z)^@3<3Ekb50h8z>7(WnBmvRKZ%PK8b{cK!GE zGohki-FR3wIs<5Qbu*9TrF>z)`GY}~0o^R?Ev`Po1d9IbMjZ>^=^_<&9{NUnLmrl= z_mqt0vznl4)E_FdAe(}`WWC37IzKo_HxsI7vNLgIjnZfPlWW|bscaUSQO$gI5Tl=} z8Oc1NjZ%_>>CVDxM6%kMy7~s?YZOa^s+ed4<5NtIlElL6oNTOSdZ#Yw^J*HV^jX*J zS*7|1x9ab~H*<%eLfo&2fkxdd!rX^u8G!ddR{i9 zNfuzr%d#Z~5x~wjp{|(us;F>1gK#V2e&{zgs@M3s{ejoV#%G@9A@Z5|rl|wWLv;f5 zDcxV(Ot?MWbj?dc1}q052q-P%QoxB^jMqZt^};9F&0#4Z>kfh}!MxGPBDfBy0Z3Z7 zR^jrl)Zcve8f%_LR{&gX#G47{-&V#)Z&uZD9#g(Yw?iHPFTDI}m`2p?{!hHCRNt%N zFOzKm&RMLZn`%nm97tsvnbp8n75_H8FDBzp#3i2qy~G0m@_Fw77V-}UACI6R8Q%em z0k?%N#$Tq4rnDAQ)j7jw1{jNx_B7IkNHc3&xgGVPF?BWAfN8*PFhJS~#1~QIc#xi? zMV5p{vjo2AhdaAU&2nXr6+Y;DKW zECI-Du%2{$9#5_4HE577s-GoHi2s}Dnqr`{yFY^|^eYcvi5O^lxB3n=^tZ##qXQ2b z|Bv=rHnv~r@woK1TYW{cLJ}4&2ue=q_vzbDY=$J&6@Qz@chZY9*08SjsRv0u-A{NP z>^+kC1ODy`R|6jJi}BwjYb0M*uSfj*)Za>ss}DmY#Ajl%b3E&KcS{#^j-!lU3%I$y z(RsehyCZP|0H>iFFhK3WSNB66`JU(3R5*?ey8DRe0+$$m3HLt>Ga*c2b`hWURu(rK z&v6gBXxF?gjOQ%LJ;NXc0MCB|lDh`9-m}DkUN`{7C5^YRF6#T)4Tvqn?Z7;Nh4)o& zGXzmbbpr*zJeT6BOtzgJlKaN_JQyYX#75?#sdJO{wJd{1JUaKnEUTg_{k8K zLxMZ8;ZX`oyfWK;{t1T0vAu6-pPUh()IN`E!4@o2{M5hX^E~{+@Mpm_o(H`&=uvv> zWg?)EY{zZ2#m|3m?dcAsx6|$C24);TK$6F?-)E^vVmx=0q^EjG38zZ+~T zCTR5%5CvN7vW4VY53XqXUmYY&u>1G>-;K8v6Se-<5VevwKy+CTI&mHfF-Ja_#3ER% zMPq$8*A6%AA9>4`60@OncYFs-On=V%BMh%TSx`AE_I^!H($ z>;Vmli7g$xFMC1e>sVYj$T%L7m_65$F8vSlF+Ql=*u}VnUYGabfqzFicz(827b9g; zbz_neZa$v#s7MUqtdnREmJA^#!&58Zp0eY4Jig6W5iBUg0Qv*dKMy7M1bDxBo`>-q z-4nPx{=JW29v1`MyWcMymHTSvAKWiUZzmxOa6Vf?@z$e0TZ&G87Oqmh7m`;&%=-Ih z*Sx+5%N|TYQX9<;HQ@Y}w!cL(tzY$ce03+gjRC)pTD?Y}WPhRu0J)cJws_ok!nI^m zv8n%FV-Q2*ADT=>BEWx8)Ny}RUM;|o7tfv5yrlzdT!lKsIzCdy*M7@fXYLJrtkasC zoKF?Yc?5t>X=qXx%Y^~<=fqN7S9>4|%yfK`-CkqU_#zDpqd^n6=DV<}ShjU6raMC& zpx!0DgGd3NuK+@jKH$``F?(5uSkDH7*$uAuqMpL~l{RjjDm2zYY|K4Ivcj4id9e8+ zZ#?D`U7s~8)jZm9$$`eIJ}Db>Gone~#9R$o;`CuI(O3X*j1R<7H^6$l>%vu6K96nfzd^lAsAfetbbz3x}x5f9hXguoY^V!ZC$=}asIxy{THK3emcUk--f1by+ z{!u>PN#%Hg4NPwsAaRpjhzUrGoM31}d>M-mAmFUNC0;TV5yQl0s>By2{7tJH<$YNbTSA*P(PSGC;c7m+71BRZeZoE`Kl^p zsgD#-4c18BSsd;U5ff}XV6u8irzAgJOl1jt?i*nHP1cwNVZ9__;*?o*~Kg>F!F<)XA_+|G;F+ZUMgkUv((LHs#Zoa=M{{t30z18`-XA{C&*~T~U4B8=2X$jI-nh6>fm5*-KR68wEz>&f!&G~5ZcxR0 zE_Gue@{mNZ^}(mQ<6D4G&I8yZ2_lTE@SMaLH+L2%`k@efnpPs*KoYEd2*kVJF6R07 z>M&ie4@(ar`VW>V%y`~?einezqx?r{JU&A5=f#C?)z)0`*Eq{ zNxQ_ggneJ#q+N;$3A&jjB>RPZ-kTyTL-Gb1$9j|qZ>ib;${egard_d2;K==RZM_U^ zw#@T~=iUPKXZ0lZ-3}Df{RZa8r?jmfzeBwqd^}s(H^+5@AY5bm`B=XW0_16NJ({3? zwv1qiNlZip;7<|+1;{P~xOo3{OCgAJNmeI0Sv=Egn)-KG7{XUHU`)zwtJ5k5F&DoFA<3-QXL}FuK7JNVN_qbRT zIO%vuKcfPa+ZLC-O|L$nG{MK~8;83CnYk~KDDaB1?0sR$@7S9@7q}aAZh5kyv z-RJH^wDpZvI9df)apf(+<`aBP&Rf90j9^`H3$Z|OwqZ-(ww>Y{{KJPf-TCe?{)u}% zgntUL2lyxMeV}fL|2j9sf8o*T+>_pSE*tA_vY7+`fq;yDiFN;#@9cDe{101_WFnMZu-w*{Q@iBk9}U^LbN;V+aa?w2N8`DLxbUuM=9v9P>Lg zIvoo@F)D!@n;^e0I*b?=ram2-TtbM5rN4cYD_%h58c_mTxD1miw;cL+al3!l+JGEaT7jIvay30FzG~cJ{4IrrogbFdOmA+>Qqm? zGxKiD0D3oFd4bXk-Q|^+Nj5sQt0V`bo#fposC|q5rE5MuD5vuP3+>ZRQ#MeQF|7|D z`WJRWv;x3eO8}lTttwbR;JA+D{Ip)ihW<0Xxiz|u{`7X6>+Mf%2k%n51{b!2_dH4y zfYkQ5z1!;Dr%9gcj9wvG_*uP+g(S3nYn5Mmvv}^7D4klD4SJ4p1;~$I z7bga_ZLWWQW8oc`(%GoJ6OgQJ)Zc~4_s#g-kkZx7kY#szz4DI7{k1)nCcNO%wL(nU zKsL>WuwJBEL$2Qt0yIe{FoXcKt4q=sXgh|+S7X5SryI>{e7c=B-{bnCwfbtn+1Hv^ zNp|MbWHmB!MUjls%2n>qpi|ir7Y5ikU(f-3NY4%cATiw_2k|3s6`b~p7(UbIvU(9v zzFJ<*6cZZy^_(@YCsyhp0t9b9x=Q)mt=At;Dc?K(Ysp%|rhs1$*Aq$yZzdZd$<~`b zw{!8ip9IW_`9B{1i>OV^gN>xoERVWzv17F50X!MclwTEp!{|$SZ-H)A z;#r_C3-W;Fs@lSP>8+oHiCfk_rHxz4Dlk|FueKjndNYP;b7wtb0>I_;m%(~O{hKDv8f%y;(tu7FDD9*JkIJi)Oh~FOo}11b zrCH;Az7rvRx>IGjQAzzSmD_G4kEDv~iQd3?z1m#ydn7l4j>=(4Ad3nHte(pPZs(N; z*250(r#S@L!6r7}o^;1_P+kb~K20j!(z`03v|xSBkQZi6N64xfU1+O8^Ex z;aA`);Iq*^*x3DI;(7dm{9EyTA*a9K--mJjd37%~Tt4O9h5LAq`Y0B_`)NF@(2kdq zjOPO589<)L@@l++_0rp3iuYLRZ*vaSPmC${B1WsN6u`F^ne*5DZCHSMJ4s;yWX;=- zwYU3tmgh;HFWbIR-*|>C2WGvuKiLb$?)~w8Jg1*gcZVg9u0OdKzE`J`2Yr^G_3weE z`Gj`|7WyNBc%tLhfw*}S*9}8K%YD(lP+${b6ietRLm+w0eJ`OJiJWu}Lev)i3 zG3SY%%6WV}N;>&GPlUgW*O`#wzw_dz0^r~30|@Q3`W|G`hlzA5Ii|GN4f_GhPHUi$ zuJHMd8jVZJ|E~Auv+F*~w}LGuAXL`;LBxQysdqCRgz&9iE22E6d~2PcNBMu4{C%*- zmM(&eDy8&t@K(~{-zD8B4~Bt$0hT{-Jad%(F_MFfXA3azNlIW$-;;b48tk774bf#P zc);iTc__HYD^dEsWPdCGcnG4B_i^RQcy?qwJ3OALL{67Lw_% zaixKEkTQX;(YPYu-y!XYiF-311_|YlG5#^XzZY&q+PG-JI1nPju*CDkQraW!gKvK7 zKb9Kv_Fdk-kZXD{7zY9CGZ9%%NN7B>MVkoy5tevgD7gm!=_kUEqGe^TB;P|ap82nx zKZY$e-28s2ot7o6pHVs+@6MoIG$PkuME&zBHh_$7VZAyn7OT37WN~m1Z8vy*-k)3Lb?@0C zg=K;#35bnh0bm;Cp96qxO#mN}bvCcE4Pccxi6Hv+~QF!z`8t;BI<@?pbD0EXiCvUtNG z>1DI)5rD*HEdZ0+HE_Mf`A&-Ozth)huo$-4UE}KzAIen##I`*L05nNE4B+n=;!G3$ z^P}RiE{NpW=Cuj{uc=<5ZW8cZ9q2SkR*K`jCj{s;8g31i&>WAf>2ah5NVd`*XF`JV z?eF!g#q&K6z*oCl0pR(#3T`GbZsvQbAxd{se2-OBAR4cst&f3hk^tgWg6B$zJ;*KX z10X+xe*2DA3Z~JEr@D2LcNEjzngHzT1KKm2pWXIIp3SrF3&!$?>p^pR(jh4U06Zj2 zlmpnEgZ#N>U(MD9z#llHt`9(Frtjc7m$&OM?a%oUq<_yqZt94o{)#>~;BnK)mSOqt zTg5`*Vcga6{4BsHvXyTulm}^#Q~%2SjJ4-PkkdK@Aaka}^&Hkm`%MG*o9n_}ot3Yl zJ+@t;UMiRv^;EvJ&DZs%VlwlM_j0fGKAZ^3%?&ZJ(8N*QPLT9x5sWpUce_w<|C)K2bFA{F$(V`4|BEb*XG{ zVA%l{Hji%c@4uZdg0NN4IVFUxSn@__PoP7qXr|8SmSgH^;ruaU!BSt!V-S$$^07_h zEyHBu5s-A2n!AYECwv*b+~@4Z19;{vB3Kg&Tl&luFOZMrzOw5?_l1Reg~lf z#|s0*u^rIdr{sf~zY*~LD9&`6wmy+JoTr@t0O@!)!M=~TS)()o)CF8&GBHj}Vf#W* z73;@cX^^W}a=?k-C#`a05#O2$G-E#nR$%&cHVp-YYVTQIAJV*UEDtQmIzt&32q5wS=fU}Tb}=REm9N4=>ry8Y;(?V2keL9# zeRXliaZjC40?ecRKT=W7kuw^Pj6BC^U5GdBM`qH%VB{vK|o9T@?4?6XPnq+fpFYJ zI~NpO^XAXzP(;X&WamJ*J^_mj95Sad^n5RgoU-zL;WguesQBZ;%ew5krSPGsa8i9s zckw)r;2F8#w495S%s3Jtk7zaFjVXSMa|uzvx|$y4XkAk08N~|8GRODhY{fE1i+>qh zN^rA^&EIu7T6{`eZi`8O)Hhm6Ep8`4@HwmKyNPHmT@T}HD867<+Z3&g)KgF{xh+;lFwZ{;LK5 z)q?*j-{QaOhWM}G-+>nV*SQJ)s|5cA@+>>G(DWDlS6lp-gT;SucKr$Jg(~_7;NKA} zx+3Tu*ROV5Klc{Oy~*{vP9O{e3%)?(w z<2dCMfGWaqz7Dh>*J1ov-EwfRaI_{tpz&{gg9rdV94r98cbub=3DC-Xg(Ia?j@O9; zmVq=zanw$v!eAN-_WT&a5b$rylk)9^Je=M)L9q;ZfTYxC&vy}R7%g*D%IR`s0suvB zcZDJo9uVpJIhN`8fj&j0iao_>L1}thRMZ_evaPK))nze>YkY9bsu?vL0E}xNvMK3E zRfkOA`CuNma$Y!A^NF4ZVnw4H;R9yI_`+9nMGFfNFtQQqhPjV)#hIWqf&j;Dd9g1$ z#^-&kYQw%IkzUd%&NswVe5mW#ND90B;;s*Zttwm=Ebxa^ai)j|DMme)XTt$mke-oN zBy_eZfV*K%E^~g}!0oZF2@<_16S$=_VB>|#Pi5nzL21_cYGGq^b~7b8+n>JnFv+kV zu0KHXnZeRl1E!PWyn^x@VvS)=8!dw4c(@h%%Z?^mk64<|!cpM7oBB$|4xO zNA;ox5MCsO!^uc()DmP zfyICj7AC4$rDrsZLt#v-!iTJAl0{f}MT~w4Kt-gqEo03d0<(E(AR0|56*^{U4k{NLaI zQq(5-ocCj|?XyDF&;3os0BVN;VH*OT!9N5cAVHKFTYx@DM7UmnL_TOt0-*h^;NF0N zmVXjF1RwVQy>}Rc)nUwzYOVDio67b<06(+vXteb%5|$Hda9uu*XKDcwzbG0CbiG2Lr+LdfY} zZNSe<)JsWHx*PNHuHUHwIQ6g9I{-}Ic$CL$+kgG#G@*Kv*F5-Sk6(*H(m)=0vg9JoDbg$>3aPC*L#o3`FVVqoBy*ojq{7ASb!Z`JHWB{Jb__zuS5I)O^hIHfHV_75vPkSsg z0KB(HBSs-K`KXWa?C%fkc((QZCf6^|7shk)siYLz_WqOPvtB8pbn+Qh_CVOd#@PM- z$6_ad1&|m7O^jb*)JAq(OaB7Mm-Dw4hVPdT6N&(U3zEM`-U+vP{CfXBx)RfPc=#p1 z9ngNW^9!|3a^>MGekWog#N~ip%)C*#jpR((+J$Ms&yvOjOeb1&*9EH@Ufg&5CCvWEG%`uf_MPqOi*w~_Gix74=J z#FuyCZCG@9H{4bvA8iNh8sOa1KTUZ2{+ow?=wGIGzu^A_7I0pV+fg^LmRm3m{b3gX zy93KQw3fCkQEONtAEX;QA zBmQ2@>l18wL&mc!>U8}9}k9~LQMUZ<{xE2mQ$UpLdjk*&d-Z|Q ztWPtRQ<=g#Bh1qrgn&T}M3>51?OH;zoklApd!w7x^;l8fUZv-mjb8?O^gi91M+U%#OQsVF_g&BEX%#?IJ064p*!|4_3X3WC zYu@PjtJt8`X_hJzs&LKaI}Kw|K(t||6{nX~%H@$B@#tE_{nwkj@-n4Q4XSI{Xe;VH z03$jn6oBfM3%{NY0T|ZxK(UxtndnBXT4MY+|3R<*-UF2XpJw4!!xD!H&{&3y^hqU} z?+U);)kVnZq6P~F|6GK00 z8}Q3)Ng)5q;KEgh(%;X*G=VAWAQ#jBD!93i=;DW@X^(#CpINElduB0xfh`K;hdWQh zSN;+#uANoWxv#8j6pMox08C?>HL3n`aQ50)F`n8h0RZc6*8uW6LnZ`?%XFtKu=75t zKd(>qxxeSBe^Qcvp3Sbl07Ag><{H-J6#XbfH+RCk&tSJDpKUy|lf@Vo|qsk~Xi^7L+{`cc z)&TIDmFTM)z!Ct^!~m(v0?8I2-Bu<&#>RqS!6NPM=j$OtO~mce<-)gs@sI?73%R1_ zAs6*w#Q?!}c77uzS>x4$S0Gej*b#&u71Kd)%sLx)%1^mr%k+xkT z0Zg9T;(mT5JG0Kf`zht+#%FX5^T?{;HT59;eO z!A2}K1SDUz66gO~ABX&dVhljnA7uesx-9-Ip8_%If}R%5@zbufr^K=aOAUB#T@S8R zW(EP~<;OvwTc_u|0ZTV!$_tATa-XWZ&x^)&rLJI}Q0ocFpJdC|UIy`kG<@L;-Vii@ zN1;Dh-xBTUt7SJft~Ik5Z{*7!!7j#cVcxmI*gmdwUJ7^d z=>Fm0(6vW#AFFTydx{7dyzXfdu+7i)W>%%~!meG9UVRqNRl1=JAxA}~UdOZbBh=6z zLI}_o9i$aY5Cp`p{3$$VSF#oUKF{6$+{%6^KGm+h2x5S@!Lph)H+ep2WwrGeu^(Mu zd4c;W8@*;+*SwSse{a=9`lz=hif@KeexJy$+Ihc@>2p~G%fF{rJ(8#TOR&)E4@T2x zQGaEN$L-@;u>J-ekNcBM0M4H5onC43@%&Jyy36{wA%K0TZX9a695?HsKvzIasPcO- zJK8_JnnEFPay`QF(M_LZJv+VCfGgj0jb+qt;=8Ctlx6j64BuvFL9hgOC2N7WTx2u6 zPS)=f_wakWm?{n`b=xRM3uv3P#i9Cda%9(%9C;nb(dHAyTCuckak1<&N9)oW1OaPl z+wwZbIa-bS(jJc1GWAXu*cOj-DikwYo=9nrwP4UoIa-`)>~V;J?nU z_^-N-|2m#^Ic)K7$IPRN{y_X!2j;APAO7nI{;PK2zp#^ppl|8=wOs!&{;h$3qn(N1 zWjn54?{fVvUBABJ^=ote*pGW%>o0nT)t7u@+OdFX${d;!3=8QH($852IsHQ#08;K3 zaqi&(ObQjv|XEV3Ux-N*#4MbPUacm%7H=*D_N;kk)1Jd+Y8($CD5QOIvPSeqXBppj+fJEqM zRhSL$P)s&Z8JtF`_&wi5l!pPN0X(6@F@WJRIGy z+cVt0e2Js=)qk5u5g+gzmDFpmPY-Qu_M05-#CF?7j+QZ1%yG06pkB}wHvYbMlz@K* z^3Nfv?YILU)BQj1tHDLe|G#wqtHIZ)oR>%b&FJT;y}#>xr+kLw1^1beqs&aF^a*DE zIxFP>AJ(&FX2AWK(=PLd?b~-A|2SRu-QmRiC*fmVPb!%FFX|39riw17`_UlD>o`t@ z;CKc3W{SFM()rme%*+QQAmIE2^;SaiNKwHHyXnjbqqOF7`jVQ0>^i6UxU=bik?dSn zZI;S&mc?}BBGP3if}C>ND#gS-i-qPvF;R9zEyIM#A!3XgjfN`n9Tbx!7gb9bl2!hl zGw+xW^okH3j!@c|mYV0^IdcmAplV_YE2VaeFD&FAqn=DmeY%cJY^DSgsO9dTh`e5N{! zNYBvqad{0Vf=Q%0_XE;XuExgB9Lhb3enh>7SU|ZFTo-X8(cX3`!0{02Ij6yre!Xa} zSG8EuSz~H%)(Kq0_)gsj_a~JXSi|JUUzCIUR~HSmDJg%-QOGf;Lf1z#?MU4HRW{Oii=s)O}YIpwUzSWf78FcOwMxEiUsoK|~YFTsDI8}RwD)>t%3@{1q+j92mLa{SMD zcR&;UB4LOSV2J|%ze6N4P`^^>u^wayAJ3TQdu&KPfJU`48m5J3OsZ#S zx29-b%ud2`M3q6rD+i^(q}{~fbV9uqGB8y}+eU*Cy#M}T1Pk~NoBkifS!665tR>8_ zZY8fJX+*&2%dfy^^xKtHzwhJ2(1S)~y&vW9mEB*<8NgA4pzxT$l~r;@GR#yF0zhiy z0q4(CK3~)`03JnDR4FYkiNG9ZOB*(%PGS~LZc`ZN&=@UEm*B&g_~upKNGVU116Pr( zjL--t8I~hA!2N+q$vtXss}zz9%GXMKyh+CsUVxQAu(+%BF}2U5eW7cIyow@%iT6M< z#(-f6@7?rVj6ie!A9jFdFM!348YFNf;b-X0%)n@B;OB_})O9R`P$7IOq+QPi0cs?s zUJFP8;n8Ns}>_aD%B-hCdxdm99nc5*H5QTnIeB`>A+|36olGf=J&W9vxfd%7|%!k-9t%*U8*FW!g%&8-iS~6{Zilz69QsO6xcO*h{Hhi zf3(m|GGlop?xX((Nlxv=yc{Xdx=<N~{t3#0_&LPjN;;;*m2x=BAQn3xi+s;09wkz+`~q&u|zae zfLN&GqEdK}WUpKx(-3E_i_p}@BiCKfn#fP_U7Zt6r(d2Qvij#Sr>nqM? z)sE3DRT+HL>nec$x}MRTKB<>9fN82BGCucle7ZP|`p#+}lps6dx%gBFP`Pi^) z7CzQdb9??7+B3U1!um~>eE2 zC)#teSn6SeCvSHe(CD4bSeDhYf{QBAM4r=g+Gz3`0)TaC^%DATm0D_m&$>#n-hW9c zykF0jn&Xu$Kc!6IkuO5PXCEh<#ti8V4bR5y5b7HFD`(1n(1c-O=#qe^*zzh zYJo7)Rtn{v1yT6a(6;!Bs%t|8XgL<>fk|$gNjB~yl-m-G>`ECX-koD3=6j{#(ivxu z8dFt#N6%qgJfx>Vr1)b!oz>KC!PWi`%xSScyw+SWXp`Q;szVcxj{xN044vlUK7TA^G94XE0qkebKmyX@R<9OY@xcA?& zCLn!hC-`ouyNPI4`p|Tqm*@1!%xpBD?!E{>`EdaMX_0jkZkH42rrI?C$Q=rfNUg9Q zoZVBScD+_Qc?Y-S%cbx(^FBCT{vYst*8p&Qr&yqTMJ?#a5PAkiGx-7l+%M!O(XRW7 z&2{ z8AO{Dn#q5bKMug)3e7ybj3;e?k_#4~6JNm*zMIF&^gF8Uz(*9xPnV|l`FOq#mo@zN zo-A2Y&P>dIG7C(5@+U|x=Pz|Y0Lm}IvIgn#Wh6f+IKzMi=l=>c$RyzU&y*S@zg@aC z7Bk_%o!eI>*>q<{{wD_B)fs3|7NVH&V-Z|iZ4^Is+4 zd2**QexlL@+N0c+(S+xBN0sj<`6V^$#;^ooT*fr?!Ted{BBILx+3~yujaiT8$Ey0( zgJ@#AUnu$e_`ZG1UAjFa`D6FVJ(!Q3^QF{S0&)HnmJ;R*CWL)mUl>$CV0(NEE@p_( z(8PP{bWt0+)^ulDS3X2PwcT^93F&^jba|{r=~vta&)4c3Ff}jjhpWaDaDB*{`Y@ec z9Nw%mpr5xo>Q@WmqkBTyE61Fr(JHm4UTWSRVgGM_6wkFvO8+a~t7mftz`vyD05rdr zXWI!BW{z%qAo4t~Qriz)J`x9Iclt}pr?`_i5nLxs*x;+vP8Itx=Wb(JxR*zpB>&ub ztfY*OZzlqwC@AW1eGqq9CPjO@g86#1i1B_psUiUMb1Fdk{TlYhRQ+RSzSd`k2+up; zc&Ra|@0@pL_O?h?+%mSE|HL_3s^WfaI!*K3V;%Rq1zhmy=Zh0qZ?v@8Cp_pprUQ8& zMi%e~{A1@G>F0f(9~B49ODY*INqaG zUGFOp-A)xXTOJeID6b9sU{u}KJ4&%8Y53$=KlSzqtLEZ-QwfArq2%0zs6U;b0;0GU>$J;a$TK+{IoiVaa5(9 z-4^O;<2c<1NVZd4#d~@j{WdPgr97vqW^jH}E#mky&N<9GUsH)&g9Vwn+_)0Sbj$u8 z(zu>cERn8@RA}b}M(jg$#dS{8Jm8t*x&=AzcsO50JES}*AC?GIgMmNyNSUN=62-TL z@0F+sk#9osO*)bmS0zV^z_^M)x&m88Bo%*W!Ic2;r&HRvMrb+H1Luh*^$Rbj>AGDMV>bi)#wq9OmOFDkKcZjBeipe zBk$92RC3MO>wBaKdl-Krs3YB_nx?y@;x!Af9i?L#q3yIBZ{kfN8xuN zOMv-G@_JaO1t9vyW*?bqOH7)PT-5KoIF9n*v%dtK*Nq(DA`aT?#8i$^Xi1PxDB|~u z^5J}JjvE543#Y)idQM9zkaFEBaj}jpMFziCkW{O3eDt@+()FFtoHr$`1S{TEl>4XA z>(QSQ0U-LK|3#jceTMQ$#yOZ1d041iHo$bm=W}HMe$L7HiZEBm7vpzH9s#iT_!q{6 zG|KUFv%%x#0eTnhK7n+icfuJ zH~_$>%k)LV)5q~pfcnH77hpc3bOMR|0N`<4Otgiv6(y>vBMtPP-BSMiw~Qdb?$g z?h9`i8+QGga8l$SU;@*I5T981!p8c{4~m0Qf-*TI_E5+p5toSF&`pr#{m7a zP7MppS)8A77NFUBit4L#JE*jlAp&6HoZ^KQ+S|nWQEBgEPJnjRRMoATsT1wK=*+q` zXhJPIWy8*Tw@BKBKJ1~`zT+z3V=^27DH-$ zoKg++b5*rmLoBExJ*AM(;opggF9XOh5dils)d@DZ>LmpNK;7kZU4GwkJo934{gMyj zPQxYXwn`1x!}TNp{%P4>@(l3A<&?vbDwV^q5zd!Wf=HMc(ArZO2}oA@ch%Gd z5dEJ}h!J-Q|L}o+3y>PXf5kU||EuwvYCR%A>4A%C)mQ5E*1JA0j5DSNU_FpyidHPmI8vD+hI_rh{3(FYl2!V@%L}C%#`EL|G%rTdkybgvI5y)sB#2wl z@nqz6*C*)-fEtcOWy*hVa+k*d>OcCehx|&yn#uQtw^RCVb%)~dyw~3oxx0*K9bdN~ z@Snr4HQao@=*9g2rt;&|V~Y`g>%RewnwK8_8@Q@?tGNOb`gxkiMGPjqDm)NZp2!Vh zpphv6r!^2-8d(M7xorq6d7PyH{COnD7~hQojN_sKg6+JP@yviUfQ_BNKn?8%fy_}t z05iaS0@-z;QSQokF8d=G&!t%z&vPS9N@F~i0+wbz-`m&|mldUJG@cX6*DS+Vbg5p( zc=lSK@NSR!JO3e73D{))frQg{tB?917=&ft5;}Gv2K?vo{Ob>(NAGU>zY`n4za3vw ztSR@3_ltxz$6tDc=4Zv@{8~uI@m;5Vo{t9)V?GXg0J8huAj|@i;h=)?oc0p{{f)kY zsr|VDhynRDMOqk>pmptGoJR%AG*7rbUC|Bg!?%4y z#{lB%h2pef*ej1$(6Fer$Wmpxp(GRmG%^>pvCO0j-)sPD010}gFeW5D!}KrW!iVYH zWv!5Jz7XJFI{^Ggi6I)TP%T~|P0?rJ=jdReD1#au_b%4$j1;aZ?; zEL~`&g(y|j0T@(O3e%rvo%Wcn2*47mCV*gH)o~qDnj~w%puCrK%b5NZV)_@v<<$v+ z$tHPjL-`(n(3pN1K!e{5DqF%4dd-8of^%}egq=WN~ebBIw*o+pm=wn9mjVk0NC_>L}^a} zxG(Q*;`^sIVxF_-%ZBiA&}m@YozANacuBk7CRZBVA47oY&FkMiXxtC#5zn+|G$Pp| zps5Z5(o(4g!oYa|4AVLq)Zo&i+i8G6a-?YOqWRanF#*7&ECE0b2Sbzy_B2WU#Cd9u z&w!G{1Rx0jyiR014;;~rzJibQQ-g}F=YzuT;~}P zj0o`I+v%Kk4~#VM_S-D;@jVV8Ube59w~XfPfRC^1%erBI|Esra_xw%(0C%h$fQV>- z+*r@&6#%$TF#&*gQ*`}<>%shS35LZnj7As|111%+`Z*-0eO!A=5z)3nDwkN^-25db0!z&pq<`6?m> zShvTA%BzV*o7k>{0I0_{pOk+?0)P{k^Sa4W&J#Xhi2+7BHEBm|fN&jH;C_ez0HFFh z0iY=|P?i8NLD8(IrdXmJQ-7lBVsQlRbjFOUBAu9aafD|40Vk9+^3mTWr=>j)QVHG% z5dd%=1OTKzfB@j2ohS!s?qBC2%8_9FAJu^X@B-93G3xIEulZePM%8S8AYTi=uPRT{ zA|)RK{vZITWG4YYRc=lIK)-tbAA465BFA-vt5=(39puml9Ym1B2t?4qhY9$w2OT;= z2N8VOfH8*T(7EZbhjH*>2|BdFggy8$HX%`r4;^sKk_2aLoOqHrcH5XRF~*F74hvCG z+g{0QXT55zW@ox*dgi6-do}aejz=pQC%O0)=+pcE={McI{ne|I@z2`#fyX_rUr_+4 zJ4-#H0APGo0Ps}-AW;Q?mQ?^CRREY|Rsq1IRsq0F6#yEl01${Gqao801v|>e_V0;p z_~dWXd92@KCLS}=inoaT2Tl2z6##No0O+U!z=kRStf>OP{i*len-S92&hE?r=XzWo--m`?u3ZzcXUeRE))P(?tADyzOy%e*Z582`}XMx z#r-J{E380-bxpmR67w z4@;mYdXVyf&wp7}v>S5V_QO4+A3{DX8K88qfN{(C&>qi8E!2n7Kj#zplF&msON@3> zq@xDM(<7Xw=`~v)<)sIFf0iCGuSD`$%^*QPfhsHn_+AZSANwli^$oGET!V<~qz4oW zVta6XCt#6$_@dVn>O{_`i;>~#g+Y3#J{BS`*5#@pUmCTh6cEQ^VF84QM?DbiGb$aa zYLY);#5pJFZ|b|iB$gQG7>IMPrVA87(;H({O%SpKzQz-qZ%r{M)ejbre;$KaoDBcY)?r-s$W$hjD81K}~Vjg+o& zjxCxX5Z450!{lf;p=H~S3A{S`T?fV{^O|UX-DHxkCJ7V8MM@U%0%DdipQEafutOly zsZ`C$v)sO~rc|5y0XM>UmrM)e=$eN0QAC2z8lPhOp;fMgcuq1tObDv01CHNBzcs|4 z;~5IBnhinogvl8&4`7EPU=t?{g)vzhhv+Xv`nq24jyY`tL28;B(lcv1S$*8BnFj7y zxsIbtv8IP6Wt3V_z%Y@-sZEUuAwQcWz)16%s=~TQx}G$#E(e-pHCco5r;Sy>+MLwK z5>LcZ3rxp0p!n4sx1b0X%v^TV1V`;*x2!QnMMH4dE$Y&4zFfpZ_+}q81^Zb)ll*;u z|63#CI1PSSCPFL}wGrbdepb85*!JEIKMaX3-h2ffI9^QumVOctT~6Ll`cf{v6-hm3 z3BZfz5q)2zfvEEm1_nlVeWr$Nl$)1YhS-o-(F+IFk70ARS4$B(Dn&TX|H*jO_v^JV)u!2l_=M z`>t${LhQ%oQ3j042C&P7D^PLCV!1Rze%Tx{L4|k?aT+GrzbnJAl=S6-%18*XVO_9j zWIUtfAX zydDsJ(E2zUkSM6|eqqe1I4S#OKN?&b)?^>#zThC!{k)dPg2m}P8p(d@UyJq`UrFAkk5Zza zKlNgIRa~$<`eyBVLiAy6r#2uwe=n7x+}HZw!}X8)@i1X*@_kOy{Xrf3Wn~b`z9`yx z1dNId``91)@a?}=+I<;~ro?~fh<}OO_XyKwl=#{hY#@J;ns{S7YdWR{lirrt)ejoF-%li;r^@t?|jH!wka7paYO_rV^n2k14PpMQ|}N4ch26mUU(Y*YJFPmJ#>ZkZ0S zq~8KRR@Yqa{>5?AY?C2jU;NXHPhquDKv+KUbr_ zW18RA6XxOc zw115MYnAqZN+3DHU(ux_tTc05c9oKtx#;iP+wP2FBx!YuX zZWQeXupqK{!}?r*aG#X;Z&k)qiFsr^Le*xH>r1^WjP^x*1x`LYFSY|In|@=MGQ&dlllpN~A7K z%Y}-Wwfs`X-2Y4Cb)3+CxV&=9XMChg_XM9GKQ`!E;(y$tYW>eWn1?6HNXGHPINEP9 z{%Gv?B>wbxWnWMF4i2q7`-3L{?JNI?f_Dl=~ zvK|PdlwC5^?R6SOj`*)!hk5N)u@dI3&)oJv{A;}83WBz$_wDNZHLk(c^Dbgk#G&-L_q=Mc~PGr&E4er&6SfyAt;%aK)2%K`EH)bjegq>%AV#f-XDmjz@M z1@-yvISV|l9>-n1LtGEI{Me-f|3|^N=h)rVYkjtIUQ3Y<38DM`TR~@Hf5_<8*QMtM zc)Q>oZiUmeS5pPhZ!oUd^x1QX;|SF_urhDgZWr+(5b@bK=D2{E^IQj+`Tq~|_s>jW zsjhg)-{c2=FTQtb=9*aWsPJ}k_DR#N%WXr)!mOS17L2A-;CPsM;mFgAPak<=>Vn!? zp6+k6l+M)sm$pU3a)SubpcLWsT*UEWY8hKi@K-HtI}6p-az}b1PVpdzIF|z8u^eBe zCjFgD0(HqfFKD|?5g_l0Xuq6(?}TN+@pl@O=W}r#hdXGSi@5y$Q4zZH;8RJt<3GI$ z|7ns*aFG8c@Xiu5sb!6oIFHP2_+OgwzZ9Y!M#ukxpH004sbH{`t0m>X^#Hey^EUji z3H9Xvq5Q8mbq!wOe-E3#^1obyFn@10f1RJT_^I-`2^>_fbjnKrv$Vi7$OAvH89`F&`4>$+t$%HXoFGhNT zk_kjECyV+(NCee~D7UzP{)F1c#A<>RPZB}oa6a@Rpb3aLf|{s}Q7-cA{8RPC9;gp~ znqZuEj4}>8f0JNgaT$zVjo6?~u7!3?VC+0XL5`6-;e_>#Fduk}(2b|_CtE(jrmB0V zIqfcky8%>9{O1Tn3)>=&_^*~&<$actsNWMI8ss7lCp#ie5x{J+T;ckq2+=(d z7u1q~qN~?m>@W2>KFUR$ZJCI5S6(IX_($<9q~UoCPHpLJrPzcI4a`GPkJKm z#{A_imTk@#ji*JJ^pKyN3-8if)CG1-ThmtU$!Rg>y$St#C}sxDs;(( zP4X3q>T@5=?!|VCQi29Jr)bcA<_46<=O}zA-2lE!iQbr(OeXoNp_ysA`!kdDME-f~ z=Y&qHrYL;*Q)=KMz-*YN)p*he{5Ho|+LhGbzgRY|&3(zD>lb9YN|5)*Exj{ZUP)ZkmmW zq^;0~`gYNv<+_w2{VdffRl+`iiPgH~>*rtcmP`{T+9I4NQ$+v`x-OCqgI&>;-4O6g#h|Ddshz|$8m+fQz(T26yO55Ac7QYAO#B*43L85A{C1iXCQ^kHQ>VK z6-K~v1EgRTu#gj0!4^)UAPI0%EI>uzEMY;Qs+7WZpLq z_n-~W=Oa{Vrugu7-~7+b-Ocyj46yU)BODgM@9_x<=ZEn>q8AZxm_ARLA3YtLMBl6{ z1YYw-&Cn$LJ&i-p{-@c0Q+h(@hxv;PxEno$jK{Cuxr4_M@SEL_@gxQgw*MWSq(GHa zB>XE3->hR2iY*eP<)AYXOsg&l($$Ldt6DoRNcb!TFVPzLj-J zT&a7tU_1`;W?e|SF~;2{j*IY~*coTUy&6iWGJSn-n3AB~82V=SS*zE0qE;dXRy-*y<@|iF&L`l}=qYh++#&W=PCbfVRAe<{Go(@GT?f1+CD2u{Fi6ZD3y8PvG7;~ zgQoMM%7!`D>98*6qf*|F<59PcXmGX7E9ExS5Nms!2~N6W%C4G}c3!a52m8d%4A<#n;`NydyqFAo?@cmiO2Rzpqg#LA*!Y$0iYt4dUG0YLPfleb^?$ zq)DK3S?;p_ZeK@_{lU-m^!&4fDG~oRXjp(4IX&a0e0u&<^P1jC|6Mg~_-AXwiT)iW z{+~(f?Z|)e{6~*O;Xb-dF9r+d`TtXQ9~>WS5RcF!_7$Ju772hFt4heHfEwJ3##Zp4 z#=dUs4{%Gs^|9H?0Gdmb9zVvrh?V&7vE3c&-y;!k9*0+ypnu@gm+Yr5@fYrf-oUs* zc~3?^5cKMi1!9SNtq!m5IugW>m@f%`B+U1HroZV{Dc>Q%K;lC0ivJ1m03QK?K)1Wf zjqoO64t?HvnXo5Po8(6M;GSw4m~u1yd4S%w0$ z$H8RgKf4~Y+f7`&-)83r%$qOs%e}n8hM^f8gzt$ant_3S|82i)=mzNf^5yR*;-}Q7 z;hLZt3fO+>P>6qhpTXWg5M=&clPw*IenqH(+te|#w5tUucMPeYSULv97WeD;-h!76 zEiio(dzT~r?fdJpdNYXb>|#XHK+MpeJI@y~1Tb0e_6HO%86nuR7P?Ep}&ml(>?MX(T1&ReasExfsa*_9~0im$I|$w zK;#=Aq&$`q=EhqsRT8HJz42iu;-G3o{FNh#m>GrxiAK0?m+<9>4R z>z($w&Nn#ae??#X;6>(ziIgYG|DwVF;w$-I zEWrQb0{$1|e`mL!{5RW=Jfw56@!!Efz$4oqJpa8$ga7tvjqkpI|7QJ^|GwhjSOFf; z%>ty#3`tPrfY}E+*CUG}M1p)*m}Q46SXIeY@4lBNQHSMdvv`L-V zb^AasElae8aP+A}TVULZgM$Sn%9W6}BmU2pC7Rx8+sErBUtN|6wP>=1sb;kNLcJ{C z7mRi{$+sDSYqdmRvLeyy)eKj@kO+LMk_cSAArbgy&4pY~Ah2==jKFZkN3q;0t`*mg zfTj1p@$;n=7Bc)69|G>z$OL($5n!JF&v2p}RVS3qLd`<1NFsOotPS3oWnb7x8cV3& z%|ycg2s@Ba^6pVHG$?uGmu)z;u>$CPBWmtT$kEkw?F%*>_gt{Equ&$dZIn#E?K)EL zhNsYhmtx*Uw1JGCSF7sLvrfG~il-A>Q2>(O3<1LDo4v)2S0(s2sej-xhgl?kueGl0 zKuNuAm!R~hGE%qYA}N;=J*LeIuqTKkfHgV6TI;W3DUZJ6=(&zZ3m+nxdY*-acnhHCSIOrGE+zJ5CDo%> zp@e-L#zWT=4PFkO`j`}a-*$QwtCvNu6olM)3pE4~x$^HL#b8*~23Q_M4y!fuBa!c) zVl3rI{v7W~A$pT)oT_JO_gvn;?J3t(Joswp#(x%w*kK@Gx9UjbdSle9|Hs}HgUE56 z;eU>ma|jhnxIzRK6L6uzg^CbVxEO&86)v_^IffKhq?kg*p=t;&u5hsdC0s%<4suBpvvEvN6d^`%N!GrznIxy(+1c57dH?r*?njd>85##h7A&g&R!k{W#zasu; zc53zCT>De-u}}1)Z~l_p&Fol z!I}KsQZq4^5Pg&s;XHPk>C=qpp8r99V)1ABzRyJU?YG`ea-ZnkCx_v&#lNQ~G-V=j zFb6>@8U9N6$J2o$N@vA_@#ixi`yecfdB*nhL6tc|5=3QOh0DNVf00O~2_IN43lK}g zI%PCho3J5Qp~B>jSaO6>laRZzD5Ah(+!Tz4n#csQuS1KYra=FwaiyvGn-T#50A)a$ zzk;KBQ2VYz0OR6t;Rw`X9@HR&#b1A()V#lv8TRjNQjQTA5S97D$G-OGqyYhC!2~KQ z4dfgUa9n)i|2rdk@15V%B;X9)cm3RAlI`070nMy_82>GvhPZ>C_j4;S;44CP712LQ zTp-26>?l4>cs<|GdEdTCBmarTA9|J`CA2!AR$Gg=6Li^FMJ zIfA^8%z5AL-<)ipGU30=d{Pz*?%zkn2oV2_b-zZS%aSBBdbBKn<7L|9IA7g2R>@Vjt@eJ-xO_Bp`zK^SH{Zkm#e}I6n1>?%w+? zO)TDiElr*f(OcO*{UamF=!2}V_*brc5#qdw7l{zrUj?yr68#9o%834w9K}y#qW$3g z{NsS=&HOIqR{z2G)8MhiU){S;#{tnvzo0TCs_2aHzsG?Br_s|u34iSCpbG5!(JVvd zhjcc^_vT?);Jgk>WcpWQ$@DKP?DJ)@aDgl3B3iOe776F*uqN#5aLL$T`Z#B=FLAz_ zUgI+RUwxMNr!(TexnTnQ|8m=8_#rqI;y!>rGFME%NRIgb3GKQ7Oxlr300RUpMs_^L zBP!9qpfOPH_%}f4kr3QtNBElvn3@pd-L&(_-46rkw`WQa`8_iXng0lMH4y?1fW)7{xDRWURhj<>wCAzqW%=Q4pVtxd8=43uN(uJgmil~; zS%=>#6_WWM=?~!6%L_EH_zSaZE%dJcKl5k^h&}Og`0*0--x>G*1v&secDlJq+rS<3 z9T5Eo=EaR6XLQm;@AAibzUrk2xP61s@WlXu%k1|GjF$+JKZgEO^U_8ldWt)OucP1h zXyV?J%lLcGyzB*}L;`;<;~o3FK;Xle)w3|~k=X@4vO3OLAr{`IBPw`4LVQmIzfRv$ z0$p$gF}qR*9oS`;c05lzh;HiY-^Nv$*d0W7=lJdUbd9@mybkHG@0f@9(Vbz}e!r?; zS3m--D{J;oJM46v=d*_7&za#b(j6$Ue&C6Yr~Y&WNOWO`U)}zxwC$j;_Z+x^=iPsI zJ(twJXklB_A5vl?GaRI|E;JBf9b_Ej{fBcuSwt->`*As}g{q=c^70)Q@h&-}C<}W=x+; zGy$^1(0xwr4O{D+2wnxRl1d=aHi+a2-I0Cr4Pb{XZdJDyw=|>QiSk3P#J%!U%M0A> z`yRJ5zDf!HOWcSyS=hd`tp*=Z8y%m{UE!vI1l1Nd&E)S*x#>7BY;se+ibTHF=cas` zcjEQD9+ByDBN5fjBW^?+Tii%Q=eMGA0FUpV^ED9Q`~_}AJv6nGb^GkHX&c+O_)jLL zMb8NQr(D@C{HO69{|igKGM%W!|C-F4@xP?}FZ0mkF@_|Jvr+z+`~MgJOTzz}yixv_ zrN#eJz{o7PXVG9x%x4Avi*b?o4SqVO=k_1tv9XyrfvBgdOLn8{AL*PhgjC zU>@)#cJ`i+_ksA21>{~R&2Z*_6QB?GVoQ83<}3b7M2fZYLX8w*KQK?LtN&KN4C3=M z%W}&$BFXUAJ4>YWy_O#7ansTw?x4^s10YJc>w!?8-#WjgCHf^&s5QQnSUHt|f)gD_ zL;@0Ye(lmDB2v;HpL6NlCH;JNFze^Leu_Pa9;8*yji|oFC$W8hWTDoGu6b2HoZlh( z*VMMs+HKj^CtAMV++6OENb4$q7s<(e!5a>|ZA7(Qk$vK?C{;vak(2K->P6Rz0V&`j z4Y5yB>BmLeRX(I`1_(-{+UD*6y)J}yCM7a2I^FC6Qz?CapEBqpIhbn-ya720K!iue zmFyY`p^t+Mg+2!|Z>bo7`QE0~@bj0wA*sMl&Jl>&C#ITJUO6j`pYwAZa&CP10eamL z>AN!DlGyHmaPWJtczb3{Dv7!7?nE`4a#t!=*F2)gW$f^pVm?y3ly+eMx@7dfK?y}# z5y14CJ%dbqiNxYM5E1-7#0u`2i77Cj2P9&yf#AO^{>Jct(MP0KNjOi%@6b?_;I3Cx zB%lw?HZY^Oap%rOlfZBC+&NqDa~@TmgTSQB>OLu2f`^=4zmY%y=wnJX5Wr#M0}GtT znis=U9Aj&@t6>0eIVnHny~Tz!`=0S#&MnTH>1^Ry^`g1r9Hyl$qNMJ&4Xsj=_$6^$ zLENxT^Jhc;jbz8!*p57kCGD(scc$O>dvE>lro&ok$f0i#Ki-?!d2il)^EAxw_kEvW znLr7`0H?3&ZokZefc|pg7*A{vsh$p9UFLtd-4#w108i>FLcJGapFL6IwYa?JDM3Id zAgt^*Ks-5Z!Gy&Qhzk(PCzzn_h|Y^07oLeBV_3c@HtBbN_~lC;d!jyZ=jnhz1kSVJ z#ZUT?af+Ixj@zc(Gblk7b)BI7rarj-Lo@xCo?|{(mc}##KVv7aB-_ZoAzoQ7! zYCGyk?3W-&1G{cw1y$WDWD>!{1B3uv(Ef84Kb}o}j0{c%u_#{NHq&|o%qOL%2 zDFW3Y!i%xI7xfV#0D=IdIOwWW0a8T<*bQO7%khl}0o?$h;+?L8`P%A9syEsvx+>>( z$iLgJZOfSOE$e-Mlg9PiEfQYP{-1rV?yfs5#5f}^xlH^uf=$5@8P+A+^G0yRkLmoI zzOv^&1Rb9*H-0L=j&AaXXcEi21J)K`J2F*wPUk&clwW1z2l4xUVI3e`Bv*!TPn#gg*o@ z0TZmfR<8m33{$-SCHE&`3VZHV`dBA*PV_ahE7)}+k`Q(_u)`?vV5d>y1IdnoP8wbAGZV<&kTz})c9C=LjmJKa5%sh3 zIIYjr{-pJ+cacNU2mf$B=Jm&Y-DP3GoAQF>khB-X)nJd>uZ26ZN0|7m!Ty}N@&B7W zJG>FP1GH!}?O%532T8!!cg@+shloqTCf3P!+)EJtyewX)m=!dC;S0eA+w=O<4r>{I zbK?2%B4P8yhPduQXeF7r-*fiP6Y~69oe;v^pd(?|LZ{yGnedNYP52k$8ti#ZMKV3+p`_58r)0hokpULiBtOH?3+eU6c4 z>kca-e8_6%Sa|T0v7?g#jpM%DTqz=)&9x4Dghz9&lB99mHFj^2`*~2Dv|W{J*o4y0 z^spNK5DvmVt-uri+zpTa2qFG|VAnD4tpgF^@>uC0p~D!W#+gxWk>FmoX279~BA3 ziZwr8+7H3K|M8&yJL?#7l;3Wb54eQ$_5$~B-DMv;!2ADX9nY5x@t-lCQAGZzf}Fvy z=e!*i%7ot?Tf}ocZHq#MaM9}JoG-S2(>`*ZkZV83_vtnJML+r!(cSf_HH!m)5vDE1Ma;RZ8)mwjHWFKo}>x7Nl3o;P~Z z{0xD>sBuME<1qV2hQ^<@dJcFaR~W1;C31SW4ym;L4ZLB4YWYuWk>RIh5a#SRTVSz-(^Iy9~;fD9cL?+0Pu9y@AN+5Gq3ymKHck(H_ zOd8$=r6n?p{bSk|2fUc!sU~N5Gsng6@-}dYHH7_6#2a|4up1iQXbMG$Vy-w-G_kt0 zP{8m^IyJU-%r(5*#0+ordr>@EJZku^Pv7ND42ns)UEs|S`6|`GFq#P2nwQHgdl7HO zQP`eB|5^xO<|&DiLQ*gSiKItcN!)6Iz#gdiPvIK=7yN?ZKWPv4`>4w_1pf;v-0;5~ z@qLK@4Y?f-ZHE69Vu=4`w@Pb>|Hb>3=6{*hO%-uJ#Q%yR{@0=w9={e082&qh{}qP+ z6@)HbSN8QA{#Ocp{o1$qLK0ONI0Lk@+3vI4)Os5=;kxqgXT?DF;CcW6(!U7$E- zWI!z3Fd0I`4{&gudW1=!_G^Q|jm33f-Vk5GAIv%o1;?l1jXWo<%n$C_547=kzsj2- z%5@HtVbr1g%|bAo%cNW2jR`pw@+61N2muNx#TnqYf0O14;Rr;Lx1brlF75XXmz|43sXj7L0waGZnPG(pJ@BsQjOiyH8C+KU`$ z>BEGk%z%JL(K+o`RZc8IE=R3-)Nj|G`HNyfs~;usoT!5UXF|OWkD)nOEuB{@YnzM^ z0#pdgVjlg4H$q3wrWKsOB1-shse}W=FB-kHJQO+L=5n{Ca;nCv{}lUyt19Qde(vW@ zXh|!?^{xq1*kekC@P7y~H4r%g$MWaQ!1Rmb>V#7L-kRfnas5lCf6U{usOt5_SCILKKlUiIw{F{gX5KKgR-C^Pgf&h5R z&6&smsiOq}g34eVb4dxfl++RzAH?Z=uy2`25M1yiO_q8fZh8wkMDQvROpLBh70^^3 zwp~FUg(@Vq2LfVM2?E-c*nuEmxm`obfYNS6bru5Dx;|mJQvtzL-ch;aBb7R!SM6dw zXqUPU6CUp!z9hG(z5e3M9*6XP!a6NJ2#~AZ-Qe$@;Y;!|;S1utb4}9Yr$bi1=ePVe z9rvMBsRcgqw{blkx#y*Xw_F@-2HhL=|GDru;;`fQ0}y2(em@E};US9L{M6obFNWKM zuXt}sCh(t==lm;Ff7*FDxJdOUw^rpk6a9}pFS-88Rudk&o6hyHqdZTYJ(!L5?DvTn zb(pB$y)%}mONDKx6Cz?vNfZB~>v4|pxT1)qj`E;y#PvQQ5>7CIBPSaCA#8kh%Hvcr z`MHBmG30vDEz*9QXr>7lZzCn8S|&misVb;Nz)ow4z&g%^D%ul5rYC?xKOajt-UtFf ztU`Vj@N=14D2Ref{gT3|J*1 zRdNpZP6Gt$!w^V75P*~cLgmnIJFyG9CW{4;TBlswu;bk=5ciESgnY_Zr{y@|lsMw& znZT(`;%(%@J(0tn(|>;K)qw5x=l47lZqT@Y@twcAEZjKl{asw9`b*9m@*3fr90`L3 zFY=>c*Q6E@QLqhr(Vp_Ac!*i_nL=%}VGSF+fb%9y9cb#X_kHK$$Me;fY|ml{ zPGH9Ww)oK5q4s}?cVrZ@9_!y?llprmI43^lNELtlr}q)HKfC^x*kobQfF^WT6cbikqfVb|*Z6xxE@<9Zx14ha8VlPFt4JDBkDY`2B! zXi^f^4+c{-&WY%d%k>FyC_3m7u1-5sf{tIvH~2jz;mpMY!rvvF7mixj$(}=H&#=>0 zTGzraB`}MG2W)9iId_Z*OAx-X5oQVE+zH}Xg0Lrt5z8U$wyiVEp*xSA z#aVPpTy{3j#;3D8XD43U@~P#>>yf;YM$$%_l~(Hf|Eu>}p7Ss)u0}llnx3j(RljR` z>;3u_Zz14~U*PD8$H^h4h$)4LA z_Iyo|LrWL>#i8fEgEB?>2+0vZM{rTs=*R%jgc*=O)EV(4;ILD6QVdg;B6Xblt1EUF zBe(qB`~G>r7oJ=2J_Eg9bd|S^4qf(}&N+tm{9f3B^4|CV*S)IH9@>7_MSIpe;yXS# z3XnbbL=vEoYze{7J??V%cEsy;`|ZhhznWu!)+f<#In)tpPK9lC&8J8R)SkfmIK-nU z{xf{vy#VzbWB;YjLH?}zwTsX5{5L-GI=GSf(KUKr4L|Rh9v~Bn(eK|?aJ(P~tVd}a zU{Ak}tn+`tMo53!;XkG4pDx3QB^2V{#rtm7VB7)C-9xo3lqb76l?N1Vww4b8+e0p* zoX>U&3J}H*F=glLmJRamY@^^4K~^(da#XSDy`Za!f7Sv=7(_2>AVvq{d3j2|mqe3# z$3H*Gn+Bjfo}DUU`CD^V*#X>^_scHeRJK!As9!d$IDqSbD3^ztRs4J@-`WCb9sx_& z3&kPVcCcGV%FxJ;=#c->jwrJc@;}n=*}mSv9@XNV;Zuwp0Qgo3^@zjiZsl31Z(=C? z8WR2@t+qITewuCZpx#<~af<>xkZx3c$Pd#Q!liWg4^A;=JT145T%`AGS71NwXXC7c zdO_<0KtCGip5E~vhrA7_{+Xx-GU6D=@qgHy&RIA<>DeuJ0Paq)E$=|RGjg&DvRO_o zRiGYYNrsgt04GJGf}dZOKHXPH%|JVlAip=Oa0h*qp_V_ucYT3a`Au|y!4+{zC?J|MfJsK@hiYx!A{RrwvjpUJW6OQ3f))va0} zpApB00r?KT!%%U^|G_CaT3`;fCn7&U!r$;@P_6_1gKSrz9`g}7U%m)v$ep840cKNs zMj_ugD9=#-oUBzC$oI=5BQ}(?kLOcKKO}!=og1)|zh8QW??htOxJ&F9Q8Z57N)6=4 zlM7`#A>_YeN{HjVW-I4VzjVq0;E&|VN*!=Y9H;()@xvahfb z0v?i`D(Mf1pa0N&FOTJXi|;W8*EiUH_Hae>eIWJ~v44Ih%hiD9la&f$Q=F-^64^W= zGgTMld2?4Wq-$A&Yc&M<$Fg0ub${S^nX}R&y~<*> z1jtVqUdA0j81$x1=*MS_Z4%H3#leCeFIEOLUX=MtBSr@KFTyxlAg_v65%T#l!)GL1ft4G9j`r#D}) z3@uP+jnyF>mzvyOLY$X7s!hOGq>Xx*-<1!JqTNiu?+b%;C$Dp-U%9<$5b@qWvH?GA zQ0QXgEwQKQfgaQHM8(tNN6&p#bSxaFs*%Yw=`3oykAuSi;=6A?A>YOKn+@ImtPjY< zqJ{nRr*eG6B0W|u4+$r8Dd*Ae#FA(Zs^=?2uGr3Y88~j2`9elvea7)TqG!HGXdByT z9{w(C8mwR1Y-EB>eE%*s!5ictcCT~+=fP2|3HayifLR+{&gLB%DD{slP-SBbWtYtv zsK>WigL{35O?NrBWP#WbA#p57A`xi0FVcO4U*o%}t(YG>1{glzN;HiaeHb-Z z;vkS5VXzSGh5Q8H0Aw*zIWfM??k7AGe}9BlUy~ybRJ1*D1V{*fjXg&oxRk$Rb35Yu zMu-^ve7Kw2fzMk#kqZ*JhZr9~ocEL)_pf4Vllmk$I1P>zl-Q@*z@GN?=?~V7(HrnQ zHNRryp=SR`0hF9R5eTL<@Nu%QKVnJhA^!VE3`rHzg;bWYA!}%CXe`O^CI0nB*n~gR zk*kx9rML2UB?P}t330A><|p!+(1ic>Gk9(6s84t|L02yymGE^1fmh;?p!FGyYh}FH zfRyllIwb@@Y;0*?Z6}crV*V{DKMz-zZ6uERU=Be#T=DKlt1w z8SmBq;!qBpx*uBL5r&u#+QqUCmAcV>terEeUtv9@p}vpW!?9g7zljbqd7JUXu(xuNm^lT!gKJy-90Z1o~GnuX+Cxy04=CrW>XH-TQ^;7w^p{yvdwh}EQ@j}57v!V`SG^0cD12$+LtI-e65_beH zc)98EVuTB<8K(?-$nlKAg*nkpha(sDg67Z@w4gi5Pf`23vExBN?d_!dXX1YID1R{;r|&m-2j?vTlv2(of>MpxfD`#f*#m6n>=EofD{bW?Vz3cM1ZYL|$ioG>R5Rrh z(N)KtQ|aBspyVMI0t@q}^9>{hjPaC}MtvNxXNPvYHg6Kq0FD7Rpt?b4v#+xll@9rS z17;68qq^M<*R?|c-QNwnjX1PAqoV@0;*L}by&j@`%QdN+&DwBCgq&AUDI{`(5jzd~ z7v#^}i$olrQkAVieN(7M({r-W{A)nukk2d&s_1{hhhf$pf&jJ42f5Ts< z9nZfEPXj(vI_8~rLH`ouDb>d%p`?&dS`E609Xure?><>xa$rP z<{cz<&G}4S644GsDPlX{81?|&VSgCq&TvowOb5fw0+f>(FWN;9=fvL!z zn;Q`?l3#JOW11IfXDQ(%*lnB-_ftYN9O;@^{=8KyIDlitMv*~1^@75kc+$<=IR-e9 z>yVz-up%ONtYD*_VtS~RRv0PZmU9d3dH#B19kF@C2gDuK!N!pRHvrdyHH#tyK#!3f zw;-fC^%sPMr{^SlpFrY7Zap`vrfM#{2W| zGPQfz2D^sx!|<%SrsAU|Jh0~w?KyE!_*J+>JH(H%x7p_ydD;Irvga4VUxuH!p!c7= zMv**z$`{=>EVY)YF7%ccSZ&T~BrE*q&Rntj>L!M}iz;d$>cy z=;Tl<=OKZbcGEtfopv&a^-OIDKcCLoC*r#LtT&0u^Sy91^&*K=3PCcy%mPQuzg)2u1#KRQUn*(ZJ|A1&)jg= z0eNlc9;pDEIWHaJGbfqw;q!ny+ym?|hcj$XIy8_#ZsvXboLhOvbimHO!F(+LtNF5Joke77kinZJ^u&HgNZ%=+W*+S;)5NB%j972slO7g z(d(L?Z&%c1`-TT-U#9WBz_i23MH}qdP3#)%oZ9m_yA<94`HVVG4kaN)kU@L?%)18o zp@MnZ(-92Nu7Bl!7+z9wBnr}RK`q;0$1cpv4q)jug}*C5J^dCti_hafeh^*+eHUJD z+gI`VdwDe^2bD|u2p-;&Hm60QRA@Lz1m(!_L^#6^_U}z))VNQPDjL^aa)|4Y9jmTQ zIH^PWcjvFwDT0o*MvfD=W(FUGQN-p6?{<7Vmoj5mc(5iDv3jo&Q`@56xi+yQKG zPY@xM^0N+(UsjPr!0uebB0YJF90BgWiTWp@{ud(qCQHut2co@;ggghTilhD6*@mS6 zr?Z_A$T!DRHPWkQbfhM-Ji`ZcS&iFt=Bj0QfMW(Z0Gl(ZS`nZ7dNxCZ+}_lLr6|Ht z-3Ya#B@3zE**K(q80m!u9s1vcm`63hBRWzHy7!6({PR*yIRczZ&l4fBB53D0+s7<3 zB!^Dw|7ar8I|^!S5%uJYe3A&DRdae6`#DIDRRK*QJJu;&)Qdu+M!#2G)}n}1Q_Ryl z{&^E{9^~7O(&7h&kMo9UrF6B+E6DejOyKEAh8c`feJ`*Owz0k;~p zG{}Y}rY$Tdp9-oG5}9H=N9|_o3{y9HFVYLaiu$D;EwJ0uUVcL0xcsGOyd#3J7&04&LqQhISQy>e!*GF1^kU@7hWTxX9)>#9-8~GJ?!gjs}TUE z`s_^mI^RnFKcw@xVN49QC^AK-f_kir(89@1VcK8l{K`%Vrtv>VFJBt$OO;%%bSq{9w96#QtF{&-kX;H4+iwy^wzi@C{>% z%72WX6fTWlTLAC{!%Mq>512Fgr{H@#zySc-W4iL-DBAs-9Nz;ro%r7ZabyuuyjqC> z^FU~w()Hvn5&?NU{VbLb^@o5T8nb9u#`lb7?j7ovObPBc4@*(S@!Dsqd}nhz%?Tgi zM@-bi5GN=y#FH>?e+=@nIBNYsJ1AscBRvj~9vNdDWn(%ekLXyiR~#M1ez+=5Sa%Q+xspeH z?l+%?@k``e;$#tVN-m6oe&)mCAQG5d8I4qLsPciBB>uR$Fs$_WS8OPMx7<7OEZ|Ag zFCqTWJVW*W$XqR;+!4yUi26xy6mdqbSFoIi&BM7q1b@Fodc4ZW(Y#kbUIu&dXdYXt z(BCn#Rep`^RiM2ZZbg{PEUIW_FIzA|DLZ3K=Ye&tmJBa$g$^s;f*3*0LQJT$N}pp>Gc<)LH7HkTtWLa z9}$N~>xqLzPa4oa{gK0S#&NzrCUzCjo{q|G)dt|>avt=e`Ht-A59M~6_a2sq$&m}} zr&4WEl~kH*zeLOXUbrEK&VGmMdkn zpE)^JspEK~V*o|eakw?m;b8MS`yb=)3AFFfJXo}12NE}Sj0(uU80q=1a=hZ<{3vQ8 z3JFxcH|=c3A%N20`;T*1;<}|Rm{p^CcUHASlD4N~avaf^60K2(9J+Q75dr@t>+XK9 zJOGpX$nk);sQg`78|uAZPL70tO4ceUFUY$qb(#nKQ5|_m3PN?2PE-eu}QzPRu1iX4?k|&UmjvV>Ny%TL_IEgZ^8Qas?A9=Qo z*L(V-{^gDkJczN`gSAck{%&X5f&QTJ|D1hqh$P3AXGCV!pRTUa)aYitwc5c-9fN6> zVYh7bp;^Q!ZN$+Svo0O;p+C&6(|cxVjIhg#ScXNMQ_I}aEMi?Y!_pXGrxvj^hq23t zFwHSoX)`R%p1@_%cpEckr_9{ZE44J)|EsGqGcMlmMLV`@)N1J>XdaQB74ahSMPy|B z-k(?NB*)Kqo3r$sHr&xnNS>KA=ixaX1v+OahFCsMkK5823Ob9zrf21UhC=jEZcr?K z>B()mO$s%XEv9^mhvXCA=5yrOM*J0_e2G ze+le2_^&*L|4QJ$#w^$1zry0b#2@3{z<pyNUrfZDhez+mBb36-Hw5gEWg;bmCT zeFzC)EaXu(G4%t(NXQ-I!2yl99s$5!g$nHfc=rX8alv@v%D`Cih=|KHbi(o%orD&^ zBLF{!&p?K_&X!UkYBv@?){_7o4!dC)*$N#6A z0vn4#2p%^Ht77Plgt-2e&NJdeC+{+4A;xc0wg9;S+6{nj7mRU}vJhUAvJf*V0pZrt z{$QK$uOr!*{1ap$j`k@FF?*l#!-@pneaiN_^eEf1YEq^J0@-*1u!;nAWSvIHHr+=S zN607tw~7blWy&WC1(wQf%642%8W^=GlO>avdTY!_v9HU|Ri5`=BG+|#i;4jj|3!GG zTMW*5M=z{cWp&T37;GJoK*<$Xszj#$L2lK`>ZmyS|RFHbgi5u;x%=dhrMoU;qn zuCUu4U!J(iT)=$3ZfsFk`YFK9jPkHJUY$^$A3^F9&Z zH0yFU6VUivN`E&Yxvlk^Nrn2|C(jPB^h_ZOQ4Wjv3Bl-eJ#+;D;%;ZwuR@_>Kf?MS z@4h$+5JOzRazBByYEg8{F6vv(6XK(U3w=EINYZ`Fg`jfTQN4oXr=@jsLrvR_6qXBf zZtMmC@&iTfElv6WiU1A4(s785&YIhE>GxYR7+0~%@6n@$ogkxjMtN((F_>__Smte_ ziJ)XtqKs=M4~ii5@R5w>lb6kiMgRb*56iotoeAJ=SG#qR(~+B1 ze9UcFa!(cxx`)L7dV$aYa;SXe17H(U(E3phRYK!YBvh}{b|VMR=aHa6>p-s>)-*lV z@&~yzfTWikLlM*S-Pj?jBx3-U#S&u#xX#5c@v$qD@ z;=s6y0)Y0S3?1KUhgY7hAVkq)-QN%Bfa3SU-|hY$y&bPR=+6<#ZnPcedQuQpK?&7kl%IP6Tus6ht`d7rZXexgS^@W@ET5HYPaka0_(3(E$neK zl4Hz=zVQUrGOKIHgQ80_Zc=+U3n)??&+T>hI7T_A1t#zxlb&*$hjl|G>`KfHycPjR zwfcnsmi$ZgY=$jU0^URCJg>R}34VTH314;rSZ+x@f~*kegivIN;NdAQx&;BntGnS| zK=qWOgnVl`G@&;j#{=1ug4a!=m82QWAcl7JX9UO|iBVVvv>xXH%~Nma#WK~j=Y?1Y z5#~M3B2YJ=`m2$H@1mOTCg3A=0-~tJ?BB88Mx_w&1hbpa z`}P0){Oy1gTK2>JU_zl1`jfQKbd-%_Mg4uY@Qaw|73RkiN+@dgt!7x!^wGE-H>kb9 z!9hq7Peeg-OMZ2T`V&FpJBf3|s>_FYsECHSDDhq`Qp}sE0KYPw`9aO6>sfqAiYw6w zo@I zeMPe`BC6Pxf192%6a<4NtxK&sLO_h8NoSkp$FPiw2#U3fCL|N5*VGpM-pgz0BUs;R z;Uj#Ij&(_qB=YxTh;|l~aV>}yhF$3qy{S41AzV0g1_j)zP<@NF^+ywUBw8I)v$u}t zcNqAOp|JUe67T?!h>plmPas)wtR-5sZ>WW>r=fs4cr?WRZzPG2&#}h@@g=cf6w2G+ zXCxL`!BVx^6PKz(VdA=4EK>mbZ8yOFsrT=A+&VP>%X{PG!4HK^cf=a%^VAyT@vhT{ z#jVf>*#wYgZU^)HRypALty1ulntj`S#jX=?s}%rdPl?nV6t7@kenTxmHeZ!tU6-Bj zc}tJ}KwtlI`Nrhun*M>>9rAKw<=nMChI81JYYeh@h4Y}Y%mG`Z=l}x|~tz&=StWZCkKbP~KB9}-a5mMjw@myr$qbKJDXM+#ky)}$e zBo{pD|F008^VIW_X8=`D*t#kgsuAW@{^%c(My_ZnlILbF9*FaSR46i#qR#i-JD0ke zzNsyvzY74Uj&rFkF+3B9NSQ!h+OmUv&&YfAqEFxX;x0lIEvo0=&9DwGmi~FbJNCy< zHfY`Ytapt7Q2B?>dhH7UdRDQ|In?tU18Cb zmBe~}?Ad8?VCxd0F|efQ@y2pQQQ*d}zBN_*!Tv zQZ%ddposG)lb-mR=KUWEaTt9#phRJfb2geo05>a8XwtA?ExBmQQ^t zd3^pVe=2W60V(%3t6!z_7ul=Oczip5>Rq1{-O9U@^jtos6G9E3{x{s^i}>F3=1H+e zEIZB0MYw=w4~RoPN5+>nTU@tPighfj5&gK+u6-V%D4+3O(R}@V-hMa6`)ex?#fMIE z)45%x@&2nya@mLcygWAP_0~i$nkezdk0ZJ{P_n|vS{HPaLVM_d&Sa~-i zeu~9|Qwz)47OXZQBuuYC>+}s)2$5rFqfY#E^osBevb5KHJdXX-NQ4;cw(_w*cy3k` zw_A>8^f(s(T}0HR`b;7AyVIc;&J4+5%hMqbUXWWZ$@Ry*_N5exGIt?QU(q9Y5izAQ zMRHPVzCMo-LMg`S$Ldx|^tSUV?K8`d<@NV;J!-qmM}6`CnGmYx>J0JmZEtjm#^KMM zc!uWNYjVX6q40lQBv^O)_+ENStSjQ{Z&cEx{no~0_<-ntD#Tuj_ws#p!cR+l`1C1x z!=d-sKe^X0B%1!p8$yBY%ktGK6hUR+Xo~a=%=1kZ(72V)Pn2%|D@C~9!MyS_U61+; zwKbVuZ?NA5)P#A9YgOTa&qst!E%v}r>ESuO*6L~+x$W5pkk>mN_5b@KbQ0|A*07)c zXR(_9k*2%l)*aFVQkn4HD9%$R@3)nX=VBdAWTq6U5@{v4! zKxGoJY2e?V0{VMrC?v&poaD!x77e7k@7-=?x?Fcx>U8eBFJJTc`(#DXJk#=1d=~~$ zA$`A=Z|666ySm&dUONcTzmWDcmdft0pUKVqr0}om+vtp(fU8MbV=xkN#J$pm8 zWsLLtx$*(dm7_eyd3Sa=)bx9Ky35}y_a|rVX%ePo%Z?9H_p~B_N>8l=xukJw$_=cK zfp@P#{5|I;)gIQP8zO+m*laSO@o|${7a<3i_ab_4 zqOnEUdX#qe-KI-;nNOMeLs>kOCT+^LJlmv9?AquQzK8FmjfP7^{ z+2Uquo3h2tSW&T$|s%PLHJ zV#X(ucz-z1JmAR`sK_#;NY5Z7DluSSGPZ2XNX1-{X3V%a0HxzT2JC%hV}AqYRuMlS zGoS!kxVtE)j&Z38=3|cHFJqZV6FVP(0Ckhfscu&w#fJab0QE5*0C5NI-l!d*|qb#NpCVI1I+6819_^*xF)&9&C$`)AX zWC8oi7G(m8u^^cR(JBPUy3FiG)7Hc7Sw)4zZOZodMsdL;3;0ivPx@swoQe@;%eMjk zO+D6wfy^kQ--F^h7W&++W8t_hU(>WDU5A{{+><}W3&s)5#hV%$zK;*L#JZwkg$9DU z+NzA2DLs2PfF@e(ByIqY0E=)r7HLZm0_ca{W|J+g z2Q4fxPQBJ+%l1?Cx5b>9#j)c54dM6o2WcItsk)<KH@!6|s>ONnayF`G( zdMzdX>vS)&2VRZUn2oDimuMgJA2G3HgoCkOO}Aftse$mGURuj=pcu*|cWAu<%_M+lH*CPdv_7~T!9r{Zmy6pf;BhdPZi{N91Y+ODpsBivb>cqrD;5n9 zzM@6|+{1dO6>GXSI#DRKJpk6J}31ZR;kJ?|Ub(-uUAbixg2(Cr| zG686bq48wW!OAbxLOCc?q6$E!=&QI$4S<@$Vr@VN5>E;!#v>jRS4kCFH!&%r#%GRoOD4~SaBd< zo(#sYob?1;24*!;BMa+vj2G^{zXwa?{bVmBU}m?qn-JacA0T%1UbGj`I&vJ8>~d#N zi3wmnN+&-U@7V__0r|h!dDlN8%l(~g|A;J8pM57efMx4ebfE7W%I$=%-+ytOmQVy3i-N?n zw;di)eZ5Q&;IyNAmIJUH$HZTel>tI1Wcd?$tZ8o|iBGrN0AO0A9yE4$vwduUvup=| z{>~ut2^h-yJ8(_Eqeo`!YuekvxEu~g0`Jj&)ki%y9RMB2%cCJ&px-?1f{*AJ_2naW zsh$VpxCl^&Yw5hhp&w-IbX=0l1+4%8PZSP-DO3d7QUS>ohnOhq z1*mF^E?xKfGs%n(g@CXT+l{79pz`L4<&=mXrm#?r8dT4Ey+7jvXz1~VQMW^MuIvK1 z4~rhkYvn)?A2-WDB>;+(BEo@H3xIg9A!bvADu^mE_(f;|g1ZpoeLn9JErLk|&j9fR zax4?C??tfe)xRWpJVpqR!`6O02{r8;gn2-6cn}u4d=MY_^t-(-D+cUDyD6SuypzHs z#&D9VnA&ke$n)^{Yq%bhi+i|g{~}wsAMNBJp5GIbK-2K}CwN{xdXC@+z{qjxLgDfM z{^S5_K$O1#9xLv>l0_q3-uxj0_&@*VJLyrZ<@uX$M~A7VpL{1KK=h3l-;NLIb@|12 zLX!J?pWcUDZGWwR%c}PV2jDl0_Wen~iZ&!y6Wt2S^Y{s(d6@J3ifgG$I8Hwg=y_zF z-Pp)$IH7Vs^K%-H;Vyo^s{vxFpWyV|*VNbJBrvYQ1OTcC9g?$EFLJ4$*-d3wc4tttdFdS21cIO^%dVzv25gfBn6c#n+@oXdhOb<9?^PM zvZsKq8mI_>DCU#WS3ujU2U=GH%)hwg{dT7L_o3j^rS;g2sx1J6t6rx<{aY*sh2W4b zInnuXi1K2NPywRlbX}6?Ew@!+#R|V9d5aIjA|m-b#JYHpae2RY;A5R0>|-6;7nKtPoKIk1jJ4q1AK~4f_?0+&(0a&BHYA~C))UTcw z0r!06AR23We`gOK0RHz6ccNom{+FEx5n1&A?1^oJ*7#qaemgy6ITn!TOPa>||6kk= z2?+Sjr;h`g&)b8;l-hs0^#BJ_nb30QL(x>`0OrS^B>5fp$4^W`O}mq~iUcc=FH@4| z0^bGMa3>x6B*(h})u`f8t(A84R_(0V=~B5Z<#oW zN8`UR${^3nV}xGGdt>lh%uh0+B6i~ng2o_1f zjL!(0_GDz^jHx9`_t4LH5CrvHfK`e zlgC-TVHEhAVo8PwtuT^Q?u!+{z<*aJ!lrdGqWZ*|QPjUp06g~l(M$k<`EH{H;Cw|8 zpNDGTL>%iM-{Jq$`4aIdKjW@9zd-G3zIp%XE26hmU#9roI@)t+y`|q#uZY^?G+ei# z1{V0a%5}u*CX4D6G0p2<#~w_Q<-bGi{Iy{D*>$c!f$mYK*|lHTK>saY zH{^9Eu>ckTo)dsBfaUD^OoZok?}7!!&!lqON$NgZs$cj#wV{Ctp8*8o2PydgVA}y@ zJ`(#o*^~DwRR1k^>%!ygYQEO8?Vd-qba)j3`QN-i^lxRoLi1_(Fz|2rnWlCe)i1bF10^fN`;we+y2BEbHA2^7AWaP$NDxkgbT4f=!I)a`t%8IPQxrncDFrIV3>P zS#g_C`1%9UwJzMxRRx-qhho#fNzbzYhP=H13-S%`Rx73FESKt`ohM=!?btNU#~~DzSV15F;JRNC z@C5ME#n&~x;52zjp6I5h3xyix;7Awd6*cZirPue2noPm`+#^B!^I36NwGM z==`O-0lE3UOCHnCu#7&(HFQi0W6li#Nx8Ri=_2>j^V#!NX~s#!)6dJS=ROqC2Il;$ zgY%cacUu=|d|uYn&d+oCLkNKm&YR{hhEN>q%|6bGVH~m*2k-W|U|g6FjN6u(hi~$D z%3sL1Zk|_bsLQL)QvR?UtJhc4*ic|S!| z{ZjPky3%E$fj@3&;bj-gT~B!gqvxrZSjTxMWWQtRNw;oy;>Xi))VgzsRr;yb8~*J*_Yb zPoUS^Crcf~6B!e?&^ThU$4xoJ{^5?(twK@Pt#iki>AC+OJQ(v9iG_kR8}s=_+G156Yz!ed6|Jx4zjWA-#;-7wu%SGb;>rBcCks>0{K&=1ly^^Us0se``B9crK#%)=VUH=*USDnItWg=sPQyctOmrmio z@)Z87j0bwgzo`sl8A*N+{(JIE;J?hD1pccG{wvWxbpq6X0RAhd@ZahFi&OoFrvS7s zPvPIn^#26^77yXy!s6eWtJ3se#VjugS0rKc&K00RV%%sph=8l%hs8E@DuhM>A55}_ zLBb6x>MS)MnivOQh#IA`q#C)SxQ@EGgNYJ6uoxf%tOJfpaX)t;l;BUDSp28Fp+`i{ z6!kt?~Q9tPT!?SjeF-p}>fg^&Ml7ZMNo#B+e<|ENw`h~0aXg*Y5h zw!d%WjmwS8LR>(8xW5h2XgAv8p>%wovR!c56^eDaa*~Rb@^*O}8`8g%_vpi0{+)9h z8{D3Fg8*6akC2bpL|3oFBY;iYhUU}SYtCXdgr#RtAK+lqxNt@0s84;?#1tH>q_246 zIw0!YaYwa;EaE-Ucpr^WaaG=wF@FfDP}tZ|DeAN7d9m#HPyk4p9RPA`RX&(pHV2by zmgfig5t9DFZq{^#;wy2}onhBN`i|JBB8zCj$of4Ic@pCwi)jvQQz$ zlT%+N?f@Iku=%>C^X%eP^+m^6O0gx;O35|dQFB-)o-2DrY-8s;pYudB)bxfoNA-vm z6EiC)HAm!HU$HgK3sk~-60oJI3e-T;m)YXi3B9Fej1Aau22ZCPFhH&1GDevXOy^4< zd@S*LQN~4(BX+*-j}MnwZK1n@fYhy0s2CrjSv>-f<2S6L#JX=@-iHV)s1Czr|e-Ib!%k=AU`vfc`5p%pIedOe!M5#txB&3 zMHmmU&C8_{fM>C!p~qO4g95;E5fY#T;2|xjyfX0t>?}`Opu-&e%Xzow3RpNtGK6dO zFBY1Px<@kt5q63Vbjs|Gy{?1{*uEs|p_2V!Z`NYRjNYs`O z21fvf4}wvW12~t^WXyezCUh7dyfqf!|0knUF8L2WIZmOl&;@{*QS5M7kmJ3!GuVx2 zTz5NrNgf$MG|;rOCjcb-8d!=jK5>y!`-gE(<>3J|oyX*`J_S&j!J|TZ+|PZ4Xc$a5 z_C3mZG(rFJAkXl8+WCO$FM=YYdgaLNS7MS=C-ndrO$Go;`vm~PVxj00Rl_m?ohy5a zXlCTRtp>)EPsXm#CEoMiabR^4w0MCQBAkRLz*oR!lM!wDS+K&JPM!T3N z$NDZs^`tZsP-N*t5gMF>e?7D*1t%CcpZY=*-3*OHWOp1MV zktp_n(J}Ho3ApN~1}wz_02RQ5j?31>je79e9F~T`%weq?6AD z%-0OGT?}%8`5);rT*5naUq|$v2=e?aLb~*h-@>>DM?0maBQ4MLoQ~rC#IDm=-vT_( z{y{|L{cIoW^KQHwLs7-g0d!6XR`Ib8i*W+lGcoU5$B^5}i!|Ox!33`7cS0>M0MPaP zNg8E(UE~+jhdCkP~%Ty?! z@S<8J(YC_e2qo z8PuV%??8b;T`oDKRHEh;e|NUg?lPkCS>Qi69=Bd1;Gd{iM7dWk@V-iy0}f49La|2% zHTHz&@5+~Jzo!2?ckK76P4W}Ez8($) zU#j&uq@Ks$LH2;hpQh*!r|IiUYF?R8g}A7JQ;g4lm3J#CT>0Or_09w$rxNicm#cjo z^k4B%pL(M_*_ZehSev5fCDeoQU2(1gu-=xifS%&RmcJvPtPT+};DuU;zZXw{J|!$a zQxw3z49@_*>7KFi$aY0Q?&WWsK{dod^-?vPx;L~`j-9kl9Nd*JR6+(C%fwhVPFvEY zQ`DcP<}{rxtdkO!%evkOF|&s?+y43VJqMn|xT1D_^}lI3Ale!(74E6 z{b?v9ZPb$wmLC;DvEnYC+qYyJ-^CihQoiNq1Jm^Qu;ReFu|OJmK0H8df)7vBRb<5wZ+%Gfl*QqRN-TA6<#oj$X=Ci!20ox4g=NmKMWe+4Ow)KCQBrV?n z>hT`Ei%=i%z)+9R0VZQsSnvdZ%>bbcw8EQf0MPP`@sP=M`<7xojiEpQTRhotygJdu zS*irK|AwBMY5xQ1n`)J)d|TeF6a5cP_**`@ACeA)P5&S}l`eq4>rgygghC9? z$4e_e)6}MYwWShPm;hh@-sv=+X2s9OSux26XUI3p&-KOt<9l`HfsyNk^^D2*{SJa-kNpLIif6W3-3$&VoZ` z-Ah;z0E(c0EN^1oe#UvO{sXLMuU4k`5ob`#FBCm8tkZ$BgnF(RAWFX%i-h}czaLFG z=I2s!s8$#{IDe?0%NGz5XqoyoJswa5$l$4CS%h2$ZHYE05{E7T{f_i23HW+)c1Xaw z2(TY|NexTJPg3Jawj&ZK;_~@wUtwOUm>@UI55MsZgjl!=g^fcRd$iAKT|6%`?0+{H z@R!$&!P%=SW(r*9rn}!5vZ7$)>oC;f_3fTHr_I0*%Ts9Nmgt&s6+V)~S`5Xt&V@eC zmzEv74t`+B4S7PlG%v;TP9F-=s~4!;c0?WL@v2t}mTQ4|qc)uc<)KUv@-`9)_T5lW zaD1%*^L6wmY4}sXe|U~UT_ny(Fo^r!EXmWR>o+2!Kr&=}!i1XOaobdh>f$@(rs_a( zqg&~bfu6fTzjGEGQ5gy(`u|5x&xvngy#B)3uUyBxZM)ClxgP?1c~`tGen}w@tAA6y zWeq(IaBh-yZQpPjk2M~n5N~C6LlCA7#tcDh%0UnFAd+6AhhgzU3HD(K_n`&C%!3GJFkuKLl!I7?aM>-x zeHel;Z6nM)7*YS}{Uv~@tB{}bp@!xVJG2|6cXqt>NET z_ulG1J=6al1MIF;;2$?qs63(wWi&@M7FPNcu?#dtp`*TpvNV~?PnS!nbjYE@ELI_~ z5>QMy&M#!+hP!Kn%UC2=;(TEgxa3z0{xrDQxBM3qsvD_6n?7rdyV>a;EnWCC)(vQGJtUkOoXRl;!SB_ zA@;m!x8WROh^Xbe(g5h!SDZuaj~Ds?-c_?H2s(9{uh$3HBeT1lS1v<>K)k6q2dWnM z3hW1gslNvSgdFP8dT*uXnsZPDPz@zbp`D@_5IhaEkq9`~vOo_Z5%fMm6ROV{3zmus z29o;k?L5Fn*nKP@erbli*YSb!_q_>)RMMrm(x)lTTTlBG3-y^0v$W_FJ|q!q8vHuM z0^^hfa1wf{3nfjiqAPXbzi%RF*j-=)>dKt;SFZHa5Zg!Yg#}FJ1_1ES{TAm3dHBqMXTH{%ChRfVB=C2@Mg$P`Z<;sT>Zea0F7YLlsHicko(6P z0w7o%m7u>?#ei>UyCVPLHN^`%y^}&QKsI{MowzjJx0P&E+AGvBbt99aoi&cP_RyAS z#|2!*yk|yta){;Al`N6_!jeihZWC^&+vT!5axsp7s20MRxnMxfpG77C(9ZG_K#c>C z<68m%$C3l!uFo~=I}2bb3u#|#KgD>TLsPQvM)W<6u}=uea1s;&(2ji^|A9ZAW5YRP z3sZApk~<14=|*$rlA!oNV*y6pIfW0?9OG2kQrZFjVO0Y8xEr89s%WB$07zVhLVze< zj4k2ACfh0SVUdA@Ym0$|RUX&b}EEC7Fh)yS~CI9`l80GIPg3*c#yb`fIF zzXjll79TTRQ2jOl)p!=SDF8tLD)T`d!NNUnv0$H%=V`;g@68ZHd3H4)H@T<#^K20T zP@OgaTozLR`N<--#FqAKq3P-L2>{d2r%zH?Xb(OwmN9;hnO3P-aDELVCZ3Lcy#)hN z42%L`Em|Ij$qWh_^Gtx{MKXip#9}!687x<+{waXIQ3pjmn-EqGZ7i1kUDo6+39z&* z0Q|%N^dq$x9oSR=bef8WrA>`k$WQV6sV&7tx|>ie)D^-PE&;HUaG8XL=W%E&ONb>} z-GPPj3mHFWj`r&8N=1P<^eAu!}uNWV05uVROeIEAAL@iALoYMqt#{G%ukv?ac zO z%jwdWlcwwvPYbrp#e96s<;8gZG1s#w=ils71|VlSmuKVwQ!Y;zX#av;ic2i;vMB&? z63^RwPxyD{fp+lq$xXaqe#jRI&L1@7BJgFg6h2K_@{}#%Yu*RW3+>22^4My`h1<<$n!qL0 zf@g#riV^V*bvgIn1EPti@y#zfVt$^#-Q}?K|2E{nr2Y~AZqHo=3zjnjOYwHp3O}E= zqHuKB4qAlpp|OFy7tPyl+)kY+dPJZH;u75+3gB-qRu=bIw}M{?e5G>o$TFWpj=2=? zbyz?!T-whee+8JYDJ9)_aBGwjgkBl+v9ZE(74jVILZnFf(3na{8Jpw%d=w~gI^^dJ z?H@RG@lG*3708Frxn;?Yn8DaUj(Z8l;j~LdUUwp|i>`tkA6i&wb<~cbfD$zskAIU3 zKR0KK6nq|e%H>i0G5ETwA$RKG{Ci!5c>};cPi_bb0?9SCBG>TVTMQ*sNPSWJnxQ~C z^_2OCz&Dd-0>zkQmRpv;$rmvcM<$-8z8pVEU|~P}B5eusnLx`gO32~(i?qpEPV?_L zuLPZnBElEZ=Lz_^m?M@wN7M%&W}-MY&*vFvRzopicIx>X&sURngy#SXh)*W|`AEUf z!q?+#JTEr`-(M&qJo!y4o@jpBGCwCb-|R~6_bg}rZ6>qSQ;aL*^8S$yksX3>Pu;}C0Q4ch?17&*kc6o zC;WA469qWP@iClen<-FTM6ZI%(VAvuiVLD5j5(FBKeSFoToAO+(d&($MA3i_#w-5BfGM=1Zq3;=Mv z14}mm)h-2qeu4h}*tbA8PFt^#~|HhiYV?eSafc%k7pr}dGZmMrt{*zk%2OtBM|Ds4s6RZ>O>F;;xN<1q_ zhzE0@PB1?I(G;G-^50DWAd0H9H4pj{B5J>vV%|L`P_X=u%z=q1q$|p`|0U?ZrHO_z zJ5fOUOy-@Yps*+g0DZATY~g37{e(h##HuR{{Fn)1s=rRB0Fq~PMa7rKE{#AB)`9=^ z^Gw|P;|aF`q%P?8v;&)LmoVwgK5&6Y5FX!rhO1f{+qd{V9FrWbT_!`YHFHKG;zp&=ni+ zzuf{~lT(Xg!~Bp+|L^3tEdN6qnKSUs*nHZTSjq!S+uO1I_W;0yo|#wfOtB9ze4*G3 zyqmu=5foYegXez*UTsd>()M}$g90m=`3B_Q!~+M@t%^0__j~RD?luEYC}8L z0lJ6gJAGd^e!h184*;%9TDxyAS_j$#-I(Bc0`G->p8?$eX5ts4ujUEBNqZjmE6CBh zKNQ82+vBml9qZ!>psdt+Vj%429*9jtJ2oZr&>XxFYkT4VP;ZDqzil3a=YlcGdgjbT zTjY<)~P7|;CcL^m+z&#&!}AIo6UTM_c|=j zX-_RV-`S0XpI?Z+vPS~U@10yd#f)VA;nwdLE8Q%YVQ}S$Ey}$-hQd$p9VpN}Z~CPf zK|cIvUbhB?uaIslME1h(L2+_q&P|N=?BB_@@$D9m4Ftu>^hKt*Ik@xRxxeaJ;~qsl z@k~&vr_>{p0#HtR1yf&6_&5#u4C6iQLQ(jE`4pb+K60-Sr{A*TEzZBM`^{3W+|-Ql zT>lRBOzBNh%X-ES%vtXc^8MNjC|MhqB9vK;5A^OTM1gpgGE=`V&vNkGWOt%19#9gc zBcTYXRZHj^Q<^jE%Zo=3O>1&GxlP?CG_fUI;iq>91_0%5x&inftQ{YP@~!#1Fo*p} z>O=eXY1Er4;6Ksx#@fD2=}4*UuZu^NzV2hky=uirxA<|mIRrp>hI@B=W60~WcK|tC zxi>W=w9L4pKPBqF(m&`Q1VhjEigN(OO`kIiRQqjTJy2HxuTqcKimL^xvG~`M;%ETc zqZgupe~Bl7jrf+P;L>05Fm2~1+$!K&+J2?M# z+&zQ;(o_6*t@fYm zx{ZIkQsq%WxBBm%=|4S#fA;|N%TTCAyMrLs(_jzp&;bSFN_8;+*dG-Y+Kd8M6f(5N zpY8N>77ffzM4%L_#zcXJ##9*TFz(A&8+BZuzHz_a9$_Nu=kx$@#W`pQDFCi9{ewVTyv&)XzRQ{D=B~Qjzv3KX zo=6Jyh#(09!5||x$@LvykK5%OT$=Pb?S@z;a^IlI^iQriuV}d5eVucl4C@Q9@ADuC zY*A2HZ)c#IG?q!wY*N9jnpZ&)V%~Bly1sk;;q`rXZM}H6ImJADMtuFN=2dzf^Yo@U zBP0bn&jH;(aOcGIuFoV3Km7pA9JlL8q0u9AY7(ZDLXcGyV(&~=u}eTjqiEfW!L{1- zN51|MVn7b?C|}a08Lry&j77&PHd6(9rR};;#m)cz{u-T<$cM2>n6gb4NfHbH12;zfr+98JR1u&g*t(-; zZEsIDuv1r}?<0*#UO}*?c0#!THyD@9_fvq!F{$7OeME(BXcER7`q+G&M+N7{RAL?_ z{m$(_l~T|+H6tUI&O-w^p)Q?=c0wu2%rEdj@QfnBh{m|n$W76%69?ekBoY$B#Oe~Y z08q+F>P_9)s%HR~pq;ss>oVPFs7whUbc*`9J<2~88tULqP~FfRS+4g$$MHxd?6DhD z%4Kd3fZnVVAeb!EQI}biRWTszVOoE!D?L50M=h79bq0&mbPiYLi>X*R*YSJ= z7thf=Z9HAW(-$xmuApQ zg94#aXn=OA7{Jtw^gX@@OGMEuj}+)nMAm?wgF^8@pQi~^{3d|#NETWGOxfJY!me;r z^t13~$O)TRJcqWD*z&fpg!>L{4tX+m;@P5tEBUCISn~9|8A;6a#Sn@tN4{KmS}!6T zKWrudvd`-TH1`TF1%TFHbg8F<#kcW1oYYf`*zz@i%|*5tGC$Yn3n-4%Q7sBEmo+Sq z7e`G2;E{n?wx}J1u z0rc+IQz!&R^Q6f=t?F!u~(o zOm)3HAhE2jT**}4OU%7C#qU!*4-=B(NBSXj>_(KzaZpmln_W-v|gl$ljGUcNKEew*v72R8_PQBP)Xad~l7mtE@V?kt4@%Q=^!*p`A;&7e#0 zo*QCZ4;I9b82R%`%zf;CiU8e5Xc2LJdh2FH5H`{!u=4 z16`MtxbLxz!KalI3vF4|t$_a!3gD6?O(<~y#7!z2zvdDEO)fycD`D{&Qla$MG$jdL zFr)$so0Uxk;0JxrT@j((2cRVdm;brA{HGZ0I>YgE-mt^(u_y@8fyfIt)bGHem#F3c z7#5`DQjD8yv`xj8KVY*Q?bFZ&bVi9-{_6$=g`}4Mq?Z4sTK<=!_>1#Dpt00T$5`+6 zX#n}t&^OFLWBy}4I07dC@z+g-jn8Qh<3qWD3vYA4G`Rl9)r($I^Idd zCH~F`d|jDMdqL5y@z|~yaIFCM_szo{1|B$8{E#-MKQr(2Dh3oO+0k+7g??|Lo9EHZ zs4`H*H9y(marr(y=#RI?kk{Yw9R4K~qP}I0FrE+j4Ybwe|MugUF9ir!maQpmOK`z0 zfRVv^Y(v`aiC{g|u5tw|)Q4s&e1ZAc1UT)RH%umgFGb2f@it(6>o^5V>OaK>w1$S* z>>6F$7k>Yigt|1ZnAah<>vc~JA=xreNt+cI6o`i0HIa;uNjA4b6P`m@mSWyyoTv=# z`3EU%kjR~0sn72Q;CCH}Q-wIZU+~_be?$WR289H(3a#;HG)B9gGvWC!MK1O9J-hjR zw%x-9-sfEQTxzlnfd6PSg`!?XWH(i++IX+wJ3GqBW|aicmf<;~msXCp*=1g#b_w62$zB_soX(7t+@D^#SCH z;^GhrXm=^v;(264a{TAtn0HNy{>l2X4&!8lT-_WJseLMsWq;@|Ox_bdzosGT13I7{ z2txT0y$1TSqAL}sc+g7a2NG1)G`38n>2bAFY*Jy0g4g8yL zQ$z~X{J=cy!800-`Tgo1!*UwQOgB6a`C6!!G4PWF>#R5Eq_+n6n=6v^Na;}Ny24Bh zIeK79ywCP2QTcOCw~|M3{(W7;AmaMzbxVBxxf2IC_|LVT3;=j1MM0-#M zZmak&)*rxs1;^fw{|f$%`>plgBrf!yK(+sFt^X$UUlaCWHsar*{|5D}`cKc`-#uTH zjfc{JiWRy{%u{`a90Q>PEReq|o(_}%;()(oqGdQqLj-8dhFCxQBCTKl?_#yEOIfFt z%eW(9+AzT`lGq5QRM!vy2z-gu@;(KLEm}I*_Z#odF3iUSp0X_J~JSX925y81(zrQ;P;4LYJJR*a6i31gcLw% z0Dpe{0%xK-GtLxT?%(4~)YhDXKz{k}IEV9H%UNBf@O}H7gMgY>^T+dku;7=p9=ae1 zL{$V(K^qhT>X$i(_Syr^Jb)s(-QT+ZP2T}P`w20-+LPU^c`2@`RUUIO~uu|$s`m21i`DS zaBx8?ikL)x0{JtND*(Sa#Unk@&jmbV|zd;EUOZne??;x zi;Gh|KXU*c+#w0TSEK!V?tltxtiocP9_T{hAwMNd>69k$Fi_z5V_kL>vT^J9RVlG! z)g_FM`g!woTO6R&5 z8W912$#Gp}GjWBh@^zne#{l4rL_Vpfl~Yv&i0wcv@r8>JD@H8xZ7Q*PTSEI(CaFu? z3pdtzrLI&(0JXHYg}C$wjcp3KJ#kZ2qY_KiLo12^=Wev3vXSeO6>w(p0<)O_XWfLU zJ8+dMHl&@prpEQBj?{uy0F2BI6rdP$xjShG5}SKTT>;nX1DC@x7w2_XZ4Q9sqM0&n z&r~sB)RbK$Kq>%}-KMkvQs*N8h{Kwe1z)#JmxP7d5HZP5mlNFYa0!>@P1X#X0>D$! zlnl_{j2ZZ;GjT0FFV(|9c3m!+Mo&_>xMn~pK{OZW82_W&%NUB`=( z0o=uOkpsA|ni7_tP!w3kbP(iz{iieNrzAbE)!SqF2XqQ_%Od-v;gor z&lR4s^oe1yJ7@{xUMx#X;Af0yn=LEQyagY3$x?vTq#?}Laa}QO^11{demI|C-mAr6 znF0XMz|SO>%I&zR+9<@jU!FCCw#0Sd|HWihK;gynaR&t#v8bQZEQf3Kcvj$e0*ia_ zFK8unp6l`WCf477)DZyusO9p>^^n`Oh~}e3!U_(H9I?tT>M`1ru%ZGy9pL$CQf~oG z0ERzrnIH2yMSst0%x81R!8e#L2*+bplsIoH(1`&5?fzndaZUU@^Ffqr2lmj~cQ*CMKDfHFTvNXqXcZCB3J7M@C|i^_=w#sJ69 zy0{}xW6yyF-Zv5C@xGm6JjP1Pu7o@uwiEF2q?HgayGqZS6o7TP6#2p~=SwKK5Yxu< zr6>k?KF&o!perDkV*ugjH|3JcG^d4zY=9g*^75H!v0#1%UoCS_v)S9rLPNsD@EG{H zgkJId%yK&RKs+(uf(oCqoX)O))TV*X{CQBQiuiZ%`Ooq!rBB4T> zfsJJxpb$4%78vL0QatD!sv=g*d<_05A#a8)>gm|RAKzJ>0_vD|s5`DK{PFv-C=}WP zF8;$N?U{Zsj}`c51(Q?&ZKe!^quvvX_l+Cd6I)PN|6RI6{2ti>elKn0BK^KeP)zmcxDL-B;QbsSW+WuXH|$ZDKrytoBMJ(d4=GheUqbue zw0n-=86&r7hdXz&5h&?3bK)Wa`f=T>4zB&h zygwf5w(UD^pDL_>_gsd4h(hW^7o(;6ZQ?$qn&?@}|JxSkK|z5cSdNFZ#~uYhMPB@l zC&EbxZ$1Hvrw+0p49zK>L-uZ*zoj_{%P#&FQ!9C$1Ei{jLb}{f|ne)YD7UFQvxD zcGImuGLptT|21L${1Z?LKN;Epu$S9`f22tJrshxTVggqYd46eB|U@7+{goPT1&^QrCFMmH-;n3rkLlXdb#%B3A{ zv}L~XXB2aOZDk+iLn`$5O%{{I7N9$vuk)@h_;bYMKX>ExSoUjF`NvEJu*ZZG{6Kr&ryQPP&fIV_AO{!l!@$q%L1Im=Y_+uStpjlyqQhv+d-0@54{VsP?EvBL z+=DK`d;bGB4RT|v0>b8y04S>`k`PMd($joXI|9&!^F4L^K8eD-KM#-`o@2ef6pL>3 zYf2C8m?Y&J_-8^PeMDzns;=1cbw0R7H>DtN{zTq8?)Nmod+UGTIoGts^}kSk&YXfdB33x9&Zxmr5#(&f89yhmG^JPR;85`E!?aEC>JE z9d?QSJ_-P*()Htb9$kWQf&2;lb32*M6wd+r@e%KkV4m=Pe2xVEc3vJ5$vnB$ct=}3 z5Zsp2t;*@&`gVu{+O?T(1pK%6_xHME$nzEJI3;@DbmR4!!ubHAb10OimZV*@sa=&Q z0^m4M7F7@+@%W1M^h0}TPF3zfWpnx zR2ct!MG5zJpg|#khBTmHs5V8Y7g;C9U+$XUr0eTeJ->ir@v#-aar9K~1wMW5GoM|lqAKcxkVDbO>g?_*b7c}&9^&&7Fj&o~VD%ZO>3;-nt{YR^DJroBpk*<{M zDe;s-|D9O<#ZLN}f)SZP3t<>smm0Ls6lw`UYyB@|^Gw)`x(5RnvOjKHNw-_rr-AXqeJzq;NJF+qBLpDUu51~1)vsRck!Z1ZyGF6Ubs zL_vT(<{T6fM6)Sq7+GXr@7-~Dq}>zKb!l1}hJSkRDPNNX;8 z9@7=dDV-RJ{p%qxSTtqUQ+6O^A_&Ud$-+Q%iq71H0?hkN%s%ZK;hxNl;A(oe1;B07 zZh-41Cd0H=rZ>mqFUU$w&~hhjw}^3aI|=b>6a`?4!=9WkZC(;P9bhYbMAHd~T}7Elii zLj?@RpvU|iFhwsxpYaS(iN&=YbyKd#PFh&NlX@sn{XE1@a{{cT9f=14)DwFe0q`QG zepCU(``X4$0pK;ZOpm()Kxw(0qWzP$0^qtYz-l{aaQ*VM8Q{FCiERnb00aPi?rA_U?JSllCR5}0cfEB%!vY3#eCW%44B?j4VUw|T42|2*#wrFKeH)f=KlyTm=mUa zT8_;C&F=)E@5norIJsH-ir}Si67r1}c#%NF43V=HX^>;#hil!2m@Use`0E(Nu zAplDlm*t^)L^x~40Nf_aiR0_f7Er`!eG4(Jmo2FEcfs*Ji5cBYXXQNc<>{iV1t5&9 z0yS1Gm~APcGeolyF8DF8T()IPZ3zmO;CS2e^#r~}64&IEgPs#VXGnoUF<>HPu?)3i zKeF&V(BwRCfC~bJ3-wTjB0>o{IBt_xHe*WE%lAtam{m(s$i0lAQz@^G2Y>?~N)riD zU}0%*sRh98G8?rkMV3+)a-gvzjPH5tTY%6B#ZrLh7(naT*H?0x>w_ga#<8oHr78v_ zHU;07;NPQVhH})zDARHXMUL~?WC6f*mH;T7F7vMR^kO+~dHy~BddjiDg~knzH;?Ay z+S5gSGhJ{!Mg2Aa+qljIpqzi)rc7sl4t|SgKLt(1@_vyk)pAqS9P1q};5(j<^Xp$U zxu+LjjAqR5{=Q4{G}YMq7fsTkJxft&Nay0I;1L752<<@~w?7xp9$re8wgfFK;d<&) z#4?{?JnBUO;682=(4#Kvgbymm_buwQ=KA*QVXX=qHWJG7z_2<~J8jVpm$X%z%DPn) zP}Ma#*$LPNFPL;0(kRP@P zG0`G)2*oUE(T-ezPz~W#af$1d<8*)xMzrUd4Y85ZN8*~-6?O>VH){c4yVDMUJf3S& zbjYl{PX>qu?YbF0{nftsBql(0_DABqI^D9xe#{+fdAN%r$tLP!SQU#^ms`Pslo<8XZ65x z?j-{F)z6rQY}5C7*_8l%K!d*s>5!^o7A*bc>j#!50}aJOkoU*I;$IcCG7?W#CFrpe z1%tYSA_Pr!h0xL|YAjsM_1K5qUJJhODyDGcU1B{jAhaLt3o-sPH*{;jKj_d^E8rjW zlEygxhP2E0E>5A4S9Z#E-@ZcN*v+5 zp#uNARyw-dzM?>Tp^6AtK|9|*Ckm*0x`BA5mU*j?BQ>u33wzZS|Btk{ z0g)rS(gkmns(Z?9;Y}N@seP;Uh6iDaK@4f5XKEk9WE)`$)0pg`849EIhK(?_M);*o zGZbE7!b39@rtzkirYYWPO|+jd#Y1>=Kn%qo=0y);C>~-qdk`M25#DGcywy_uMCET} zM#Q~)&v#DsEoCXmZf{(qQ#XF^&xsp1@AsW^@clYxrL+8>rx`q4`CiBT>?~@0=Pdl6@A}_7&+`AC+J5c=`R7z)E@XlMUu({4_VD%AG+^0NV%bW^BLMPn znJfUc@@4@44(Oi&q)3c#6SLkGEpg!+PM(Z;|6*AIz;UH~pF=!&$rMijiIX!oEx^HN z)zTR&%#VyJ{}x2-yJcNXcj4Yt7mEh;662Rgme#2E^zuvs-#VTIF!(--^`%~NsI^O6 z4!2DOXqsrJ3fk#yRn>{;QzFMjo^j=n{B%G?%I(S(nJb0Q^)G`dApn}t`^$LmZbI^c z_oOS~WX5w{`JCkI9N<*fw=wR1Ro^U{4oI17C$pi>qa7)9ix5wYyPwFZ#Fo=U360}C z{>4NLGPiOb=Ncp5wZjBK<8=RhOW)698W+q$>2nPCIV;SsXoQ#nbWhoDBGP9n7xdvA z<~QFnNl}~b@>(Ru*COWe=orwMOD3N;8_<@`0eHVh=u&t{g#P>%#Fps*_f>Phpz{3K z%$FWKM=rT?OzF27n-_4q%qjjZV4nP4ljPOY<#4W{-6r30ALH~7OdOSs?(>t`G7Gg`zN(f?dfkowmH6NkniSD86ap zyp2$&X+EL1rtakAesfi~$2>pmL&E(y4lSm@f_kij|sEi zZ~0EFn+)%jZ(bXp^6266)7we(`BS=*H?V%2l_BcA=q0=^i+TGa3Eg!M(#_8*Y8Ud3 zgowRh8pXS)-`W@iUHcd7)dN{4x^F}x-;vP4zh^>#Icu(sBj5y49?1K_^WPOEp$ATt zKa_S$0CYwOrMjq_W0Lpv!*O*MKtDn7tB4FwwBKvyeqr~UdA%}f!IK($@+Bg`Btgd! znourNN9d7Ng>sqA0`qKL9Z#7r3lU6t8}j_+i4$l%|C$+>t5$x`Tr!J7Uib?Euqj0Kzp?2>cdODrjR!gW%z4U|O^5>yFDuX4A(?s@D1z=a6cNDjwi zqQhjUZI^#>(S|UXcZRor@)D(w6952I>C^Zp0qenY@LvGl4*!KG>==0l$WP(FDlpH* zf60>G;lIY=zk%Q#g8vHseFFbg4*vyUe-i&S3FUG9v-q!iKK`o&|D9fclbC1lZ!5#+ z)n5n#L?xKOzmMy$PSoF^{#?)F`m2-m7X$b?6-u;$h=CvvE)Te%9?4i=L|p@dmMP_93|%pg$Fzgw4bAa_D=?s>_AebN~F3RJZ||H^;aVLW6h&z(Bh6i6u8sn#cN0ShW8~ z^|t!H&Huf=US6{KpPBEer3p)jUHrhiV_J~6R0A%C7S*;KXW%mf;8ZJD#|3bDCW67iI&Xsnl+RA&y@*w07-zkQCgMofo@Cw;dTs7qF zXri1KbrlQq>v^@?r2V=*3az{=zCUiM1uuk4&xb-J0HAA2(exM?PT3Xvc(vzQdA6uz z6-;kt5)kRJJaQBvsQeks>kcRL=5V9`=1JFXp@b_W)w>!s#_>t>i?kEx2&CPp)DC zYFz-D4QjFSwS24hDlHJ_3q3k-QQEVjS_T&DJl?<#Dd35hPHr z>HJ~~3%WNA_s0z-mS(1AUUozPwdIHaCMIAc2jE(^$3ZV)3u&!zUW#@|gpfc$KOL`H zsZhSQ0w8G(TU)RbQ7OX7*Mp@P_Lds`t zx?t}+aEAd0l>8K1&EB;@))BZ$rWJ^!$Sb%F+reC(&|3+0>lv1I|Gnh z+SVEI1g)YICjrItf+u7Vj+2bau{~;F{M*sONEMGqTbcp=RaG&Lam^kH;uHBz-6H8N z*(Wj4BpSoA-$LIt2mG3C5Fs!QYRMaUzo37?(5L<_EigF>+2UG>3wDL)YDJR#5ik&2 zhS1|m!67hKicp6DjvLs&owuMzyMqt_{zl&)ByepX6#fZ4u2|rm2_ymM^A-cCc?yf> z?QSch_hGf)94mMVXu{Gyu=?yn#syrFi>zl@U^*q&vba=i;SbmSs_PFC(xO}I$I#!f zB)P-yQQ_MpdQCE0?In0G!)`hZvA<>#0K>MvlqX;x^@&OV{zVmpA4Tm1ATuUeu9Yn& zlCf*^qLJ5fcmNryVT5r)Q9X=;9&`V&gdR}vcry}ft5+Wk_7-!u zj=!&EJg#LJKZ{nup@ix(ukuB2BNMUIiu)NyBGZ(4LQ^dLeaIED1ScY*5D+qYZy%4V z8OP9ki0f|gxJWs}-|5XP#yHw0U><(6K%^8;02R^ardaB3(}HUMx}E{uITE};qDDRprN0lrK z^&+*4_XSl4u=fWL;{fOj0RRiiCoTWIm@WSy6SOBbNG;|6oDgYWFy2@XiGzj2_EjOf{`bPEuK!{APXZqPp6BXat1Z+&)Q_<6{BO*ak-L88 zLcjTQa~*)r_swp>fX=09z@PD_0d!8fvU!&&Z@#XhG09Ka_K`z#&vSAAm*!5+?@t@; z)B!;QK*(G;4M?8pQXUrEDuAABQr?``Dz<3@&xuB~Vdn9X&US>eV3#VA*1#bUTAXT$~ z%XA)(0C1Z^pB+Z794sg9+mv=v0JzT*Fyx&VSGan{b0^EEA#pu`3kxs;Xxh_zS%u%D z=`nag_*x#-37E2g#k*`-d}bmx`848+ciKaO#C~T04)4jFJ~wC&Pr_1Cnq>Uz=Kv z*&D@Pju;pQ0j#5oESTkj8{dnoWz|Y;^{j>Uh83MKQD^dfKSkttUVnn11CV7~`Ot?; zqjxZ`cq z=$#|BoF0chV`}3NziaPg-)7GSD&+V6bnNXZ!CA#rW_q~?yfcd{7kwvUGI zvtE0l=z|-VoJ6~DKj9vi)Edh1B@NGw`gXZKoUoXt<1+wvc-X)={h!JPU2pzUx9~n( zf~$Mf*Q=cxznlk!3*L&yo^u*SO!v{(`}AIYL9dM(&nF;=bmfASV;wzD zz4+NHu@1gr(7OZB}7szhKv==x0byY%3DLbt$NM5D%QJ}HMP&<;`T7M za$C>mvpf+jJNe8O0cZJZQw3q_N^#5PubDsBEBKx81q7S=v^rEvjrt*NXxjI!?Qk_eX{b&iUZIYS97wLQIe3^=N&#K z_?F}yK36`ZbOOi9#>qHw_mfQwV;w<2@GU8imFFor&)2-UdXLUhQfhdX(rH89Pau8t z&9u#9dIQKj#sm)kR44FH6;9y4Fx*t9@!tRv8*d`vw2?9R3?ZCTarz zg{Mp0&p7gwr(%c5$6hD^Vjv+16ql1Eu4d*(_{_voaR(VHZ^U^MO2aYZ1oh`Sqx;ZdD1YEw z3L%mhNDeyS{WkgN*pTmM0DM7#nI^$qg>zi}Q9Id$$r5;+_&h>t_K*_nMq*Vsqa*ip#>$R{jdO=(jRlKG!6&o%F5&(QIUlTxls#;!! zCb~sTKzVU5tL%T#=Ii4|?`12m@&c!MLvQ4mXy`1rqP$TggNOit@%sMHsekf~qbi3O zFm;q?4MR~%P#rpsKiDmK5AK>wz_8YH^>~Y=zErID$WrfCR(mC~OtBAlKF0FJVdAYxV+i zWuB@Oz_114sGZjfcpxCZ6a_3TMb_Enec8162**>zY;JTL)IPmg!-Nx5wq#Dv~T<8El>QkopWBDiSg2>_r*p-#w^T#>Y;2yzC@ z7(iVcCDhNuFiq2##_?{Y9|QPrz`~g9SONfR0CqG*F~@NRNHx)Xe7x@*yLzpoj_5hn zQ8N=ueIQuxooC4DPxIS4(8)X9B!uzF{IB z13V2O6cKGln2_}RTn(E&MS$EO=>brc?{D~_RL{t5NY}02%=Mu-4? zjtD>>z5-OfGH8ORp|aY5iM2#ba8i+kzAByIJB$VJaf=A3s9&Q*dF{~<0Ch`~Tqs-6 z=U4|O;sp%IZ6RiDkS7ulH)_htQF|D|BTB1VrT4b<^SIy;8jUh$S;RaJmN6{l5yE2F z>;zpOzunQjK>uwjE(W#8LoHIeu(k0 z+6!@AP$==35@X!v_iKT_4`mG!p+D$&R_P{PcxoBcGXAcBI0cLT0EDax2rNw@0E9W~ z^@;Gl@ARA z@(UT2(>Wu00IvOH3rU(EhkaG-+-_>xe$+7!l!_H z0hWYVkwKsTQNJ~Khk%Fj-k?4Sl!!dNz>4$xbr8|svJ2M^7^!&Yaew5e0RFY-xZ?hd zcOC%Vu6dw*S`gK53|>aPlWfuzZd39kzs>-({#kh$@8M_lGU=W7B^AuY&c(cV1ek77 zu335us)BMXF~Dh_=-q+P(t48?!H$?9c@Wjs#w}jZAAFI34|5eEG6=wrCZ0P5V0M5! z2q^3c?$_oj#>HQjSNlH)0pPV!d$Qk80nCm_|F*eQMg)+Ts;dA{-bFiAxt%=HCjjct zFNe~&FWS>n+`a%B|HhodeZO1obqT2cvVLP6Js)5+(TUsLvVc%R*OwRi?{bJiEb!Ub z?&vo>e+Ez*!xFSAo`85A>t|(^fDhf$Z}i>zoRgD!Wcvr6lm4=7cYFX;t0N!vTZ3T? z0GjE<79sXPZ@e0}C+7WU^-@NMzgwo=kO4KFI6ztYWyVJBTJ$=Jl{d?J?5gly1+wnvHi{2T8>LYLFugfaM4AyUy7YHCy1C<&f$|wOw zNlt98y{z7Ni2$rM7{!@1k5ux9ZLpIXwpd6Z25j0R-OakbZx^%(~wOkqy8b z_k)xtbi^kCC>`Ml`U7D4F20{H6}2OU@7UR5qMg(fj~0-ds#Z40z^1%H?Q3q8SJB^v z$rReh3o!1U_h8x07Q+Jg*I-G$G6%w;J~yJ~`Ca}vB|Ut}T*?}Xw<+JR*&FnFr`y2% zv)cJI#>=WnIClMf!sR;?pD52)EWj(jN3b6M)AC}M`sp)e{jg2riVDj5DNFL%+Ye2a zH!&Z&aMYySWd@-<}8cyN$HO3 zn>y%Mto(J+JfwL-ugpLc9AkdvfbOq)A@utTUi}Om|E_KqR_KF59ldJhSBl$RHOu0E z0^k-YAyKwX6YB)4os@v;JUOEJ`MM5IU@7Aw%C?69{~Y@0uT0A80OdyK2nJ_&4`L!T zn0rN}{;17NKcflKZaQHF^JKI?R&#bE&A#j;cW-jS45AeG+ z=*3o^%Wv+z3w^$V@=tosNhGvYW_DRBmSg4e++Q0cbhTLPW8HR?Joz-O!;H7m0P7H2 zVzo3(&jB%KC`{@40#4t1=K`)hK3i2Ur$Tg7{O zyS%KF{&)KCic1I)@Z*xMzoEWoG_Btjt>TWei2vjwrBg2U#dW{)G@WO8k|z!)lT9q= z9q>MUOvzo(c$T|faI8rwc$@P~F#nj6!=Knd*AW32&vTxvhYOUPp)YUFP`1C&Py6X) z=`{%ZvPRT1(Wa=j)%yWrm-g~z!58T?lZ{%az^w*~)IiQu$?|C;Ieufq9L>aV8M zU&rRT^@rI`?Iiwf1pijE@NZXt!M`a#M_D5UHxZ;SfINVFj|Sod`$KVAUE>b2>9{J9 zG#CmfKjfL8p*V#nU$8jaG{XnD5$SB$S6_k|fr#v8ak({d$CI-mBW1pu#OUXS) zHt`tX2J+rKB{$%`m{JlKD<{qyJ*MPhpfHial`DHh={X((9*pjfevKdepMsmto=W)> zjYWy6oB5@RR0fxGw^fZ@38^YRc&SZ_?N4|@!!DkSWY|Vb=EWlg3*B{^=$D)0dPf0R z*-3o>0UK#V7IEbgS-xOcWf%DkiDCbS#8ABqxnt@ol^F68iU5*{0FHoiPc@8U%dBn# zK==BSgaGSd{mH9VE@hhpq!&TfBEY}c&eA6yEj*8^2OQ(Ok#h)whFD@XJ$_ybPllZk z69Oa@NRxqX$H&C}LbdQ-?usSZP2DmTvOLZgX+b@&*>b&WWjI{@z{=v*u>IsGRu-eB zCs@GGHb3}*mFKg~Cr7ZLs%CWoP68|>tTWIr3kY}Z5niBOGQPxUQ%n?4sSK=4TG%iR zSk7(tUj<-Y|HHdhR{Qn;7p{GW^<9$Z2HPJ*R$d&0y9B&l=vV%rY<|fC_CLVHXt!*` zl`A|RSe@F`D4)1cya@|D5CKr$Eg=Fljjulsm!2_zzgu}aCIGJJ$4|+E@J83Ca*Q^* z!3VLG%e~eUWo4t=Bst#hwLb`LzSnK+`T%ZryG)>1&=K@!LnD-gNo3(WKzrO5z<=3n zP~Kb?AZ*3T1p4K}wS9fiJfhgj)sFwfw{pAVKMkoIUH_2E*{}owo6p*vXg{%X?Wq2g z%Gd5x_agwD?Gb=j)nH3&LqI$%`vgFy-f%KDX(`%U`YbiO!cNhC4|Pk^b9Z~y4go81 z>OYOF3_9rn0ew+7?#84?gRn>CUFx>!y&J9`)(-%bA5`|}xaGGFeRyyP0X*%Ls`S|v zGD)++mhXCjff`Mgor?1%$&f-V0C10Kfvmr^-`peMvVGJ-d-=V_Fd&QLK|Mok^FfQA zmo+<8cx>_a!$Si8ql5MVTa=>T%T}479Gj&N*(@Ru6WV37l;>mr!?IF{2MSoW)`snY zm4mfIe~;=J97TuJ9!bC54@gf(!5GgOxAO=$Ka#;Fzn_bd3|1c$@P+l1}h6)R8=pVhJSzjtnZypx3pW3_DZS<&}n3U^9w3^)zOHI>)>c{eulMbS{QT68%Io&|F1Gf{jl5 zkjDFiLSH04JhJYlm<9mA>v9W%p2QBBySA2Qy#CBQP7XNVb{v6H5+;pf88~8 zl0`Lx-sES8wSxejeBzQlQ~1!=ZH~#uv`Q+MW|w&xFYlQEAvo|IfNRV>y*;M;E?R8aq)gl)kT+AOzOZ;y`IPEs~~!&2LJ}?jmPhV7F@U9B^w0H zvvxcN2sj4tHILgb6Jq3&ism@B|1LrTJs2+@D$=`RrSo(CMotikw*{zvMKw7@!?;c3 z>v;WuEDT>M>-|71lp=QR4*;uWcwu1KAoixYqpBEx7DX0nNum6PL*U&gK@8Tv&M#qM z_LANl*TwR`#g_l30YIzC9vsvbl}CT6e4|q(prN>x5+LwX(lY=}n`cOV&tuPIm(`|H z0OCO~m6ip-g!W%%f&kHy@Sf=6{1Fk9|GaGXs`%Z~Mtyz;XW5&}FWw2o_nd07(9`@&*8}e^8-r&x-Bq z0B-V5qT`pvrpz~r2FVa^vR`<0w0vDhCdxEwBv{>vcl zZFW=neVIA{Wg5_JI$C87%wKm7-eaJ1NPx1fKY(HYZ~&NV&{xtIu{;Ox|D|UEI+N%J zL;6B|`Z7Yhg6kmVx!&GVVS;892nDlY-G zp#aGdLJx50nW8*@ctnK$@?K}!dP;Ma1uR06H2Nvthd1_L1+lysDhK>|Ush|>Zyo?Z zE}sgxeUK;50SXKDmqGA}i(C6YvGRxILbp0u4wpYg2-q^Kr9%5u3Fy*GMI-$p2nCCI z%UeZ2juVvNXkaXsn4gfH19(@`BanBT^GcA$5M)E;fIkUJi4?E5yCu%)g}*po&EAg*|Y z#(N6~MF$Z8!#hRbh)*B2-^{AMm$w+e-HXv)kM_yZ_;5Fkz&e)-J6nGI~x3hwqy` z5F~z8ym=6zJZ+5EKguucdjPzvhg7~F=NAb0)oE_Wl74(E-`(@r1M1%U1oY;ur&PYn`OecO<}2q$Q;A$N zJS5al69&w`GtE3i`#j!DtQ_Pkw63hrkKfv(_OOKRJu*lu^5E&;TKQ;v{>eKa!X=n@ zcgVzUhQ6TDrp*%_@yjG2PS4Z(T5gPQKY0&?ZeI7kHd-M4F0YSjPi#2~e-wQ{`D)%e zOb}XOOC#hihzA%aAq$x&Cu#@Jdo24aC(7qP7sy>c>1j*5@FTwCL-2Ql!9+F=zy z|C=fAe=BW}0g~Nc!SCyPJ*;~h;EC936LNAMH0c3*w!4ksGDL`li!2mxhL zW+i#Z&M2LhXMIXa&7Y^_fOx^Hgh=3s0mWlVu)Xz2o}3 z@(nUd&J#9!GH^Isv1`-bF;3>5I~q_@AAL)`^B^V*{%PXl5bVbH1pm~6f9gQyxQUf9 zfP3s$d^|FA>;(Sn`A&Dd5Ak0%nDl7Yjr$qFf4$H=7ylLfyJnA1;J+~JqB}%Zeu)3t zyy95<4*wNT@Zm?tf2IDw%gvPft5fx-{fg3a@o)1?{RL-7ZC(9U=wT1e$1vo3k;Ll9 zgYDlw^05hVA~7J4mkKGmf@3S7u*#Dd_|gz?^^fz>U?>hBlNbrYd;mZI8L?s*v9uQ^ z11bZF>lmsR&{8}O7@o+-qF~JI2qh+VC<@~n><5EFk<_R-=mLKq?{oeK1G3{wbdQQ8#(v zCu7{Z7g%SMT&xiu_$05KYZLJpAOn>H)L%#`sZ*P`K*{9=c$b0F0q@>CC8g%m`Mvph zH^5C06(*Qj4&Wc`QF5{U=XNQ%fxJ9NX)=b1Ja_T9zV7^Np35~j&qN4smy#_vrPS6p zd|~~CA1S4d%$E5oei(g9U7XPgi!8hq#MVmGGCpE4KCu-_umFnWgBzg$2v9{j~D&9RS96<^9-|X-vgi6br326EM&Z*;Z=;5Rd@lP8fhI5*w8B zkImLI4Cu?cRnUk0L81B~T<9mAx|L`1w5wpDv7Dt?Fneek(9sMNt4tQ;9;j2D^Uc&^omM;=uRJ=Ay_ERexqg7hC z(or7vVlbSxN-OcUwg4=waJdMIfMibqv<%wdg5THk*aKSV1-4-4jNJn$MNE|!-C09=+>ikmY2 z)zD6xLIkMU6ksC9AAo!28OtP->6Nm^u9&+uSg!i}1hhQrRh~p7`#VoVEBA(JYNftk zERKXhW_-j--4M(Ea1Nv^%A>qhgL3Ij4GTRh6Al$%BIsY!uxE%Az1HM9gYbdRAC8-6$A1S}ql&veL&m5sKt;wX_o1ka8vr=#KnR z?F8Xr;jl_TNS3DUz0k_t!!`l^7Otu8k=!_pD4(Z;DuAF>jw!^;%OY!NcVS2(&r&&Q zR!l?rE-w*`0MwUkx$k$a999n1J`*Jx)E?Q2l@S5*M+t!b%}(Qx%C&UV1OaBJ6CVno zn8iFxD1}{FQXX$H1C&BoXq=MD$zpBfgNPBPDLr?%dsu%O!h=G1Kzg)r)I22Vr@_AB zau6^z+&r`d4-ijMSbD@|wG`rmBSNs$B8}8v%RI?RSY85nA2<3Sf@PJowij4wf$9Tl zkB7bJD1ZkAMS7LhEdU)`xt4}#zj}&(EP^Z=_#o=3(n+ywM;=nc!W|v~SZ{2;6#a&* zu`D;)6U1;O#R6M@bzf2Y4AO%d+F>{K;b~&ITREyxyQBei_+aC(LFW%_=}50et!~my zpug~-VQSE00HRv)^E3cvNR&s{PRNE%%aDlx(3{1>V4t4*(CSHKWvyFH0r;|Khw)|~ zK;~$t8y-=AZXGr0{Ly-+0wU7GyiNGAw%5|nHmP{!{^DeIf_aDhKVI?_|OaJ z%V@U~!UIUVpY$TQiVp}d&TIWfSAnoqO-Y}uem|vhuJw}?uE1#_59OfxJ8AV9GDdzv zo+eC{jd2UWa(t9xT#k;~D3{+0J0W7@S7Fh=K8!&Gde~1vj8dIS%AQba(DThsasZ1E z3a;YxSKeeNW0CNTA$i1(Eb9g7ZLJd?MO5E3J_wkAkz$-1G^l;b)hrlNJ{YzJ@FX#a zdI*KmsUK3m?Hq>tG2V+>51zQnx?y5NU}_|FLQ+?CqOo6O%HyG~m(?=DcPgOww7lCKd9mR5%wbXNHD^AC0oLzWj&|;tvno2zwKmx*GGB$y$Bvrwx0s%Db_Oq z{x!$6UYAfmnT7`nnV-fIvg*EG%VQ8MQ)-X=^?vq21P?T-!$6wKVpx_$5(~6~e!fmY zPOR(|K0;8;j~74~$p+QkfGj6Q8;4&+jOisEodEvtsAZLMY*Fa(18yJL+`Kx|yG0%I zz!fZ5u4HQ;#0aI6!c)~fos1E>g+?qZADad3g9y4-0PrZ+MhflaA0_ZCvGRoSXUD)|xc3a&=dtI;^ z767o#s9p3{zHwORh2=eJ=U;Mzj=g@L z%JCTskk3A-sZ<)A&MW=-3`G&a+ zeXu}bq2Tg%X&6Fpdjuqx{~^D=ACcZTm%OuM>7KTrHeWKYkK4H4+I}7L#5;#Sfraj3 z7i%N>m2m)zzz2wt`+fa*?6ZsF5y`j9TF=M4ewzr!B>`0}c(Q1XYg1j?!}8yzQB`|7vL%RPmV0!yRVxkxrI>7^_IG4D!G;r#TF0F3MT0s&O! z@5{Fa&T@RJMZ4sk{DrwfL}}eA&K=fa8F=yOdscp~xC$WacDdG%0jNDjsGdYy%9Sez zS)!&t0YT^d(<3XN6!QmlvE)B4M<|l>v$v)YDncPB(C_2#S&6mhPum(l#TRM-yYQofGytG zv-@>ufkDs8-&YX!8B?sX)ps z3w*2#tWv+|@8%0AN0hHU{WdH$m(U;A%e4DGEYHtFZ>yF-L;dp)d9?o%T&Kv>pZP_3 ztrtxr9!%5gY5SqCH%MR0w~K4^ew07TeE_Jxwf*r$v{So-=a)(69gGw6hZsNe`ks}j z59#B7DYpmJSpexYPaw`?fd2EM2~TcUEg(yP(l7FBdsL3!fRB`e}0e3^>(qg-(o_-XhI*RTDk`!C2w4R+JAQZrE&3gzIhPiz0U~XF5k*m z_uqvF%@F{&-Y;dx{WM8L2&Mq+YTAbHa7gvio3=j)SpLg= zm%jHP8juW&i+fZqDktmjxuXrxzlM3l*UA_c-Cxfi zJy9s%9z1vkxuS8QyfWVTppAK3d_eEh*UYWld8(OGuBkx#bp8LjxlR41_lm{C1`(a| z9WvA@zmX?TNw2<=-+P*Xkn`4I6#)0+tSTNcVy6!?w%HyEQuWwyh}Fk~h~B5-{vr2U zZ!d($yZcm*^38nppoVdBp%=lm`MQp$z1P!2Sxg?E+-TOM8z2hb=tr18JWNyiJ`|Vt z;7PF9*pEOozSp7o#NU|ndICT<%E^y69!@zy@Bs5t`C7-f@=nn@Y@yxS zX#}ACalZjiR?E6Mq0gipRuE+Vr^_0?Z4HV5dZ{7#3;my{QJExg}xo=E85l%=Uaif1pwGBypg z&jWLr3Eb)q<4riv$#ZIjuTzWC9!&s@Ps|;4a(kfeVgDVyLj+-MXIVpKWlb*)IV9m` zamq7=Z1J@3z|6jxzCAX-!+rlx^B>K3XkM$|&_8q`ut$ka&fruw=VE^nPZP^~*_@@k zganw_CJ6x!P-p34{Cj(p9R9_5hgXSV>|}Wa$8(0c^ShJ;=(m#3a|D6HZj|>5o2Z@z zC0ot~lv8jsM>OC~LI5l{{O)-B#EX>FN8iqxM=EjnCoJ}#!9Ts&o4|i54;^s$FKtus zUo(OKD&W5eXc@SW@;cED|0Owr|0=6X)fBffP{AXkSZSv*#-}-Pl z9_o;!3E)b#R{F3!jdcQ9)2a+PrYa_Cfkp$Cap@Oy+$Ix>1*E;6uGS&;C&)*34@t@^ zd~hO-`x!nzC}JJszDdE)vFG4EyZ|jOtxd%DMK_`0O$Y@#cJ&{5iWwlR049cHOTt8k zkwAz52|CnAqub*K`=w)G4-4gh1l(UEg)+;8}kiX!1Q)sSho3J zdb{(Bwm-i0ncM$$rqtrXf3xu4R%ijW+*J)MP`A987XEZh`SH?tO;^EK+g5a5rG%^g z@-?&WRXG-HkrJ?M>Tv0_Tdr};7rkjB)NjYD18|=|!!7(KfZdDU7GCsq&&Tl%SO74w zrwy0f%{h`Q-Y#PJEL+Kh0VVgVdMWg`jyGV_)({rJYE1z8R8`@Qr;druL+pX;V8}&g zP^p4!v;fF$f+({h3$3pyc3E2WLa!~J3aV`Ri{rjp^(bF>5sojBi#J@qAg=eTIPbiz zXN+?5b1$F-%DdxjdkM<*&_hTBK8{*7rG7C6;#JhUZgVZ1x8y~54nNoTR{442Dy!kG zc>#M4@z`Q%g9#L><~8{|)j<7QsPAR_7d`j7x1~ZR{?G*7JLhqf{WW`Do1cq;y=Ntl zH*BeS*<&KZhT8D{AG_b4FB7#bPvQ9(|Gd{d&RTGGH5{DXxc%PqIy!0K&1wq}+)7 zi}r6pE~(n&bsouVVj{XQd4DG-V?7%89DXhX=c&66?`f!D`HBe)+R0tdlFN;8>X}W) z++R~;x4QE_>W1eVk|E#M)k(^=;#KAxuubhQ^>O8JfR5~!ypH+4o)zk=i!>z?I#!q)e)!-i9{0&E*%w(tS;0oThU;L0*GPcUT^= z#j*;GcxEto_QbfM9N;GU)tuZ!nc!Kgz zX{ZRcirEh4roEZ|vX(h|U{E7rrt#Qx@SeObRL z@ATH-d})_J+AVVDd8=pC3t(K&sku<4rFa4kRAJQKda{Z&0f`+auBYZin+uvu0Mc2Qp&1y~4S%ltbG_?tIn z+`6ou1^ll_sGVIY|3kBO94ZRWe`H!lV&`()D3?~(#q-v>sVcX9SzS=vPw_$w z3-b00a8c~F=Q;NGqEcwz9gdl;qfr$xLobea{<&vb1d!XF2tX8A=Y@Xnb;uplM)~UM znrb-$fZCJs>z~b=Qm%lGdwQ<-LdDAYGi!g6Pz-u?>5O6v{<#X;&a@9#X;>+f&~A@BEdw-=h^dBLlo zU4Eu+&%pzL>X``bejWPuin%?mfoOUjuH!#Dx$u8FCb@Alq)AKe+1neQnx}JrozvI~M z_yyiGyT+Aw25>zCc$)>Rxcki5W?etS)&C!R-^udNnjbeOen~h0+3lZp{_N+t5CpBs z>!!EAyAGSXes1!5Irr;c%|tW$`(w7Bar#5go&U)93vm9FcA0YhoC_Wy`RQB59Y?v; zl>6biQ_iDygq-rcc{Ok3Io|Wmn|FCH0%7tBBw7qde}q7e%`J$oVo3E!ZT- zy%guW`zg%#7QBd$>yVD)Ja_(CwctYDAb-}A=b8#6?(flcq*tHv&Z;^+7uUJx^Koa8 z_7e8zo8KX-iGKF6KsjxVZnx*_FgvE+KtaeV(4Nn-y=`6-f^f1W3aayCBP@5=Q# zd)#+(9I;uPPpXTQo1E6;wGNAvpLuCwX`MU#L|T&~fjg=gajzUGMJW`FMU+_TxI7 zSCQxV@a%Ju@9V+yl9bb(chT0c>hkvQ*A2VgzX^Rv%#z{t{) z@9})zw2iOZ@Qe|`P^B<8bsP0jn%ARxl(*NmG}ZHlx>ZJ4Uw&K$m`4|y{6eSJW4*EY94V`;FaynUYnPbCi@SE>I$a7D{B`KuM{&6-pLo zdX199$?_&8!40v-OG)x4firQ|Nejf{{O=38)7&vmhLKISNxt51F;x5L?Wv| zzD)q!fxNQadkyypNvi*kx33A2EX&S2H#(~-+)B-ahccw?vIs;W3R8<*G*%*d5tv$} zp%`M(i(C|TEEc2~6ebq~j)4XzL&*eYz_n-=qt{Ht~? z+?tT^HnjY6emBYziSpzYIsMDV#9~RfcM(5Gyu+XKFi#oFnX?_v|Da^3Em%6gyS4_Y z>)%t$zoZPCM?5Y5O>O}m67BVDX~GnkBW&6~U_ z3ZR@a+=U_n6$ISGtIl!q6DRQ1Cq$Ct+`=kX6E~^|d{+!me#liP{JT!*$3hgGaP-sv zv?!2yybO3UcZ4vUjx2@sOycSTohz>jpy|bt>1>$1_LS-e)H>mX2)xU6AXcLM@IUh@7^&V8co0Mm=8jnrcG$_BQ%Y;!O?~06N&t~iGL~p#GNMZ zo|k?hbTrX#eM5J_L8PypDX0>D^80pP!W@72H95!pKZm!p5}8*oSZC2pAl08AYBpa8I4 zDgeMVvEJbZJQtJS)g76Z^Yh@>BYQwzp6F0#cCzVmUox0t+rkO?vCKilZOTX32w$eV z)(_c|c^ZQFJ#6LJ=yH5$SkMICQ|%+Xkq+=;^dM~|VLB85NL+8HJ#37Ry~m&j!!>GJpHTy_ zCdV5|LlI!7;e^_V#D0V!zk*7 zw(Y>zPhG)4>xvB+FIqIpV!xy!0K%;`b=Ku$pN(~*tTml5o%_1(czPPG?!S&AJ;Jfy zUiD^|xD)NEt%DB7C10s{6>+{k^IHC~Ot@e3n0KvmUOZiS!awcQ>YkDC|5z8+Zmp}Cykz}m0jMX@@8`OY`g1u2aXpbkC+KyX zZ|fX+h;sjtuo9 z^>&R4zw+S6+SVjN_&nwKKhj+b>zpg>eLdEm1o6K?0zcCo_4nXm%9n|MCGnrciGQ80 zApVcJk~YfpImQJle)>=jq#DN|`n9EVu5%mz&nm)KT*2ToI#TM4n?MUC46*p|4M5>L(*~D4`JW9xa6ZZrVe5 zs%@G2{PKhNcAbbp_;=D4-!Aa~nI6hx67xe1sd@8FJyYyGD*g_mT=HsT^0!k=Ir5VSko{#NIW45pVmig$&eVMYH&T_peuh+}+ zI4)7IE7&DowJPk74(sjke38z2#yrUx?OZDVZTXvBGqGMDk5%mq7wzFylrKf7DAHf< zul%O2ej+*MIb8fM!Zpw1`n%Pe9rJ~pb{iE87$!!$BmW)SPpAMet;_ud(uDE@66sTl(R+wpcCa-{xn;y0FY*` z0HDK~0zgJNlrLB9(?Np*fRF1<&3so-@dIWGg=D!)i>gnGF)SJ%7P#s}9~E=V^D`&_ z?8|+V(?6jl!ms4%W#5h;%7vxN2eNUAgK_$zFr3KdCEBGYm;SE$T`0Qj5j(ubV9d$05szGGfQ zH_Qj&|IP>It8ke7zww@Vk?Z%(#{u78ZkdlOxWD^v%}ZPf@W8xXO>17{=O3AuweHrd zTW9~K%>Re~{}2DifBC=s#sv3w->d0^e>eU>+GK`wduT`$){kRN!s)oY1gtzZ6S z;SA#%3JZhM`#4lMw|>2nzlLSTRjLz@N= z^FDwIS(CE~L^@A(I+3DXb(w);0x-;7HW=+mRx>67?HRRD56=5fs?$NpGr78Z0TZO2 zFY}33(dr~t<_ZFpE{IQHGRYC-2W~QfCKyD$AD}S}#rtU!4dNa-sgYvo?0=>M+`i%EcZx+Q zB#`)LI0%1Tc)iy)ygyW2;9VwhXG`5w3r(d&J1-o0mkRqG8{q5QJmb&t;p>r%@eA(A z_wnNNJLx0*1M^re4D|^xUOYEtPuwvKd?q8=#^ZG>WxNZ2DxvwmBfB!=wwKE{-MP+y zFJzc2JzFTRR|GHNn0#5lNnoADM1g2SaWF_dn z45``Q1NNnjd{a5(MlN;7_8x0r!gU<ztZ&BTo%atg85Hm4t&Uy zT+j3vcw59x`tuH?k1;Nh?}>`!2p`atis+CZvYmjsQ(Xn1Q+yac6gV0`f2=!hO23TX z#s}*m@;^{9l#k0Arq(a*skdv_P@l+2^?@4oesHaBn*)MRJW17 zS3m(l-sgw-sq7nKoIos;<@ZcZpFpn9&yELPuO90H_`bTS|9b_nGNmu0VocNLIr~3G zc_^K7637c1*pC`!5(M##CoHoHJzWpfP2?{eB^N^wZHCM(I+dZL&XI4ICw6(&08jRU zKq`PIdIR~O;h_s z$al22BtO<^C1;3m2J8WMbZlr2IFrm!cQn_zA)m8-ZME_#j;#&e~o zT+db5<($~mzIKs*s8isK@|F79E>Aq4isM+jfs|)D_si}Q9u}3NhiKQsMWAR8>4Bgr z5oUS~4`u3DlUswfS_3`)a=sjo^4dC)`7&z8brcv158EqeGquS zblV5S!-3o%xL!ElvHxctZ>Zy9TA>>5d00-dPoX}gJa9*Wv;xNU&3$e{qCJzq9T@;K z3v>UUJ3^jF;y;M}v37u>Lts|L%cSTr-H^`{=7Zx2ilL!?UOnfEF)&k?I~SBo;ve#u z!H2~d$dmq|Y@@k9Z}spp!@TBdc%*q{0bq&v|EM_f=aN5%^^t#|(GN-R-=gZ!$9lR% z{7-aYD34XJe%|AIz%w1GAieMVpY9ZR&#Mvt_CDj~9Yg-9od$;e4ndK{r4~*hj@?s5b+@XWk}*5 zjur{F_z?7yP`jYvrbY&pR(|Tx|wkllVV_iT@?ypLgYx$g#HZKZ~9d z|CMqJ!q?q2z8>g(l>0|AG&JI$inOm#&d>CbOi;dCa{59ar5tyd-b>r~aQ84xf{05G z{llU@(1(V&^PlN%@kO3pnMBO}<$-OrI~8(~9;)zuxE!_`B)D zG-jCjMJN|&@ljv50h!*|z8>4ha-*H~`EWU4SDv)|B;%vVSL@f@N82+6}AE!yJJypM?VZRK;3jThH{TT11d9839^8#eN^qD?om~vsoFX|)KOpULQ z`-qvCH0}HS)#(_ACi&+0 z_34ckH){Dn-~-<}o;nO%s=vYkG3Jq2ldG3It;yvf$8a4vZfmYUU|6R0^oIU@JBu7q z&LD6p-Z9o+g)#nh$9bsrbM-onc&U}U4)eDt=(JX(uTaQr%pVx8FaM}c`}O))#|v;x zd*aK^?f43b@!L}axAbL77BOR=Ybb8Yq%ogM7sDsE+^?p-anrnARcSu>pzH1H-RoVEcQ?%k5&o-}=0$$F zFki>&N`W|7`Zur4!@~7Ox)pp|Js)|enClDk!Bf@oMz{2v6`vPZd#5|*MK0RrMZVrN z&-CEw$is!@Z!b5-WfQ)B1$V{21+TaP|C_sX)7DtnH2Iw>ZI011PJdPV3S3hu^3 z(Bu>oq!aCNXy?3pAfpKkn#|WM!E%61R2ZKDCxuT01{#_bC{IdBOjMjO%h(=FVA;;h zTcRi@WhCC`+$5;LK;pe8bIlMBd5g6PK@Nk7wF~`V|9#@s`ZEYas^~#CPWGck0}LoN zFK7XPrcG(sU(lP(%P%rtNXq`}oL319488w?{_Z7P2r$@t!o7QwY%50uWgC^_AT?VanP|{ z;eLH#J_!D0O9i;AB#%4B%JLTGqd$wz;^yKa`hg8FHgGBmz`{iPvK?0=xO}89-Zfw5 z@05PCtpEC()|)dC`IY=6eIGCA|4;lx{6wGNLG^`PApR??il6J#bV%ZVU&4K&ef(a= zI>fr!k~=&BN|WDM36l0;6nDKlmsuL(p?~Igq)NC!V94|Lw?z%>4SsOMIWRw2zw|=% zQb*|LmykkE;!Jxa)TfX|{v)0sPfPi!-{GHfJmAO4!smMInx1jzKTW`n zvECn9DO6a9^k~nCwt=6^BIS^C*X9Kqk7ZatL7)Tl`vCR6l#J!#L#)135cr7axIrRw z6RY}MCo)8SP|s8ZAO%820Q~NC4{{g!1ZkfN!e!ctZi8^@=@3N8uAwOc=os<4JfSrK zK9~I>mrw*4RVUPBs2)GjJ_y8~VcINXk}E){u%5Xq0&wF$M!2iFm&ZGIEzbABI}(Zj zMmUX}u+~E-u(XZ%+lAi&b;nWmNZ1|8zDnGMt&fVM!U>QL0P2S_{C<})7i$2CvYH~-qT>yz?yNiZ+5f77? z_i;VYnG^YxgIy61EBm{I_N!;Q0pmk{OR`EH<5v;TQUGPh`mj5g9C4rZW->r}{0eJ` z^ay7de}@0zsF`+Z=tScQ6b^6#x`x(Ij4Rj6@FJrE1Bq0wZwrSa#4(66I*Z5dgLJ{X zAf2Y}Jxropf{68W;5Lc9yc%~B?#IMXEWrB3Obg>fQ3bAGzCg-_Jdp7qB$*D^ghj^n zA&!<`jbP`x)H#UxDNqU!rS|JHwDD2O14-nk>ZJBUy`R&9^lLHG%#rVn{yRLW#!m-G zKLA2OqnNwg)qd0U6X(EV9R%V^gIR?ns0YNk#oM?Uvi}Hsi1Q^(KamdQZNEX-(kU0= zLmfIw$K(tVu4Cr;0(Bl3XW%2=+Z%}f!LfZ)U=RCXC^%5TK>9jyMKLN&99=0&Y#Um- zq0K9?3$%T}=Y0yC8S+kW?k`vAJx|x3#{iL2AO$EwBM-uu$@E;=_@t^BB zPWEG;$uFVUKz#1|gnmH6f36GQF~{>`j^`1dyD#Oi@DufWDE|W^`uY6Ng7CM`JjFnQ z_}}vVOU|hXen(G=E>33nKJk?A31@mrg~MGu-ybM{|HZKwK4SR?eD8T*c7S^YWoDHflShWhh?QFEyIO8Y0Y`UKZt*XMSPso5Wn+<-Rp1e5@rB{}_3^AM$+?{n{bvdXV}~zpeMxuO@)gAL*f`>od7mnf&*WN4r4$C$|W2NW$$A@OzZGFQ0%A|8MCo zO!5CD$#s}?m%A-DJ^Ks_zCV!}-$OgJ|m+?IL??jBgS|XNjC2!pu zj$clNg`bFD>GZzzH^z1cVe7t)hy3UC?47uq9Vh>j)%U+Zh~mzFUfJ+vlZkDl!@*?z zha8)O7RRX-A2dZD(c;0UWr?tGkUrS}5`QVjA~g9QcLFp2x(~Mv;c1gx^c#)@IWU(C zo(%3uH{^h!V9;O^y@ANjBMdiQO^64Pu?A~|br9725WLRym&-x;Grc8KCz5rDb+(np zUS8^Z`H=sa?iixoJ))3+4?>*r#Hka)KoX`5uO!HUr^G*pB@SQ}pXRI6(|9$3EK6egwRL zxO$jHQc+-!_y9ZMIp6Qv5)8$m1IwxKJL?%~BixNS7kTs2yvQ|p zk=7maA$Q}#6$Cb4n-{r!*L)D)zjbb2_y>%JoGhc;4 z_+NBNUt-!YA3W7-d42Z!OyukK*ZJ4EgrY*nyvU7?d0cS~g@9tie6-hjwc!6q^iyF0 z7P?=ZzYg%wKlUOto;8a_)ie}X<(?! z{O>?}B*XoC5%}jgV2)L{#QzHUU%ldg-GqL{|LVXnm9bYx$jJNF`ClRb>-%Plt5|FN zuYk7&Z{XKAW{Kb3QjPyj8SAO@zf?q6(SPJu_Ftm^q9gX72kg@~`Y#h%+5gfTUiDv= z`0ti!Txib|T#y|YAr=|YVJoJK4)l~J79bCue{=xE6BGm{959%g))5+ZWdheX5*t1a z%v?ukuz561(XleNBC0^J^MTe=UpR9T|6R6aViUoMG|W6~QdCfY=7Z9tKO{Y^>c0&! zT8Q|8a$u7aJv1SKWy=$q%5r=`Fn@-YOR~_&mkTBYQV0tz6QJE{J%JoNmZTFaGXFLf z02Xh|2ci9X2vJ~zaO-&nF-z;fye1fj8{=jN9b2}&EV@&AHOsKL$UN1vKCuOSbCCLp+ll zI5Xq+5-ukdc1O08|A0G4ue)>2bc}M&_z%GpC7v>ULA)s&D_?N)GT#9CkC5-V93+_L z;Z-4x9x)t!|Yee7`VZ#hn+^$hjL+OcwM)o8+p^qxAg+PloqkAC3<*p`K5 zB)iyCKh_D$-vd6TrGN*z;D`DH$XU3D56_FDXZ?{8(z^u+e$9&xh|(<*j2~0c;C^ui zxqC$)XyZPCTt@`N#uI+<&lGz+>ZL*e`jInT7(c!gM^JrJ85-gwbq~n%c*M+6GAalh zKp_D6)No-)1py-EhZUhm;;;j3%S8W#2xg~vm>_~lnqU?Y%%)gO5Wyr(FhPVNQv?(A zhe?{?w}@bNieN$$OwupwOq7Y$_0IXuY2T+F^?2s-cvZ}NzE!2Vr|!LVtGd4LoTE5a zRAN*JvGf^6zLWc%cNxf0WDCGtmR zRHhnIT7?lJAOP_Wf>b?-1=}F_EpChp;LfD77rD2PKs$2eWLP@)`y1PEy?Zh~;N`+Eim!GO#c>RGM(HzBkEp4uMj_C)3z_trWkPP(6eDUw@tI%;ggwf@ zLz9hVycA5d`Nv_#^#^&q-z*5TdbgR<_RZ=bY$MnF2)WBQCq%spJNC;$?PJ7v0Jbp? zK)3`9OD5z|2JR~1s%W;|zDwxsR{J$724Sr`pAe??&H~l%4{F(5M)vLnof;w#@W{q> z^fdBFSLeNGHrnI#?|_rC-EPr2b_X79_m8UWI=4%&-d#vpc-d?(a(ne_?S+Kw?ggz{ z3gLw)tPjS;7pe~~HcG-@&lAwKBwPZdgJ6eraloAdb z*#g@$sK;|WuEI(`%#bR>m{|H-+8gtvloPanHnC@d*e+#Gc;{z}|vM~s_|-XgbGQBUWn>>l`qFGAq1+&@b2zrqqVOW2p2ip@zo==11~3TWuQ zRADBgCHOBn83erdgF&^;_0~F3M);u7T4Z~kG)GGb;r&L7F}PQ2MLZ8&^otsv0ZP!k z!hIpcHtGdE1i|14cCC*$Pe6EU1fm|S0?`jF$U>g~hW>t)&3q|5j<_9G>d^}K*QyhF6-rEckuFrH$p%IZp&L%nkGczINyV!mcWeD~h5dQj0 z>_OQQ;@^pb&l=-Bs;n*kj_Nt66>FcMdau=bFSIf5Yy#KA&WB#--!0+M+V?qBqrW|0 zB4twMsmDK_K#bAkNd!;xTvIZ1fQ5YML>z%siGOpN_;;94zwPdZwBH*9drJ#!SGD-i zR5dho(02-E7u3%?^Y)%1nW6Rua%HM$P>>%k!UHpX?wBfHC=AOZk#{ktuB&vs%E z!hK^v@V_#{lSWc^+#qC|KkDZ77S;2sAU*eO!jD%r&a*vH?o#*p>ik`ee;ALi{ zp8wel&p-A2H%2`Fl~9po#k^$Lo_E}4Na+6Fd$iagydA8ar+U193;fl;x9Gm+Us`Pu z{?fm_)J1ByBvcPn>ybJ$wDboLCH+I^a+U0N|HIpjGQxlG_s*q+sekQ!L3llQcs?QA z2@Y1+?w@(rqXFmOcScporEWc4ZA1asYeTM2dB9o^bxVMc%02Y^$W7}!&;8WfTw?sV z-#phR{G5MrmF;}NAD)W|?|3VVU8KU>sEt6tU3GFH?rq3(TaSM5RXm$;NBM0f^tPRW z&%%{2yLofK?>YXB#T55*Yh^_EvcIy@CCt4r;^UT_HyQ(k#`WD|77=axxaHkwwvZYx_lxQC&lc2RndOlJeu;kTTZf>{LrNX7wh#`zVWzpObeJnMep-Uz#RZok@KyFTM>)mwy*+&fi5bHTan zcAw*M+floEibn0V_o42eCP1g!vrxqNHm^ZQ_n*#AtxZ@s*J^zT+8$JT5WqE^c=~+S zP7x@~=%1`Ltvx#-}QpEFzkB30< z|IN~$>9PL&WwwyOmd)7&w;d-IXG8>;KK|?_d!KeE&%6Fvg#L`k0i7Aw(V4=TME8_H z!rC`G)#7-_e8 zYa5o|GDFn!9gW1i@}6z+kXK94tHZ4FLY8>{^YNdHKNk~6S?duWV6{YfWsTQ~qp1}H zsBpkKxIXyv;Lk(*cg{<^T3$+VYO!`6S9qoKguGfIz{z7?;o%P*~cYBrMh zWN{)|S$Kfe3J_$m=l|1FT90l0f5b|UwI;2{=KU|BdF;GMcn1GjW{gw(FBnv8Pc&qH zQD(|LDgSGx_+Rz3FD(Cy-|K?P{~F8xw$I{!!4RL~f5(N+ZO`~$*c0pVspY@R1m$!* zga0*C{I4_f`gL~H>o@lLr7p{VoAO=PU*@x}A8%kY_-|LKZB$pPi7*^lifxE{F++*< z1enpPCqg-$gviJ7$%NQe#Q{~UijEA8Aji<6=doIc9E3gB5(AN&U&RNo7IqTq2PE~t zr+UzFjuH)2ZcD@Sg^#I2q#@~y(s^hIITIR4>W}Sq*q@+lK$wViupd@CwjsHk;QAA? zSL}>c$)R@1K%hEu-j8cJef_jzp(_RWgzONc1`9lt&~02lnt*5V?{& z<+0nZ3q+KjuDUl9Z7Le9+?6Jf|-P%R-!X44Yr4{|JE3Ug46cWO2X|z z)KZEM&Kr%4${T(wOfjCeTo8d8>KF9C2mzcJ2nqs`0>rLejT~^S1b8wbQiNC`%oH`$ zv?#JNden9%aqs(G^@+zqp48z1W9x}p8lUOt`+O4!KxHRm$p#7-axNbw{F zYGeU9&Xz4Y2NLmyTcMFNq0}5jWOsFAu2@P5i@DY!VG!5yIYM{jWr6;^DFjQ4B20ii zAl!iCT<}EqpX7pLpkgS#uijxLuTinmZ*(HUYJaZ1k`WH)dgl_ty}9Td+tUgA3k8UQ zzJE$_hI%bRfFS}187JC5={N-GK zvLhzU=DJI~J(?SEJ5`b<2r;+kCDlYyOq3GBJ<|S}+&7W++tjjRnZLX2ZTMN0uRCoH zK>Qufbr!ka9<@V^?fGJg{^~E~+@JHEW$w2FA}S%;qLCz_v^5eFJlrjApnpK{Yd^v+ z9wns;P%K(v(=7rMa{CliFJJ%h+z9QHG_xiAKx(#@3c{Ucf_56tx0c&nZj2%xPodaV z9-@6_qM3wXe|FzdIacKJ9J+eHqDX&v7N)NQG@J(UA<+tJDp3o z{k%@4)8O`5E9E(333Fa-*~}<|KE!h`a(R9kRf;Ct(WU!`>)mL!R+ym88WFBPZ4_vq z<3@~r9FTp6?P_$FFh7!H0{x@s?b3Zc0~z=@jN=grM`FQA*=WiVKI*@Wa4=W!I0`#+ofU(28q{K=i%nrc)@Vq52q91&=Rhl{C@gw= zLAT21?`EDh}>&~=x<^EJEC#Hi17;{LI-vgB#cN1_Zt0(vD1had0vW}7|(t`>@`z( z(Y72!=CGdrjOIY`3GkE$KM-Y$&P~q*Y*(+5MG5NZoNHtJj-nj%HMJWABsuKr)Qjad z+NTBkcjme)ynm;*8|5HEdv1(KR3i~8o#XQ!*3C-H!jYQ6{WGkli+o&KiSYc|tx-EdD6zZRhA?4kEv5apf~_XkKf>>( zQ^fx`wh;g%Ar9K31%yXFh^$fLO`LDI#&+DT9jz6F2bF!c$Guz07kQk%QfV#Z5D1KT zoRDmx4?)7cu=r3xc(ZzRz68O!RefCqogy&c5sLbEA+UtFMu>m)#BD$G`0uJflI_~@ z)*D3R`?sqbYb-dpP#LV|{QDum{NmpC<0uB9(wXP-J%2FI?R89crw~Z(tQrvC`%J_; z6}MdzV!)IIa+&IaoSPEzAB#Rg-d2M5$7aJL@cdw7>HB2Qh3dugEHt;OqQ>S#cu?`ENtXs^@=uI(Iul zfa56lbKYK!ukWkD-PJbaNWhx3j!}yXGI9<9eU? zSI@CMh5zab+c);FpZf@oe`A&H*$O&r2Z(R3_j69-XOqH%-!;jjGl zRj#k)7Z7GFd3VrGOa6m%KPPMlmk9Z|%jdYi{xP_9p7(#jzqXn}fO0z=%_5Lz65O+i z=6miA6QS;<;L2)3cs1CkcH#cJg7N)|zqRsh;A=e2yuYUHZ1+C}8SF|(ki&wZhwkm# z4B~8>_yA7l&Ti8D%-c4-Zj;bU{d|>#M(*XHcm8#)m(YFHzr6A$+vi_7$Nic3H@Ka= z-QYgAtMi(7vmv>VUvk^C+GQr8Zns}`3MQ)EItd`yp05S>F)sejzqUg4dVdpi&%G&j zEx#q(&wT@S9HM_e?E5QtK0C)j@ji3Wn;D_St$n!vJp$(k-o`?LdFUbfrR(3ucu9g? zjGr$MvVH&P-#WJdLDVCRx6psE$mjWIr|{$F5Ofx2E;vs_=XL!b>TGbM2E*ZJHo_9>HbD_bh}Ep_*eJ++6NKka~ps{>#Ds z>RWQ(VZ49UzkiV|deq5R(VWM>_Rvc(m%j{EGdyeo|X*B9J7Puo4l zx6m$kSHF$ zK!oLc&L#^)oPY7|HzPdXx8@VV?|JL;Pce@hv z^UCXDJpG+_y^%8!=nf&^zep|DnkJTKwaY9*`?>E)5UP0meEgNO4}t!t-B%kO!l&+o zu#X5$SKPsKo`=)(?ey~^pCu@p@f=AMxgTyiD?Yc&Z=AbT2<)6rh3$I5yzJU~XQplf zX74N2!Bf}Tq1&g+n0Lbpmvi@WrH#}|JukBLP1Or#&1Ez|-7f-TCqMK0t^NJ?z{tGl za^Z$^Txmhzz2kO`t=CtaEo88EP9J9@SDc;V!A$K>W}LsPkxlwS{A)y7spHqW=#NIgXRy%Cf1rj{P(ff`18}ZObD}FXJA$zFfDCu;DwrT7FD< zDs`N-sj??aHRN^TFl!?Tlm)M}|7~8CPxCE5<{a~Cbg=>hiJWbP0n;e}#z(wbBL8$q ze#>K#6|h4VnffXz~#cHoh&pWl)$O3=*Ev=&uC`5T+Bb##^NJsf! zxG01EmY~{6NWp zZ*X2qoSRIhm2p1K(Xd8BJB%~&V04nwdiX1SPS=2=WKflb)JI3BcE6Kqw}Rr~nwmPAoxQwF^AltZJ~5c>b?_q@_^k9ak@*z)gR zpq0+!z0Iqgs8qS66N$~a^3E}@R!MX+Tys|(K@tt%5k*6;B`8c zfK_(YO?|DtW+Mi?{g79CU1E;5_Vp7} z-5Kbfjp?vAim83zLeJJB9I_7@=-ag*VWKn`%+c|FSlL({5gt}rOMSwtmBA9fm_6~g z>k`^y-IYiiJtx5f_7Fe7?&}NGJ*_jGguJxqq?%)=r^LV9&xsS^gZQx8Cp#|Ehtr%r zy{cRM1K5AD+U6hf!G*BL9y#l@Y-GP0DIY50c!6pa+&>marIfK~_ALe&7RICai1k5^X^2v^yLA>xf z)%Qki_`=T#x5IFa+v!H_VC_p}-`$#7W4rw7K0Y)XZzp_xN(j)lLV)rHQR)K~0`PLg z^&^!25V%!J?z&x#c<_jbs+>P``^R%sZ}70z`H+D}-e|2LY}R(p6IR;w{qq@>U#*89 zV!N+Z*O)+YUULeskes{Y0v`Ik5(@2csKl*Mxi<|2043QCd{qPj<`oeHl$V8&cQS9Y zlCuY1<6xDr@~CkP+;5D|6(Htv5MkSm?zsd+Q?`Z`bF&0e+ zx;h907|>E0DZm(wI1mehcw*1jgg;1nCO|thM<5`JrU8+%MZ{ME0=c)sgvGES#O^K; zm@yLy^)7p&I-8g`5K&-4ke(Vo1{>^L2f?-0vS%A1bAdl#ng$Y5wPW#=+YgIEQ1boqj^(zT) zuN>6l1@5=)`7ZaHw?UryAV$Zju{pPG>I5Ah>LCqbjg|pk9>ld6<5dW^VZDg>ydhD3 zgihvXm6UMJ%PMTw!0S}u=^nP45Ofd$pMikyEMgqG34}mQUts~Ftf@aDpri`0yghnh0Nb zhO%VB=KhzQ=V-T6Wp2MonbF;KyFS-{SWlyZ+o>KcYJ>&|pdu&ng$T~MUpelHN8lWK zd4zggJrT(2eVo}i>nxRGdr2~2;CY|J1Ae`cVxAuPy#V!rj{LxAA`?3WJfT52 zR){8mUAsiRXAn*#zNDr=sPFME{X~uRdPNYGvR!_!md+apJBpPY{n%;ddOsx=OGeG% z|LneMYlIITp9eu4$~+kH{T=Lt2?)qNZxo24J9nwfi9*I~&-RH#)S|z4`0r!4sKyXT zwdNBDC=AbABqxh~o00;k_d9^m=F&&I=Wfi`QyVOByKmOg1-7FV#8o36nvMu~G_?Ln zbRy5kTqC7)+(HCpb%V$NeGtuC)dKhXRyiosQ#tv8<;^k%<~9evdgAX&$bJXc8HDvd zB1CM2-6#XGmse5<0F9HOeG(A&EkfE(qtH;9`z@77V_v%|1U#O5{^M|KJ{N&xnMkO6 z{5?f1QXxkO%vG?|FW1Thkvs--m}hJ8GLPfPH}ynPJ~&1rfN*=Sk0Z9D97<{jrqeZb z!pLny2#EW@->z-1W)L*(Hf4NhC_b(q_U$y(!eA0pvL3wHF^()9l_>&!2|^T zTXOX8sNiJ;yfW@ciXn|uGaMuJjC0FLEByC)1N9yvrqQ6B;@~iAR+%xd1T!)H*lwYh5prs&|ocQ`>^9@ z=PC8^EyK3W4#JpVs!S}N?lXEHp0@`WCV=?6>n_s(~m%`gQ~ zegoI>3)4So!~Pe`oba3FLu`*t0y|dC%kYSQ!F}3@={y(w788Wd%kGo85#Eo9zy{h7 z?uu-`ZU>r|7c;>%G{l$b{Yi?kPcJU~mLc6d>G)YuI(Bz8|gc6UIxZi&5z7ZA@Il&PD)lIb1 zz48Y7?HA=8nTO1llS9z=l%MbJi+;4s#HAu zFk}rvrakh6ZX3J&6z|!vW1OJ>FM>F{=j>DpL`b;0_&N(ti1>aJg!_Iqw)H;Oqg>I- zZ=CIF3W4<{2qJ#t-HBd@kZ4fL@V9$DqicLz&)7UI4TzL3#_@l+x2h1hc-JB(mjA}z zUVfABAM&^^W)LMa7kJk9n-L2O{M#5mnIA7?gg_JxFsA+AbzZ4t zggwuP5QvCpCQ_ZtUe-)z5&Z8-Xg~5>AgD)6ef<7jUnT5K7qfFSm0v5=7d3Oc7%f2_UU-~jC0M45m93Y!mzF2+PU9BVAouL z;LF_$@!sGJ{g~%b=ds@wfd?XeZF>jJjPTR`D|}yhAM;l*p1S>_&wiL%B5u|) zO+16p?(=;`{a=th*Zupe+%CWJvqe5{%Y7B^F$1?(EtsfvuZJlFIqQu!A~?cg0QLAMtOxvk>*HasBQN5&CaoTr`)zPusuZ9nHlM$Q{>>MDVI5gqOS< znE#GRP*IXyHz-mH3l#p@%jc4_J(le_IomFj*PV`Qn85a5U1)>wzrV)!?K}ScrPsxt zW{T%i(qP>3_E3K4-&{=5K6kiX-6!7uVj>Zpybs{{JKe9&m(2rzK<9nIf4t27_dkMr z5U70IZ(+Xum6t81n3wvCJgzoq+FZ1~Sm=MzC zp-p{2Xd@6{v1Lh(a2lPFq&o82c#aJs7TEkKxB$V=b^nOxZSPue4?@RI(1T#>Yrzox zbUCz9=)5Y`-eTMHQr`b_HOQ|BGc8n09BQ79p9g#vWJ&t7M9+2R%gNR;TH=ZJ-i|NP*GXx6J8A6gzn%8jOf7grW zx^Q561NFX8Iih~!h*|eg{$%BNt>ou~pDwl3@hh1UV9ZKY&_l|Y+?i_6Q$hq+$4^G@ zJ@S3!I^W;^H>+3hz4==86&7gvx2o6HJ`dsV)(Z0kBoC;zo>PCKWiwUoPi;@n5ZGA< z!HaP2+w<;(IU9>0T7X; z%oAst=zoj)dJ@M`%n@I{sgSC4!fGGBNk zCEhuN{$pOX+_c9lU#0w+6$FIMa6Po+OjB3G5jXtf$O;htROi)DBk^hs;Fu5#B2Ln3 zBNK#cw6a|xuM@QPJsI+9W-V%;O{qP8$g6djt@^ZDM_d~TVU^Yu^Ffw~R%7{3_|^;m zn*vYqpWuJxdxY@61^)%}zv_^r{I8SKYAg}YXA@z8q@))n+NNMP$!Y$VS?<#EuN-GI zQ=(rY-p=5EOE|<^B40RjjBj;#rz1}Dzlme{UkC-t8P^Yd*Y(q1OkaP7I!|3cU5{S> z*j~TozYT5E>sMw#`ES=G1WMSenL3dQLH&&6PGGW5SSTBvuE$!e7J48KI!!8jo55(VLl_3pLJHz5hLZNWzcm-5t}SQk#S`Ok zs4q5T`?xqW^w7|;+l_PI+2kLlep1qZ@Z2UBxYD9ni4=G0hB_Arb_r9D?xBrLKz4l0CLp=A7iU72xS=ahXem|bq^jE zZ&dor@bn6f@j>vCf7}EH9VP_4m0+C-Dc=v{^9%4Sh~{Np8#U}OPO!Gn7D8#cfH1+F zFYuvb6fTITndw64&_zuw1V}-Yw8xT@R7245R!u>Ga8Bq|yhrK@eeHR7pWBy9+n9}bAZCQL;c=Z0><*Ws-Nokq&@SOcD>!7#+QGDFEZU0&440{v26U_uS$ysHHG z@ySR-tfTDgJ1qmjLwzuxfJkYJur7*RNzDx9>qS zMgJBR6XHWX2zJz4D%!F|CQyNeq?`!0!=jlIrj2AV!wm9Y2#u3}}~QzHT7ZhV3KMhCMw(ZWk>pj)Z6n4yk`~ z2oqWh8D89Tui!l7BDfg0iNKM5hEQz0Hl`5?`w(iKdM^z#c*e#{DLgBSx&dL!{RBk) zhhx;MWkqY3*AfruU|8!%RCb7%_PM^~1Vr@ss7$1t#s-4Kt&;?}eqvBhEccDK?~g(W zX)ciycD%kn30W_Kk_@<6W+$=Tj@;cbJ|r2BFj%L*&k<5Osfuu5aDsV@t_$~gfn9*su`B~S7bky;?ste;o2ImV+fX&MPRUfKv2JWe!{1j@4zgnN*peTsQPrunNF z?_=sCO<{mq%NFLcbNr^=i9<5JXA~>34&1mCJEXO9gcZ!{hKSc$J=_JhenPc@$tbuLGe09YsP4Mj9s>VKz?1tC&i;l*<&yMJ1Pa zPErV$;-FjSb{SUl1rRSnq*Cp>rJ^YW$BO0*bg5+_2-&Z-=Xu`iI-S5^ycQtX563ai zHLG%o$-Q<2XbwWSGxVDi!(#bpo z)RZacN1#tB85$WH~pf%m+2vyGq4gGuhYF_#OfpE1+x z+%9{Hu}N(Em7S;klf-`h@eZr;d;yR2VO>(W>}sMhoZnp6^Svb3?Oyj12(3uyF)zPU z=uXGDH)x-598cOA{kEY3khO73>>amC%m*Y0$RM1c`yWJERN?kHsEDWX9j6@>65+@Z zA%y(>Rieg$^0nt5>@_a76)IRAE;zz*r3+v7<}o*@I>{Ua5UW@Ul%n{f)k zY0qTvY#u=9SNQAmr4s)w?tkuKA^ywLIsSJ{7w?fd-W#s?gM}{hWQW|GRuh>+`!pUwY0LY+UX zNpAK{*mGC?aRwTjYDuKB?p61}+*|VDyC!yuXToi%zr0JW%H@9}OavXIa56he>`Hro zwS0^+kMab+Z}Ucm_q)q;iF({C0Rj96BgcP^6SaZxO=|}9 zGMjFS53v^=2ms8Mn}J|I#B=CpYR|B|4a`U&fcBu!=7#V)-b*Y5c5XUxVEf0EOpNpu zr$5B^A&lFCr}X!{3k%#%nX>_c^cNao;cfF6_S~l)C}7_uC!g{V%jGyz$ls0IAa*xF ze6xq;>l%W+^PEuXeS9!})EKcxsn=zD%**DID=EzSCEn}I$i&9hYw@WQs~jHlGE3W# z`r!(MKYjmVR0`qH?9R*yZ3)~>=Z4ops->4$$l^S4kE$u|pEvOP}p9$Z+0xp$AXTS4{SNk9J)!t{o=0|J`3%NZAwE-D&39E{sRz z0VK-5H$y_$XYJJXk?Y9I6vsV+U7sY6OYX1lcrPww@NB%`jAnb@D}uO&z~(=_9tc|^ zj;kV^!Z^@&(tZ&;%Rsl7H@ZVtCnzjjy;Gx_h=yoVRB)i z6hVlaGYFy3cG!+@d28~#@{Z@b&m;V2hpHyO>s!q} zQh4;DpKHp4l<>=%dgc+`VTq2Dwnem0%!Hx{&CScsB`3u^xUs;*(?0dr^Fu*f{HU|( zj`%x^e;MOv-)}8^8|UpfsjWxr#W*TcX&=+p{b(QgpiHuchx4&ST39MoDA0aRfAx(e z*kAHqs<$CLGRq4hK&i$O39-a@Hh0IF*fVY`<~+~R{!Hhagm8}uFA%N85)w*}AWv44N@cMwRuR*ywUW7?RH^*zYk8%qS1!%{-q_sbY%x$lQ=j#NA! z_QR!8JgaM?v+S^TTH@c9-EB8(^a%gLUs?X0q-Y5;ZJ%7{>$bK_BHOu)_JQEf2`d?{ z=fU!q2yb}9xxrL@vqGHrP75|n#?N>Em4y+6@WZ7A_F#7|RdactC?~1E3XAB^7=-`J zNWnAo_xbPKUwb$4`<8_`gZCNAzBj8M(NC|``rKZ@9wPSqqk9tq&3|(CD~UW$G~&yS zn}Mind2Kjc-L4gApLCg@gWn_pLksueO(#LWO2mN&Qz;8Xygl}Ntk9^$+54}%sW`>go>V#fBlJ+9Xolb|L>B!F$$G4k#$#)RJs z))4{Z_kKUhl^`!{J?}mLO+^A|pGFX86yG;Y`TKI^0)!cV=l2kq>8{_w?^Y6G!M>Yb z)QBN?X-9|@S?NN+@s4)@0n)nJbn_{JM%VV&?34-0Wvy{!0SJ5!<_949^Hqubw7-<$ z{^`vpg!jD7IT3=cEyVavo*+`nH-r0&Z{dE6{n6C*3)=e4bCv``MhN-5$Cb@xK0m$P zt$rS<>IUeyO<#nu*ZmzhhP+hSTjAq&D(kBYm~ZmNa|9ygtds%$84(ovNXeDBZ3rPB z&Bt&E9ISA8C3tahg!ULjJ(SHt3SQ$6eJ{#!>#)ImQ3dUgeJ^m19ZU)x$lVIG!`oF{k)n^Dh3^c^Cg{&ftF?<$rmb?pOX- zBO9LLe}Q>9#s9w7^*hhI{(?)>*RTBdnb%KyPhCINX!&pB!T>#`{GUyRVeL{v@TaOc z$n=DXhW4i_Y{Qc|MVVNSU{nF~9rco@{d^&yxY3}wG$J=3unj{~+Md~;nV_9w8)1Oz zNZ4@EX~45z2p!m>c8Q0*rZ#Z61JTe9N}i#ieML}CBF;&TWQJCXf4;?;)k*NH-jd@CH#iO}XC`E}!0jd$#Xb{rkA96z-R zrIRCGCqe)#Bv_c|)ovH%mbFvRdhq|L;ML|XkqHt?tS5hXVj~QwV#>C|W5Hm=t5tl- z0uSJhvqktno!>fN#}D?)?#`6*@ezLLKQ#MOA!_#Qi^cTfL{86#2bq6ZgJQ?q!h?eU z6C$KN?qa;`mwjv_iU%)>-GKY^VK7?ALHG`82qjrwM_otdu1W9%;HjX#fJAJ^45fSm zVs>jjBfKU#Qk~0Ap-S#;4S_BmOIL|9FkF`0`R-$HuaUx2D2^83sekOZ2zQZv93k{i zr6G8rSSU^_u}4&sDpf(q_58v7XYrwRdroqGQnI!?Sq&=35qF%`aklH8~h^pa%F!JM7e`d@#Uj3 z1wqt=^amgEOSbPKQ7mngg{au}_ZkTz2Na7bKKO3C0}$$mMm)i&hv9MG!3P7PBY~x1f&#>@5U_hrgwV%BB9?LpN!npsJT^-iA1&0M zBIST0_ET*d3cmnB6(a|FQ5`fu%uszGl*wmPh|y%63L4%%q!Nf^ZLg3B-UL6yA|Ijn zDfqqQobP#DFG7I}5=hx1a*>bW87?8|y`<73$#xFD=7EAr7hRZ&or8Q!OF_)Shu7 zc9eo6K3)-?@<1ZOOCg>z9&gTp*9-W3VKr(b@JLI&)ClFBosB0luf`5MR4ape0%1#n z`#Ytc$~8wk2xx8RO@z#cJwV0r-U*UfoTNm+$p`QZ?LG+lbz>}Ho1YAU=46QRvkM|w z5uORsz6U{6%T=Jk$nqSW|H@2=Y(hlHuw{$m0~%*S9HtPItOt3BAF^KT3qji(tKzjR zY?;w8zM|;!c6{K8@b~*(zuE>t%oc&jEprt{6z>DObmztBzXGWi@=9JObZL~s)A<63 zTZ=vkL2}qLVss1YXYo)q6{G-A8C-1iJ_O;0g|SRf2BC{G603;EFv>?`5S7ll8&?tt z?vNs+d^m|vrNYnaWrXuwL#qQz+~0vg#DRnePMMFXPSh70+~1g2h3JkIGmB((s-D7` zrU)98GEcYbcz#r(x_EptK@Tk3z!-?~G~)j3)KYv{?N)5=dkAmzxzh(8^V3Gk7S;X& zDIy{x^JYB8{OFCU1wKG@YVg25*~d7zKVFmPAxU%~yrU7FLm<%$a|j!vs(7qNWsLc5 zGS3N7zYie+<}X59js)rd1C-m`5AXo*m>8Z02KIElevpFLh{tlD?gC#eQ+-$KJ5Y|3 z@CgDbC-vGmFZ#t8Jr1;&2x`hqgf@(}T(&Htzk49KGa8pEK1>a21;)oZ?Cvl^KsFL0 z8SR33OXEo$y9hz&XQ2?{xhsMi>EGcbasUzhDdrgvs<_Y5&eWp0q{d+^d!~isqZ5fV z#!?UwOtxwwlslG42~-2-AJfqYIxz_7zL(b^>~gzR#?5CQ^*QQ|&<_wym<0E+jF|H!z zudo6h&l?F@%fxb_@0SJc_XFuivPeE4C-}Q#94!KhHpW+h)Icq7zmC)lbpN-6__sO! zVgHVLVCSWT{2zvrf?^l#`PhhO{VslaQhjD$`*lx=$<{OCpZ9O;d~jXg#xK(m8i@tx zDa;W*kkhEBF+QZ+%l~Jn{~wi?Ft7Yn>~ml9cIre-IS+`qllv!w04(JcPH6XzMw-ar ziGEZ2{Q`~4n9F8Ue}AvzxOc|8*#7Bq5A)(LoK{%i1M!`D2k+6+jz7@|AU~CqVou$= z5E{addRJ>8LduRKf~TP)!p0+~5Oi}~$JPXexG%R*?+%S$C7c|_r{*5;H7E1fp4fe{ z_6aI$j&AY008w=kL-bGisFeOcp7umjv;og;UzIs%dSB>WN+NX`W#MD61;MSU}tDLY-D{9T5)fh&%TpJwowwa0L?j9Kay^+Dve_;- zoCvw=U(oyUubdmM5Rwq=N0_ENj1t>;Zgb4a zDLc#=gyI<2i|Y}gfZMO-5MUq9Nd&RT6z@Zju~| z#D@C*H3G8y4+1`O6a93_WboMkn)jsnZOqdTLtDQ@AQ)MqA1MqhajOVNljE?1$fViA zn>qY=ZoEYI!KbXP^V-uFJ{F-a#q zXGOC6O;lB9MnpzLM#lHO_p-Mj99Zajjn^GOm{-Xd<*%}lVPHN@Fs{#}gol-9U&4A( z1v?BmT*5P$?OV>Ij(0JpMSiz zAg>^V`p%dC*o1Z3zDfJDm_br3Io=BESHcjVE3L=x1?kiv#!pnZ6u!POc%y6$(ZK%E zwD4~b%Zk4e?t}?Ei0ng1`)k?ZO%pzyiZDc40U_d198<71#^(nS`@vzL`vn_sb-KN8 z=yP%7&KoU4N5}SZhxK#yjT|0YZmS0*eePek>mJ6MAxD`{CVbzIitnj!X?U)Yp0?N7 z#z+klu1HseCV@cXF@$g*bhdx7Mwv(144!uP(ir`>Vu(aFNMOQ#-}cQKo|DGEsQulKN2$j1VTyTTurX4> zak)o9DqOAlxfR+J3wf(?Qnv9m(xzJ<7541Io0_s+|PQbT#$~= zFKLk8cfy+lKZ$Nf@;?oO(={%EwD@;d`%U7W=jVC+yv@+r4i$`Csmn6;eC@i`e!hP;mYtk^dF*wE2?%O=YN^|HV~b;eXRB{I8m6r&j(K zu-EB_rqSPe|TAc@%lUet$a24 zZ~eyk?@aJD3WyV1QRxCTcNC$g0GtFTE*bmY3S5Lja3iRtV1)(B4;HMTEB``&#|jpy zVg;$N2%-s*UJJ8eG!P ziJVGTUORQK>!HLuV%l?}a2NO__K8m5U;n8d!sLWG33@7uT=4|LeT~c0rL%k#l= zK(0#ACN7>WK3~k009YR#eUN6KW}l*e{IhUdB>cl#OS%w|?}sTCI7>N~JFqCS7lTZ0 zzOvAX@+=%S7aUN`7rJm!UAR6tvCJ{TY{aD|AI98BJdjFy=ue<7!slVw8DJx|hX>GY zrR;5sF__X`0&;wSpRw=X1X>!RU+iLG_h6&<=AUCi>}N)3P6QTcVK!`UPvJM&he~xn8F=9VGl!Gup85XqsKM`8mr<~`T=>5y4x^NE% zoo?4&+)go4-jb7Kgv<#y(tC>XE(8bIaE)US>pe{1-LTWe#JEv*6RtaBEcs)Z*a9x0 zebly)uKC4c1q+1$X{h~l;|v>WrR-iqed2L6ix;7#nJKH@NdkPJTg#e{n=;mXS|qas zp56e_wXxIvsz{usW5$wY4E}h6iTP8jpX?@)IX1M<(i|2nr+A?qWUx3*n-Q*dVRsCq z)7nX@NDz#rvRK(-d2^v%g#ya`$;Me1#3o(w!g7w5yGCFXB!Ui-ZSd!@zzZmd+OXJw za#`kL7H8Wl6J`w4l$P?nXaq``1O(tXA>;x>$>eDg3%GDDt_xz+p1>07W2q7a9Z5j^ zbtwqw#Toyu7LR3onC3XoVK~GF&Gwp7Gy%*kh=qhfIZk2@oF@xmqr^^$=f@z;P|iBR zLUx&_0v-%{s+5fOSI(gk-EcpMmC%LTfaFq)^s6{c1qi-@67L%DKrwwg<*8_3ZYVh{ zDyG*>h*e!HQT{^ft&X5mMS>sm!D@id$4bP3KrUZFNmJl7=CoiRWCdKU_pa5N4^WO` zbwZ3a?qe^Cy?EOKZax3mW=lzz-xJA=uoie8hy%rR$o!7yDc~3>D&fsg8WXfjkFMxP zYXa8@>UpX`u%o{)4_ql$#7+V+m5s6z_1KeMX8qC#!7+&ScGUAS?+9Xf1_8!imUje# zxLy}TO;m!^@nJH8?6z7i!^25&El0np^*Ip-DrgiQe~gr3peA_bYswEnrc0ob@_bH_=l_R|!n!bG;sMLgH@^ z#JX=R&Eu5HV(}0W5F`{Gcx<^g@8b6?cP%4Y+;f~G#yt_`I@nO`WzxYsMM2e0v~mq# zDegFrT0d`(J-y$kha{r?jclnx_&&^{D2&SAu zhe;}}e-d}lFDT6Ly!2Dw^M0S>aTLBU^g0&OKrqklCle0blLhcy6CP!cH)fpzu6_F( zCF)f(!mZd#m13gj8{$4)pi;OYLyr5+n8%v)0XC+xKGvPL zRkDeGpC_zm7;59OzLJ9woS;2-gM^ZTv|Pu1?57fh@{pF_J;vf20SC0`-h-fwp$<^K zSuz32%%1mQj`iK6_4CXGGDQm5h&@zH$7x?Nd>TxsaXZ_&Cg|U1wqZ$&^(pJ!Nj;#X zvw+YGQqto87~||My+3G=Z847owys#l0bS!w@SOiF^sj&8RpOtr5L+KEDFM45jyhk( zx^xQ`IF9BzTLn&R2b^yQ z>&1UZ%l{wAy{wOo&=T|EmMCG3zvp@Ovl<~1b^_)PdIT8ANb~9IR=+SzBQcBMfeD*r z9A+M(On#gy%qPDg53c`jTZc22@UifH1D>+}qu9FZJvrSlp=(!4SdgANQF95NfpBn? z^h6OZ{!3bbYJNsb#|K$)J-2!8#t^Q;VHp@I`F0q=Vmrs*|C&s$eOV;^%QV8=`iJs4 z&eu#|30q=m=7ia0L^JYk!MztwKomU)+t(T!@oCuRY8D&n*f0&>l1H727XM}QI*oE% zO$_5aXwThn1cQi2VfXs9r97JdL3SJS!Ts>o^^)ai6CmW$n)tmV6YS0rYdL!#^Wl%y zmg;$1>}I-1A7caena+dsZ_p%=o9#rroN%Y5*k`H0eJZXie!_CJ6UzSiMB6EBUoW+P z2f0@9d`@s*)hwOB}zVYYu$k4P<9(X<+hg}s$h{mL^QJ+sk(QKDX`g2>#`2CY~ zB86F)->7iE?%pWd2}+iW$Pfn}Vn7M}&!iSVzZ1#Ja1~MG#4`xHRKml`J2wOb-QDiQ z%X4WAd9(06#C`n%<}DCyQZ&!stY1qx>9Ig^oj<~Hr&dBa47-0UaH*B~c^V0xP+$oj zeh`Wqh5eqPM3$l1E=3Dg&GMo=pGyu;Gy}}bC*h-R-9ogD8aUI?9pQEuqu+gWT?wmS z3lBELJR!)eg#cxx6)SW@_BX2f{_trFm&}?!e*Yae$*XVH|*8d;#@lWje8NM4fv94HV zvu@QYKp^4YGHyp`&wJPBYt+yv1@Biy;X%tdz08sq^{FtQe0W1ZL_vUxW1Uyi4-v`?!b0x%>R&njsQ}?wX{PhM@(yU0-(*6x{k^g68)xGiwFwR1sN0?kSA|G`fZziN8=hvzH%b#4 z2-~Sm2xTFzZ9hDGD90T^=+O!Sv2l3k+OXNK&GE!g06xyt&}$p-NAGX!zVT%XErfD@ zF2+MO(~|4MXEG;$bs~cI-2FFD#*GJWw9PYvwom|VA&Kz5I(~D4`*#2j8IRM5LQSqi zP#!sS)YE}d_&wP?tsXQ8(SI*C%oI)!+XiwVSst=Nz#!J zWhLkOKAwG+or=fKKV2VBb=mX9*%xQd`!p^7$yd>Hv=imzlW3Ug>G@MV{Cte5-%K=A z_3M#XXL3F&-PFSkZuvQr|Gj_0bXe+2+r_^0Vt+Zu1m?5aBm3 zp85H%b@UK9|LOXe%j>62c_PZsy~2OGOL{osry+Qg|D~W9{21)jo&Tk=xAD)3{BHoy zAD0m};*T?V0 zV>1}RRGN!tEd|b__GUHCOP3L$=JiNOCAx~R4Pi9*n97cd9uDjV&VuG^T#=#z#AvX3 zpsqMC)%$@$2|m!ZZekq)_1D_5{=)k6hWBLtbI1NC@$UpaWBW69zULY9!zZ|<9zIe0 z-(S|F=>i0n{5`egUr!tVR40x`qQ?M_*?(iHhsO|kBiBP1I|bMK{KYdr?=#F?em+is z9#iF94@bIEp|HV~SZ{3V;pgSV-$*{;F~*CB5EzB~;r<%`kNi}AqDoTvUU-HV%>T8K z`vX*oe?ExMgejcx^T{PI1S2`ka*VDz8-OrXWhr83izipa=b_J-J6pCf#*Mtsv;AuW zz1CXcX$tyJWr!D+dzb(|kuEYjGn9KLlzKja&>?+-GJqJyg607i-ebnr zKTKQ5&$zMKP1{+aDCI^0Vq~8i;vs~){)P!ADiXEbmx%sEVZam4to!DAGcDt`qQ(x&?7>)Vh*`8p zT8yWe#Yjf^dMjNhBaiD3Nz9B=4ctQ>u8o5rX7n(tZDXI7m?yw{M525Y4}hIeVVvxQ zNoJP6LIHxiycTghje^hRQUn1UtsF&$nAl;yVIFV}R*K7bOw0PMloN?7EULqZQnP-r zdi8NXChULXB+LU-5leamn2H$M=R{c*Ad2Q;1k2JvR$LPhH+{(sLF9j=uIcGgSTr9G zMTj{z#`;->ev~uz5(zFU@~br#7_U?0k3~q>3hvKw>?d={U(%z)Jlevl7hoX~s!V_X zFfL+^c66M1UPEhSGb73~bCGS&`J+`OrCkSDQh3ml%W?9`_aGw0l9TU#mMe4_ro*!y#jH14n@rtW4 zEW$9ed47byt0?FY5XHD&JGTEW_2UHB*-B+*F@*CD#!niE;xWf#6Dx~p8wOHmHQGZ2 z^GqyKX-I;bNCJLSg*3#RLM1UoyKcuaA_RksAS4=WOgd}iwhA!i;&>EBxUUCUfpY98 z>yL*~UBx>NEEGV>f$*yn;d#LFu@^C(;@+xAGrHzC;Y-1n78@sBF^k%_;$bWx9NSFx zqPVXZr%_h6ZWwG>NSR3(>v`iOT8I%NVn@V1qNG|8fi`9o`Uv}RK@@SEQK(yoe#o(b zGs^J2&UDtV72%nphR|UaY&=5{n1sTs9)t%#5-#rLS*?c z^fSbMg`fk%F~#&@>aHMYG7S5{#zimWifIyO|JKhVH%(|J3tEuhPXjUG*0w#(Sf0Z) z4)*zRs!*R@3NsI6toMcMvYTm=P@c3S5Qga;1MxlyB*+!v>VJ-Lhgkp8Nr$X&FZHqh z9bvuvQ05yDZc;d2nFk-(foWc!hk76H#=hV>6hwTS7J}y*Lmqs`EWgr_+wBut80?0_ z4SPQBZ~QBf^siGF<@r;&55oPfyq8U}!F;k|^W~<6vM|Cwoyk!!OB_pgrKiBrA>sQ{ zqTcU{uw3wfCELFJ7R<%G2?4$?cRDpJbnjwbd|P&8pqBd-Di4Egl>c+t@6;&Qrc~0N zewp~dApN22ryAuwmXa3wGhre@4dJvLbV|e?Kkkg+l6EsF{+RDy-wY2yTpmdW>+L@h z^QaeFETsQO`UrR>@$LCUPi2|87CyeFmYwg&ZZ>aqmF|S{uZEApkQS-qw(B%4?3;Lr zK;WBlM+))uZ{+@l5)ki)QK#Ru3{+S4a)9~p_PRW|wr_eGTZm(p(^GjB5l=xvg>rn1 zar~|DXv5p5A(((mX6^5=sKYwoT;`$WzIeMiwv-1O<5rGvzoYmYQg=MIyeH(Fgg44_ zZ^Pc-hFQTFv>tQ#3ZlIwMs!Kb=G@A)k)uD)uGP{MMmP?_AwnelYEVHwh*ugOG|J)m zCd#aZcsIe%G*o!MdvdKbLB@3_*cu73>JK|J^*9j@It+>6^=sf2?U9X%g`EfMJ8k!w z5g;46m%|a?HSQn!*#zT$fLQwI*HSjFKl5?ZB({l6{GRtc2t5G^#?}3ewwU%FgBtV0 zhPJ2vUC#Q=8pJ-!!FFhRB!nsaIE%(>$ul>_gJMr%c0=7vfhvyGn4`E;O zHJ(?^Gt63JYL5HTFj3G! z!;e8$;k)C`H>BP3KosvkKw>lfPI!X;T!snm*HiE;&D12QJwa%Kb=Ls%-*1NL#y1-C z-oz29EhN$$_xlv%VOxfQ^EAsNL>ERhiEeldK%s0ZaGsq`j(z@v>tAiO$GlY#(VD_Qm+NBOcSA4x z&zz6i=ADsvIy2rdd?%cuUJnEM<7=fO;)!^9?uPGW6BSB?J+$jwp8B}){>8adepLhO~ zmg@<9nfzzv{4e>?g1mEXd~B+c^S{OyH~8P={I7&E*!yh@|Et7)lmC?l|BLaU<*5|o zjQfwshgz!O{IAxph5waH`CqA$*WdYXyH2D2f%Q*7J71IkPA&CU{yR15FIs={-uU3!u_EmeTW#1#RWfU(!Wvn9roup35?1!Wim za~YE$!NeU|Pc3zwXN+D+3ldOsd|ssi+UWzviaX+l^+bJa*n%+*v5|a` z@PeKWM3cIBf+ZV5KzMpAW}$wXaK5w^jqrb{8~h+vt(_0~z&c1hF$?7Z=R-z>p~cx9 z&O0+PBKv?LAMT|h8Idzgj4eqV1IyIM_k%P@1+Lc@5SJj}K=6p-S(*ZO%+gLB!qXzy z2$eo#VuHTK@A6c8EaFtaRXjF`V~Gv)Masnm0^i~Ne*okI7X2rWM!?QU*jK<=6tmDy zj8QIj-EN$w87u_nz{8XqF|`^cdRmAxh8n0b4$Fx9i1CZOSs0QSeaHpGZmh)4D}wSU zL4$mr1ULa!(L8D>3bAsutK#o#De*aDWy>+=g)<64dQD{gDia_m(TQG4VvRAt1@%Q9 zcxL^UM7(322GN8IC1ZyVfCC_0EJZPt9G15yz_*i??}03$IHsLM3wp+|UI@x1`-+}d zJA6gGKJYlIlWu;F^78XE5|q;{W@THcO$b?B#3)1)mK*?!WaDF7i8>IY6$vK0{}N}f zU`~{)aAlq+a>m5oR|+3Ok~0!v77AedB~Dhj4fIuTL4{YXvXeS#VW$YQj{Zd&f{}@aam8(OU#LDCbD+upo5aAjb zD@&k==h2sV-ze-E#<8KmwLIIaOC-iKw5#J`oC51OMLkb#{KsN7UxFZC^_B$)_u)zm z<4hcHT7OTIIFB~2D_RtnO=N$X088W@chdmamok~~3+G8&8dL@4=r3!mM~Wrp4M?pV z_cSPkIFY97g#ztZ(e;@Tpnc&wmv~?(d$=BAp`m{khG`Q56vqXz8|N5jLIKm=I9b`e zy_X(-}IC*N@L_JyJ|JFA4Pu?*leY9!8PMJV_w`n8L-UX{4y@ zABLPd1_}w~6B7B$gpd{7MwN8O{yypXZT&M9^9W@gus#;^1n~XTqlNqkpN|qgmvKCz z=cH+WH?DtPd{Eyo#2GPHMBA-TB;By11YDj{oGQo_>4cV)bTmJw2DHX($IB62e zo`1a!*A~G+?fGT`@z3w2q-AeGi{%+C6Cb5{8xhwe{4Tq$Cnr*`Ae>o_P?3ns%|bl& znglyhSnd(;b44OS{P(S?-E!KoY7);4BC^fG)I9afg~VHEBPd$?dy62z6NqK0ji^p@ zX%Z8TnZ8jA6Z0+QXia(B=Pg9$!29=Q&nfLGlWCGG0u91 zGHJPgLd;tT+q$K^HL)oSs3{A)#hH#`s046>kX+OL|Fz2cLdB+e9od5e*yS8U}y`7fwEKC*CqD83IDrEEaPj3L%PnoS4g*6qm)ccMR?0pB{^NzM^IQ z&`izG$EY_vUZuZJr_yW8YvV?}E)yW$3R}W<5#ji1Nm<_XNWgxB{=oT${n*FzYbUS& z2+yxuVajn@x2|W~J)3kGj#%$g&HFXDq5%E2^)va8Qwk|(7+;w*5ijSJb#3pJYF-^K;eQkPUm^dS$p5A$|C^`U`CsFQqw~KarSrei z;D2dAOa51P3qmjd`2^-rw7 zVy2eJK~V6LF89ZDvCj#Bt_ku`;sU4!l@Mqs76j4wtw4;&kBSDyLcp0B`#@%vOO>Kn zOh=2IkCIR&!HJg?5mgUTF{VOJ3;h`c3aGICT_~)>tPiM*Lm9_*)>N3KsMRfjpb1q% z{ayG#Vju3CZCayiim`P-*1z=n>v=)DLIecsfY0IQJ!wr_1OOwtHoWWSaN}b2^(C9 zuzaeA|6L2hl^6-`UxKrxdooP6QQ40lUiyIR$qqIQ)P}{=vZ)eH-PH($kWE0nuqj3u z53zt6!6k^lz%1B<-U>r=dC&g86-O&<;KjQag?M_J9s!>*zYtpP=~f07V4OVS$!Y-N zXLE&ma=dqCJLEXeSQulKE~j?!{bn!=qvNy#%d4mHCFo+kokKdK|4bE4`hgi z;3wR$?Z|;3FWeB7I!&-4S&?wrHjBbo1&kAJtirAfu9z3Vcj5^6B$hl+9t4(lhbwdW zdb%t*kqctUTTHZvGDU6Sx-3cfPf6??Dq)To$)jbB^5)C0xrG>%qk8>&8f_Q->_FypK_!|`$0^5s9xumw z{n%fMS$;CcuwCyn*_$v#?| zV5Fz@fdfG!PN!z!3iLeaFl`s)9mmlYHjHkR`pe=%`_XqUPR>z2#>iLU2nhewb+qq+ zA80!xhJ1~2bwU^J{n#V1*ptf2YXSu3i6l}zFT|Z#NR9If+JAdFxG0tIh-gQk=S6nd z&bzA-`d@!p;eJgm#!{*%2pKz~9V#O4OBxXShWy+;aTGB}dAiHt(mX76BLr3)-%CZz z5A&7Xk9uVS54%sh+80R-7e-hEcR^e`)(srRaYTP7(b_jcJ8mwk3v&%VSdk!ARKbSl z9b>*)oag#?D_I)Rh*o`Yw4%huI zS6me+&%TTj33bfR6A;^ur$la>nXC%)li|P+0W8MY_nThKFz)xx=`qD(5)$vx#r^53 zSSfC<%2;B4D(EqyhxR!jPGj$t{*mKzB15J;(K*$U!8Mn74WSa5=v)flxo% zyeJ9fbc`a7TaIZ)tnGWc;-ADBW3rYQ=kp6$W4$~*hXk${JkeY-)gk*{RB29&Pp$7z%gD;peXDt6?Am;68g04K-_?;|gm>;)L|04?h zj@Ou*uwXStyX-H=eCw*wALaobeK=0G<17jCxj!G!zI{bRVmBd@Jtw-WDkv^ihtcXa zkM`UzR(PIDDSwCO1j>^Rk#8}ZbD9}EtC}n>nE!k<(n^S3vCbz2x*1) zcO-?oz69}4;cAok2QI|$Eg6UjLr;RucYVw+zY<5QAuIsRp5z^_tRJM#vac3+ac>Dh zE-e$@rVH6mWMuW08Sr{KQV1W3_1oXke$gQQ$8^1~>4)Y?NdB8jaj@P#TAJYTjy^x+ zE7GS6+@4IZUb!7djL|yg#-*Rx(_az4rG2Jh`7dty-y{;S@mRug?cOTK26(xe(DL7t z3Xc}igf}0=F^S4bnhBQw(wbU`6u0m;i^p0+3#6U+Z?VyS)Jm++4YMg@+xAGrHC?jj zj*aVI{`t&N37IT6Vv-)(ZpYt(rQqW<=HFM2>9O2P0}u-%5hGf&2EpG-{EwLzrddYInKS4l(tuYYGA#cX|Zy}PUtvnbPJ$(L08f*>Y{@pn7 z?|~JuZzv=2d@c9VkTHNsP-V4Wr=|W(EtcyuD_5}j>n@)7zb{)$o;Nt*?f8Rq2hX8D zNq19C4-~nd@3pa6p2*L?65a(-`FrUm-WPs7eRk0-e_uTPQ1(_i2%~Q&Awik{{MTn< zp5wg0yi=`eYoF9c1Ugaa<@B*Nd6TR|*T8-@S7 zsYOte^~LLRoDeiFovJXCoZztl@!ysYz5i)=ji_fhDunQ_Qns^!gLM97O;8yYlX8hH`xn*BG>4m#x=pmao~4 zUY}o)kX|D z(arKXp_{&&`pXjY>h7{YJvXJe!lO;$$mH|JU)Xv*9m(#hXpHav6~YnoVDui=uYV?L zD#7(a8}Z*_v0NGfi~R4Wt(Braw?^$Q(VGNi`i=DDVu1IdO>LKOOSS?9ZCPt*p(au= zl(Qe^xKHn`CM|-Bf=EFCkU|03kDsAk*W(NA^Vex)XYHZ}nf>g(DOKG{={x1Ibsvh4URq<${}r1;6JTpNB2kQIx%OhVgJajh0QJQd0;p zfJdl8T%d_imMil#y}2@eX}f9hpYj%u1pIww1|^5f68q`p#ox)#mrCNq&zpW%cRKXD zG+$0An5bO1d1ZQAwsF2YX@PO|&iejeE&%ZMnR@?jCK%Y6fc#!MMgQ3h+m{gJ_v88y zi9J0;o}cOA-;;lGKJ2L;;;HewFxP|pl>Z&kLsh3+dPr+}{$oAVAVm+6&MiIMK=q5y z^>F^`;+Y!(~cWqCFK zDax`|ukyc^4`q^e{x`Jnze4^uyySo775-OBasF2BUz$z$O^ z$KfFWNUT%A;{&=mvAy|YJ%q`XP(PdN;THCdM1g=`r!zAp()GR`j{KZNzFXXr&}Z@q z>BXCRh=i^l{`bOk{VhG*BZ0*z@!#1*?j8#00fEW?j=$qX>zM6@yWuW2Q2rWyXW(=xl3dW965#}5=$p6B@3XZsS<lsJUr|h#IGbF&nID0V#0k-*tF6bW9GHpvX z#e@kvVwUy?VTS%V2x2irGq_+5dsziSsr;f?jHR{V<&+6C_A53(+ISm>C4KY&!}SHfCoTh`{C1iy4T$ z!Oy-XZaMIj%auoI%g#sVtF>7&K?X2fBZUC*{pIl&eO-07LVyp_ zkr)wwB-nULn^Ian=zP{$ZaufqL}%#6C+tP{(>(RHK50n8dov9g^J#9D|1ty-G=KhI z)_8Yy_`JYIeJyaY9*@O{GVM3|_j`1ia}4|>EmCck>vOCmD%E5Z z*0}0k^cTe%7Z+#GO+YqJ7R&fB<%U!s8)0%HyTSz^U;MT}h`zJhzR>d&=ff{Re8j>C zZ!RAzrP_ccUAp&yM=}6v=|Pm5fNfP?6xx4QkCuZkxX}+n`gS^2RDnt&#v1+a7?`i~ zrO2v2pDYCT&4|+-dPF$Y_FzZ_5`zNI1gp{!gj-I;^LBZBUOlfxR-e8&{6bKUA!F_D zNR9>d4)Z|yFm;obLm8HJyr)70%H4J%cm`d0C<}Mi9O=&SfD)H7jqpC`fF?yAx1h0^U@JSB!o7|Q*fjh zCnUbCKTl$v>9`o2kIs!~A1$zs0wD=O1n@mW<{fXv1qk2a#q@=_svqM8cR6=sR5#|Cj=g2|eTxrBG>u_2X1I%I3>Z8}Vk@FCR0-F~F?sL9`rF*Oya=|j?!4cj$rTEqYFwk-+~b4$>Is zw|=oNMOLDJo%qCM2g7@KGY0XWt|I=6%ZY!Ke9F9ft}xFyeGnGE9k&(}{La!-gY=)$lQ>x8ug1M) zL07F>kN-#B`+&x=U3tRyw)*+?OY}h}pT2w|nD^BSCWv5$e!;vE!OT}Lh#&@&?JOpU z!DQ+!ViALP=maw>g2`5b8ALF%orzgQ)(rK6Su}&mc7h2anAyr;1`*8C8B9hS%$v$! z@?=|-t#+Gx~qEXC;O3sg{=!Zs;)ox+&^{e*8Tm?IrRPDvCDt$0mz#r zDbIo6Je~T^uoj&+3T1UVCGo21X05DU? zK^^1rKPKRCq~*U`7`K+HV3blqd_gS@3V?PI z2-I!iwu?F*wm@Lbh8S1PRZfpWeon6w^n+dqIrUZ3e?rU;uMS7Jx`*u8yHP#8O@JAV zbOk^#I!PAw0l+zq>th@9_$?g{-ey2qC&hYlQhz~R@3ZHi`$Lb*GZwyl{>9(nna~Jr z`pb~y=hT&ctqA;&=+{iRzBO#2URMV;7JTUdct63Tgg)M~ob`KMoG&wh`Cb-*kQVmC zBEVe$Fq%|Px{39+f2$v4?8sHFLibBZZY2?a7OO| z^&kUrP2U_^7x}^h!*Z0%f8WXCaa?D|FVx!?^^KJ7|9KszZk!pVkNf?f^*!NPy?$(aeVgV%lG@7=sE*HHjMNjM zazI3QUCrWqbW3GD*KZ5;Qq&JXlAne&j;aXH*=NP9dq0gBFOp-VCwu^d=6MCdN2$p) zEaaCILr4_L-FC%I356DgH-Cs;R&d(A@mJ0n5? z6s5p-VQZg>?zI%5uw+99j!0tfdvx>p`9?i23qOZ}Lms8ygJDpXxq5W@6+I$gbH~X) z=>Vbb@{c<;>0#gg?{po^hRur6u!CSo(y&&B)-)vt=w=0KdVEsi>X@%d9K!urPjyh8nq zf)|6Bd|I9}a!kA;$dmP>(ne{+d6YiYrDT5Za_H;+BTCM~zK9Po9_4^@#~5O#wN6`LKj%QoaD`wS9U2m58E%iJro;ag7Hr|8vlgnNnS6o zcu%YX3$;h$L-1c6ut!>Pi2rII$0K|72>cf@`;XwiS{&fNr4jhAaQLs_vXH)P`HvhO z{wsvTe|bG0_%HH1EWbRq{MLhRY~%;xOM;gn?!#q52SS6wo-9E{d$yq>uBSuSrUx_$VTlPbemAAG0F>bCIL0QHy+TNS zKmr-ckS7c;69VA1k5M`Rw4KF!aoc~Ll4B6@0O&ji@POm)Q|?j{Vr+`i0aM8xPrHEoZ<^9clH}F_JoJRn@uREWCei!>c>riq;h1bSkJM-FM z`5mEvnOm-YUOi385d{vmY&tueok4q+^(DlH{ZHzVJ-Bd!<;WTqzT5&6GYY39yY5}d z0mx*@ehU^^bE*B1Hwl(pr3MxpmSuqb8V00TiD5(l=Wu$v4g$c&zVDd2$5?J80-*xH z;Nuvl4dFrztndURzmhHNG>kkqtaiQ!AZj_|32Vnbk9CeUCzeXQ;FpR3`HQ^(*NF}- z@JxY`$BfYq7BoZI!UF7+ov6eB;1_9W8-RX|&(oghFtGvhfiN0kLBF<5fcMgHY6k#{ zS{5w17(%%VU&lwuBhIqKOZrlwuGADCY_Gb+Jg}g1SF!?~*=U zQ@=lF3v1O9{F-WTOkg`6&eFc<5(JJ9wNwRQq*8B!#V#?6v-!UFJOSVx?uS(0a!In~ z+6L7JmU$WQ+>kL(z)G}VRvv)ci8Os40C->A{W+NTZQVind7*kyGa=xLUeWJBKM(@+ z1#=!OU|D9O-|Qqt-by>25c+x;e^brGt~uR;K14@=Yir5e-{8s77b&#&veXhem2q?NwJ~V(M~80 z+KB{!e*EXDMI1j(68B9><+c#O#6G@y1;&7tV~0MJ5=*DVViN2D`6AK={M9A&01rtZ$y4^}9C}`?0Nm}VrIo5hf z*8|WWh=ioB%g_O{jvj`28w02bNl_<>2zKcAd6Ln6qtx5=0W8m^Arm3A_u?|^_FJS+ z9t@&=j%kl_sziC(>ZSb;mlk+$z|wvyj}_^)oF-imTLzOopX)<=PKp&V2WdCe%$jLP z*Y(3a8{1!Th?1tT;~%>mhlc^^$pAa@cgIr;gg4m2L8Zes#-o}3dN(<$hw{B0RU>Y7`GljbYf+|G4G+@iv1v3 zG7^BdsELq)VClQiCVAZV_Zi@yOws;oo!bqT_D(*`*D>#!8w5Q7r7FoW@6v6Feqdwj z&l)M5gbTNVD}J|+@e1!X@{>Ue8`-r%vKO-l9rTyW)-pe0Pc<~UDi6okw16IKnLs;N z_CZ9+83=3Xs$?Qd+m0_xfFOt;{Yup#Qze8Q4Qw0u5po~w}FGlPX5>+M62rikq#Rh?t!*>U=Uu2`a>;CxlfzQ29cdzp@d zC^Acu=wdYPt8qiD40)c#^A1}-foVY_4a_pvlSXc4$sRNEQw`#Rbp<$w{?0M|1@u@x zvdp$(e-CLs=74{MEMkuiAUf#TYTW|uAgR4>}ax$r|>@+y&n$bZI`=aXu>&;9H|8k63#RtoX{ zT(j@fn}Pw3IRaSp!0PcttRp9n00HcaQfxf{_?SOm!h-u>i8&)-`F{v_hYZ-sz*?#@ zAv#hq0Kv)h$9RuE$~zRpR;;3b{+?!n>TU5z)M-ATGPKiq6%IqpgD;NRnE!GFpgiUP zo?~3#J0MVcR4)c_;Ls-7o{QD)fJw*#z!ZQu^QhM{@>BYJ>NB7tqvL@;6|l_1qf$G) zQBMbevS0$*84!D)sP0~Lyv3wOf6~`6kK9pN@9VI5JTv5ec@7Ky>KGs?8VR7lW1bdN z9*#Y$=hR&gUmvKoo+YTr)(F6&20cW|?}3SZy5G2*l>SkR`yvp>`)*Uv8xk&S1<8&j z?(VDd9*F#EdcQrYUJB)EqrWYrb-up$E(4Z2W+I5S>~!akAO>j9od>-l8%o1Re|We@ z=bTbg`=Qh87@!irtA9{yD95Ba-%ALfk@W+jjP_lACrO;|;rfe`J-VF+k^gVit*&tS zIa$!_sunqjhU#|rO(s-jysma$pdDUN4{Us$oqx>b?0KlU|8o#9?hM)^Ew_vMfpE{? zL+WbxUG&4%fzS0c7I3+Xmh{C~`;ZR6ohf;2!JUC9udZ}|Lj(hLcOZ@fatpe>r;g!K|J0LC+zZ~l3HZs!vt>*Ir4Q=iSM^xn?T@4gL-?gxVi?~l2I z=S=t`^>K2F=1I8U8H9rRu9_x2^p{m@;EmD;G4=f;^`ewVz^3|^I=%B_%x)HPAMG}G z&~Aqo|Bm3s?c^~)iT<`O?&Rp(xz|n5Z|?T$MFK*>GfR6!zlJ5bSOr1&Que6(OAuin zr7_xVddy?O!C1nc0ZM}P)UgA$#am+G7530Lp?nzZtnR)6fZ0on&r{(!D;?vpMGJL? z-pA_SWShI&m{-hjNHZChLiSix@+?sf>pf;a;(Ck(Imi_eLOV6MxPW9G3VwxZre;*0vOT1?w8 zl-PV8f)L>C*YO==4Pqp>Q_T`I&gnR-Vw~viHn4tkeh&l`5$Q&OFxeI_zI72!|UX@NfqZg zfVU446<$p_xwNPUci6N{)ghf!aKl!)v@@mj${n|j^Mw7&a?Qh zI0pZv+>vhq|E2P4TYh<@{L5sHNEm4M&~Uc=0%v0jIe%$g zGYDuUNx#HaIA2E^!sCHFIF7QT%#OKX%kLaIurybB8oH|hIfN)b>d8*n)?eHMfQwO5 zIYY?;?G6yP3?>(2p9c)*VqbSmD!c1nIZMgy+n6ENm5Kw-^NiBL0O8KdJRU&PG<}$M z-SHyh$`TSBkzs<85akLb;qqOlWu|=k|JHlzbBLiC>07q0XCPozKXQAdBfW$Hu;yN%PO51&3k$!+;lfU0WZO)D z>PAjyOWn4SNjAOPF?#reY9}Cl1}j@NSl(^y*5Q(rfzL_dePANk0g$|5Ljqiu3>YY1$BYXVqU*8tj7TSh4Vg6JThgzJj5#qTSS0KNgptV2%f81jxS%MDdc>j12qPv183 z%3xvh6Idv35P+?&3@bZE<}+Cg{caA{o>4t5rp=9aVJTYQsRF>7w37^Ladk9yn5m^E zN%258LD<%6 z$n(90jc=1hTP843f+H5TG=sc%*ml15QD19EmWmVN!eJseOM0o(!;RhVnfu<_pZ#rU z$00iZT0g%dL7gx#xvLw~`aCJcC zo!ARD6C)dY)o0XRwL!4wvn%951Q*$jVT|W490mX)o4X-Rc)FdZ1ax2QwYOscmO;+% zqg1(&15U0Q3C5k3S4}as0zw`UE&q$x?J@JeHmdQbwaxDFh^}G;B;Ut9)$P)m; z9({oJukA*pPrhjGfDi}((h*}?acF`z@?C)BeFiw{kX8<_r7dcgerwO)^r`<2(H`(H z06@ih)~M@_jA5bOkO?d{8yWTE_I|ZP?Huf-&l0L2pM8=hB5;BL_FTlTSSAzk~K3+SgJ=CS?QpCU)Ux!@4T< zWGES^7dZi)tzNuM`gnV*)bCVz*d9ax#<*UJ@|w2ei~<0s9%WMl59JZhsNI%&9{S-% z9_Da0XXj;eHs*ax)kVavwI#dguE`MNP&|yFNBArxf?V1FVIu>i`H~VJa4UV%C)u0Z zO7J}S`-owNDZG%=*7C;ev&E&AlcLQNS4z|l?9xA5?$z;LTQ~KE7~}wsk4VL#W)?|` zyG9SYAff2G>uF=#$YIoLZUgwh^AA_6$Y+6Fn2T8pBu^UYTaOnJA4fgahOn?11p8B4 z5rEvuz0kH#?4*dSYs6J6?`r&>d&96xu*bEMeA)U4w1bxL&@$Td>f znCgk`--!cMGq2ylxP76Aaa51%M$Y3-U5gKwhaplty1u`@NBuC|t8InUpR-_y`Ktnu zkNkW*9{`lm&q3e=^$7i2vSk6rrQBNbXMS(`d5C`6NF(G|(-=SOb6%9KJjkfuRQ5q! z%V*PIk6n;94m`6+AML~z-W}AJlU2o#Wlhy3fLs+SBZpNpJ_i`5{SIAsK_!~&QP}s0 zP`;BoV41C@Q}jFy>-#|m zA3mq&@wVwtOzdc&KCi1~w6|}8_w%}A`_n8*J#UW3ynX|{uJwW)c!q+@G1Vt!to~mlDpOA?`M5V@pYLrvG-$>&Qwf{~spfzAT|SM)57*EIT# zxUJ{Pll+AJ1&1qE+L<3XvG^_)JLeNpNeT2VWG5+ zdYaZ@29E*x9K!!npiH zd_lvrf@FZ_p>u679Ps~X14Kt0+ZWIEXY;i#djMM5b$}odHJ0r>`VoCs$&v*^KBhcc zs8nCg?{9D8y>U8YAm>~;D7Y*yY|7P;a{*lwAS~!FYxYd`M_IDH4U7JbVcP)%A12X$ zmvxfi`h30fCM=cj!1KrFMes^sUAq?mCQ*o8t^@Ejd3Hv#WZP?~D2E z&f6HL%*?T9v0Vgi*+oA9)(iPP(qCt4d>;U;oRI+oOTu>mI_aZ*mgcXsJpGI~U-H<3 zSR$m8S_Ki#z{;i{!!lT(U|1nt2mr*$29fG(`NmF!`kLFbv4<^yexVdHuyp9cK7<_C z0oNbuXG+eN0_Wmh|5Pn?LC7@y=uM6tto@O|w%b0Z=F>X9V=isIOBSN)NB_Nk&iK=6dGzZ)(_Mt(QrXnjZxG_} zEZy&=wJ7lo)$oA*Y=)-cc2RX4QeKw#g+5RmBJOJH?N2h8w`#d)CGx^o$ z@3Lnc)hbwg*9z~gcCmg6<6|4^v!_#<2mi(J(k4B(pUoT3LwE?dw2yTh5oI`@ZPzZHJ-pQCSTw70N_46B+}Iias)tF3UOUxB;Du1j*nmu#a#k%64n`6Es>gUrxvHx<)yqF;Bdo(?9{2;Vp7(iro&8+ad-vZ?100Nkm^^j!TckGid*M~)E$whtk; zsO##&F23W3;xU!8la15*g#JN(Vb=pe`u;x2*btQ>daqh!+J|0MG^e@W|K**WUp>h*knhxGlCTHNzNsF?10 z@XVKVXxym`&OW936j^7dgU}CwZa}|z(ZT&~C<1*M-%0d4ZEfTWqJYznpEG!T-OtYL zBv}6ukKZ(MemMCo!S`;Z6T)+u551aMV~grX3>TihjrHcUTVKKR_AqN652))RAwZ1w zRG??{3fARM57)Nn{BWI1A!Mg2l)$1nT$xLLM4!6oqXXT7MTX!kB*!hfS z0SDXEW#<9Axb-I}IT!tdbdU^^L+LE-Q%cU`0D%3fjj2EB&M$`4w$c&^T*&NRg%Yh# zQ92+3IHEu$rQ~qCQbtJ#^(jgYcY`N_ht4B7d*pVZ3l6pn$>D9hZ}l&U7vHKF`<+97 z!eg0G<5~PSkVo)O3z&P>BQN2rz<=ct{1>kE9sWyra3c74XkGIc@LxLD;lHr6clfW6 zBk^AettdAJ;-!t*k2~XciTjVnfAtakS3+|69sXM^zxhAl@{6P87Zz{-0RHXDuU+|t zJ_i5BIBd&bGP?;|NOZni$EZd5myc8g-DO=N+FWSU;DP9Eb~D{xE@UbJy@TBT^q_s$A=7lE;#bhL|71Z z3sLbAoqt$@F%trGq`9Leg74$&kUP39Cn_J^&VxSTVMB8H zW9wOgnIH!-B&Ohu{RKB?iJv{9CVrjJ!9xmf)luTm1?)TBw}0~a4IM#%6H zCC5Nw;M@@k#>yrUz}_**4SXV7&mPe6teQ<^nK|C2scLV`O{pyq7P&@Zm9ux3= zC-ojn01H!_^g%nHN2!O{mkeZQ7RY}@(butXU56}-4b34AHf$X(LuR51xgbKw8LM|@ z^z8unZ9}h2H-|KlC=aH#s??wQE$CBD{U<~WNYm*j-zG`=f;m~;tAqL6#6r)iNo*nJ zvwn7h>Nz3+CZc5FRc9iAWh0_I@CeX?#b=mB0NN)z1i;VsYQKHk$fY#ccn3gy`+cgf z8~e%ozcjL)CXbC&-5ktR#Qd#M{Ttbaj1|d5vmUXwv1P2Dx7Z^9JD_Drn!(OICLm>) z?vWmGZ|?n17}?yP{O!*Hh*aM9j6Bm@em^nt-d^*4YPZ!?Y<(Rryo0O`fW2w+@wvWr zN)oNtK|c!_C=emXZn6y8MLmt<6x;m`gc4}=slQ(CwE?)F-Rn^PgGc*Q8yT0L}J>%WbxxNt#a9NJ>+xJQv@&fIn{=hgFo4il|L*CWg|KZZu5d>7- zPz^|r+k4Ry%J<^#!s9@Q{?cy!v1eqX+aTh^V5vL%SeX5@JJCi!`>p2!&wG`CD}vefB0N{k-I&^K zzq&=|U+S(?J7yQtu*0sXTM7U!hzUiBe2KB96y=as42vf0} z-~-G9achz-zO(6GV~6T#(YEi!?%HDxy%6*QjH?*eM#>q*mY=5HAeR`>Rf}1zNBQ6D zPCcRWrhCa#pPuuyjStWoyYg4ntTm+l=|N{dfIc4Daiu#+{d~B&zqEyg7V>O?ata+e z3F5(v$n$E7WOl{$1S;p{ZtF4W73~Z9K+YmVn26x=-RldqYdDDUp&a!+YDZJAq}Svg z2sVSpesh!bZm8*@ot*2K=(zsY8MWN`r^ zR^P{hPA!8aypaM62VoimK#sQqwDT!ffY`G9G@^X^Av|3eZD2tWs2KGb<}sDaXeV+evUN~TonF$3QBTttAMd6< z0BYZsKeTe*%BiB{er`$&Pb&SHZuB?;A*z9S&Z2ove0YRtuYi@=7e%drLU+CBNLlDE- z89u=B0QEbUw`JgB-YehaNBvp!S|E&#cc-8F7@t}I&@Sl(&4jik9pU}jWT0O+MFKso z2NCOG<)UaHmDmz6Q3CDe?|T?O zD;T#{(>qySB_D3zd@$bqam1hy@v=ohp`)0bnh=(O=r8ez~%@LgRn_sNcZC;HFy6 z16bm(mJ-B-ua1%2U{6(|s{tgd4b{#`?}YL*gT`*amj2fBk(CU~X`1&4 z`(4>U$fS1v>$pCk@g|?|ced#G{X7`NcA=Z(xNM={L_~pri~2d?fmm8s)UMYI5b04l z22-0fj$P`fSRmd|N!A2Fy~=usrVde_gOCeEKyeoBf3Igi2)L_mr2*+<7Utdr@n>n9 zLsP6~F}@`|EC$TTB>?etxhP3iMXelSKIO3mmToJLfZJ@67dD6C(>JM}^_5}Fz<()b z;2-m^vL?%ax2@`{ssX}4ZJX}%7sJjLJa(wbl&<@xwYd9<=#0e-xE;u{4?ts%_VusX zT8E%bi1&SNBgG@;6eb?H;3V~cgQn=S=f)@ zg8f1Ui+2ksO~GQ5f%TXGLjq3l`vu8_*9tw?>SA_#n*q4-XH>yoQsl}VmjBS_k!~Mr zv6PBUc72_1Zc{t`r{VO|U!wnR0`U50_^f~>V##9wzLY>x{XnlV20?CVl56S~h_!#4 z-G2H8*HiZ;JoFU_0qS9+7)KhP%wAUfmz{AGVcVM}Ay%Shh z$RT1yUsvq9zA6I_H6aoE7%Nk7B@Ke_=kx2&BhQ{xx ze>S{B{YaJba{y3MRfgsMvY5^S^s6jT-mMX!G`#Tm#~^&QKxlhiUq}4~du|F6J=4Q zf0+eOB#q~Ju-iDfK8hO%A8inV>+mf1!{Oo+0=oYs?`)GkR6Y)Ac|!?UfZkCdh%~nc zB)^f1?T7(80A#1~nGTI3KhziU<|yL9$$H}XZqm4uZ;~GBJHzvjsb62qK-}l{;F$G! z3{O4_+Gm&g0B(c)A+EbQyi9 zCcoOP5^!RGMjC&%vI-Gc^-uCecq%X+4$yAa0$%^Uia?}Evq`E4^=HGgwBDkx=2JUu z>)9YF=5sR8Ufgs?30S;e%PtTwtbQ?!Hzf#454Hs?knisKY;nF1k5&X=0=S#lBDpxM zJ$~Dj?;~#y^ljb1dwC5&);EW>CvO7?>~3OymnS=(BPtlr3e&qFSY|%ePyXk_8R-9d zzS!{zpwx>h{OIZ+R(}%&iL)@wG4=oW>qfRRV;}>fO9w#ZlPm)f`DfX!rxE)7%+qg! z0KC5S8+J`TY<^TNM#t3Gnf7`#u6=7*r}tTI@-_Vf^WP4tPv3zD*zw12V4t76`-2L`P4irJc)Y%s`M?YA%cR(U3+3*N4y{y- zd9SbPaS%yfOsng2Lu(!(XRbb-c&p) z{tkW1=6KPgLr{FrV!WQld+kq$tGi7j?+ijVI2ba4+_dOE<6aB8RUn8J@7K0+vOs|K ztqiT4D%9^Ie0#)V4Iy9NQ)h{gr9ZCfz@IAF{$U7c7YbmUk`NNf;bjIj8XtBK@G*x6 zRXQe>&2N)C6k z1O`heaKwdfnbIL%=$E0QAqYcwg~zc!w~CviPo>pT40hlU)&7~l6g zW1G*NX)3PKs~BlIF`PQaDUIn zeD(N#($~x=rQ8DNVL`@{Esl)#heQgW^gvUK@BilefBpTx76yI($MhdlapLy>R4F+? zn+G5V=&LRzLv%hv=>R}?gaM7@fOIARxPeJ!CYk&1ecB|7t@2Y!?!Nz5W|FW2(P`oG z-!N%Yh<@9o`;HN1^KnFhwvl%a2OPJ>NFN9tAl8sXZ<7)&m{M{Bba|DMbNPSj3MEtS z2}%T1P&%jwmycehB*d<_8+K<*dB3#3+&BAU_3~#cMnCy`vT^DHEku;AmT#H;`|?|_ znB#^wKK}|0_`i_NS2m3NE4fjg7NYv!KY4FrR*1KkVp@5!PC&{a z#sojo6;Y)LPYxnXUQ=r{AsJp7rg@bt$@L;!)8Ee#<2AdfrkRngXHh@*#Vr})r5M=Q zJdF}tzHHJ9R$iC)ORyx96QaegOR-;*i?E;x&5;fO`i`vOc*i6H`V-l}@6);t3-(BK zU>VB*=_B)B!q1)J2~|~+tjYi{_KKJj9nMd4jL0eMn`tQ>hvO@fyT#zTOhRs0n%7mXJR-E*FmbJOR>O zZYQ~55<6U6!};@)WBb5?FkJwzj7bf^GzMU!TuUk1Q zmn@(?t-*Y>o*Jg)(fVg1%joSa>d|c*003a&p#$W{7L1SV@so9T=fFaqHMX0p-}83= z-U;`bks(`_m+EB!0A(3~U_*5<-?*n%GXI73IdOwt$%yiL)b?W$S?HBoW7Dq&HYRIK z9yzjwKF7o+*WE6!alw|P4@6^h`=kFgAyf2wAH+K|14okk3PpZpUgv-@4wh~nxEX#dbwHgSif>;q#3uN*9{8ZfDiUb#9&`G6q5KO z<#YUYmk4OC-Q@YwLK$xE#x`E1{Z+X>=K28<2?ER?%ULb;LF{Vgw#{7qvy>;qj>Pd% z{rrvuuvY4p<5#IZDy6h6FpdMj)z|qs)2)1Q7(0C^=Ay?A>YvZk7q)

    FA34|?)EFJxl0UR0|Y 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

    p_cjz37(N-wgWQm6RfTk%@c&vLpla;FKm&LX5! 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

      c^_U*+<@OuVgS{^kR&~Vhn|w}Nqj#)RL~ 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ⅅO*YIuI-mA;*{8 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

      Ia;EZ7`-6@bhYZ?uyqe;*;?e`9L! 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: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≫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 g)tO8Hd44D@6aDJs0+l~z6egn9 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%0A=m>QgYwNw|D1Jo+CYO2Yg?( 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%0ATd9`-~pQij#c(cggk zZug(fK;N}I%3fCdtCi^$1+0j)fUW`lgB(CWY~cJgcKgL;YL25za_{e!sg{;n4`r(! z;Dm%RvV`a5*;&<9iCmC}Y2KT~XW%=l*j4&6yqXRS;=63v9--~n ze^0?r=*;p?%x42G?MTy3p;Ed=fs~-HBS6%!_@)kdV{HWibzCEedfPV)eKdL#KFoRv zJYs3&eEW%{5LoA%l7$fN(JN88a#Vas8amKon9+)4RcfW^aGBMf@Q$=IP&F?g?POAx z3ch=xlh|_O{Kq_gWe|06Y51*Leoo-Qm8k;d3GL|~n;&t{8f2C-qsaMLq7&5+?HNKI z&N}vbr_D-+m9>4?fwP}J!p`IbNUfbejGOdP0O0(f)WS)QPS|Y2^(&MNN z9ZRbOyy>{}#r3MgO9lSciIlra7e6&WT?3AIoC-ew3`$2YOszVN!!>#h?nOc0XmoDU zP+qwvS|%X)S~uok-r0|WQGUQ6Rio43`mqo>t1iqEP6*;zPh@?^Y@RJ5y!m}|%thTa z*F4Bm#*Q-A6^=ef_jRk%Q2Nxi(L@z1HFgqAa~GhXO~Xq0apwXDH@7)t=|vA*cK4su zMEtLT$>V;G*zUC+E19ajv$<_9u88ZVDa`3rhI@dvuL=ktOV_PCMUO#vnITQ<&E2xl z)ueFWDe5Jx!lgj)=-=|H3MqCk^78IqRWWoTiJh})9Qx!2zu z2!D3|#tEaS9SweZf#Y=k+RUl!jwwdmJPGx%h?YXY}f-=P53qsB5;TCCXHd1QEb}Nyhqmm^;M&sO3sq}el7F^bxpI?%1*O>TX z7q?m@AIGxjT6$|^yyR914P)biM>V5MiBu8K%WNgh>SBQygB`E0- z|0!)mcHzuSPNDRE#wC@iQ!ifMk)U2%mhQUnBY#!V^k-1(!>?HP4_1fSM8YJod!zZW z!az^8{Cy*qukJQo*3^!9X6i}Ci~<)tw_9-Y$s>N;e$qA3vuRg+Tgz-#9$Wg?n{mbm zD${x4{NEhUmPa@q*G#~@kbVAchItBl>sew;l1pK#NIvM_>3W->$5Seq#MtR->UEUm za7RFBI(C7k$hXeyd9>JI_Q5+Ru&%zpEt2ho`=NLwwEsN5}*Z`N;m@oSH~>WqoN{dm>&zDz{hIf> zUwVv9E$_F}*w>()&t6+JTk{}9Uycs%{tB~hUj)^~c6{g>f zQvlsLnse4PdfdfkIyxgyO{7EgzzuATBr+KVt&U^=WocuW3P>vW&H5sJ8>` zMzlNmJ(Z^{BY zY&TWWB%aAD3m6agkhqvIdoB3~(KW`y9nMOoL_K2k8QAogQ&R67N>5f5`kce}s?^VS z((6I-l-rchrWY?xKpYn*RVV*A7v`gelzv1sHvs`Jaw2Zt{|PH?Y@e_xk<*s%Im)KWRDEHAm_Jwdjth)bkILHJUw3%*>yl6-xD! zw`l*W>q2W$m?I93qNVSW&%bXlUd;O}FzUx95LW7#@vS7od;3+UH;%^=*+KdUiruo^ zi*tP<@pchs%Hhr-uqS3Bw_VG)*`IepQ<%6u+uV^zqP~=}@TelzXI46r>sTi7Y~t3* zUN9fQQL^w zdcu|j`JoYcyHFcuQty8I5I~4H6zE7akCW&GEv?D50~2QhRrhK3_MZ`-eLZ9uwjyr- zm_P5!4^t^76^BL79qRVn{=L;LDx`evzFkwQ)9mNHF>?(CHv96qE7ViK#}uA!Rpw#HQHlV2wB_+WA)Jq`HTZVL;) zMe#9NPbT#_Q-`r3dULeiVTLoTx94sRydAL05s7VcZ};1^fxD-<31AfOk;?lJ#acg| zn{Jt)$SsG6Pb?r0cWdE%Lk$l4ZMFOdb!Ta`$&|G6}~4z@3Vi-4X$FwItFr4L@A9pdBXO1 z(=5+pXomLEL7!iX$Lnp*S89Dr2c3+3XCFWGK)I#$s%%zUJcyYw4*X@CUmjEtL{#J& z&w)66o7h@*c+2>FGeRPGOe8Hc93=9^p201?ffqtjeQIETRg~k8V>#cDCI`6eAxL|Z z1>p*06)|8*bhsR04g=2IkCM$ik7U+PHP2lureiMc#he>@8V#Y#NOvk|3!7y3sy?>9 zP~-08ec|r?9nlZub-fn(aPGwjn%~M-Oi(C+F_~ROvL@9M(_aGE*$iTAz_)X;lPQ%M5j4z}NTS&efhz zd+@|)^Bb8$&qq>JxAbI{^Y>K!1xv!dA3v!=H(i65G-=`?s(pX zslWfbkK0j<+T>7@?7d1d7ck)&?wYEC&QI_^d zQIm@U)RF%+^N{6rne@TQ)kG`l61J$;?EIP``hN@a+;=yHz|Y@f+zZgt!ID&aOScpc z4Jr=hmvQ|pQ(Gw=w79=_0;`&QL(}$sU)-F@Xr&)37^NS51rv601TS0KQdA#OK|}*X z+wf1ZxTs^yEJXna{V$P9oZ6Y1=EAY}38fEs?}eV9W0F?o#IyWZNfq>4cpsdYaHwo3 z4I^FxerBhSiYYMuJvR`V{d#u4{O3GqP}IFtJnBq4JgF>L#fiRD6FpMmd*W=6$~RbK zn9SwaL)STz(+8DLI}h#qiy+@K@JxS%m$DSf7Qwpd3p003Uxm(|a& zt^k6^LG9DDgu6Z>G+GIOp}l)|WH{HdK)1-}Lje^=6+U9~$x~O%R(7gq#{>1H7&9-E zH~y?Zsp95i9azd+sHbfHRdmdek7jg;+j2>Up?$zQUsLXA%WLX?fnt2_`AtzoAA4Fy z-&<13g$k})QF;BRYGIOF_H@lTHy_u8)Dua!_+DIC$4#11wslw)`_eLL3@#PHNz!rY&=>CoViX5q`7UUBc* zl$y`5Vlkm(Gz61o`7ZnyCTBw{a>Zij&s!HNTWn|e7>s+(RSZHtKjG1Z*u8$5(4aoU z7d|Q)mNsr5)-4dDS39_cubu-`W%6FTw-uW^SLLx4Y- zKraxpJpp|?5>mLEq5F7+c1j#B0TZ0@+Ajn-*=@^D*P<-X5XRaF9q0)hqv-; zz-AgWVjbuEoNYRI>D&)9S|(nuROUv*&0LYUJRQi9*H18hroQmPV!O8}`wyvnbR&R9 zXvfdL0CW7;+fe6ug56Jf2H7FSt(EU*!0IROoQ|BmajmXRDQo0pV9)Zu>wRL?Kj(C2 zh&-QBz%Mc2glfEE?bF{?Gze4etJ1KQkgebLf}=KLPuHPYfNcKA9@kz`h-k5BFQ(ON zq1pQFGt)v-^{`Hn$(u2pF<4wC;F*7M)DS(Q+}0%OVMN&3^Qge!I+^$yy@#l+OY_!x z=q=WpA+gr9t=*s+lv-iO6&%fRbteoK7Y;O-p?g#O`|+JoCY-idl)N^HLI-wUs*Q4v zc^4WG_3;a#g;~ufB5b`aV1Tp!8sCWTT-{;q7MKW}$5NbPU|5XK;~Oy=Kej9Y@4NK| z&GRWti$l-?KJ{c{ByH`QX5UUWh^U(ORJ1sMol`K6sH|C*Xz&n4bzV5q=8d?BE+^IB zfasx3C zu#S-3#mZTHb!Qx6#{0t1Nu@CYLhT$2eVQk9iDBF(=98B5ABv8Hr??Q@jUr};(}fM@ z(42>Z+?btV4Gb83TeJ{IInlCLO0N}Gh!37JnyyeT|0ZX3L)8!HP)2D0KL*y_lTD<&sITSKQ%BON1CmIpJ!n zn|9##yNilWBS{$6+GxFs_-CbxWw`#Ads$v+a|z8x{ZWwNCIoXDj#NK34Qem78b!V5 zv*Noyi*c!YO}Y1l&*1TG#==Df>fher%>9O1Kif{#;SX@2fW0VO^=Y*xwl!F{(!CY}Zx8Egf~6Q0|6Xw3W?58z zu;`NeRMW!PKTevDn+g@r$^+xGS8uvupGNonmSOqZdxh_H<$K1#H(o+7f4iD^n+A9! z2Ks3H)#pF~tvFUh#Q-uID`X0z2BE=-Fww3W8q;qR8@)h4p{E=WkemOrMM(Sd4_qkX zO9nU*5y)&X6v6VFkD*ey&V7F@iut(vRkr&FtyB!B=7@Qi$s2J6piqcWa@i4BnUf{0u zNOaR~_^JDr0ju%F0u7_H%dMs+^h+wPw9m{F?RABZN1G@BLHf>qoZ?EDVwbas;F&mm z^0Rkcn(pddpFrEw^AhgXl5E2P2iyho>G6j`9NZun=?cB+s-fgtis+@slIbd96J)E| zg0Q5b*|*azNrsSGs0F4IaW9aY{#d=GT%KxfEW0WZ9j;-eLHm6$(j!{K?8rr0uKulN zW#*S48A2ZQVAz;`42ijN)eTp`lWKMVyx+j^Utw&q}Cu|xi9(>uv>Y0ariT!5# zzi`#M@Gkl*VHImUK4XE@ACq}&IUPQZV-f094l^=rvROk7#qnFKJP&`9A(lXX~_ zXuf%?IQ-dNKKiOh`ZQE(IaC~181;ek<&bL5M~o=%O6sdjt0Q|4xWVhyb3E8(f$9=) zf#`UD3uwtay~f@ESRwDwQvF($oYadzhk6VEgX$^vP4t2Yl2hB$X_VMd%3RBr12XkSUX+7 z{L3B;U5=%K+X80Fqc%?rl-e28vZT@ZELrr@t7qw~Zi%nQk#T>LWbZmHXjIkhrF{-X zpr4KIj0b%4Z)|K-bN=2mUH$fU2dq-aISE0$Yg%rYYy2k2Gp0}NeM5#aQr|DjyJzGz zXc>KZcI>8rI4)sRoqOd`o@I`n`quvJ^#w8X3q&F1Tz&iZ^GI~R7?M}-b9=|5GQ2H*hd~f7{C}=EcbOkcCu0^iQGF)(v8q^vfaNk(A(S);Sj0Jqw=g zyRW130s!epKgO_J4@1~{Po(nFz!VQ~i|3SH{>-cL)3T@E4l^!fYOKPPW(KBZV=gmW z(cgjp;7urGWnO%+SpU^Wy@%>-yN(6Nw)LlZV>Btr`5)2aM0&vZ9%FOpFzt;5DNcwd zy@@+wLkjJ4m>SUW;7_f8_*RY8m1`Tq#i~zl{(J5hD6+Pt=jWB-eITSK!qsSkj6M6P z`{|5K*L~I0WOD-L#QcJ56nPHbLxLYTdAtc86nmHwrhN{02(Qy<) zHApAT2}Qq*r+uQOAmp6jUpv)G|MSFy@No!$L_FPWJLmaxPzd2OCSS4VsV$d&)?&kawr@Cva!HDn?f1_xbo;ef z>g(=OtH;~{A4`3S;oHtj?Dz#j7ii=dx6lv0!0oM50+(Cp4^i%@uj*VQ01;vJu7rOl zsgJYN)zuZXFjql$QII?Jz^ofYg$S-a0J8s}RUabvwBNBq!1Aw!lBZ(kq%4H4) zI~lJcLu8Zwc4I@MFH*l|K4BG`OLyRwAHVn@EnKuXpa_EBFa^JsK42!3nMqL*Txn(m50 z5MA66k)3ZmMTritnim8&yM5W@b}MTPNP27K{HN4p2yK+mqNa)d(AF0Sqv#J;(7x72 zEwr!mTdc3A03>4`wkw(_7ktNtAXnd*ucE&8Ncj|JvccsT^XJBe(0WpDGueLVXm#qY z2;X;lmjHo6clbEAb9eGs|kvMuM!0>|EZjdrJYode>L z0VcJXhbcp(<==HnfcI=rem9&iCP2qGVVyHyood9T_Nwzc5%GwY@%}xY36rGMw69R| zSBemQf>O_x^9&(s_HJfG8>cCNvUjQ$H4w4EiE1I)B;S=?56^zLuhlq?4jTbL*ep;h>d^dZFR(3N8QC*oo zyAR9y-C6g-+Y)$ucL4lfH0`%8`!Ugc+{^_ ziudjz;%nQPt3{Z9G9T*h4$}BXn&kPptV9G^)44eycxjvXJL(?}6@&7k;IA11G7uA>5DiM8(f?^8m@txSi|L2NFhIJ4D_77tw z6y(2gqM3M@qWeij=c;A$d3 z5wMs@2NMK=?eFy;ra#;I*&fk9d;9l(=6k;%xD`C~6)B8Y!+4ks1BCql$X|aJ4g~Ey zH8@uSfLk1H+a_{jq+%7I-85z2|MFP+M>yQ7P#ls}gL)wFv{YAN3jsjrq&D!c&}m>i zZD_s|$rAzC6Fm0W;V`lIpCTtvP2gBDg$A$a!OjkcBd3kc07zqY!soFtt|fPO_^lJc z&tM1dD8g}H@H~nH=~GP#G;lCw-k&-u0$!F1E(pqmeg9C-b9-*cxPceBF(McD-7Z4= z_bUO2-iZ@?gwX#1A^~(NO#uCW={)Lc8-m~CQ2x>{MxN~9FF<|drUKlX(Eo}3-HG{p zHvr)vbOIblUdYEzR34KM1ROpt@9w6^C!Xho4hRCzQtA26q5t3i`EVAYVe@2jy`S27(B{bjtwky&}-~U3GMik98jl)pilXvp*JwVbP&j%k@k+ zKoX*W@z9T{UHBjp1e$eJ5PH%_0tQkZM!3^qvfRJk0 z>pwIh`y+WTVn&g8{3qhcuT$JVF0YJ@XTEG5Ko$l9AO=WBMJY8+Xn%xiF@O*U^ba_n=vcul*V3`e`!{9b%cY0N z1ze7-x%34%Y@xin1x??{S)$K%KbL;4 zy#>4cQ!KQR?4Cb$7E1ug&a<#VkHrGmW}v@zN+8!v#^c@YRaCIp2mph}S;!>2_rLdh zr7RPi$}CTZhPPRa(0fF24!@Q+k-XRUrVZR9K&)MUN*!hiSUP@3SZOuY8gy zJ3F4e&;fH_LUheg=(Rv}S$Ep9RRD+q%j&4p7v`}O!oa@ZNTh;AH^BK%sWuGZ`*-{u zk+)P^`Hl#lO9L#B59yUcJgMp`0aLu|1jd6t1@Ja|K@9RUFC?<$Q{urkf9)*;1PC(i zb{6NI=Qb*l0*pa$8UV_^$}|Hy-gK?L2lcK%Sl~A^hVMB{c=mD6F6~=ITuxbc!1+2e zj4wn0D8peuHa$VhR}%tA(z+oAv@9`z`ym$|o0Zwx;@vzEIqxknkwae%G@j$L4UijI z&x?F<)PI@tL&HAj2LNv*L<4=D(Ee9@Y;$>f=WByq0ee(c*`vxDQqSq0j;+DRUZ)}$ z7CQL?8&JneHGHbgCt=%s|VlD3~OvH%YQulTM{kNlT5 z4D__sgztE9rw?E!+2xyh@U1}=DV;1Qc;XZK!QKc4d8w~rkRjs5W|PAJU<%-E7DR+I zu3wkE5kqZ&ir4aV5(6HHQC&7%j@O6FFBs2Qz2$ndp4#5t+T7iVER5=r$yapkd?5)F zzUy#(Z4gSSZpMbQr%7Oq9#^@&%yMS*?j7a^c$fvV;J2 zRESD>F9(4nJ3ClHeGLkK9BiY$j#lf9Pz>JJuP;lOkdXTzvPFF^ua&ahZ$3f{JV|Sb zj1xSLsuS*N&3Z&#KOIp^Dl+Xm=6Ut7i~8co37h_Y0JyF1#@>e2bpT3F=w%C#(zVkb zaGAlh2Myz z-`Uc4TmoKw5XVNrOCfDLxrgQZ@s?|gyUe_gVq0&oSzn<6QbWuW*ZKj7KXWhoTOuO( zAk6x8j1z9d?ecmJppNQizHM~g3Sp}u5Y zhxJz-<3_V2irVq?+WoWi%XU4uK3;g4%zDSSTU%{5x$IG&f_NnBoO7zqRjpr{0w9N#9bH9>W!l8ShB&ZYYiESO(2oe+d;`uWoYZZ$l&R2h! zfJp0S@s(}#(;!ChyyJ^Tl>zNA8CPPe%BEQ*@zT{2yl@&#%REBYTgjA>nI;Dn+E}DX}Iz{VI1=Z5+QbF!m}Uw z(1{sms6d3=@;qPm@V6oTITD={)?&1?)o%-U9^|y@*g})Sg7rX`|1+MsDTn|oIX|X8 zik^))g6Ft(o@jC}|AX{IK@!@(Xy0IH|2~m>sIs!_jXbZf%;0-YD9%INXLT%gsJToc z3rC2AvYriIe3B>&Myt>D5V5W`?4jJVtO>o8Hvs7Ovp!M&sjM+SVLx z5Si5h>>uL@0Q#f4KPDUEUwO1j0U|cs4+6kn=zGU}-j|Ez;T*Pz`Ga8_j#d9MC!BZ6ZDHjm0x8cx^$X_CQ|h<3(@E_%Y>)D-D>tB7Me_lAmkujy?4G1ov$4h zCcLr`Iqzh#Tl+e1VIeARXPG1bNQ41HP_Uu*ZKU6Q5E{RS#S#F-K7RFH{1(8kJjg1LIlOs z>v-&_*mgq@!Lp_w)S%(4@3bk zK|Au@7=XU-60S>J;^Xp&HX;Gw`k1K!_&tO}XCQhQ^$nT50O9IPlqZNz7c%?v4;ssJ{th!o2spw!jvNEaL`er(~_t4 zafgV+VAY}&`3xoWx(=ufK)h#|O+DSw*g8Qv3~FqI7BPTTUv+hY^O_1}rF|{TCPMl3 zR8t5ArlX9QL5k}e5(&X1VUl^UiL(vN)TkbcK+5;Ye~S)om*!9EtE{8<*e zC;!M{u^#B^GK&SM)pIOllAUl&90w3`>nudhJuDl~vCO*y$pZf}@Y}tGB-yPBv{#Bl z_IJOOdnZCG*@y!WqRJ5#vLW{0#zI7I<9ynD7w=@T&r|oa*!#=YZ6^U;+7 z_Po0HiqD}B>GZgR$Qt{>gbj+vN6S0`E*=>1dB0J#hdj|eP#hmlA$0$*jb?emTl~_f zJf^rfH>wkjkB;|US|uvODx71_wegYBoVUFCc_)>WHUDoW(G(AJ6(|2ZzUj08s!ij?$Sd#R6vq$Mfn)E)hdcW&B<7L z1V(j~W1*+xEH&qaX2BI8-|aks$K5=x-y;h&wXe(YGz|M#SbK8)z>7_OQV>d}#j_d<=1IMunye8bkGQ@Z z-;+>*Q5ArQ^xx#^{;T<*tMVfNLRY5|3svhmuw|{*{#Nw8JUlpERizh-^mcU!Nj?j#i- z9*5JFU>o^($XP@vMc!g0VMB=kMzoKnU$b2H(v%@I5$erz@ZC8LC#{6rtuM5zR#hTL zta&i}QF0^sf<}l{J|D!k*hBp}jmlQ?aYhAh3Ioq7`u%`??M?ehumAm^eT94LJ>yXn#KI$s*;L$VD&R@G+&KrXjIbDxzxoo?>4x0Xu6zpU> zgY_2-HrIYW%3(s=`Z}(9PKxh&74Lbbb3!ouPNO}|VvDJ*xA#M8UL|bU za{4mgRH+hA?E%F%SYHVU{1KUc)eA~}Qq`R;)R)8a1TLRUb-j)L&EH~urDk5|Z@pa9 zUMEGlM5^Z`_I+=(T=3mWKZ@~G9Rm=y{raZJB zLI9XO)))t_moJllMWlOeL zr+BX>w){KktX7k4u8Fm{8cx&EA%`5?bXf(R5z&E&(Z&zsNy_$RgeUCy@}c8Li2 zIpj7xiC7csKHJB+o;(*V!w zoA>GKB^_Bilh~cC9m?3HjGfBbtyJictd~_-iD0L$=P7iAE&HbRAP+&%UC4cIPpYpX z*o_9&5c9-_7GmHd*$?pdpbur(n_oYk%ewIl0Q?nN%1A<*LpStk=s=&$x;&q!Bf2H^ z>7=q%LYBfor#HaXoHR2)L<8L$gHWUW;m=~eJ*QgmG(L)&Jf#QYKDHh^HV&DS%`F#Win*H5EE=fT_GY& z*vswl{VbN)P(ZBR-GLB|M=bWb{M%VLG7gK~Vjzc10{_Ji_fe!)y0Wpf&IA3r!;6H+&X+G|w ze+BT4`RxY&6$9A<{$(6!1Dw|YE(Qlwfl+u~m;!Y}0b)CbVtHu-6*tMD&zR8d@x;*cDx5ao(; zabltGU`!%39S@9}){96cKo zJ@GSl=NA4RIgC83_NNJIn(5TGZVIaF9 zq2v*S0|1wF42o1F10-)6fCke-LynX$9`P!mmh35FKHxsJJ=qk(p0 z;;S2~>om|IkT7*rjE2ntHX;e(f#>_GDSH8{z5&8h5D|Q8%l&j;fOblh0Qf`#=mq$l z`9}h5wTxjc#r?R$BV6BrXMacGI^+%>O4LxP+=q_|3?r0V7y0Z8AcTz&8nWOe5<-N8 zCMi0&u0u^OUvy6X;al;2`Hf5ne<5lR-ZxN*Mm}^09Vhd-z?8-l z!E{nWBnV8bfk^f79zF;e<#pT@0&2$pYwC9Z&4x<3cu)Wd@pL2k;Tg zq*iZZA<8e8!ufGZA)@Rpr7!~$VkbZ{F|wZYy3b;nfB7@{x%?c5SYxrz@!rZ}2?;VG zvJ(#qAf(>RV$XBl#bW=i>nye$OlTxSu(0K+-@;++h`q9okIrKv{Nd5rQopr0KH_%u zYemS!0Qy96X1GG6kLZ1)1%!lejOVb>^Fbi^qTW01@q}!&=TfOhr-tWV>2kRi%_|M; zc{?@W_kKjLgAmZt^FtWGbUgZGsZS$BFo-l+hzbAFxPgiHsZ0zGi_lGdG~@O-TWaB3 zpUs2;UC)FF6y^qC)&O8>x`<0XPfK}#J(Cx3e3Vj5C{OAxj*rl~Sr|$rlVw^e2z!l% zIia1d=HHAE(5FQm%EGEh@%wx(02&pc0mefZR_Z#1VSd$|AM*LCArnM>mgY1V&NL`w zZ`nB=Vu2E99}CR3h5^=uxZh9fqE!H00@u(W1VB%l=gnDSfb3lc9T>wvD3J+tj{+Q@ z)3YS+mw*8}M++N3Jaoet3};M_IZN|b8=Q+o3%V-zJ&*zac#hkE}`kklB0usOl&HljeDB$ng1j)S=KC zHmo+!Z>dm;0lnwM2u+A`lKXE~<36hn-d9B`wT2XV?rZ4%B;|FSzyv1F&vx>0LZwb> z%A3oF@1I^jAJC>8HO5h6U_M66PH6AHRjne<5A=$PkgsW?P2_98lJ{t-c`?*er2H-9 zIr}Ve?MG4n<*FRU#87MOcq`dt*B)C z^+hL4I{+HDD zzT*V_&T+NkMDm_nC>QkG3g0ueS#P_(j;IBc&s?cf+s|z_Unn2GZhnj96cPGCRrb$H zw%(bdWDE6W@=qZxDrg10rTR*+hkY0If1DP~_^?Rf^)>Qgh;JxYl=D`~#f%RNgmS^? zklN?mus&WsU-q6~QVHH~NeS_Co}vkT{d_GNp!7IX}#*#!>W#oBWRP{CVog_*Lp)YxRY8S&kEqc+zg|J4U}L{e_BAkJ}sHalQ1*Vo%uI zcmeI(c>(%G5L?y!mcDC@f2O^&Mt-(XUq?~jQt$pY%B3y&;8nSfH~k&k`Z~lE3Dz`6 z(KhOf^AjO|G9SbH+UIVmeZeE0R-AZi^DrldPSh61FVxQ*Z}I@$R@p)7E zfTreE^RW>3+x~o&=RYL#dX-2&w5fS?)0FEWu{^1RYF2HfzRFT@d}uRIP&eK`gOF{A z0FN=j2ZYL|yPf$V`U}>avrWx2a2_2oM4c0u_uBhzSGTav#UAB!I=>rASM&)YZV088+`sG;7+`57fd`Y0Y7EWbFQ%1(EsK+CUUT~ zmz%#^2g0|r*z>b0%ZB~kI_6~si;WCGvk;SPG^Tc;96TSDh-}~r$`8`4sV3;K)!cjzY;j=INz=cl|Jx}NT^Qmz#6&x(04(zZU z6On}RAB%rAh?U(1pAe5#c2rwal5b8g4pxqGV z9y=fuxS<;vLV&M)wM#B zqAUI&8c0c+kl}<7-qolYv8TiPpMU@NzyJM2cb&NF6L)=j3q*j+EJT%iScu$vSS+BP zLpCM`mO)spvkSWQm6s&8Yl z?mW9Z9xAShj7mV3I8u7$; zSMip?pAga4b$xh*fqZ)Fa4){&=~0M<(Y_(~3!kQYM-9G?d`yso;_NUg_4gFNJi-E| z=nvLPeQyz8NjOyWXy%nR(dDVjPjKkZ@v-6TD*)E>`hd`0XNLTJXL|8U$^dxr)a3@4 z%CqAL6R3yB0HkSg45pzzF_t~@JL3ec=r|b1GjxbG13}{u0QSKwg=hWz6|}_c6h7I7Rm!`r zv!-q?{Tdcv`b4ps#ic&3*O0#_bW`KKOD&%H?IISfQ(QNV-%l%FV^6c9l?f9%U`_M1 zpjjt6EbtsGNU>lnLbAkwX*E4b48X!{G57I44J^Ps-PU}(W~fXTbz8Q0p(bm}%tCkv z1K(Kq#2El`y*4%rZHh!I-{@<2TH$%nxV|?=KdkE+7?Ut0OkQUVPCj(g?1_0&&lIU# zpNA8X1|}j7+^{}etYi`P2%OGCW9Ud|l8De&4ER{R&j31o_DI2k*3Tnz99j>C&1n#4 zW^%hnpghO_|Lna1lpNP}9r%7#&2UJ9WJ`t|SVqK>f_UdBu+{Qmw1{`2#Y!awt4th3ZaJ_P)*@1g;VKgzuG03w(i0kyOEMylb+A@b z;Zep~iYiJFHI!hYNe+OX?yCQ{-hF@g577jH0YFk&_kRcTP}RSxe*LQY_3PdH-g5?( z3+f$emQqaUYlEB(4rOaKy@GbknN4Ma$RV+Yr>VmIBFDRAjegY`YYI!(o-1mXPLRT4 zM$=`qYl;oT=w}dyOm$zE`TE;I9cw6h;5mcP1eQaZyrgz)B^dY&_e+9tr(0f0zswkn zJG9UAO6wV{*3&Q6!;2PaPEssUL(`RCFXHnQEfw!d|P{nu5r-hP1rajML0zrkq~K+K&MxD+nFZ6t z`J6zCGkEB&r(e{5NdZ91)GFou-q0zCNHY{&x~3(X)#8D-Xi`aSq|(dimklJ}MF(XZ zq?{Ja<=;2BU*M6(_qB{a4YmIFg^XJXGTq94c%05IqdiB=w9YNHUI6r|b>GJlqBg-i zYo20#nf;+c_VpRYaVsoam3alPE~0aHW2+((TocwfL{ z5&+U(%oF526wC3}{d~ppJ~oLv-^-Y%*2~^{=QE6x|>d!!PC20TtPok zWDXY*#?@MBiIfs426EvD61P|)!y`QZ$MuS|1@!4WZO?C#H30qW`I^XSbI^o3CHMW6 zkc7~lXNbu;Hn5`uG-Bhzvs6;JZqrkRj5}=K0no2$$fJK4=!cy}#ye++adsIqp~C?} z_v_grM?0CQ3E*F+&hdjzS-Z~!%~JyVRRi~3P3L_J_?rm7FBjRvR;_opB_}^lhmKd?5g=l?POG>FF*u|P=sn@`F%0gj1(Tf(| zv%888j=v4MPTOF&o1*DL`ePSD^v_p1fnE2|Io@uUZl7xaznET)VIS-C-huDdHh}&E zrqOF-JfC17UpLCRGYz7mJ~+vC#laf}r_R=p0(E1r$L-Sdeby~Ax4P);l-6!(?U>H4 zY3-cO?)e#0TRlo-rgd~KK#GCv+-|lD=-TQ*BJUmEz&u2xo?zjWH7w5VY5{KtXl-X9 zQg^Vp_2UOwDt&^**~eu+E{DI^bsYfi{{jn9a4n0A7+{O7@9f+LVjahZJntQ`KqV|h z`sZ1kCw)1?!q=0cE{bq;vC(|@3Oe|j7_t+l*8T>3%TQ< ztl7ui`HpFpwR$cxZqR2T@^57!8rLlDJlBevWFcDBEVS-&!;Tx?dBYx}J5SuX@2*** zv2ZLLk1QG!6A7wBbnYEz6{mRnPV}AV@g^K_TgKr(Y(H$FJr@5_nKFw+>j_UbmA0h# zHlga^x=OD83`ilyKd%PDR2QE9L-?1pOLa_F)v)G824S;_PAU;=3uU_ez;^QEMzmgO%Ew3wh8i4+r)mJ4gX%@MDiydy$O< zfCyS%?5AD|z&-_lAF50Mex?dwIaCqXt7^(~lgj>7>ht!b5^wD|DXus6gXfEgo=koa zJ(&@m>YSn<*8cBo4d)$U-6I0P3l@``ZAMKo(H4() z)dFCj@FRnePq~E3$3rF$W()=pJmCo}A^cYD!2;YN>W3=E03pnurWca{(EvDAQ{i_^ zT_j|eyciN;$l}pWas0Xx&-|_tMr`b1U=(1Vj{qQ_ho6kM2WN>e9ji3pc>(;uxTjpD zrX`_8EYqmV^{K7uDwcNhb{HnW{FMG72}D9TYHnW`9V~ZLhU2$|!7lxPcn5VM2$&Z7 zH#8t3m`s3r1wbGCsV*LH;-VThVn9Y6>37vtT?x&?+wqp3^ixL$Y)K7Z6Dg28f1O$e zS{AifH9NEwXJ0}s-;A~w)@xa+|5A#zZ?7a zW4}k2SRC{2%t;oP``;E9O8*Be&a+-79?qkEXhH?JMucDN%Q*qtke>(Rc ziRi=n-u}r-->Z{;7tGjw{ezYM8U4ZjCM+LVZ8LM$+})q6^jq|M`h35=T7Qh0vU<1P z`)mz{h2=9X05nHebE3iKe*Fwz=Og`%D_wk8)i?*9o+u`}S*5p?oik0;-!PC=8u5Ui zt66g&be#?jkR#C?8FawpZ4SCvo`vq3nUcT=ogFk8_$c;2tr*lV+TBP#Fv}DlFwIgt zgqKR>Cbrb2eY)Pu84xHIpAPY1H8pq|K>H&)hGG18DF&d4N;^WpfogyBd_sT`B0y+( z{Zdsga;XD!Ues1n5FVPn7=X8=7};PJDMtN<$pOgkF#y!fVXCyQm-)Gr`>Tx3l7xcO zteFT90Z5(G;_2Noxex^*48iWcRmzzK+S^IF8hycT> z2&O4kAi5DeNc92TSdIBSiq7f<3<%14TzH8P1ibj-+DsV$aQc>VVKs9GY^sjyF40tfeDum`VoAjmuLfDnd*dF`6T#f6s#OG%g%WOc1P_SS<2kQ#$K|7p|6!#Mh z)|BG@S?B?{*N2PnvfBXy0f+>9${IeD3lIw>L~cCP4%bf{Vpejr$7O;K`0lD}#}#XH zv`h!Q|GBc!w;@VZiU<-jDst@^(mPe+alJWH(+I&>PWMAGAW?D!*DEe-7#BC|nKDMI zl6fz5{V~*zNqZf4tHZ3#ePx3CXID9~dL`}HS$6xZ50)|drJ-h3YVR9&{9%2Inzj^| zWy}K?_2M9^bf5v~T=Dg~PtWybJRuMic5$%jq5Jtl{RD%cf>};44I=2};&Ps|6VxI? z4)4Qw?;I2&2~7{*&%@eAFd@0lh+K0-&-O37e?X9%8{|URDKfbq-0{}YFDJ@u5XyBc zuKf9u`!R(ftT#vy31H4W-xq9`yPi9!iFs*HZ{qXP3wnMKt-Bon6k$+$R4>B-e%vG` zzUXuA^e)x%a*WToUhGG;nqJX;oD8x`ujpDq?)kmse%VH7x5@P~fS6;tz5ad?K+)u~ zAIy^$(JufhRCv*T0a46LVep(UBffv|ykF^kgAlwpzlCys5ZdP}#_^h7a!Kt%J-mNI zCP?TE_j5o!MeA=5o^yG=XppV%K8D^&iOSq_p!s>djCRmGh?X+`fyl}8v~}Fa4ST(& z^c?1u2k_pz!t3Sw)g0C7fc32D>CheTqV2*wz-`C((Un{;&DSfG=WBrTrb~E#x!)0? zD#7*Y4w5SvcY2iLx<8;>0|DHZH5?!?f4H>kmErjUV59G=?wj-~&VS-^0`rYP*9&s* zrAxV9c)plG8RNU8Gf3R|u74iJ&zI{b5Ntv>pSalj3jihePo@_JROutS+0U+^UlJYl zi3#C)s)#TTOFg>8_d1`)R*jI_c)qUYe05K`sh`Vu)OYWB*AEw(N83~=rc-tXA?DG` zt5-5krvk8>RvGt&uoLR!qT{n0rydbIov!AoeYt;@iYvKZ)8%p>kpjy-{m{OzFFY@F z>-Va8FOuUASnnwFRk~`|3;i=l?Dqk=>v4hm+Fi${q}I@fb(7CW-%>1GmG8l*?5q;r zhYNiiXXtxy_`V^0uOsE5o-ET|jQ4S9=nDF!(6usRyH9mLr*=MO#})CwKhJ}IO3lc4 zNKJ_hTh>=od?!!#(hC#vW%~n_a z-b?yWNqyGcGCCVdsz?)Ez@y&*{bE;fK)SLhz;l` zRi{PR1p)Wj2m}0Fg~jZd7<%qZ?f`#y_GiwnBz7iecY+AUf>6IyRp8n&s6~O;IZSOB}1Xca}{ds4n6uYIfV>-Jg+c{zP{4ngE zx9huC?}OdtpPf6*`!#p-e!Tm=!?cfR^;;}N{o^byVr$W7agJlbdsv9{F&1+6-h(W5 zdB`*0*@J_fEH1^aIHEC-$wCh3k64C1;cdzQ*S=d>hL1-H#M$Tn4$GPy+1Zu7pJTaD z=zh09v0J<2d3Ugob0qu~mSI5NMj)`~>2LxYk-*vKAufV$zsKV2^-|wC2o6O+unu>t z$5hTf1e^(L6bVqS8n6ok|3S^ViA^H7oyn}nJct1j5tSM?0!vJ7 ziRdl+2b><-cGevJh4wZj#h{EIS0*fL_|jvW5gR3R@5n&|K^95uqYgZ&ZkKh#eJ z+BaA>7XMP`oj;>*rtZ#P@Gpn|`E9@H3jp6h1b}WOtx8k1J{1pq)=UTRYViEeJgMLD z3;_L*=iz>2J@zw|`YDz}pVw#AdP#vso_O+0sQ=i?%*$*< zfK(BdBR|4+A@8pj^|IAUKk>ouJ@UjII;OYMHR|6ckB<=U5dq*5%86vqDvlJ_-j}a- z`gy-5rc2cT0N#~>f{6fFjuC3UWil{T64kXFqr}4YAqf)+1Bv2Vc(5r4cwU##9bSV{ zuhOb*B==ao5*SjbqX^q4lneZWc7%!uDFKM72V7Dxles2B?aLI$W7rF!^bz_V`!k^o zRD3*&OfES;Y@~zSLnH&!rLH~S48VG32eLXPCb6jz+E~u9U954wswTNt2*wE$Z+Pf{g>CXvVjl)LlC#6FSK0z8nec30c{0r>a_zVq zZ#cgj+ zvXDy|&}SiAhI0o=aS;T9?JSN6;6vQR$iCo*%UfAoB!JZ^78fyKyw5^(%{CUtAkGmfRFjrrSV=&4@(GdY;g61L}c<*GX^zAIJza^)Uo9HNr zn{XCeS={l0T`WXnf0Jb`b%P7(AM0gj@_YuDD%tN#dp|<8}E9cVE~H04%=hD9YWZ`Ot_TRNM18$V!utmr*@ID96<^;mc& z!??IyBJ`^b5q>}|d6~y3ju_;(&@Sn!^y|^owcT95l~x{~Yay z&)~ydA~Dbm&8f)cIF{4}e0|Er9-sb!e)e>V56HX+z=Im(wB7$DYZ!RhP*P<5`qPOu z*a`5}Q1I}!p{Ti^NEp4yi8fm_S5g>6;xmcc-(_leavFY4!okwBy#Jkp`bsE~7!2z@ z2!#y;s*0gotPSbO0oQN$Yfr~wNH|AszgMgmsEKw>4)SN?O7E%+12L~RO_NCfC;^&5 z96^7HhxA05@N+*n{48((K+!pyUU_@;#$xVVg!^;y>CBzK^os?a+_HGeB|?Pa`={&< zV3+}58ec(sb{Y^xbu_50WDHQ3Y>0wEPyxtANLv7airn=Bp+&~aX*Rf&`vqR04UX{A@ zm-g6P&7tcry|)ZkxjjkMFKanaul)HE&pvL~p25sYYynVf;8v--f6za!T`%XI;P8cDQ~4AuA(yAKM)ECMl;^E3Nsyvjhj7UqQd{_?1*TFYBxUM94Uts(7eh zTsu!07@qWekzxCd<=naW>W$B3R`kwNrDq0HE1>{KhMpUTU3<2npWHaKWabTTA6Mgf zROv^GO=qvYQJuK!h3DM0%idou1hlTs2lKhS zsGq&;{&D>){q6c6&rj^enW6Dees|Yvx(HWt30YjGSI{qu1@Zl->+;^BdG--pyDqL@ ztakl%O!`mH6uAHOMA8H?!AGC5N_V%?rYI*JY1INzT98n{jT}>x{~|o zK0>O-a%w=BcP`oe1*S{xxpvnJV`(BtQQr9X%9`4&A_xa(!_ zm*IZFd!5(=bI|7dUvDU`>h%Ip4S-Zoaw)^EDyDgha*CVCI<| zK=*R*ipOb;Kg(xjT%5#na!gX?k^R20^HjIoWy>Ar8Oa%v?~9e>%G&{=4&l4Kh3_pU zUPP9-O0FHyxNl@WW|%O-fZ#%Z(=(PZ-Mfn8AtI1u?)lQEim7v%BdFVcae5Mfi4dLT zyJr)=Q}^p=^=jNdcAi(99PD{E!aM}$kLSs?$9;b>;gQ>aygvot_h^xyUH?241XHIS zK(F^!*FWa_r>LJv0r(=)4!%cIdG3X9A`$iUY%$CAihK}1lMCU#wBPH-rX(=rLjL2g z*in|CPnm=ya!!|G@m!|}#G?rF=bfvKr&G-Hy7)fWrDqV)Z5s$lAWDcGq3E3BdUKT> z#1dJ0xuljd*$V^x*ncMeBB^w{n0q$i{wQnb zau666&%#bLnC-^6Ui23kUq9raM=1Z&rl2e%XIBzClh~ac;P32G)=uT@R=4O=u%9gV zYfrK+`uQ?nhp4EZPVqizce#Bh2iXt#K3iU$JQ?zMUhaANOK3-2NNU~PMOy&>qGLV$ zyEYO4>``Vf9CD7CgM%23B)bMkNntht*eA1-f7eNIiqE%rw14Eu8qcST-G9OB8-tan zs^!%ky=_nCL}$03NxxSu7hf4HJjIlW$IQmnCJ1b^{krw^Z&*+NIcJv?JEgN*iXGG0 zHR+J~7#yA6Z0-i({!`}rgEo=(Veco+$BBx+SNwEwj_AxB3z7PJENh` zM1Xr)Tu6Hru?*?+fOKa+E`N@N9no0G>04QdOu@qUIg4`)69C>hf+@{H)SqP`TAgJf zDpy(D@g?;DUw;;IcJI4b*6i{Q7Z}{m;vD_NG0vT@IKsJh7jIy(c!C4&U8I9kEG|NT zcN+^)FwQa*S=TwtO|v*0;`syvx4*$T7P{>6?q6JeWl&pP)OAA8LLo?j;%>!T+#wWN zibHXS2Z~F9pb75oE=3E)DMbSX3Y20k4#nLmE=j(;-@o^rIk}VjBXei&25Y`>0s5qo1wEV($=)ANkbV(;NYH;XSU{#@uj`C`t3hCV z#u!VgU?P2*hc!Uh_si);-}b?@=Pild>$CcbpACpyvd5Ya=ZwVx%Os!qQtGOKRev`u z+(|TsF>vM|VfrIEC8?2D>1*bpXzy~F3XP|(m2bI)DbXAE#R;NTa#WqRQMraYMhF4C$MF%G`$c%@7BBs9KE^>&ffZ&J1ypKVfAHiNdu!;GvY^y>u3SE>IGrf8PFRz2 zNx=7)v=|`r;)_(OE;c$h+fdClmBu>(u&VwSo0W4Ds4B+w=hjT@U3hnkM}Ai-zw`__ zYc-BAD~Zq8tLTqr7m`389lClK&uJ$U&3leHkiG(Lt=3ElxnQ^>PkBCmaD`_V&6~s{ z)x=Lan$+*jj6|QNl2C;608hD_nT;KP8%+1X7s|g98D`2)ftf5sN~9{BR25ZA%}N}# z5(~~R7>!@^Gj`w`5yX?ocUq}H}zk&HV5aBg(0eLNlKBaQLgYK9Zx?TZ@9etY44xx{y8a42M&DJn9d@u99F$dm%qS z>mU(h-{%h#ypTDRJ|)%9RZ7~otE9k3Uq)%A^FoYnfRk+-ncRArTSf((S3f=1C@41`m+EQIZ;3RQ-d zMkYSkSZR&l4#J`gd4lpW_-1|-tJb6e^Onr;KhuC^ACksoR(a_kih9z$ie=-C;Ja1p z=O=he{7bGXYiAQp;QfgPa7GdDDP}Ih^k*^Jz>eRHdi78LJ5%^*?My0B+#~3N&A6iy znvnlce_xP4zs`;rJXis zPmy&!m#kG!^D@lY^kG@8;A1#+c{~dHu+k9u(qmK$&Q z?(Yhgz9>T||9A0@s&xgor+>)x6X+Oy2s63m>~b(tH^8xuXchhy*7#Kt>L>4u;4klN zVAYPd(Ojehb77=)nL`9b7j@(Fy`Pq9C@0M`lHItK1)2E&5N5ctw_hw&h6Hx)*e*D?Au)L2mpvtsSzYo4*4Wmy@-+Oo#_twH^f&iAvU zyOGv6V=_-@7DdFWmsi->x^IOc3`A`9-F^M{|mJmkvh4?UrkT}3Q~o_H_I4IxLIghc^W>e1nXRy4}Q{r}iN zbh)t{L|#L{`5s$kdIO>Cwgk&R-pf6MmY#~9f>?V(Ch9e+YgQH@%iL$=f_h?4_tWdl z7dYCLWS$rYBA|I;5l$(rfAZ+E@Sl8-Td^3gZR)dUq}8*!jejs`rY9F%TSpbB@^r&^ zdkRlipSj5^5KwEx(!Zg!XYG?T47 zlAs-S=_&M7X)!RRXv``)clzVAw`}eD-6O?e=NwP`9|Nnuo8T*UAr=d}NUXAF<0Maa zGgc(BaT~hJop1KoxlHc*>5q*&_?iEuSx#K#I8mwpd>Hsecr|+&-dmg&yY@`K!+;dV zlQ1Rm=>;!T&Y7mBMNaOkyNpF;nE3ei64b)!-x>hWa z`iEHw3VB1cFgL+5SJrSQ1jDC`=_xc%tB9uv7-}d87oPUeso7nTHQ`%sQaPs9kf_m~Y z*REH2>do=;Ws-s8=JhYhtUHV#AGhrYfeshnEzdimm#-F&yoUhApV3ayIj+_`<`?`U#>2LD9byxn;F?>} zE$N0S0>B?~e$NO*O@|L{{_C-fJY^NYC$`A5Dx~xXs0L#dEwE#obgR^1a$c3hT?Xu& z8vSWLbMYUW>$O3ezaAuDr&Y>sNdhG(T1mxl7U=yadaP(x?^K&m(DB+YL8mBBH+m$a0>8;-d2|jF~0+*YK@6vpRQ7v_#Cqoh>Pl zizs%1VF$@{Yt~vS={P$i?d<%|9}sCSJnmm){BOXu7ZN1&;BUmxMNd=dO> z^`pA!ehyQYtmmojBSXr=xPAm$_7Tjz^FA%bBYucYZg<3j7x| z;i;>oX=K=oo;&$~>#La>IoW<)`rd(03O1n+HJfvs;m~RAT9UkBe4$sy34-W1@l1;VttWr-r`w7<o1CKiG zWrYf-Hd*SjzBMWtM)ic>zu;&dz~`12JEXggR%RUt`@jM`nd(s#3G4bzXnxdR$ID&( zQDvh3KgC*s==`W7j?Y$daV^gHkOGN>^cU80m79>sr~Z2OfaO8r=T(t+TssDwAL);! zZ5ILYhaEA|zUu1u$nHOG);%3j_@r9@JALRXjFQK0=CQvl`?s4Ka=QpngRvK=t?#tAU?W&uqK1t%l?VLn(#vwC;qiMoG zkR9K#1%;$&REA$^Hs^1cb`MMo_|RuTQg>r<3OHKf;~gL8^D)PRJK?9`G5+s%S33X}A8X zGFX0heg(7A)%^=hH$WVQyZ`rfe5t8zE+!bIE(g1qKvVh`)*^*TnGFBS(hOXSX_GzI zEvH%8p$9pJt4h0GGtNBqK2K znhbC#G6U&!6fN}$J+@4cuM6xuG+s8IrOT5aFKUfhm|HDC#Oi0kRTeK!hodVOQyn?0 z?g|^>cru78?_@AP$Ez62nBvu^y+L9$Me}hAkSVaX}Gi4)m)O#`_t$k@M5t zE;{hh-}a(=QtjkBp`DAIB1;*ZYDQKTc^XL5k)0v2w%iqY`28;O^*qTBHx25w^V3Fw zYn8eb@Ru@sVUBz`>8mR|26LIb+F!B(6K_#3MJaFEBw61*1Y-3r%fN1e(4$qX=3Rl0 zOLH3L4@q@FV{%XH56z2A1xkvP0Q)5&6CLX+l0WOxi^MiCg30toU+MD?;L(x5 z8jB1gsG;QV@{|1m0P~@fau;i$hDTRsLM=Ft($SVeH}Y865!6eSgvQ<8quP=77Ah7o zI;?Y%%hnZrCQm+Eor0RMW7?$=ugiyh#=nxvd{dNGJHh@fZv0)?gJuNBI&%4uaDA!2 zjr?!=OllrWZ4wvcLD9KrKmQ7L`{(QZcd6)}=?Ai)YUM-zxqM5H!c&?-zlu?aEj51I z6~C4#F$|6Qi{fs;Q3}0^uYBSoLO3W(u_9E13I-$i{bfCRw~cwm-+w1BsDIxyETEV9 zcA}Z6QWB726^*|Jzw!(j1Rfp)Q{sK2%ERmfD#Kw)yd%7%#$-O%QVs}#N<7$dRlNb% z!gifXj~%x4RV4tOu4>1ds5*tnir~6srDQp7*1NCa<^Pzv;3PXvH2?233+CWM>W3ad zOKmc;>G;+pCGat`9i&)Nf$mnkZ32sqwd;v1tdjHa58h#>?1AMX}N15u)}hJ&y=f>Sachs4%a(YVxTe9SdvP+EWBS$7;qqHs#n4&>L4y*uVg5$UvX7*}# zS}vs_Y(Q;<6idfTuaOwa_C0)8yX8|w#q=0a8G((CONCM(UGuvOY>rnVkA~4wJmI^C z4D9hY1c%z@ZGeUNR3CfF-c?rPHz$j|ycehNqnFc30;)vOd_qjDDn#=bwN93?-yw#ipn+_4##4^5;K7EnRN(Kg)pTJha7 zus7#vCN!CuZR5rJY0_4LiDQMC3!5$5__e!*lIzh$O_L9~!lJhKQ&23WU&4L5iUOB5 z_FMrYqb*3wr(J_gJ9Zh+6dW#cXrbma?(RoBsj<()SRUL&6Z8TDDsH-*_(%RPBz0?nsh7eOJ+c}9sO3|J zDGAMEA8-oGnd+1UFj#jV&39I}C*iq?Vzgx^_PTRk%0wjJ$K`cWtfc+hV~uqL%c|&~ zo$E^9=bi}~&60y=38CZW_f1q6m=baG`3iaX-9l{+mu@&q(IFx5xqp#i{s*TFB zt)<#L<-L>5tj?;!HZY_%104J{dMG}JGBjc2V`Y(b&tgedQxQwMW|tYN@Z5Ce&^$iB zk6cnYItV;#UgsAjX}3zAcV6g@4FC@U@L4!7M$M*K>?K-{$*};WIt3oKILn#=vB~BY z8}};D%qbyfdQTPRtBn6loEM0?ng6({rt;I>i~$3xe&2_W<8c>0d*K*{qrvI& zc1YL%4^v~W&pQE&52{<_-l{W!(5<`%3QNDmF6W!(fFvu_W^@n{*BmZ>46)ksi}!+V zIDq(@O4k1##q?&q5pJPDSSfAMxSpd?!{Yj7era#T@78K3`bI@G8DWZV=63sVN8(zsktys&(jY0n-hl9O zUC4j!fotg9!wfcv+r#2g&$W+|jv`qVBm5Xv)b5x=tbKn*|cZOvRe+7XeDkE z$?%eyX(T1i-b+rELgybWo3m9Z1gMT9N@%8^SyNqSRnxRSAHMll3}lh=AEj!0?t4dXJiC_86gZffRnI!GLW!b=s1!H z9vr=$oQ5SIrGUkU9oj-xhFt}j-8C%2*BEF8GsADxAgl2x>HGg)U(U}lnxL+WkQez{ zvX}Ryk;w1L-KU7o-K^D{K5dmQsNc-%`>X@xr6y|h!S(TqR&@1tOOr#vNt$NV>g?w` z+mQcK^UoYnJb)JnZ>NF@u{$ zcZv@78aexGH<2623wQPBP49kNF>mArI1#vNVQ24s`Y`4%87jOY&^G6AZMh zTG7G|J$GwJW(5@MN!lkV^OkP*iov0_mY~4+DyKBg@^WGk9r;c#r{Xj+rLyVJMeviiZJE05u6Z|GDr$^ zZX9~f!BvH46wM*qr&uOCq1bY7VW4>}^=tB9W*F<4>CYjz+ROS$Olx50lAhBMkXmmQ zysTKZ@=11r0d=WyuLqBbTBL@Y?ZH4DNSVusMqCa+faRX^WQipK^X1o2F83r!O84t$H{s7>c2!$sK|8Oqh$8)IP-Xt zx?BO~f4hLQwhy21;I!cY-kJ_DR-hWbybKttff0C;_v&;;3zj$cJ?gJE&IH?mb~uv$ z91W6AWhBRHwj5 zWBCp_@xd}hOvUa!Y~?DpNj5ilD|?dBScfb`L>X74__GSUhHeB73+7R{9}BL*ZxH6Z zitv%wFAKDvXZ)Xqu*F&3oWNVDM$)k%#+w+5gOLD~y9cC}5Oj}qTMwF-vvW6{)&oW&5q% z=SzhkittCbY|tR~_%12%`h%MgK|n>B@jX#Dc_A9_(gx>fVJ27@@NmO)wQK*Yvk}RB zVdxR+)tT1~`XPp*R~}>r6aGV;Ht!-(BO9)zYawgRC~c0NCUC}0(>J>FF#XI{y(a#R zqctuY%FL)27hWziPv`Y3^jCO$-Iky z{hAW*jF7aK-r{JQ*d4L+K2zl3TaCf52JtAVJmKDQVfZ)jBbh|+!hW}up(!NXIyb_> zIX1%7b_H{5YvnCPIMv$Lm|xU1-->`HZwo()WPbJe>JyFXyFvHu`xd?Cy1`FmYo~W( z$@rYVw_IO{?0#v1v9LD3uUIoL35isyfkuk0xtoAw|77SDpAAKQN}~d0pVE{?zCV5o z?mfus(zCm78^(TV_VA`9*cdI4+_0%*Ze9=jzhLu@#HLxY4Cm+h-Sjt5)GB# zdlTL?KM^9pUR(6Du(Xl~d4|3?LqKn7SJm#(2I$ip^tmRQxFlazBzMx33#%6u5WF4~ zphEBQVf(}(a8=|WS0(r+$u(XKLYvG=Jt?-IOYpShRs0t3Si%-DGeLK~E^E7lB%r}d zjoRTLbBm@VH-00GzS`op`UdSy9K@Kwj_>h&fxwl8l;#P~Z(-JZv#U-(RCyA`&`zb{!0s65Aryt;QT?qt^h9n zvdIG^udAZa`vx$Mg%z_2ox1?M3p9Q_FhZ$<@wLa;exTzclmeQ*4FkIUGA|}3ly%M+ zY&?$5U;Gzicii>Y;|F4R1udmeaBAaLl-2u*?dtkmm|jPD z^0h;YGGHJ@G8XAwb(TA9l?c8_|ILPv6);`PDX|Z#l~bhc0{0^G1tbEzw)*C^%M>cyxRlM=$W)tPSoXP~(kt z#8Y-fsRH??Jf@&oJ8?=^jrDKpoxR>`yZ^nm11VlmO@+=jw?UQmIqvj$!J0(_b8=LpX%nmFZR8|CE^XKJvAUIx_RPS#%= zPoPu;juzaEXPXgLG7nDU&8u|6m@}S7`;W1X?9rbX=!s)Yt^0I?c}Z9YfhJmIG`mfV z06r>_%SW5<_^TE$Pr|zf3*Q0UP8jwg1TXByuuxCwe08T%?{mMIRT#{sc>b3d0{uH@ zRwn!*s}qmDjA-8Up9nH&5x5q-Oc#QBb<9hE8TYNlRL=A_WD+$&4d~wqCbzl!+Y&|q z+|jKtXd$g$i?Ifcw{e}Y3L~s(K;|f~i~S7^h(^JN)L`Hu+YTSZKO-V~1@AeJC}%ex z@jRu}KBmYU$vO4htIt>?rrhl<$H;qx*$K7p5KZ8_A)`Xj20c@vr$Rs{D`5GjqSBz$ zc+-DLzP*nJv_||IfaLpeS-z`fzqr2($}D>rz%rl{Okx@Y^0*3&R>PS@gbhkG-0AW{ zwy_Dd8xsZ>?l@Nl74=-Lm=6@9e<}SB{CIzK73Wq(j$Bj;J|+o1R)+*Tdkt}BB+DeF zR}~RAu`nCoFT;>qFr@w(R{|EdWkT66SAVkgi~$8*QpIb+kNnIhZ`k>p@VvS8!Z%yE zfDE|s6{moW=c}){`@(vR>-u-NM_mrN2p{ntYPiMste*lasJgz4KlHnWQhBqdhEQS3 zNbV+V?(?nF&onI5XD@kEK9`&8iZlil&^*$5^TdQSZ}ZT~!diqdmq}`D1gq0(trxPG zz6B`?xRI2)Pw@V+s1P4KyuQzv$gc3^w|C^40+GY5_tyO>)-4G#4~a>kLE%Rvp5P~* za-p0sXBm_i#=od0*RY7N*Mcu95!!ntU1#woIU2;BndbNaZb#b)U|YdMDH1c8Bp0S!JNVxM;PH|hzhhxhcQzMF_hINqO*e7R%}m<=VEi2% z9UOF2#S&z26W;`)E`a~L1nYuLg#=O{VEs;Lt>xX=Yw+3?fp7xba+#KYv@0K@{MDHa(Z)+Ti6`Ro3QV#fMGtoHwsk^oQ{)n@!ov3eFu@nS| z&IEvIi1Obt_67^#|4i2$^*BiN?8VZ~87X5prAHQ}5~VZ4QTeuqU*(l5{-c@x3J(Ou zw@+8dcxvR)_GT+)RP(7I(1W~UgMv`I+KA2)W20$W z6(FVE$Z+i%s=YF_k+`WatWK2JNJI*VlwM)qN(NmHG1S@ui4e&^|ANDOm;l1`&Cb`G zmy~U_nDhPXH?VS;1f}Ods10wTA=5i86>9u@-VQM_PV&=f;)-^fe+m@ zaZ;=2^$p)p(n)|d7Jx0UYtY>@N|q}-%F=U;cjJ#9OaOq&5i0T_Wn>bPrHUBQVz=)1 zS`E*tu@aN$0pJtnOO!zM>aLwPCp|%;7X{tv54gex$>*_bt&?H_+*>AX1O*%PhXzx` zfQ(}xpFVtb@KpayGmwj(L{i#=m}4mIZP7o@AHbI1!gac4V-NI!hTdI?R|EB%pz@Qp z5_`a2Tg^5_ctnu-J5wyVjZH1`fe?bljR-~jGe^t^AMn6TGC}Jyc%ODz^>kgX{D3N! z0$^7474qcFP(bg>h8o zrGT{f!3s>Q1{ykv_rtY!fu(R4l4$%yt~F8baG*1%$a`KZOQ}qLdAe_}uz>BG-@$3F8MNjtPH+%d~LAS4nwl+J>J$uv^ zEP+VfUEn>o{A%IxMM%)21q+L~C2XW@R+hA5vr`MH#PG;7#DDzM|^KZxTsyJqUBaD zslf|JZ~z}0dkpw?Q~MFlW=v%;UFk>f3uOR0{cE}zLAymHWE=15o!m}(<#r;l1ohRL zY^jJ>ifoY)J5)0#SfQb4Rp)Z8_rfxz*J{^i1#uTHF>?Lp{#$Uxd^iQ5^EsdbZ)^$o z!Gl5B2-E=#-h05wOvdnAY9wA}2OX%Gq9f#1W`jMk1Z zi3{OhdylJETaWmF6DSJP0KP3gx*hO{9vIM^)O2R*2)I5uJK2Pg`>F@}Y;YVxem+wq zOs?eE*}ctkL+#|DAFm+xo6QSGahFwJUBrO$n%I>>%(G$?(&x{=Xqy4{s{!Y@iPa5n zeQxXRLwpY9N7bq=HQus}{S;>8`+;Ja@wiR0mITNL&wTd~CSORAcrStaTFoy`jt}Hk zJnI}@5Sr2B!Nyq&<4fcDelAI274)Y9+ksZ%54B5N)t8Q~aXFQvkdg~L2*U2o;j$Xu>KgAt9z{ zo`Qc(RQJq)M=n((JgoW38DY{ptK?8Yuva+V^r$l%+^~fz44!;{=f#X>-5X}56KD(% z%Rhw41+Y8@zrH-XVMO7P$URg(N51;|8u8GEk|;?hNvIGIFrN;99d|PZtPWJM&Kj)b zCJMx>F!m1o0lo|FMuOGU;s?fN1l_NmQmLZ$+uE`Y0Q z`fQz1-gmEx+0t}O6!V#Ad%{^h7<7Dc%C=;$7(euO#G_ykBq%&cscx?5NC~NU(SGc$ zDAMvNar31Cw~`bYD_q4<=B!gRJeVlKf)`j46B6SjcwXWHd-}BgR4ep4<#UX^;5P0% zZlwy20bGDX$rlTQn3%F|Y9^(b8NQav8plizTC8uUO|LDVg+qn--VxD?iwT>)*goc_ z!lewnPyi=~XtTe@e`2fDIL*crN@__`O|p#rXRE@6j5jLXkmWTm_p^o~$o-I@1>sy) z2S@5*-<9hx#|3ru(m5ELG<`7Tl@}|Lu13%NV;B16R1UQK_ZQgIJ);Ri@uTC;^ti5x z!(Y1%ZOT&1oCsBmAxv9T(>MP?mbidM!atLKzX+Q>sR3!jz(gjd-kyiQ8k5e?$3yBl z4e03~{Wl_M!~wlyu-eYU1t;m!g-5(YrEALsR6%gvtlXHfL$dHq-d# zZ^(R2)icZ-!q_OoWe*os*c=+xt4Q%k5Xb63bb{$~?D?+fia@7CI2e-_{OkS1NRcIeKS|aW&_8;WP6nUaJOB*?6w+9MlT>T#j5T;z z{~es@422RvyV`~hQh9nO*!1P)MfH0*>Qv(TcmWT*Ow8EW7Z4OuHet{~Wz3Dtujn5G zb^WIm1w^8MjzBMTEkvkV3RcH$uM3n^)-uLk_E5Rb(B-1wSEE0bEj zgq>vovZpP0AT;|e8YnSS?E8Y5>D}+})C*4Dxky&LhSXu8!w|>bv*s-pym`-HY#@sY z#ol`siHS|ZG8%VCNV;=7*a~3GLS;$RA?P9h6Ndo1-!5BAP){$|sC~u0m>yW7Bw#1u z`Z^r`e?TG3ErN($%X_cxgMysmMGH!p=t$GBo9!pvCo0}209l9QoU1Jh=*sEQe$k{L z#%OznRsd`7lcA-YPn=T89b*Z_(hQGBudMW~-<023r!_t?IE|w}IJ2?)VoL>M8CisP zNt^d+m1uhp)}tclqy@kSoPMIzs!zeWA5&o$DZ3hw`_N%ZyCgT!jCeQDT;#axckTPd z9!8FA*Y$PJ*G*T2m6$`4GHs8~D9;4QfsfvESSX>zmnKh=+iE+pZnNmAeis4JsSea< z7J`55@~V~%PH5bbBsm&WY&?v-n|m5V+S~ zMGNMalP3j(PXbT|R~+(mOkfgOm%`_C@?~(hVujouV_DTQS8cI>-rSCZB+v(IsW`O} z$K&tgu8+8sSxy#kJ3K9?XwV{(VKmnsQDct^pe$W8#u%>e8b-%Y{4?D$+9g2aQu;2> z;1U*zg--)9$qYf}uHvqgCep-+PB55n;2745*GVGSqxL><_(GsQ<{^yZG_fyWc zJ>GWlu7)A#ilg*qX0>fQNT&2~^&`^0{vr3Nfo3lZdx9CncsDd{lLR{)gZyr& zBVJo==yZOP6u>NBKCPo_#pk2`EoPQ|00BV9Ry~FHRO3Un{&T`Ymu8a@mf1HDib2Es zJk>?`s=2dGc8!X4)>$6d_QQgdfnGo_zN@lUsUFg>a; zKM+xWx=R&6FfKNjS7EcrvwJL)FW1QGl!%P(cZ?Dippk{ezF5Dye(bKG!dk1pD<~#d zE5O21Xsn6WEBDM7Ubh>-!k;Rvcq2HuHK|_kyd{b3j}IU{_VYb8 z;MtrIZRH+QSVyYTh-V$sC7{70S&qIaJuae1ISHs2|9 zFwq8oXLast&AplLIG$8ay9CLDIbF1g zt%e`wJpX=`#M1{!@xD2))E8rQWd9QOrO{Dh|K#wb)I00Ez6orm+aQixCNZK|rcFmG zj}NFT1Uw{y8}31rR9F@qEaMle4w+Uga6yrRUBrzYB~^+g7Zpr9hJz*$)7y)8rWTNo zhcM3PupRZy5P&Wi(DW5k;N`H?bFL<=*QskvCqX_WrekhjJ z*B0BK3ss|U!DT~e5J-6w=CGcA-Is^n7SS3s13XKKqi9fL!O3>v&jR(N3!6) za^?wn^CUfR&*hn=c`JpCoM-PK0hSJbwzVY^0&GKkxup*W?&(U8bbzhaB4R+UFeU8J z5>G3|K6fLP&j1zq?6T*3{Co&rQryHO7Et`ps{gYd(dF6kk!tG2-k>!Lz^(VGn16~m zXsC8vxqI?_s;tu zT$ng?Yb->Xc>$LA@Fz8K=)=r{r*t4#pd?spTINT*rHQQYO;=tU)L*RY%3r9|hM-d% zAo^j{mWd#;(-d*E_bE&gpL8is!nHDoXE){EtHY42m$498RJt#$)IEa54N*6RKz14= zOk6h}hMgJdu-6dX^C7FJT(tRzt6fgL?T@fOft9!J<)?q#=$-94GbL@Xps5JupxEI@ zUPA5D3B$eijXPdQpFk5)z%3qzYEZ4_u=ZGb5ly&`el)%0H;_|KW|pTNjObweEO6|R z;=GR^Ugy$8blP@HJ2<=H2Cmkh(XHX1?rE7&{viUxOshe>e{5?K4-o(RV`E%p#xS}I zBMqVHOo*u3YX)cdHi*M5u3^Cg0IF)HXhR;EabY?S1$gjW;o5u3U20$1^-_!+Bn8Dn z_@&c%&lS28Nl@B7wKCD=7P42d+OdBu_BZ|_nc@!t+6L#I@63S5-KLEvv70q4`kdm4JV2C_XW;EBtMyk$ z(nO_{SS<`l5hKP#3ViqU!7Bgr_*GYCD#dRC_b(l9zl7OGW`*ni-+u0e?L<0p&3S#u9##oGIc?0|vP!`05w(FF|*5%Gbk9R-{YAhkc_ z+-R*TlEZsUGb0Ye#;_epU?HYW2heKJzL2Z`CCI>2bNd`BGq_+L*rK6oJ8gq zm5#cl<=5@z7n3C3;UP~;&iV+O;VqH&wM3SZB2NJujhU)IeHXecr4lwKrf|b?irGBe z$k#eK^bXnC0KoDqsF5<6;{b$*J;oW#vvplbd<}vYwZ^iO#PmvY{E1ojUw%O}>^1uG z(j+PzJjwL#OfQRURFD+R8*;{}B9%R3yyR&JaQ4z_ih5Fr(bMg6vx z=t<$e=%tWghmZ#F`e4`v=g1Ys)FL51vdV`13A6m5C#oXsFhytl!GKSmA>v++@oyd{BG|uSvxfw?l-dRpb&EoP4^3jiT zjpCMa(C9%Sju{fe<=}f6%H2Nn26H35pa8>J;uIJ2r5OakxB+2dQHZwQrdipxAjSwK$Hs3L7Yx?SG#LH@ z$-30;v+vdbzB;k@AU9+Niz^O(`%gly9IhrJc>Ro0jMS{VXz(g&AM=}J0`|gDn9_6j zA#9@v`>gxbHS?Qi@NM7EKJHkIsztlefP=a2vA#C|6bUX~4pVVr;`xQ|C*!l-2Bgxj zBVERuV2>mS7Az+l;r?2;X5Nz=uq*z@YZ8o)GBz5e9H?r#j@o#M5%3v(f z-@!#%uq00AIbx`=(9$7i>cx24?uIx=px1ZzGPo$_T%BP6%&r+*!%U=~bLt+QLR+0# zajNPdPqb2hmW>_1idl%-m3aTqh>ozP@2 zcHLQa*})IyY)um(C)b1Yr+~hiktqO_r{XH94aKzAHo`+N-E1ddkKSi0Owf|lc0C*_ zZYow9(}rGvXG-XGw_e0h2`RJX|K=Vr(9||!#9F7reW8j&V5A?NZq&3o!~LaF)gefQ zdLCEak-9fam}qMbP(_jv2e?1Py9Uj(^3#Ff&h-@ zo9&0u6y7n4rP*Ce_rgAB_jzY4BA*#!oxuc-`M%LJ{u@a_;jc+8HTpLE-)UafVl!iP6 zxu-|Wn$-o2dbgSRN=*eY`kx-(EURAHh+))3Kk9`nYZc$hKjM#&0lt~ZK_8=v9@bT2 zG<prcxF58%K$4G;5;Q*W9M zrl-DY%veO91^VnDf})yQWI#JJ#M`=4l#><^tY1k3zfSx>fC4?R^xyQZuFOfJqYkLbOx+y^@6@ijxVK&HRA11qL?yu5duEqd*RaWl~_n=_J=h z=H>7KvN!~8=#L*I4>%wsMUVG#ez%00cJ{I`ANT7zF|=?=;O?};Y*WuhLdV+MpT3^R zXjIMpD!N&q!0F5DZv2u>R#u{~@xAz|%fBgfKMyGN@Jrlz6O!=D6?(H^<0{ComOQdX zHVFw1;1(WBe^l)yn?BSUYXMlc0l5a9Kna{BH=V-ps>Im%cMvjQj((IR^({@T_ZGW& za0MB_EF4G#DvOy)Bwj2a{PgqVyZ@|-q?r$9s^6HIXCigRUI_t2aF`5o#%5Ak#pOcs zsQ+1*_4`>(D*g;l2Hf_2DpD)U1qgffkD5yD_@`&nb+{a)>gMaT)Z5_?sXN!D<$hMH zqfoO1zy9wXpY>Bg#=={PO!A1$5?JSaPa;(-J6V<1OnXn6QL+{)y?9l3aJL_6k#~2^ z0pfP1mN@38)6X0)#Je)|*Teu!-B++P@t%-nQFFQczR~=gk$6}V#=m_Zn=Yoxo!SjRsc4CWLCh;bIPk(kjMJlH#6zF z!*ZD6pq0lgC^&!fK5DFxLDTZT&qx*MxY+gKu#k_Mg<_oxt$Vj}b394bhg@!`Uu2U4 z-qjB7#vRNZPWNBNI8V?dMHp^&ZeC;X?<1Z?CNM9hUwK=$*<+`q9-rEH6%@P~c0!$* z^jns9BJWsyTw261Pw79+sllja)=84d_kmolBF#8+ONR8jYS6;nxXR}!F}3YH1?MMk zl_9znMqNF>D|rf-E{$o$F0=#mlM8g~V$_@+_o3H-4}8SN(@+MDmKQWRvq%_+4}3BBI_*h*;GD;-@9f1K02 zirkkaheZY*W(Q?rVc@K^mC_=F^^MSd1j`)b=QA>aw#|(f5*lK9{cK7Tb1!_mPjuh0 zc^`kMDST_*cQez($*hyrHQdZybD8x0wo5Yxc+;Eo{b57JekJTM?MdUE%7?<*9S@5o zzaa;d>~D?3fe&J<@SeS!st4C{%8#eta}P=O$ENvNr*fBlTLbMoPhA6}I!`@s3KCC! zrX+nPEl3?@MiK}*R>;jYXf&5TnA4d{CW2Lg71rb`Sc*4r}n!IJ|y;dq@B^t zY0-ZN7PJTIHja3$eLZ}r8%M>Z5?YtUr4pMDj~HJ~q5gK&8qX5HdUIZ^Fs||H!$v8e zPg(HyL-i>t0NN6fpqk$xmE#vm|8`94$FcU(7}2$t;?aAKau+0iHJe+X$J~+W?1^&J zRpE>%=s>xdO5eW}EVaP@HBUl{CdjbA?)9o*t1Pntn)dx&VC65j>z#ZvjiZm_uJ*^! z*}C1Mz*lN*^%{~=#VFTGVf5n%O3z+|H~s~N;q*MBs<&Y-Ewb|j#U9m71Y^3;}-Zm4Zq%HU_opu%O1Ld{moAB1g?#j z<$^~?4Z}(mR+hT|pdMl#e-X;yo>l+8HDfP?q6m|VZmU%c$MvxQjJKZ{{ihaBgMS@% z8`?Rzjprg!-Pn?so?s#C+WHo%g;gb5p?p@Q0nYxk3|T3k>jZoBZBft%?8hX0K)v&w z%jO?Ox(>V6r3b@P0n{sVbpzTOENGjMVASlV{|9P7mA^grBGa|GtRvQ58z3|T?l~UZ zI*FmNqcD6)ebrDP5U5<`Sk6>a$-t7U2+PnI2=HK<7=U$RatsiWBIMMFRgV4CiJ%*j zo1fur1t8uuk&{2S@Oxr&b#sn>35`Mk;z4Y{cEUtrI)E_Ra%!L*sp91n!!GHTX`vmd zBBV6Pm4ti=RTJAM@cjp~iKH}C0*w$(3PU!prI=zIr%O5N$JkH8dj=q%ljQif!~&)c z*!H#nP`9w3E@dj`Ws{;_N5wLz>s;rSan|PcF@p=|8RNVXMOwCRn-uK{G0@`tF_4Es z$N)EtsAD5AbW8^WIY~-@$6JqQ-~9m5v&os{*;E)>=+DHy3L{~#{lp)=_U%7mi1u{$ zJoMhz+0aBEq;;3x78W=0L27+Qv+OGz+xwvt|@-%^QVgpz`|5Jr-F$uS>|$Flaj1K|6&v$%eccDUn9 zKR7~z^`y7ONx_( zU^@$ucaViA?kt!{hW-Q+p^yQ_^#|BU|N>ZwZqhS|l-^qBeZ>Yhq}P&fO${6=#C0RDb+5c_$w+HM&iqD8+8 zMsb@zfXb*yKnQqSIem`ri{CF6dsOM9nC*3tS|jKEng5Tys|#%;%g*=K&z0Ji?Xs=e zG08wG&}5a+WVMM2ViHbr_TMpbMLLm>joHLdCvxDPj}AAuFZV^SqlTT+sK5jvG#e2&v(y5w8uV7;k%v053WKB4|-n@uugTC*bzOb_y5M!&nkZcVxX zAd^V~JK}7F=d5Kt5W)4#!}UEJS6Lsw_wp^${FtRvb^iz1zfeHQUqPVMv08!xt0P_o z5MIwa`uguq6wv!{5+f}u&SGSazm_RKZ>ofVyqqx%IQKFi-*=~^Q`U!m`u`*fq|m5` zPDp{E-6@eh6MMLnNZqu@Mf$$at2u~E7GIV7E8!3>(ufJ^4PiIR+pL74L9;ApnTwjCA!a3-n3Kro#krFh3#D5m#)iiDnR3+ zp1y##Zt#&s{wcZ}C3);T5s`-sR?%1?d-j}SQEGn3#<;HpHsG&1em^(O2fTs$k~*g) zy8kO;v=&Q!U9h!8>RWD~{AAs?64(6h$~FIhx4G2zhErRjOy5?ay-xa;Xq6*lpS5kD zUQ+|0L4Fl>>@fgd)^$5BhE#7vaV;f#gtBM95JBH{y%j3gJ*)1-SLl~A?;~@$>V`{F zyRAZ04y4`}9oVrYYNYK0yS5-TzsJTb`V`9RCa)j^`?i~|kUh5xhvoP}xit!n_0-fe z{)pFkIBz@5^V)Zu?FG93ZXsM}$`10A(-s}npP`6XW2|tKir}jJg8pVhNbPKh;aYUT zAG=~3^(ZPFu9KaI?#2q)U*knPx%%?5I#$;uf25+jN_OpwHkFrKm-Q!6^%{O^y2&!b z5}iZ)3jD;M@Fu7CLdC5wN$nnpxJQL0-pQdP$eeg?sRemuVGg?e}q5h)0;2)Hmvacl~^h1dgFOpq7=CiA)#~)ag0`)sJ z;jjCqytEy2{YR-L9hxcI@i%YN>W*KXOhM6U1*7#;&lu z-c>U^?WfMDME0~rcRf~ipao!c#MP!BDv8szK-J@Q zyg%SC6{kh!JhscaR}vrYvy+_SthznCM&(kM?L0;~$#}!OU+tdLSqzBy1}=4V@2$s{ zC&(|4MYKxgb5J-!{}UDBa;oBIkL*pXkudSarxE{PW}5TBt$88(YqT@;KasK5dT0$l z4ZEznR_xM!@4FSx*Y!Kp{h*3x4~u~*-z)Qr!+Tbw`yUf`X>C4N=Y5Lhm9QEQX7R*@ za=YjHGL5k@)X4Q z{v?w6Fuz6T^D--DAecs?A8Yj`XiNR5Ts~DU`<1Pk=(YTDkX%6xavH|+ry$J(8 zFeJZ9Yj%JW_oXM0kd*IEJe^oDGB^?QC6S*P9EotH^8xS~Bna>-1Mb9Yxx%3;`E3yU zn@BV;xYZ!{kbpqARuwqc2ZW<#-^va_`1iBnSxf5rMB!pV2Aqtwi0}vAHh9(~J6RQk zJ#aRIyUE&m`udNn(iV=TFEoGyd7{LkxlLK$z`FA^ir)4A(R`tNl$9 zY2P1{$m@N9#NeWr|E%94FE~yptrmEtS;7MSTJdOIo|xyi==nXei^sX*i>mNP54@M*zdZ7s z;lFso{k%muvt32J6WRmE*L&+%rLJ2khZ2p6TOm4}h$UE}-bbLF>dc^S zUPpjS4Sj^A=BrE*CUw;@XrkQX9th~JJXQgvBBDdy{U?c8qDj0;B9FgIVgk6lNMdHXKcCe3VnSe(Jp!$15{PP-#nW?Wc zN%eD>#DV-vB<4Al{pMKx-dx|>B{6}VPCU>n09?L~NmS4Y1ZHU{h|b*n?94wV;648m ziAl)N-<$I?5_7%mmr10)MFJw3ggFnLZ`ty5{x)X_kiMD!$@$l%-S;Q|_VHgzJ6@mu z!C9&Y3U{Uc^ZfQ%fPnP7XGN*Er^B-`_6GZ-v$oX#DhD7PWV}~tz{7vYo+9(`L+i2A zV9ah<4X26nDLO}JUpJ>k3UssMaU%7fW_QOGdH=2R*FK_w(A(MmnA+c+X&V{WTXNt; z{Y{jY&piw{i_opSex6_ecjG+7{Y&RPBnI5ZKyHUt3IH(RnmO1vKvQ@(K|bB6vBF`l)EWB(?ikR9+@v{6O?xq5!CDm0i*$=4281 zBj3+3159ViZ%7^D_+h3JNlqpa^!>@jM1euRDeW=?cBb~Mv-a(i68Xau!Aqo%#Gnko zuHdgn1TYsWWdJX3e=WgG*p3qb80ck2Q&Lz>YP#PB^kzQF80@M8z^SvI)`v5lJx|}0 zPZR=B2|$>33M~+URd=wi2;F2Yg5SpLJ`owBLO_`{v1}pB3Al1zM!)o zLt7j6iHL~ECgKl-Tet>$gbyOFCMs*ODlY;w?OpeDnPFx|hs6MBin-AM4)X8?bdfX5 zr}A+dsJCIE4Pbd9`m3SRYs#MLx+0)X%8U{v>;!~PgPrD)x!%0ARp)Jo?mL!*DF|&v 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

      u;4(+Ll#_? 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%0D`5R9^);x|Wl#|`+S)TZ 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%0Dd2b_m!C;6ckC-sL~k@dtUb9 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

      t>pOrbw2uwq5|xsu`3g)rcUP1lZxL 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

    0#3o3ihK#wU{ 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

  • SM_*(G@1$<(XQdOlGRcYj188dhV2=%?b6(?8` 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