From 62146e35bf193bea4d4e2a48c6faf1fc552feff9 Mon Sep 17 00:00:00 2001 From: dmitry Date: Mon, 23 Dec 2019 17:12:40 +0000 Subject: [PATCH] cocoa: updating lclRelativePos function, based on the patch by David Jenkins. bug #36049 git-svn-id: trunk@62434 - --- lcl/interfaces/cocoa/cocoaprivate.pas | 28 ++++++++++++++++++++++++--- lcl/interfaces/cocoa/cocoawinapi.inc | 7 +------ lcl/interfaces/cocoa/cocoawindows.pas | 9 +++++++++ 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/lcl/interfaces/cocoa/cocoaprivate.pas b/lcl/interfaces/cocoa/cocoaprivate.pas index 2d5f33232b..0b382fee13 100644 --- a/lcl/interfaces/cocoa/cocoaprivate.pas +++ b/lcl/interfaces/cocoa/cocoaprivate.pas @@ -127,6 +127,10 @@ type procedure lclInvalidateRect(const r: TRect); message 'lclInvalidateRect:'; procedure lclInvalidate; message 'lclInvalidate'; procedure lclUpdate; message 'lclUpdate'; + + // Returns the position of the view or window, in the immediate + // parent (view or screen), relative to its client coordinates system + // Left and Top are always returned in LCL coordinate system. procedure lclRelativePos(var Left, Top: Integer); message 'lclRelativePos::'; procedure lclLocalToScreen(var X, Y: Integer); message 'lclLocalToScreen::'; procedure lclScreenToLocal(var X, Y: Integer); message 'lclScreenToLocal::'; @@ -1024,9 +1028,19 @@ begin end; procedure LCLViewExtension.lclRelativePos(var Left, Top: Integer); +var + sv : NSView; + fr : NSRect; begin Left := Round(frame.origin.x); - Top := Round(frame.origin.y); + sv := superview; + if Assigned(sv) and (not sv.isFlipped) then + begin + fr := frame; + Top := Round(sv.frame.size.height - fr.origin.y - fr.size.height); + end + else + Top := Round(frame.origin.y); end; procedure LCLViewExtension.lclLocalToScreen(var X, Y:Integer); @@ -1035,18 +1049,22 @@ var begin // 1. convert to window base + // Convert from View-lcl to View-cocoa P.x := X; if isFlipped then p.y := Y else P.y := frame.size.height-y; // convert to Cocoa system + // Convert from View-cocoa to Window-cocoa P := convertPoint_ToView(P, nil); + // Convert from Window-cocoa to Window-lcl X := Round(P.X); Y := Round(window.frame.size.height-P.Y); // convert to LCL system // 2. convert window to screen + // Use window function to convert fomr Window-lcl to Screen-lcl window.lclLocalToScreen(X, Y); end; @@ -1055,13 +1073,17 @@ var P: NSPoint; begin // 1. convert from screen to window - + // use window function to onvert from Screen-lcl to Window-lcl window.lclScreenToLocal(X, Y); + // Convert from Window-lcl to Window-cocoa P.x := X; P.y := Round(window.frame.size.height-Y); // convert to Cocoa system // 2. convert from window to local + // Convert from Window-cocoa to View-cocoa P := convertPoint_FromView(P, nil); + + // Convert from View-cocoa to View-lcl X := Round(P.x); if isFlipped then Y := Round(p.y) @@ -1079,7 +1101,7 @@ var v: NSView; begin v := superview; - if Assigned(v) then + if Assigned(v) and not v.isFlipped then NSToLCLRect(frame, v.frame.size.height, Result) else Result := NSRectToRect(frame); diff --git a/lcl/interfaces/cocoa/cocoawinapi.inc b/lcl/interfaces/cocoa/cocoawinapi.inc index aea520c5af..3b79e3844e 100644 --- a/lcl/interfaces/cocoa/cocoawinapi.inc +++ b/lcl/interfaces/cocoa/cocoawinapi.inc @@ -1318,12 +1318,7 @@ function TCocoaWidgetSet.GetWindowRelativePosition(Handle: hwnd; var Left, Top: begin Result := Handle <> 0; if Result then - begin - if TCocoaWindowContent(handle).isembedded then - TCocoaWindowContent(handle).lclRelativePos(Left, Top) - else - TCocoaWindowContent(handle).window.lclRelativePos(Left, Top); - end + NSObject(handle).lclRelativePos(Left, Top); end; function TCocoaWidgetSet.GetWindowSize(Handle: hwnd; var Width, Height: Integer): boolean; diff --git a/lcl/interfaces/cocoa/cocoawindows.pas b/lcl/interfaces/cocoa/cocoawindows.pas index 5cb5c5011a..8a91c72413 100644 --- a/lcl/interfaces/cocoa/cocoawindows.pas +++ b/lcl/interfaces/cocoa/cocoawindows.pas @@ -221,6 +221,7 @@ type function lclOwnWindow: NSWindow; message 'lclOwnWindow'; procedure lclSetFrame(const r: TRect); override; function lclFrame: TRect; override; + procedure lclRelativePos(var Left, Top: Integer); override; procedure viewDidMoveToSuperview; override; procedure viewDidMoveToWindow; override; procedure viewWillMoveToWindow(newWindow: CocoaAll.NSWindow); override; @@ -452,6 +453,14 @@ begin end; end; +procedure TCocoaWindowContent.lclRelativePos(var Left, Top: Integer); +begin + if isembedded then + inherited lclRelativePos(Left, Top) + else + window.lclRelativePos(Left, Top); +end; + procedure TCocoaWindowContent.viewDidMoveToSuperview; begin inherited viewDidMoveToSuperview;