diff options
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/osx/salframe.h | 6 | ||||
-rw-r--r-- | vcl/osx/salframe.cxx | 66 |
2 files changed, 56 insertions, 16 deletions
diff --git a/vcl/inc/osx/salframe.h b/vcl/inc/osx/salframe.h index 0d93e9e9b2ff..c2b53e270648 100644 --- a/vcl/inc/osx/salframe.h +++ b/vcl/inc/osx/salframe.h @@ -82,6 +82,7 @@ public: PointerStyle mePointerStyle; // currently active pointer style NSTrackingRectTag mnTrackingRectTag; // used to get enter/leave messages + NSRect maTrackingRect; CGMutablePathRef mrClippingPath; // used for "shaping" std::vector< CGRect > maClippingRects; @@ -95,6 +96,11 @@ public: // To prevent display sleep during presentation IOPMAssertionID mnAssertionID; + NSRect maFrameRect; + NSRect maContentRect; + + bool mbGeometryDidChange; + public: /** Constructor diff --git a/vcl/osx/salframe.cxx b/vcl/osx/salframe.cxx index 9bf63720dbef..c029f25159ba 100644 --- a/vcl/osx/salframe.cxx +++ b/vcl/osx/salframe.cxx @@ -268,6 +268,10 @@ void AquaSalFrame::screenParametersChanged() if( mpGraphics ) mpGraphics->updateResolution(); + + if (!mbGeometryDidChange) + return; + CallCallback( SalEvent::DisplayChanged, nullptr ); } @@ -1522,6 +1526,9 @@ void AquaSalFrame::SetParent( SalFrame* pNewParent ) void AquaSalFrame::UpdateFrameGeometry() { + bool bFirstTime = (mnTrackingRectTag == 0); + mbGeometryDidChange = false; + if ( !mpNSWindow ) return; @@ -1534,38 +1541,65 @@ void AquaSalFrame::UpdateFrameGeometry() NSScreen * pScreen = [mpNSWindow screen]; if( pScreen ) { - maScreenRect = [pScreen frame]; + NSRect aNewScreenRect = [pScreen frame]; + if (bFirstTime || !NSEqualRects(maScreenRect, aNewScreenRect)) + { + mbGeometryDidChange = true; + maScreenRect = aNewScreenRect; + } NSArray* pScreens = [NSScreen screens]; if( pScreens ) - maGeometry.nDisplayScreenNumber = [pScreens indexOfObject: pScreen]; + { + unsigned int nNewDisplayScreenNumber = [pScreens indexOfObject: pScreen]; + if (bFirstTime || maGeometry.nDisplayScreenNumber != nNewDisplayScreenNumber) + { + mbGeometryDidChange = true; + maGeometry.nDisplayScreenNumber = nNewDisplayScreenNumber; + } + } } NSRect aFrameRect = [mpNSWindow frame]; NSRect aContentRect = [NSWindow contentRectForFrameRect: aFrameRect styleMask: mnStyleMask]; - // release old track rect - [mpNSView removeTrackingRect: mnTrackingRectTag]; - // install the new track rect NSRect aTrackRect = { NSZeroPoint, aContentRect.size }; - mnTrackingRectTag = [mpNSView addTrackingRect: aTrackRect owner: mpNSView userData: nil assumeInside: NO]; + + if (bFirstTime || !NSEqualRects(maTrackingRect, aTrackRect)) + { + mbGeometryDidChange = true; + maTrackingRect = aTrackRect; + + // release old track rect + [mpNSView removeTrackingRect: mnTrackingRectTag]; + // install the new track rect + mnTrackingRectTag = [mpNSView addTrackingRect: aTrackRect owner: mpNSView userData: nil assumeInside: NO]; + } // convert to vcl convention CocoaToVCL( aFrameRect ); CocoaToVCL( aContentRect ); - maGeometry.nX = static_cast<int>(aContentRect.origin.x); - maGeometry.nY = static_cast<int>(aContentRect.origin.y); + if (bFirstTime || !NSEqualRects(maContentRect, aContentRect) || !NSEqualRects(maFrameRect, aFrameRect)) + { + mbGeometryDidChange = true; + + maContentRect = aContentRect; + maFrameRect = aFrameRect; - maGeometry.nLeftDecoration = static_cast<unsigned int>(aContentRect.origin.x - aFrameRect.origin.x); - maGeometry.nRightDecoration = static_cast<unsigned int>((aFrameRect.origin.x + aFrameRect.size.width) - - (aContentRect.origin.x + aContentRect.size.width)); + maGeometry.nX = static_cast<int>(aContentRect.origin.x); + maGeometry.nY = static_cast<int>(aContentRect.origin.y); - maGeometry.nTopDecoration = static_cast<unsigned int>(aContentRect.origin.y - aFrameRect.origin.y); - maGeometry.nBottomDecoration = static_cast<unsigned int>((aFrameRect.origin.y + aFrameRect.size.height) - - (aContentRect.origin.y + aContentRect.size.height)); + maGeometry.nLeftDecoration = static_cast<unsigned int>(aContentRect.origin.x - aFrameRect.origin.x); + maGeometry.nRightDecoration = static_cast<unsigned int>((aFrameRect.origin.x + aFrameRect.size.width) - + (aContentRect.origin.x + aContentRect.size.width)); - maGeometry.nWidth = static_cast<unsigned int>(aContentRect.size.width); - maGeometry.nHeight = static_cast<unsigned int>(aContentRect.size.height); + maGeometry.nTopDecoration = static_cast<unsigned int>(aContentRect.origin.y - aFrameRect.origin.y); + maGeometry.nBottomDecoration = static_cast<unsigned int>((aFrameRect.origin.y + aFrameRect.size.height) - + (aContentRect.origin.y + aContentRect.size.height)); + + maGeometry.nWidth = static_cast<unsigned int>(aContentRect.size.width); + maGeometry.nHeight = static_cast<unsigned int>(aContentRect.size.height); + } } void AquaSalFrame::CaptureMouse( bool bCapture ) |