diff --git a/include/ghostty.h b/include/ghostty.h index 29c779f2c..503498748 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -570,6 +570,7 @@ typedef enum { GHOSTTY_ACTION_TOGGLE_FULLSCREEN, GHOSTTY_ACTION_TOGGLE_TAB_OVERVIEW, GHOSTTY_ACTION_TOGGLE_WINDOW_DECORATIONS, + GHOSTTY_ACTION_TOGGLE_BACKGROUND_OPACITY, GHOSTTY_ACTION_TOGGLE_QUICK_TERMINAL, GHOSTTY_ACTION_TOGGLE_VISIBILITY, GHOSTTY_ACTION_MOVE_TAB, diff --git a/src/Surface.zig b/src/Surface.zig index 6651dd8c2..757495d1d 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -4257,6 +4257,12 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool {}, ), + .toggle_background_opacity => return try self.rt_app.performAction( + .{ .surface = self }, + .toggle_background_opacity, + {}, + ), + .toggle_tab_overview => return try self.rt_app.performAction( .{ .surface = self }, .toggle_tab_overview, diff --git a/src/apprt/action.zig b/src/apprt/action.zig index 62410a5a1..59d5f0af8 100644 --- a/src/apprt/action.zig +++ b/src/apprt/action.zig @@ -104,6 +104,9 @@ pub const Action = union(Key) { /// Toggle whether window directions are shown. toggle_window_decorations, + /// Toggle the background opacity of the target terminal. + toggle_background_opacity, + /// Toggle the quick terminal in or out. toggle_quick_terminal, @@ -253,6 +256,7 @@ pub const Action = union(Key) { toggle_fullscreen, toggle_tab_overview, toggle_window_decorations, + toggle_background_opacity, toggle_quick_terminal, toggle_visibility, move_tab, diff --git a/src/apprt/glfw.zig b/src/apprt/glfw.zig index bc4d32bd7..3aa21f144 100644 --- a/src/apprt/glfw.zig +++ b/src/apprt/glfw.zig @@ -222,6 +222,7 @@ pub const App = struct { .close_tab, .toggle_tab_overview, .toggle_window_decorations, + .toggle_background_opacity, .toggle_quick_terminal, .toggle_visibility, .goto_tab, diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 50b15f6a3..cf837530a 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -499,6 +499,7 @@ pub fn performAction( .toggle_tab_overview => self.toggleTabOverview(target), .toggle_split_zoom => self.toggleSplitZoom(target), .toggle_window_decorations => self.toggleWindowDecorations(target), + .toggle_background_opacity => self.toggleBackgroundOpacity(target), .quit_timer => self.quitTimer(value), .prompt_title => try self.promptTitle(target), .toggle_quick_terminal => return try self.toggleQuickTerminal(), @@ -796,6 +797,25 @@ fn toggleQuickTerminal(self: *App) !bool { return true; } +fn toggleBackgroundOpacity( + _: *App, + target: apprt.Target, +) void { + switch (target) { + .app => {}, + .surface => |v| { + const window = v.rt_surface.container.window() orelse { + log.info( + "toggleBackgroundOpacity invalid for container={s}", + .{@tagName(v.rt_surface.container)}, + ); + return; + }; + window.toggleBackgroundOpacity(); + }, + } +} + fn quitTimer(self: *App, mode: apprt.action.QuitTimer) void { switch (mode) { .start => self.startQuitTimer(), diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index 6af20118b..1734ef3ca 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -661,6 +661,17 @@ pub fn toggleWindowDecorations(self: *Window) void { }; } +/// Toggle the background opacity for this window. +pub fn toggleBackgroundOpacity(self: *Window) void { + if (self.app.config.@"background-opacity" >= 1) return; + + if (c.gtk_widget_has_css_class(@ptrCast(self.window), "background") == 1) { + c.gtk_widget_remove_css_class(@ptrCast(self.window), "background"); + } else { + c.gtk_widget_add_css_class(@ptrCast(self.window), "background"); + } +} + /// Grabs focus on the currently selected tab. pub fn focusCurrentTab(self: *Window) void { const tab = self.notebook.currentTab() orelse return; diff --git a/src/input/Binding.zig b/src/input/Binding.zig index ddee672a5..85cdb4ddc 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -431,6 +431,9 @@ pub const Action = union(enum) { /// Toggle window decorations on and off. This only works on Linux. toggle_window_decorations: void, + /// Toggle background opacity of window. + toggle_background_opacity: void, + /// 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. @@ -776,6 +779,7 @@ pub const Action = union(enum) { .toggle_maximize, .toggle_fullscreen, .toggle_window_decorations, + .toggle_background_opacity, .toggle_secure_input, .reset_window_size, .crash,