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(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 { @@ -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 #include #include "qcocoabackingstore.h" +#include "qcocoaglcontext.h" #ifdef QT_COCOA_ENABLE_ACCESSIBILITY_INSPECTOR #include @@ -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;