Skip to content

Standard key commands don't work in macOS glimpse window #12

@aporianist

Description

@aporianist

Thanks for this! So handy for whipping up agent interaction enhancements!

I noticed standard key commands (specifically: close/quit, undo/redo, copy/paste) currently don't work in a glimpse window (environment: macOS).

Codex says it's because on macOS you need menu items for those actions and suggested this patch, which works for me locally. Having done no native mac dev myself, I have no idea if this is right/reasonable... but happy to submit as a PR if you want it:

diff --git a/src/glimpse.swift b/src/glimpse.swift
index 825480d..1e241dc 100644
--- a/src/glimpse.swift
+++ b/src/glimpse.swift
@@ -336,7 +336,54 @@ class AppDelegate: NSObject, NSApplicationDelegate, WKNavigationDelegate, WKScri
         self.config = config
     }
 
+    private func setupMainMenu() {
+        let appName = ProcessInfo.processInfo.processName
+
+        func makeMenuItem(
+            _ title: String,
+            action: Selector?,
+            keyEquivalent: String,
+            modifiers: NSEvent.ModifierFlags = [.command]
+        ) -> NSMenuItem {
+            let item = NSMenuItem(title: title, action: action, keyEquivalent: keyEquivalent)
+            item.keyEquivalentModifierMask = modifiers
+            return item
+        }
+
+        let mainMenu = NSMenu()
+
+        let appMenu = NSMenu(title: appName)
+        appMenu.addItem(makeMenuItem("Quit \(appName)", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
+        let appMenuItem = NSMenuItem(title: appName, action: nil, keyEquivalent: "")
+        appMenuItem.submenu = appMenu
+        mainMenu.addItem(appMenuItem)
+
+        let fileMenu = NSMenu(title: "File")
+        fileMenu.addItem(makeMenuItem("Close Window", action: #selector(NSWindow.performClose(_:)), keyEquivalent: "w"))
+        let fileMenuItem = NSMenuItem(title: "File", action: nil, keyEquivalent: "")
+        fileMenuItem.submenu = fileMenu
+        mainMenu.addItem(fileMenuItem)
+
+        let editMenu = NSMenu(title: "Edit")
+        editMenu.addItem(makeMenuItem("Undo", action: Selector(("undo:")), keyEquivalent: "z"))
+        editMenu.addItem(makeMenuItem("Redo", action: Selector(("redo:")), keyEquivalent: "Z", modifiers: [.command, .shift]))
+        editMenu.addItem(.separator())
+        editMenu.addItem(makeMenuItem("Cut", action: Selector(("cut:")), keyEquivalent: "x"))
+        editMenu.addItem(makeMenuItem("Copy", action: Selector(("copy:")), keyEquivalent: "c"))
+        editMenu.addItem(makeMenuItem("Paste", action: Selector(("paste:")), keyEquivalent: "v"))
+        editMenu.addItem(makeMenuItem("Select All", action: Selector(("selectAll:")), keyEquivalent: "a"))
+        let editMenuItem = NSMenuItem(title: "Edit", action: nil, keyEquivalent: "")
+        editMenuItem.submenu = editMenu
+        mainMenu.addItem(editMenuItem)
+
+        NSApp.mainMenu = mainMenu
+    }
+
     func applicationDidFinishLaunching(_ notification: Notification) {
+        if !config.statusItem {
+            setupMainMenu()
+        }
+
         if config.statusItem {
             setupStatusItem()
         } else {

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions