feat(gtk): show menu in context menu if titlebar is disabled

This commit is contained in:
Ismael Arias
2025-01-09 12:50:49 +01:00
parent 2d7706ec4f
commit ae81edfcbf
2 changed files with 30 additions and 13 deletions

View File

@ -831,12 +831,12 @@ fn setSizeLimit(
switch (target) { switch (target) {
.app => {}, .app => {},
.surface => |v| try v.rt_surface.setSizeLimits(.{ .surface => |v| try v.rt_surface.setSizeLimits(.{
.width = value.min_width, .width = value.min_width,
.height = value.min_height, .height = value.min_height,
}, if (value.max_width > 0) .{ }, if (value.max_width > 0) .{
.width = value.max_width, .width = value.max_width,
.height = value.max_height, .height = value.max_height,
} else null), } else null),
} }
} }
@ -1766,12 +1766,10 @@ fn initActions(self: *App) void {
} }
} }
/// This sets the self.menu property to the application menu that can be /// Initializes and populates the provided GMenu with sections and actions.
/// shared by all application windows. /// This function is used to set up the application's menu structure, either for
fn initMenu(self: *App) void { /// the main menu button or as a context menu when window decorations are disabled.
const menu = c.g_menu_new(); fn initMenuContent(menu: *c.GMenu) void {
errdefer c.g_object_unref(menu);
{ {
const section = c.g_menu_new(); const section = c.g_menu_new();
defer c.g_object_unref(section); defer c.g_object_unref(section);
@ -1793,7 +1791,14 @@ fn initMenu(self: *App) void {
c.g_menu_append(section, "Reload Configuration", "app.reload-config"); c.g_menu_append(section, "Reload Configuration", "app.reload-config");
c.g_menu_append(section, "About Ghostty", "win.about"); c.g_menu_append(section, "About Ghostty", "win.about");
} }
}
/// This sets the self.menu property to the application menu that can be
/// shared by all application windows.
fn initMenu(self: *App) void {
const menu = c.g_menu_new();
errdefer c.g_object_unref(menu);
initMenuContent(@ptrCast(menu));
self.menu = menu; self.menu = menu;
} }
@ -1825,6 +1830,18 @@ fn initContextMenu(self: *App) void {
c.g_menu_append(section, "Terminal Inspector", "win.toggle_inspector"); c.g_menu_append(section, "Terminal Inspector", "win.toggle_inspector");
} }
if (!self.config.@"window-decoration") {
const section = c.g_menu_new();
defer c.g_object_unref(section);
const submenu = c.g_menu_new();
defer c.g_object_unref(submenu);
initMenuContent(@ptrCast(submenu));
// Just append the submenu to the menu structure
c.g_menu_append_submenu(section, "Menu", @ptrCast(@alignCast(submenu)));
c.g_menu_append_section(menu, null, @ptrCast(@alignCast(section)));
}
self.context_menu = menu; self.context_menu = menu;
} }

View File

@ -270,7 +270,7 @@ pub fn init(self: *Window, app: *App) !void {
} }
self.context_menu = c.gtk_popover_menu_new_from_model(@ptrCast(@alignCast(self.app.context_menu))); self.context_menu = c.gtk_popover_menu_new_from_model(@ptrCast(@alignCast(self.app.context_menu)));
c.gtk_widget_set_parent(self.context_menu, window); c.gtk_widget_set_parent(self.context_menu, box);
c.gtk_popover_set_has_arrow(@ptrCast(@alignCast(self.context_menu)), 0); c.gtk_popover_set_has_arrow(@ptrCast(@alignCast(self.context_menu)), 0);
c.gtk_widget_set_halign(self.context_menu, c.GTK_ALIGN_START); c.gtk_widget_set_halign(self.context_menu, c.GTK_ALIGN_START);