summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa/qnsview.mm
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/cocoa/qnsview.mm')
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 68117824db..d2a4685872 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -56,6 +56,7 @@
#include <QtCore/QDebug>
#include <private/qguiapplication_p.h>
#include "qcocoabackingstore.h"
+#include "qcocoaglcontext.h"
#ifdef QT_COCOA_ENABLE_ACCESSIBILITY_INSPECTOR
#include <accessibilityinspector.h>
@@ -81,7 +82,9 @@ static QTouchDevice *touchDevice = 0;
m_window = 0;
m_buttons = Qt::NoButton;
m_sendKeyEvent = false;
+ m_subscribesForGlobalFrameNotifications = false;
currentCustomDragTypes = 0;
+
if (!touchDevice) {
touchDevice = new QTouchDevice;
touchDevice->setType(QTouchDevice::TouchPad);
@@ -99,6 +102,12 @@ static QTouchDevice *touchDevice = 0;
delete[] m_maskData;
m_maskData = 0;
m_window = 0;
+ if (m_subscribesForGlobalFrameNotifications) {
+ m_subscribesForGlobalFrameNotifications = false;
+ [[NSNotificationCenter defaultCenter] removeObserver:self
+ name:NSViewGlobalFrameDidChangeNotification
+ object:self];
+}
[super dealloc];
}
@@ -140,6 +149,28 @@ static QTouchDevice *touchDevice = 0;
return self;
}
+- (void) setQCocoaGLContext:(QCocoaGLContext *)context
+{
+ [context->nsOpenGLContext() setView:self];
+ if (!m_subscribesForGlobalFrameNotifications) {
+ // NSOpenGLContext expects us to repaint (or update) the view when
+ // it changes position on screen. Since this happens unnoticed for
+ // the view when the parent view moves, we need to register a special
+ // notification that lets us handle this case:
+ m_subscribesForGlobalFrameNotifications = true;
+ [[NSNotificationCenter defaultCenter] addObserver:self
+ selector:@selector(globalFrameChanged:)
+ name:NSViewGlobalFrameDidChangeNotification
+ object:self];
+ }
+}
+
+- (void) globalFrameChanged:(NSNotification*)notification
+{
+ Q_UNUSED(notification);
+ QWindowSystemInterface::handleExposeEvent(m_window, m_window->geometry());
+}
+
- (void)updateGeometry
{
QRect geometry;