Skip to content

Commit 7facb6d

Browse files
authored
Make Ask Omi shortcut toggle AI conversation open/close (#5403)
## Summary - Remove Cmd+\ global shortcut (no longer hides/shows floating bar) - Ask Omi shortcut now toggles: press once to open AI input, press again to collapse back to pill - Works globally without requiring window focus (unlike Esc) ## Test plan - [ ] Press Ask Omi shortcut → AI input opens - [ ] Press Ask Omi shortcut again → collapses to pill - [ ] Press Ask Omi shortcut when bar is hidden → shows bar and opens AI input - [ ] Verify Cmd+\ no longer does anything 🤖 Generated with [Claude Code](https://claude.com/claude-code)
2 parents 04bdc17 + 65b35f4 commit 7facb6d

File tree

3 files changed

+16
-30
lines changed

3 files changed

+16
-30
lines changed

desktop/Desktop/Sources/FloatingControlBar/FloatingControlBarWindow.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -848,20 +848,27 @@ class FloatingControlBarManager {
848848
}
849849

850850
/// Toggle visibility.
851-
/// When visible with an AI conversation open, collapse to the pill instead of hiding.
852851
func toggle() {
853852
guard let window = window else { return }
854853
if window.isVisible {
855-
if window.state.showingAIConversation {
856-
window.closeAIConversation()
857-
}
858-
// Already collapsed pill — do nothing (don't hide)
854+
AnalyticsManager.shared.floatingBarToggled(visible: false, source: "shortcut")
855+
hide()
859856
} else {
860857
AnalyticsManager.shared.floatingBarToggled(visible: true, source: "shortcut")
861858
show()
862859
}
863860
}
864861

862+
/// Toggle AI input: if conversation is open, collapse it; otherwise open it.
863+
func toggleAIInput() {
864+
guard let window = window else { return }
865+
if window.isVisible && window.state.showingAIConversation {
866+
window.closeAIConversation()
867+
} else {
868+
openAIInput()
869+
}
870+
}
871+
865872
/// Open the AI input panel.
866873
func openAIInput() {
867874
guard let window = window else { return }

desktop/Desktop/Sources/FloatingControlBar/GlobalShortcutManager.swift

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ import Cocoa
77
class GlobalShortcutManager {
88
static let shared = GlobalShortcutManager()
99

10-
static let toggleFloatingBarNotification = Notification.Name("com.omi.desktop.toggleFloatingBar")
1110
static let askAINotification = Notification.Name("com.omi.desktop.askAI")
1211

1312
private var hotKeyRefs: [HotKeyID: EventHotKeyRef] = [:]
1413

1514
private enum HotKeyID: UInt32 {
16-
case toggleBar = 1
1715
case askOmi = 2
1816
}
1917

@@ -44,8 +42,6 @@ class GlobalShortcutManager {
4442

4543
func registerShortcuts() {
4644
unregisterShortcuts()
47-
// Register Cmd+\ for toggle bar (keycode 42 = backslash)
48-
registerHotKey(keyCode: 42, modifiers: Int(cmdKey), id: .toggleBar)
4945
// Register Ask Omi shortcut from user settings
5046
registerAskOmi()
5147
}
@@ -93,13 +89,10 @@ class GlobalShortcutManager {
9389
}
9490

9591
switch id {
96-
case .toggleBar:
97-
NSLog("GlobalShortcutManager: Cmd+\\ detected, toggling floating bar")
98-
NotificationCenter.default.post(name: GlobalShortcutManager.toggleFloatingBarNotification, object: nil)
9992
case .askOmi:
10093
NSLog("GlobalShortcutManager: Ask Omi shortcut detected")
10194
DispatchQueue.main.async {
102-
FloatingControlBarManager.shared.openAIInput()
95+
FloatingControlBarManager.shared.toggleAIInput()
10396
}
10497
}
10598

desktop/Desktop/Sources/OmiApp.swift

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
139139
private var localHotkeyMonitor: Any?
140140
private var windowObservers: [NSObjectProtocol] = []
141141
private var statusBarItem: NSStatusItem?
142-
private var toggleBarObserver: NSObjectProtocol?
143142
private var screenCaptureSwitch: NSSwitch?
144143
private var audioRecordingSwitch: NSSwitch?
145144

@@ -334,17 +333,8 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
334333
// Register global hotkey for Rewind (Cmd+Shift+Space)
335334
setupGlobalHotkeys()
336335

337-
// Register Carbon-based global shortcuts for floating control bar (Cmd+\)
336+
// Register Carbon-based global shortcuts for floating control bar (Ask Omi)
338337
GlobalShortcutManager.shared.registerShortcuts()
339-
toggleBarObserver = NotificationCenter.default.addObserver(
340-
forName: GlobalShortcutManager.toggleFloatingBarNotification,
341-
object: nil,
342-
queue: .main
343-
) { _ in
344-
Task { @MainActor in
345-
FloatingControlBarManager.shared.toggle()
346-
}
347-
}
348338

349339
// Ensure app always shows in dock as a regular app
350340
NSApp.setActivationPolicy(.regular)
@@ -549,7 +539,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
549539
}
550540

551541
log("AppDelegate: Hotkey monitors registered - global=\(globalHotkeyMonitor != nil), local=\(localHotkeyMonitor != nil)")
552-
log("AppDelegate: Hotkey is Ctrl+Option+R (⌃⌥R), Ask Omi + Cmd+\\ via Carbon hotkeys")
542+
log("AppDelegate: Hotkey is Ctrl+Option+R (⌃⌥R), Ask Omi via Carbon hotkeys")
553543
}
554544

555545
// Dock icon is always visible — LSUIElement=false and activation policy stays .regular
@@ -921,11 +911,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate {
921911
NSEvent.removeMonitor(monitor)
922912
localHotkeyMonitor = nil
923913
}
924-
// Remove floating bar observers and shortcuts
925-
if let observer = toggleBarObserver {
926-
NotificationCenter.default.removeObserver(observer)
927-
toggleBarObserver = nil
928-
}
914+
// Remove floating bar shortcuts
929915
GlobalShortcutManager.shared.unregisterShortcuts()
930916

931917
// Stop push-to-talk

0 commit comments

Comments
 (0)