diff --git a/lcl/interfaces/cocoa/cocoawindows.pas b/lcl/interfaces/cocoa/cocoawindows.pas index cffec4527d..3f881f7649 100644 --- a/lcl/interfaces/cocoa/cocoawindows.pas +++ b/lcl/interfaces/cocoa/cocoawindows.pas @@ -1019,7 +1019,8 @@ function TCocoaWindow.makeFirstResponder( aResponder : NSResponder ): ObjCBOOL; var lastResponder : NSResponder; newResponder : NSResponder; - cb : ICommonCallback; + lastCb : ICommonCallback; + newCb : ICommonCallback; begin inc( makeFirstResponderCount ); try @@ -1031,7 +1032,7 @@ begin // lastResponder may be changed dynamically. // for example, when lastResponder is a FieldEditor. // see also: TCocoaFieldEditor.lclGetCallback() - cb := getResponderCallback( lastResponder ); + lastCb := getResponderCallback( lastResponder ); // do toggle Focused Control // Result=false when the focused control has not been changed @@ -1043,15 +1044,21 @@ begin if makeFirstResponderCount > 1 then exit; + // new Responder was not finalized until here + newCb := getResponderCallback( self.firstResponder ); + + // different Controls in Cocoa may correspond to the same LCL Control + // for example TextField and its FieldEditor both correspond to the same TEdit + if lastCb = newCb then exit; + // 1st: send KillFocus Message first - if Assigned(cb) then - cb.ResignFirstResponder; + if Assigned(lastCb) then + lastCb.ResignFirstResponder; // 2st: send SetFocus Message // TCocoaWindow.makeFirstResponder() may be triggered reentrant here - cb := getResponderCallback( self.firstResponder ); - if Assigned(cb) then - cb.BecomeFirstResponder; + if Assigned(newCb) then + newCb.BecomeFirstResponder; finally dec( makeFirstResponderCount );