From 5eb69b405dbc1d8fe441e8dbb38a2947cd287d7e Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Tue, 2 Sep 2025 17:11:34 +0800 Subject: [PATCH] gtk-ng/wayland: allow more quick terminal configs --- src/apprt/gtk-ng/winproto/wayland.zig | 23 +++++++++----- src/config/Config.zig | 46 +++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/apprt/gtk-ng/winproto/wayland.zig b/src/apprt/gtk-ng/winproto/wayland.zig index 0ab7c24f0..5837e3e5e 100644 --- a/src/apprt/gtk-ng/winproto/wayland.zig +++ b/src/apprt/gtk-ng/winproto/wayland.zig @@ -114,11 +114,13 @@ pub const App = struct { return false; } - if (self.context.xdg_wm_dialog_present and layer_shell.getLibraryVersion().order(.{ - .major = 1, - .minor = 0, - .patch = 4, - }) == .lt) { + if (self.context.xdg_wm_dialog_present and + layer_shell.getLibraryVersion().order(.{ + .major = 1, + .minor = 0, + .patch = 4, + }) == .lt) + { log.warn("the version of gtk4-layer-shell installed on your system is too old (must be 1.0.4 or newer); disabling quick terminal", .{}); return false; } @@ -128,10 +130,7 @@ pub const App = struct { pub fn initQuickTerminal(_: *App, apprt_window: *ApprtWindow) !void { const window = apprt_window.as(gtk.Window); - layer_shell.initForWindow(window); - layer_shell.setLayer(window, .top); - layer_shell.setNamespace(window, "ghostty-quick-terminal"); } fn getInterfaceType(comptime field: std.builtin.Type.StructField) ?type { @@ -411,6 +410,14 @@ pub const Window = struct { else return; + layer_shell.setLayer(window, switch (config.@"gtk-quick-terminal-layer") { + .overlay => .overlay, + .top => .top, + .bottom => .bottom, + .background => .background, + }); + layer_shell.setNamespace(window, config.@"gtk-quick-terminal-namespace"); + layer_shell.setKeyboardMode( window, switch (config.@"quick-terminal-keyboard-interactivity") { diff --git a/src/config/Config.zig b/src/config/Config.zig index 5ffd01871..3bff3c0f1 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2132,6 +2132,44 @@ keybind: Keybinds = .{}, /// terminal would be half a screen tall, and 500 pixels wide. @"quick-terminal-size": QuickTerminalSize = .{}, +/// The layer of the quick terminal window. The higher the layer, +/// the more windows the quick terminal may conceal. +/// +/// Valid values are: +/// +/// * `overlay` +/// +/// The quick terminal appears in front of all windows. +/// +/// * `top` (default) +/// +/// The quick terminal appears in front of normal windows but behind +/// fullscreen overlays like lock screens. +/// +/// * `bottom` +/// +/// The quick terminal appears behind normal windows but in front of +/// wallpapers and other windows in the background layer. +/// +/// * `background` +/// +/// The quick terminal appears behind all windows. +/// +/// GTK Wayland only. +/// +/// Available since: 1.2.0 +@"gtk-quick-terminal-layer": QuickTerminalLayer = .top, +/// The namespace for the quick terminal window. +/// +/// This is an identifier that is used by the Wayland compositor and/or +/// scripts to determine the type of layer surfaces and to possibly apply +/// unique effects. +/// +/// GTK Wayland only. +/// +/// Available since: 1.2.0 +@"gtk-quick-terminal-namespace": [:0]const u8 = "ghostty-quick-terminal", + /// The screen where the quick terminal should show up. /// /// Valid values are: @@ -7165,6 +7203,14 @@ pub const QuickTerminalPosition = enum { center, }; +/// See quick-terminal-layer +pub const QuickTerminalLayer = enum { + overlay, + top, + bottom, + background, +}; + /// See quick-terminal-size pub const QuickTerminalSize = struct { primary: ?Size = null,