summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/cocoa
diff options
context:
space:
mode:
authorRichard Moe Gustavsen <richard.gustavsen@digia.com>2012-11-26 15:47:02 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-11-28 21:09:42 +0100
commitbb38d1b1d527b70aa2ca8d50a6a703d2faa5b8a0 (patch)
tree43e1bcf2c833b74d5fe18f525ba20b1688debd0a /src/plugins/platforms/cocoa
parenta0d379bc9a76dfcce08c69abb30d1fea821fd7d7 (diff)
Cocoa: update OpenGL viewport when nsview moves
NSOpenGLContext expexts an -update call whenever the physical position of the view it draws to changes on screen. Since we don't get geometry callbacks for such views when the parent view moves, we need to register a special notification for that case, and tell Qt that we need to repaint the QWindow that the view is backing. This case does not hit very often, but is evident in MDI applications where the subwindows are OpenGL backed QGraphicsView widgets. Dragging the subwindows around produces garbage inside the windows. Change-Id: I1b162470b03cca6ed722c6c54080459f2c5e91d9 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
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;