Skip to content

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

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 {

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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