diff --git a/src/apprt/gtk/App.zig b/src/apprt/gtk/App.zig index cc7af2758..60fefc6de 100644 --- a/src/apprt/gtk/App.zig +++ b/src/apprt/gtk/App.zig @@ -797,13 +797,7 @@ fn initContextMenu(self: *App) void { const menu = c.g_menu_new(); errdefer c.g_object_unref(menu); - { - const section = c.g_menu_new(); - defer c.g_object_unref(section); - c.g_menu_append_section(menu, null, @ptrCast(@alignCast(section))); - c.g_menu_append(section, "Copy", "win.copy"); - c.g_menu_append(section, "Paste", "win.paste"); - } + createContextMenuCopyPasteSection(menu, false); { const section = c.g_menu_new(); @@ -823,6 +817,20 @@ fn initContextMenu(self: *App) void { self.context_menu = menu; } +fn createContextMenuCopyPasteSection(menu: ?*c.GMenu, has_selection: bool) void { + const section = c.g_menu_new(); + defer c.g_object_unref(section); + c.g_menu_prepend_section(menu, null, @ptrCast(@alignCast(section))); + // FIXME: Feels really hackish, but disabling sensitivity on this doesn't seems to work(?) + c.g_menu_append(section, "Copy", if (has_selection) "win.copy" else "noop"); + c.g_menu_append(section, "Paste", "win.paste"); +} + +pub fn refreshContextMenu(self: *App, has_selection: bool) void { + c.g_menu_remove(self.context_menu, 0); + createContextMenuCopyPasteSection(self.context_menu, has_selection); +} + fn isValidAppId(app_id: [:0]const u8) bool { if (app_id.len > 255 or app_id.len == 0) return false; if (app_id[0] == '.') return false; diff --git a/src/apprt/gtk/Surface.zig b/src/apprt/gtk/Surface.zig index 4d7ff688c..390cf8c90 100644 --- a/src/apprt/gtk/Surface.zig +++ b/src/apprt/gtk/Surface.zig @@ -1199,6 +1199,9 @@ fn showContextMenu(self: *Surface, x: f32, y: f32) void { }; c.gtk_popover_set_pointing_to(@ptrCast(@alignCast(window.context_menu)), &rect); + + self.app.refreshContextMenu(self.core_surface.hasSelection()); + c.gtk_popover_popup(@ptrCast(@alignCast(window.context_menu))); }