apprt/gtk: add toggle_maximize keybind and window-maximize config option

This commit is contained in:
Adam Wolf
2025-01-10 22:42:41 -06:00
parent 5a4aac7e09
commit 8102fddceb
8 changed files with 59 additions and 0 deletions

View File

@ -565,6 +565,7 @@ typedef enum {
GHOSTTY_ACTION_CLOSE_TAB, GHOSTTY_ACTION_CLOSE_TAB,
GHOSTTY_ACTION_NEW_SPLIT, GHOSTTY_ACTION_NEW_SPLIT,
GHOSTTY_ACTION_CLOSE_ALL_WINDOWS, GHOSTTY_ACTION_CLOSE_ALL_WINDOWS,
GHOSTTY_ACTION_TOGGLE_MAXIMIZE,
GHOSTTY_ACTION_TOGGLE_FULLSCREEN, GHOSTTY_ACTION_TOGGLE_FULLSCREEN,
GHOSTTY_ACTION_TOGGLE_TAB_OVERVIEW, GHOSTTY_ACTION_TOGGLE_TAB_OVERVIEW,
GHOSTTY_ACTION_TOGGLE_WINDOW_DECORATIONS, GHOSTTY_ACTION_TOGGLE_WINDOW_DECORATIONS,

View File

@ -646,6 +646,16 @@ pub fn init(
// an initial size shouldn't stop our terminal from working. // an initial size shouldn't stop our terminal from working.
log.warn("unable to set initial window size: {s}", .{err}); log.warn("unable to set initial window size: {s}", .{err});
}; };
if (config.@"window-maximize") {
rt_app.performAction(
.{ .surface = self },
.toggle_maximize,
{},
) catch |err| {
log.warn("unable to maximize window: {s}", .{err});
};
}
} }
if (config.title) |title| { if (config.title) |title| {
@ -4168,6 +4178,12 @@ pub fn performBindingAction(self: *Surface, action: input.Binding.Action) !bool
{}, {},
), ),
.toggle_maximize => try self.rt_app.performAction(
.{ .surface = self },
.toggle_maximize,
{},
),
.toggle_fullscreen => try self.rt_app.performAction( .toggle_fullscreen => try self.rt_app.performAction(
.{ .surface = self }, .{ .surface = self },
.toggle_fullscreen, .toggle_fullscreen,

View File

@ -92,6 +92,9 @@ pub const Action = union(Key) {
/// Close all open windows. /// Close all open windows.
close_all_windows, close_all_windows,
/// Toggle maximized window state.
toggle_maximize,
/// Toggle fullscreen mode. /// Toggle fullscreen mode.
toggle_fullscreen: Fullscreen, toggle_fullscreen: Fullscreen,
@ -231,6 +234,7 @@ pub const Action = union(Key) {
close_tab, close_tab,
new_split, new_split,
close_all_windows, close_all_windows,
toggle_maximize,
toggle_fullscreen, toggle_fullscreen,
toggle_tab_overview, toggle_tab_overview,
toggle_window_decorations, toggle_window_decorations,

View File

@ -237,6 +237,7 @@ pub const App = struct {
.color_change, .color_change,
.pwd, .pwd,
.config_change, .config_change,
.toggle_maximize,
=> log.info("unimplemented action={}", .{action}), => log.info("unimplemented action={}", .{action}),
} }
} }

View File

@ -507,6 +507,7 @@ pub fn performAction(
.app => null, .app => null,
.surface => |v| v, .surface => |v| v,
}), }),
.toggle_maximize => self.toggleMaximize(target),
.toggle_fullscreen => self.toggleFullscreen(target, value), .toggle_fullscreen => self.toggleFullscreen(target, value),
.new_tab => try self.newTab(target), .new_tab => try self.newTab(target),
@ -709,6 +710,22 @@ fn controlInspector(
surface.controlInspector(mode); surface.controlInspector(mode);
} }
fn toggleMaximize(_: *App, target: apprt.Target) void {
switch (target) {
.app => {},
.surface => |v| {
const window = v.rt_surface.container.window() orelse {
log.info(
"toggleMaximize invalid for container={s}",
.{@tagName(v.rt_surface.container)},
);
return;
};
window.toggleMaximize();
},
}
}
fn toggleFullscreen( fn toggleFullscreen(
_: *App, _: *App,
target: apprt.Target, target: apprt.Target,

View File

@ -522,6 +522,15 @@ pub fn toggleTabOverview(self: *Window) void {
} }
} }
/// Toggle the maximized state for this window.
pub fn toggleMaximize(self: *Window) void {
if (c.gtk_window_is_maximized(self.window) == 0) {
c.gtk_window_maximize(self.window);
} else {
c.gtk_window_unmaximize(self.window);
}
}
/// Toggle fullscreen for this window. /// Toggle fullscreen for this window.
pub fn toggleFullscreen(self: *Window) void { pub fn toggleFullscreen(self: *Window) void {
const is_fullscreen = c.gtk_window_is_fullscreen(self.window); const is_fullscreen = c.gtk_window_is_fullscreen(self.window);

View File

@ -1214,6 +1214,13 @@ keybind: Keybinds = .{},
@"window-position-x": ?i16 = null, @"window-position-x": ?i16 = null,
@"window-position-y": ?i16 = null, @"window-position-y": ?i16 = null,
/// Whether to start the window in a maximized state. This is only related to
/// the X11 window manager's concept of maximization. In other words, this
/// will set the _NET_WM_STATE property to _NET_WM_STATE_MAXIMIZED_VERT and
/// _NET_WM_STATE_MAXIMIZED_HORZ on launch. This will not affect the window
/// size or position. This is only supported on Linux.
@"window-maximize": bool = false,
/// Whether to enable saving and restoring window state. Window state includes /// Whether to enable saving and restoring window state. Window state includes
/// their position, size, tabs, splits, etc. Some window state requires shell /// their position, size, tabs, splits, etc. Some window state requires shell
/// integration, such as preserving working directories. See `shell-integration` /// integration, such as preserving working directories. See `shell-integration`

View File

@ -391,6 +391,9 @@ pub const Action = union(enum) {
/// This only works for macOS currently. /// This only works for macOS currently.
close_all_windows: void, close_all_windows: void,
/// Toggle maximized window state. This only works on Linux.
toggle_maximize: void,
/// Toggle fullscreen mode of window. /// Toggle fullscreen mode of window.
toggle_fullscreen: void, toggle_fullscreen: void,
@ -737,6 +740,7 @@ pub const Action = union(enum) {
.close_surface, .close_surface,
.close_tab, .close_tab,
.close_window, .close_window,
.toggle_maximize,
.toggle_fullscreen, .toggle_fullscreen,
.toggle_window_decorations, .toggle_window_decorations,
.toggle_secure_input, .toggle_secure_input,