diff --git a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift index a5180c943..698c07755 100644 --- a/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift +++ b/OSBindings/Mac/Clock Signal/Documents/MachineDocument.swift @@ -209,8 +209,10 @@ class MachineDocument: openGLView.delegate = self openGLView.responderDelegate = self - // If this machine has a mouse, enable mouse capture. + // If this machine has a mouse, enable mouse capture; also indicate whether usurption + // of the command key is desired. openGLView.shouldCaptureMouse = machine.hasMouse + openGLView.shouldUsurpCommand = machine.shouldUsurpCommand setupAudioQueueClockRate() diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.h b/OSBindings/Mac/Clock Signal/Machine/CSMachine.h index 0417e843a..ddde679f3 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.h +++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.h @@ -94,6 +94,7 @@ typedef NS_ENUM(NSInteger, CSMachineKeyboardInputMode) { // Input control. @property (nonatomic, readonly) BOOL hasExclusiveKeyboard; +@property (nonatomic, readonly) BOOL shouldUsurpCommand; @property (nonatomic, readonly) BOOL hasJoystick; @property (nonatomic, readonly) BOOL hasMouse; @property (nonatomic, assign) CSMachineKeyboardInputMode inputMode; diff --git a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm index 1b16c4a77..66492fc07 100644 --- a/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm +++ b/OSBindings/Mac/Clock Signal/Machine/CSMachine.mm @@ -671,6 +671,14 @@ struct ActivityObserver: public Activity::Observer { return !!_machine->keyboard_machine() && _machine->keyboard_machine()->get_keyboard().is_exclusive(); } +- (BOOL)shouldUsurpCommand { + if(!_machine->keyboard_machine()) return NO; + + const auto essential_modifiers = _machine->keyboard_machine()->get_keyboard().get_essential_modifiers(); + return essential_modifiers.find(Inputs::Keyboard::Key::LeftMeta) != essential_modifiers.end() || + essential_modifiers.find(Inputs::Keyboard::Key::RightMeta) != essential_modifiers.end(); +} + #pragma mark - Activity observation - (void)addLED:(NSString *)led { diff --git a/OSBindings/Mac/Clock Signal/Views/CSOpenGLView.m b/OSBindings/Mac/Clock Signal/Views/CSOpenGLView.m index c57c05dfb..a41c07e9d 100644 --- a/OSBindings/Mac/Clock Signal/Views/CSOpenGLView.m +++ b/OSBindings/Mac/Clock Signal/Views/CSOpenGLView.m @@ -245,6 +245,7 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt CGAssociateMouseAndMouseCursorPosition(true); [NSCursor unhide]; [self.delegate openGLViewDidReleaseMouse:self]; + ((CSApplication *)[NSApplication sharedApplication]).keyboardEventDelegate = nil; } } @@ -304,6 +305,9 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt [NSCursor hide]; CGAssociateMouseAndMouseCursorPosition(false); [self.delegate openGLViewDidCaptureMouse:self]; + if(self.shouldUsurpCommand) { + ((CSApplication *)[NSApplication sharedApplication]).keyboardEventDelegate = self; + } // Don't report the first click to the delegate; treat that as merely // an invitation to capture the cursor.