diff options
-rw-r--r-- | cocoa/ScintillaCocoa.h | 6 | ||||
-rw-r--r-- | cocoa/ScintillaCocoa.mm | 36 | ||||
-rw-r--r-- | cocoa/ScintillaView.mm | 4 |
3 files changed, 34 insertions, 12 deletions
diff --git a/cocoa/ScintillaCocoa.h b/cocoa/ScintillaCocoa.h index 841ba8f13..d07ffe758 100644 --- a/cocoa/ScintillaCocoa.h +++ b/cocoa/ScintillaCocoa.h @@ -97,6 +97,8 @@ private: intptr_t notifyObj; bool capturedMouse; + bool isFirstResponder; + bool isActive; bool enteredSetScrollingSize; @@ -242,7 +244,9 @@ public: NSMenu *CreateContextMenu(NSEvent *event); void HandleCommand(NSInteger command); - void ActiveStateChanged(bool isActive); + void SetFirstResponder(bool isFirstResponder_); + void ActiveStateChanged(bool isActive_); + void SetFocusActiveState(); void WindowWillMove(); // Find indicator diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm index 36ae35bd0..c4569144e 100644 --- a/cocoa/ScintillaCocoa.mm +++ b/cocoa/ScintillaCocoa.mm @@ -402,6 +402,8 @@ ScintillaCocoa::ScintillaCocoa(ScintillaView *sciView_, SCIContentView *viewCont notifyObj = NULL; notifyProc = NULL; capturedMouse = false; + isFirstResponder = false; + isActive = false; enteredSetScrollingSize = false; scrollSpeed = 1; scrollTicks = 2000; @@ -2494,15 +2496,31 @@ void ScintillaCocoa::HandleCommand(NSInteger command) { //-------------------------------------------------------------------------------------------------- -void ScintillaCocoa::ActiveStateChanged(bool isActive) { - // If the window is being deactivated, lose the focus and turn off the ticking - if (!isActive) { - DropCaret(); - //SetFocusState( false ); - FineTickerCancel(TickReason::caret); - } else { - ShowCaretAtCurrentPosition(); - } +/** + * Update 'isFirstResponder' and possibly change focus state. + */ +void ScintillaCocoa::SetFirstResponder(bool isFirstResponder_) { + isFirstResponder = isFirstResponder_; + SetFocusActiveState(); +} + +//-------------------------------------------------------------------------------------------------- + +/** + * Update 'isActive' and possibly change focus state. + */ +void ScintillaCocoa::ActiveStateChanged(bool isActive_) { + isActive = isActive_; + SetFocusActiveState(); +} + +//-------------------------------------------------------------------------------------------------- + +/** + * Update 'hasFocus' based on first responder and active status. + */ +void ScintillaCocoa::SetFocusActiveState() { + SetFocusState(isActive && isFirstResponder); } //-------------------------------------------------------------------------------------------------- diff --git a/cocoa/ScintillaView.mm b/cocoa/ScintillaView.mm index c0b2ee950..593722c1e 100644 --- a/cocoa/ScintillaView.mm +++ b/cocoa/ScintillaView.mm @@ -772,7 +772,7 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) { * The editor is getting the foreground control (the one getting the input focus). */ - (BOOL) becomeFirstResponder { - mOwner.backend->WndProc(SCI_SETFOCUS, 1, 0); + mOwner.backend->SetFirstResponder(true); return YES; } @@ -782,7 +782,7 @@ static NSCursor *cursorFromEnum(Window::Cursor cursor) { * The editor is losing the input focus. */ - (BOOL) resignFirstResponder { - mOwner.backend->WndProc(SCI_SETFOCUS, 0, 0); + mOwner.backend->SetFirstResponder(false); return YES; } |