summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/cocoa')
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm3
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h4
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm31
3 files changed, 35 insertions, 3 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index 4e11f55b0a..d9bb9c60a9 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -113,8 +113,7 @@ void QCocoaGLContext::setActiveWindow(QWindow *window)
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
cocoaWindow->setCurrentContext(this);
- NSView *view = cocoaWindow->contentView();
- [m_context setView:view];
+ [(QNSView *) cocoaWindow->contentView() setQCocoaGLContext:this];
}
void QCocoaGLContext::doneCurrent()
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index 1ee3697858..f93fd86205 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -51,6 +51,7 @@
QT_BEGIN_NAMESPACE
class QCocoaWindow;
class QCocoaBackingStore;
+class QCocoaGLContext;
QT_END_NAMESPACE
@interface QNSView : NSView <NSTextInputClient> {
@@ -66,11 +67,12 @@ QT_END_NAMESPACE
bool m_sendKeyEvent;
QStringList *currentCustomDragTypes;
Qt::KeyboardModifiers currentWheelModifiers;
+ bool m_subscribesForGlobalFrameNotifications;
}
- (id)init;
- (id)initWithQWindow:(QWindow *)window platformWindow:(QCocoaWindow *) platformWindow;
-
+- (void)setQCocoaGLContext:(QCocoaGLContext *)context;
- (void)flushBackingStore:(QCocoaBackingStore *)backingStore region:(const QRegion &)region offset:(QPoint)offset;
- (void)setMaskRegion:(const QRegion *)region;
- (void)drawRect:(NSRect)dirtyRect;
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;