diff --git a/lcl/interfaces/cocoa/cocoa_extra.pas b/lcl/interfaces/cocoa/cocoa_extra.pas index e9850c2aef..29680590ee 100644 --- a/lcl/interfaces/cocoa/cocoa_extra.pas +++ b/lcl/interfaces/cocoa/cocoa_extra.pas @@ -60,8 +60,11 @@ type end; NSWindowFix = objccategory external (NSWindow) + // 10.4-10.7 + function userSpaceScaleFactor: CGFloat; message 'userSpaceScaleFactor'; //deprecated // 10.7+ procedure toggleFullScreen(sender: id); message 'toggleFullScreen:'; + function backingScaleFactor: CGFloat; message 'backingScaleFactor'; end; {// private since 10.5, doesn't seam to do anything in 10.10 diff --git a/lcl/interfaces/cocoa/cocoaprivate.pp b/lcl/interfaces/cocoa/cocoaprivate.pp index 9a87ea4d6f..7dbbaf974c 100644 --- a/lcl/interfaces/cocoa/cocoaprivate.pp +++ b/lcl/interfaces/cocoa/cocoaprivate.pp @@ -406,10 +406,6 @@ type procedure mouseMoved(event: NSEvent); override; end; - NSWindow = objcclass external(CocoaAll.NSWindow) - function backingScaleFactor: CGFloat; message 'backingScaleFactor'; - end; - { TCocoaWindow } TCocoaWindowContent = objcclass; diff --git a/lcl/interfaces/cocoa/cocoawscommon.pas b/lcl/interfaces/cocoa/cocoawscommon.pas index 5931641ea3..bf6e6e8d2d 100644 --- a/lcl/interfaces/cocoa/cocoawscommon.pas +++ b/lcl/interfaces/cocoa/cocoawscommon.pas @@ -8,7 +8,7 @@ interface uses Types, - CGGeometry, CocoaAll, + CGGeometry, CocoaAll, cocoa_extra, Classes, Controls, SysUtils, // WSControls, LCLType, LMessages, LCLProc, Graphics, Forms, @@ -1372,11 +1372,29 @@ end; class function TCocoaWSWinControl.GetCanvasScaleFactor(const AControl: TControl ): Double; +var + obj: NSObject; + win: NSWindow; begin + win := nil; + Result := 1; + if TWinControl(AControl).HandleAllocated then - Result := TCocoaWindow(TWinControl(AControl).Handle).backingScaleFactor // ToDo: use userSpaceScaleFactor for Mac OSX 10.6 - else - Result := 1; + begin + obj := NSObject(TWinControl(AControl).Handle); + if obj.isKindOfClass_(NSView) then + win := NSView(obj).window + else if obj.isKindOfClass_(NSWindow) then + win := NSWindow(obj); + end; + + if Assigned(win) then + begin + if win.respondsToSelector( NSSelectorFromString(NSSTR('backingScaleFactor'))) then + Result := win.backingScaleFactor + else if win.respondsToSelector( NSSelectorFromString(NSSTR('userSpaceScaleFactor'))) then // for older OSX + Result := win.userSpaceScaleFactor; + end; end; class procedure TCocoaWSWinControl.SetText(const AWinControl: TWinControl; const AText: String);