diff --git a/src/Surface.zig b/src/Surface.zig index a37f0a7e8..28d66d25d 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -3830,6 +3830,12 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool {}, ), + .toggle_tab_overview => try self.rt_app.performAction( + .{ .surface = self }, + .toggle_tab_overview, + {}, + ), + .toggle_secure_input => try self.rt_app.performAction( .{ .surface = self }, .secure_input, diff --git a/src/apprt/action.zig b/src/apprt/action.zig index 70c189c8f..0941d65c9 100644 --- a/src/apprt/action.zig +++ b/src/apprt/action.zig @@ -87,6 +87,9 @@ pub const Action = union(Key) { /// Toggle fullscreen mode. toggle_fullscreen: Fullscreen, + /// Toggle tab overview. + toggle_tab_overview, + /// Toggle whether window directions are shown. toggle_window_decorations, diff --git a/src/apprt/glfw.zig b/src/apprt/glfw.zig index 57667afb1..fb31f7c2b 100644 --- a/src/apprt/glfw.zig +++ b/src/apprt/glfw.zig @@ -194,6 +194,7 @@ pub const App = struct { .toggle_split_zoom, .present_terminal, .close_all_windows, + .toggle_tab_overview, .toggle_window_decorations, .goto_tab, .inspector, diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index 45031324a..294954bd4 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -372,6 +372,7 @@ pub fn performAction( .mouse_visibility => self.setMouseVisibility(target, value), .mouse_shape => try self.setMouseShape(target, value), .mouse_over_link => self.setMouseOverLink(target, value), + .toggle_tab_overview => self.toggleTabOverview(target), .toggle_window_decorations => self.toggleWindowDecorations(target), .quit_timer => self.quitTimer(value), @@ -534,6 +535,23 @@ fn toggleFullscreen( } } +fn toggleTabOverview(_: *App, target: apprt.Target) void { + switch (target) { + .app => {}, + .surface => |v| { + const window = v.rt_surface.container.window() orelse { + log.info( + "toggleTabOverview invalid for container={s}", + .{@tagName(v.rt_surface.container)}, + ); + return; + }; + + window.toggleTabOverview(); + }, + } +} + fn toggleWindowDecorations( _: *App, target: apprt.Target, diff --git a/src/apprt/gtk/Window.zig b/src/apprt/gtk/Window.zig index e23a8abf3..ff8735ff9 100644 --- a/src/apprt/gtk/Window.zig +++ b/src/apprt/gtk/Window.zig @@ -457,6 +457,15 @@ pub fn gotoTab(self: *Window, n: usize) void { } } +/// Toggle tab overview (if present) +pub fn toggleTabOverview(self: *Window) void { + if (self.tab_overview) |tab_overview_widget| { + if (comptime !adwaita.versionAtLeast(1, 4, 0)) unreachable; + const tab_overview: *c.AdwTabOverview = @ptrCast(@alignCast(tab_overview_widget)); + c.adw_tab_overview_set_open(tab_overview, 1 - c.adw_tab_overview_get_open(tab_overview)); + } +} + /// Toggle fullscreen for this window. pub fn toggleFullscreen(self: *Window) void { const is_fullscreen = c.gtk_window_is_fullscreen(self.window); diff --git a/src/input/Binding.zig b/src/input/Binding.zig index 45ec24126..f9921a87e 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -298,6 +298,10 @@ pub const Action = union(enum) { /// Go to the tab with the specific number, 1-indexed. goto_tab: usize, + /// Toggle the tab overview. + /// This only works with libadwaita enabled currently. + toggle_tab_overview: void, + /// Create a new split in the given direction. The new split will appear in /// the direction given. new_split: SplitDirection, @@ -607,6 +611,7 @@ pub const Action = union(enum) { .next_tab, .last_tab, .goto_tab, + .toggle_tab_overview, .new_split, .goto_split, .toggle_split_zoom,