summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2013-12-23 22:44:13 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-23 22:44:13 +0100
commitd776937df91e46536f404c6868d64016b6038d7b (patch)
treedde5a5ab39d27a5b0bc3327127c7d6dd1b1ae5f8 /src/plugins
parente14503d353de7246a1d6e36894dd77bb32c4af3b (diff)
parent3f3be55835427ea9f1bbcc046e05ee538ca214d7 (diff)
Merge "Merge remote-tracking branch 'origin/stable' into dev" into refs/staging/dev
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm42
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm6
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.h1
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.mm11
-rw-r--r--src/plugins/platforms/eglfs/qeglfsintegration.cpp5
-rw-r--r--src/plugins/platforms/eglfs/qeglfsintegration.h1
-rw-r--r--src/plugins/platforms/ios/qioseventdispatcher.mm7
-rw-r--r--src/plugins/platforms/ios/qiosglobal.h1
-rw-r--r--src/plugins/platforms/ios/qiosglobal.mm7
-rw-r--r--src/plugins/platforms/ios/qiosinputcontext.mm2
-rw-r--r--src/plugins/platforms/ios/qiosintegration.h2
-rw-r--r--src/plugins/platforms/ios/qiosviewcontroller.mm9
-rw-r--r--src/plugins/platforms/ios/qioswindow.h2
-rw-r--r--src/plugins/platforms/ios/qioswindow.mm31
-rw-r--r--src/plugins/platforms/windows/qwindowsglcontext.cpp14
-rw-r--r--src/plugins/platforms/windows/qwindowstheme.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp29
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.h3
-rw-r--r--src/plugins/platforms/xcb/xcb-plugin.pro2
22 files changed, 141 insertions, 44 deletions
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index 8af90b13bf..4b637a707d 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -192,8 +192,6 @@ bool QCocoaGLContext::makeCurrent(QPlatformSurface *surface)
QWindow *window = static_cast<QCocoaWindow *>(surface)->window();
setActiveWindow(window);
- if (![m_context view])
- return false;
[m_context makeCurrentContext];
update();
return true;
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 4f5a208f43..c7ec315f04 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -159,8 +159,10 @@ public:
void registerTouch(bool enable);
qreal devicePixelRatio() const;
+ bool isWindowExposable();
void exposeWindow();
void obscureWindow();
+ void updateExposedGeometry();
QWindow *childWindowAt(QPoint windowPoint);
protected:
// NSWindow handling. The QCocoaWindow/QNSView can either be displayed
@@ -202,7 +204,9 @@ public: // for QNSView
bool m_hasModalSession;
bool m_frameStrutEventsEnabled;
+ bool m_geometryUpdateExposeAllowed;
bool m_isExposed;
+ QRect m_exposedGeometry;
int m_registerTouchCount;
bool m_resizableTransientParent;
bool m_overrideBecomeKey;
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 1aace958ed..a2ef43db67 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -213,6 +213,7 @@ QCocoaWindow::QCocoaWindow(QWindow *tlw)
, m_windowCursor(0)
, m_hasModalSession(false)
, m_frameStrutEventsEnabled(false)
+ , m_geometryUpdateExposeAllowed(false)
, m_isExposed(false)
, m_registerTouchCount(0)
, m_resizableTransientParent(false)
@@ -1084,22 +1085,61 @@ qreal QCocoaWindow::devicePixelRatio() const
}
}
+// Returns whether the window can be expose, which it can
+// if it is on screen and has a valid geometry.
+bool QCocoaWindow::isWindowExposable()
+{
+ QSize size = geometry().size();
+ bool validGeometry = (size.width() > 0 && size.height() > 0);
+ bool validScreen = ([[m_contentView window] screen] != 0);
+ bool nonHiddenSuperView = ![[m_contentView superview] isHidden];
+ return (validGeometry && validScreen && nonHiddenSuperView);
+}
+
+// Exposes the window by posting an expose event to QWindowSystemInterface
void QCocoaWindow::exposeWindow()
{
- if (!m_isExposed && ![[m_contentView superview] isHidden]) {
+ m_geometryUpdateExposeAllowed = true;
+
+ if (!isWindowExposable())
+ return;
+
+ if (!m_isExposed) {
m_isExposed = true;
+ m_exposedGeometry = geometry();
QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
}
}
+// Obscures the window by posting an empty expose event to QWindowSystemInterface
void QCocoaWindow::obscureWindow()
{
if (m_isExposed) {
+ m_geometryUpdateExposeAllowed = false;
m_isExposed = false;
QWindowSystemInterface::handleExposeEvent(window(), QRegion());
}
}
+// Updates window geometry by posting an expose event to QWindowSystemInterface
+void QCocoaWindow::updateExposedGeometry()
+{
+ // updateExposedGeometry is not allowed to send the initial expose. If you want
+ // that call exposeWindow();
+ if (!m_geometryUpdateExposeAllowed)
+ return;
+
+ if (!isWindowExposable())
+ return;
+
+ if (m_exposedGeometry == geometry())
+ return;
+
+ m_isExposed = true;
+ m_exposedGeometry = geometry();
+ QWindowSystemInterface::handleExposeEvent(window(), QRegion(geometry()));
+}
+
QWindow *QCocoaWindow::childWindowAt(QPoint windowPoint)
{
QWindow *targetWindow = window();
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index ca2a15a1cc..403f8dc78a 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -93,6 +93,8 @@ QT_END_NAMESPACE
- (BOOL)hasMask;
- (BOOL)isOpaque;
+- (void)convertFromScreen:(NSPoint)mouseLocation toWindowPoint:(QPointF *)qtWindowPoint andScreenPoint:(QPointF *)qtScreenPoint;
+
- (void)resetMouseButtons;
- (void)handleMouseEvent:(NSEvent *)theEvent;
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 71c4de3b69..1c15c3b561 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -175,7 +175,7 @@ static QTouchDevice *touchDevice = 0;
- (void) globalFrameChanged:(NSNotification*)notification
{
Q_UNUSED(notification);
- QWindowSystemInterface::handleExposeEvent(m_window, m_window->geometry());
+ m_platformWindow->updateExposedGeometry();
}
- (void)viewDidMoveToSuperview
@@ -186,7 +186,7 @@ static QTouchDevice *touchDevice = 0;
if ([self superview]) {
m_platformWindow->m_contentViewIsEmbedded = true;
QWindowSystemInterface::handleGeometryChange(m_window, m_platformWindow->geometry());
- QWindowSystemInterface::handleExposeEvent(m_window, m_platformWindow->geometry());
+ m_platformWindow->updateExposedGeometry();
QWindowSystemInterface::flushWindowSystemEvents();
} else {
m_platformWindow->m_contentViewIsEmbedded = false;
@@ -261,7 +261,7 @@ static QTouchDevice *touchDevice = 0;
// Send a geometry change event to Qt, if it's ready to handle events
if (!m_platformWindow->m_inConstructor) {
QWindowSystemInterface::handleGeometryChange(m_window, geometry);
- QWindowSystemInterface::handleExposeEvent(m_window, geometry);
+ m_platformWindow->updateExposedGeometry();
QWindowSystemInterface::flushWindowSystemEvents();
}
}
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.h b/src/plugins/platforms/cocoa/qnswindowdelegate.h
index 06e11fffbb..5717551cc3 100644
--- a/src/plugins/platforms/cocoa/qnswindowdelegate.h
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.h
@@ -53,6 +53,7 @@
- (id)initWithQCocoaWindow: (QCocoaWindow *) cocoaWindow;
+- (void)windowDidBecomeKey:(NSNotification *)notification;
- (void)windowDidResize:(NSNotification *)notification;
- (void)windowDidMove:(NSNotification *)notification;
- (void)windowWillMove:(NSNotification *)notification;
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.mm b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
index 10536bd5f4..c9b3d69381 100644
--- a/src/plugins/platforms/cocoa/qnswindowdelegate.mm
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.mm
@@ -56,6 +56,17 @@
return self;
}
+- (void)windowDidBecomeKey:(NSNotification *)notification
+{
+ Q_UNUSED(notification);
+ if (m_cocoaWindow->m_windowUnderMouse) {
+ QPointF windowPoint;
+ QPointF screenPoint;
+ [m_cocoaWindow->m_qtView convertFromScreen:[NSEvent mouseLocation] toWindowPoint:&windowPoint andScreenPoint:&screenPoint];
+ QWindowSystemInterface::handleEnterEvent(m_cocoaWindow->m_enterLeaveTargetWindow, windowPoint, screenPoint);
+ }
+}
+
- (void)windowDidResize:(NSNotification *)notification
{
Q_UNUSED(notification);
diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.cpp b/src/plugins/platforms/eglfs/qeglfsintegration.cpp
index 55a822b887..d6832493f1 100644
--- a/src/plugins/platforms/eglfs/qeglfsintegration.cpp
+++ b/src/plugins/platforms/eglfs/qeglfsintegration.cpp
@@ -87,6 +87,8 @@ QEglFSIntegration::QEglFSIntegration()
, mScreen(0)
, mInputContext(0)
{
+ mDisableInputHandlers = qgetenv("QT_QPA_EGLFS_DISABLE_INPUT").toInt();
+
initResources();
}
@@ -176,7 +178,8 @@ void QEglFSIntegration::initialize()
mInputContext = QPlatformInputContextFactory::create();
- createInputHandlers();
+ if (!mDisableInputHandlers)
+ createInputHandlers();
}
QEglFSScreen *QEglFSIntegration::createScreen() const
diff --git a/src/plugins/platforms/eglfs/qeglfsintegration.h b/src/plugins/platforms/eglfs/qeglfsintegration.h
index f685eec2d4..12c8158bd1 100644
--- a/src/plugins/platforms/eglfs/qeglfsintegration.h
+++ b/src/plugins/platforms/eglfs/qeglfsintegration.h
@@ -97,6 +97,7 @@ private:
QScopedPointer<QPlatformServices> mServices;
QEglFSScreen *mScreen;
QPlatformInputContext *mInputContext;
+ bool mDisableInputHandlers;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qioseventdispatcher.mm b/src/plugins/platforms/ios/qioseventdispatcher.mm
index 51eb10d385..f93c6cc3a7 100644
--- a/src/plugins/platforms/ios/qioseventdispatcher.mm
+++ b/src/plugins/platforms/ios/qioseventdispatcher.mm
@@ -206,13 +206,6 @@ namespace
bool debugStackUsage = false;
}
-static int infoPlistValue(NSString* key, int defaultValue)
-{
- static NSBundle *bundle = [NSBundle mainBundle];
- NSNumber* value = [bundle objectForInfoDictionaryKey:key];
- return value ? [value intValue] : defaultValue;
-}
-
extern "C" int __attribute__((weak)) main(int argc, char *argv[])
{
@autoreleasepool {
diff --git a/src/plugins/platforms/ios/qiosglobal.h b/src/plugins/platforms/ios/qiosglobal.h
index 1c76d29389..17184dc21d 100644
--- a/src/plugins/platforms/ios/qiosglobal.h
+++ b/src/plugins/platforms/ios/qiosglobal.h
@@ -61,6 +61,7 @@ QPointF fromCGPoint(const CGPoint &point);
Qt::ScreenOrientation toQtScreenOrientation(UIDeviceOrientation uiDeviceOrientation);
UIDeviceOrientation fromQtScreenOrientation(Qt::ScreenOrientation qtOrientation);
QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen);
+int infoPlistValue(NSString* key, int defaultValue);
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosglobal.mm b/src/plugins/platforms/ios/qiosglobal.mm
index d749b8f514..8dd690f301 100644
--- a/src/plugins/platforms/ios/qiosglobal.mm
+++ b/src/plugins/platforms/ios/qiosglobal.mm
@@ -134,5 +134,12 @@ QRect fromPortraitToPrimary(const QRect &rect, QPlatformScreen *screen)
: QRect(rect.y(), geometry.height() - rect.width() - rect.x(), rect.height(), rect.width());
}
+int infoPlistValue(NSString* key, int defaultValue)
+{
+ static NSBundle *bundle = [NSBundle mainBundle];
+ NSNumber* value = [bundle objectForInfoDictionaryKey:key];
+ return value ? [value intValue] : defaultValue;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/ios/qiosinputcontext.mm b/src/plugins/platforms/ios/qiosinputcontext.mm
index 0e43429015..ea6a0bd4a6 100644
--- a/src/plugins/platforms/ios/qiosinputcontext.mm
+++ b/src/plugins/platforms/ios/qiosinputcontext.mm
@@ -270,7 +270,7 @@ void QIOSInputContext::scrollRootView()
&& m_keyboardListener->m_keyboardVisibleAndDocked
&& m_focusView.window == view.window) {
QRectF cursorRect = qGuiApp->inputMethod()->cursorRectangle();
- cursorRect.translate(qGuiApp->focusWindow()->geometry().topLeft());
+ cursorRect.translate(m_focusView.qwindow->geometry().topLeft());
qreal keyboardY = m_keyboardListener->m_keyboardEndRect.y();
int statusBarY = qGuiApp->primaryScreen()->availableGeometry().y();
const int margin = 20;
diff --git a/src/plugins/platforms/ios/qiosintegration.h b/src/plugins/platforms/ios/qiosintegration.h
index c655d8d3bf..fdecf70725 100644
--- a/src/plugins/platforms/ios/qiosintegration.h
+++ b/src/plugins/platforms/ios/qiosintegration.h
@@ -74,6 +74,8 @@ public:
QStringList themeNames() const;
QPlatformTheme *createPlatformTheme(const QString &name) const;
+ QPlatformDrag *drag() const Q_DECL_OVERRIDE { return 0; }
+
QAbstractEventDispatcher *createEventDispatcher() const;
QPlatformNativeInterface *nativeInterface() const;
diff --git a/src/plugins/platforms/ios/qiosviewcontroller.mm b/src/plugins/platforms/ios/qiosviewcontroller.mm
index 2e7e44d32c..0a6a00b753 100644
--- a/src/plugins/platforms/ios/qiosviewcontroller.mm
+++ b/src/plugins/platforms/ios/qiosviewcontroller.mm
@@ -101,12 +101,15 @@
- (BOOL)prefersStatusBarHidden
{
+ static bool hiddenFromPlist = infoPlistValue(@"UIStatusBarHidden", false);
+ if (hiddenFromPlist)
+ return YES;
QWindow *focusWindow = QGuiApplication::focusWindow();
- if (!focusWindow)
+ if (!focusWindow || !focusWindow->handle())
return [UIApplication sharedApplication].statusBarHidden;
- QIOSWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow();
- return topLevel->window()->windowState() == Qt::WindowFullScreen;
+ QWindow *topLevel = static_cast<QIOSWindow *>(focusWindow->handle())->topLevelWindow();
+ return topLevel->windowState() == Qt::WindowFullScreen;
}
@end
diff --git a/src/plugins/platforms/ios/qioswindow.h b/src/plugins/platforms/ios/qioswindow.h
index d36a81180c..8a5eb589d2 100644
--- a/src/plugins/platforms/ios/qioswindow.h
+++ b/src/plugins/platforms/ios/qioswindow.h
@@ -87,7 +87,7 @@ public:
WId winId() const { return WId(m_view); };
- QIOSWindow *topLevelWindow() const;
+ QWindow *topLevelWindow() const;
private:
void applyGeometry(const QRect &rect);
diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm
index 7ab136e8b9..7a0ff055ec 100644
--- a/src/plugins/platforms/ios/qioswindow.mm
+++ b/src/plugins/platforms/ios/qioswindow.mm
@@ -108,8 +108,6 @@
[NSNumber numberWithBool:YES], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
- [self updateTextInputTraits];
-
if (isQtApplication())
self.hidden = YES;
@@ -206,11 +204,12 @@
- (void)displayLayer:(CALayer *)layer
{
- QRect geometry = fromCGRect(layer.frame).toRect();
- Q_ASSERT(m_qioswindow->geometry() == geometry);
+ QSize bounds = fromCGRect(layer.bounds).toRect().size();
+
+ Q_ASSERT(m_qioswindow->geometry().size() == bounds);
Q_ASSERT(self.hidden == !m_qioswindow->window()->isVisible());
- QRegion region = self.hidden ? QRegion() : QRect(QPoint(), geometry.size());
+ QRegion region = self.hidden ? QRegion() : QRect(QPoint(), bounds);
QWindowSystemInterface::handleExposeEvent(m_qioswindow->window(), region);
QWindowSystemInterface::flushWindowSystemEvents();
}
@@ -330,13 +329,9 @@
- (BOOL)becomeFirstResponder
{
- // On iOS, a QWindow should only have input focus when the input panel is
- // open. This is to stop cursors and focus rects from being drawn when the
- // user cannot type. And since the keyboard will open when a view becomes
- // the first responder, it's now a good time to inform QPA that the QWindow
- // this view backs became active:
+ // Note: QIOSInputContext controls our first responder status based on
+ // whether or not the keyboard should be open or closed.
[self updateTextInputTraits];
- QWindowSystemInterface::handleWindowActivated(m_qioswindow->window());
return [super becomeFirstResponder];
}
@@ -345,7 +340,8 @@
// Resigning first responed status means that the virtual keyboard was closed, or
// some other view became first responder. In either case we clear the focus object to
// avoid blinking cursors in line edits etc:
- static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject();
+ if (m_qioswindow)
+ static_cast<QWindowPrivate *>(QObjectPrivate::get(m_qioswindow->window()))->clearFocusObject();
return [super resignFirstResponder];
}
@@ -427,8 +423,10 @@
- (QWindow *)qwindow
{
- if ([self isKindOfClass:[QUIView class]])
- return static_cast<QUIView *>(self)->m_qioswindow->window();
+ if ([self isKindOfClass:[QUIView class]]) {
+ if (QIOSWindow *w = static_cast<QUIView *>(self)->m_qioswindow)
+ return w->window();
+ }
return nil;
}
@@ -473,6 +471,7 @@ QIOSWindow::~QIOSWindow()
// cancellation of all touch events.
[m_view touchesCancelled:0 withEvent:0];
+ m_view->m_qioswindow = 0;
[m_view removeFromSuperview];
[m_view release];
}
@@ -637,7 +636,7 @@ void QIOSWindow::setParent(const QPlatformWindow *parentWindow)
}
}
-QIOSWindow *QIOSWindow::topLevelWindow() const
+QWindow *QIOSWindow::topLevelWindow() const
{
QWindow *window = this->window();
while (window) {
@@ -651,7 +650,7 @@ QIOSWindow *QIOSWindow::topLevelWindow() const
window = parent;
}
- return static_cast<QIOSWindow *>(window->handle());
+ return window;
}
void QIOSWindow::requestActivateWindow()
diff --git a/src/plugins/platforms/windows/qwindowsglcontext.cpp b/src/plugins/platforms/windows/qwindowsglcontext.cpp
index d63149e4ce..281f54a9d9 100644
--- a/src/plugins/platforms/windows/qwindowsglcontext.cpp
+++ b/src/plugins/platforms/windows/qwindowsglcontext.cpp
@@ -586,15 +586,17 @@ static HGLRC createContext(const QOpenGLStaticContext &staticContext,
attributes[attribIndex++] = WGL_CONTEXT_MINOR_VERSION_ARB;
attributes[attribIndex++] = minorVersion;
}
+
+ int flags = 0;
+ if (format.testOption(QSurfaceFormat::DebugContext))
+ flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
if (requestedVersion >= 0x0300) {
- attributes[attribIndex++] = WGL_CONTEXT_FLAGS_ARB;
- attributes[attribIndex] = 0;
if (!format.testOption(QSurfaceFormat::DeprecatedFunctions))
- attributes[attribIndex] |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
- if (format.testOption(QSurfaceFormat::DebugContext))
- attributes[attribIndex] |= WGL_CONTEXT_DEBUG_BIT_ARB;
- attribIndex++;
+ flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
}
+ attributes[attribIndex++] = WGL_CONTEXT_FLAGS_ARB;
+ attributes[attribIndex++] = flags;
+
if (requestedVersion >= 0x0302) {
switch (format.profile()) {
case QSurfaceFormat::NoProfile:
diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp
index eb1bbd1ab0..00a5da8f44 100644
--- a/src/plugins/platforms/windows/qwindowstheme.cpp
+++ b/src/plugins/platforms/windows/qwindowstheme.cpp
@@ -383,6 +383,8 @@ QVariant QWindowsTheme::themeHint(ThemeHint hint) const
}
case DialogSnapToDefaultButton:
return QVariant(booleanSystemParametersInfo(SPI_GETSNAPTODEFBUTTON, false));
+ case ContextMenuOnMouseRelease:
+ return QVariant(true);
default:
break;
}
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 006a2802c1..d1d50eee73 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -1170,8 +1170,13 @@ void QWindowsWindow::show_sys() const
if (type == Qt::Popup || type == Qt::ToolTip || type == Qt::Tool)
sm = SW_SHOWNOACTIVATE;
+ if (w->windowState() & Qt::WindowMaximized)
+ setFlag(WithinMaximize); // QTBUG-8361
+
ShowWindow(m_data.hwnd, sm);
+ clearFlag(WithinMaximize);
+
if (fakedMaximize) {
setStyle(style() & ~WS_MAXIMIZEBOX);
SetWindowPos(m_data.hwnd, 0, 0, 0, 0, 0,
@@ -1582,8 +1587,11 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
setFlag(FrameDirty);
if ((oldState == Qt::WindowMaximized) != (newState == Qt::WindowMaximized)) {
- if (visible && !(newState == Qt::WindowMinimized))
+ if (visible && !(newState == Qt::WindowMinimized)) {
+ setFlag(WithinMaximize);
ShowWindow(m_data.hwnd, (newState == Qt::WindowMaximized) ? SW_MAXIMIZE : SW_SHOWNOACTIVATE);
+ clearFlag(WithinMaximize);
+ }
}
if ((oldState == Qt::WindowFullScreen) != (newState == Qt::WindowFullScreen)) {
@@ -1903,6 +1911,25 @@ void QWindowsWindow::getSizeHints(MINMAXINFO *mmi) const
{
const QWindowsGeometryHint hint(window(), m_data.customMargins);
hint.applyToMinMaxInfo(m_data.hwnd, mmi);
+
+ if ((testFlag(WithinMaximize) || (window()->windowState() == Qt::WindowMinimized))
+ && (m_data.flags & Qt::FramelessWindowHint)) {
+ // This block fixes QTBUG-8361: Frameless windows shouldn't cover the
+ // taskbar when maximized
+ if (const QScreen *screen = effectiveScreen(window())) {
+ mmi->ptMaxSize.y = screen->availableGeometry().height();
+
+ // Width, because you can have the taskbar on the sides too.
+ mmi->ptMaxSize.x = screen->availableGeometry().width();
+
+ // If you have the taskbar on top, or on the left you don't want it at (0,0):
+ mmi->ptMaxPosition.x = screen->availableGeometry().x();
+ mmi->ptMaxPosition.y = screen->availableGeometry().y();
+ } else {
+ qWarning() << "Invalid screen";
+ }
+ }
+
if (QWindowsContext::verboseWindows)
qDebug() << __FUNCTION__ << window() << *mmi;
}
diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h
index f055864482..61dc3e2dc2 100644
--- a/src/plugins/platforms/windows/qwindowswindow.h
+++ b/src/plugins/platforms/windows/qwindowswindow.h
@@ -136,7 +136,8 @@ public:
TouchRegistered = 0x4000,
AlertState = 0x8000,
Exposed = 0x10000,
- WithinCreate = 0x20000
+ WithinCreate = 0x20000,
+ WithinMaximize = 0x40000
};
struct WindowData
diff --git a/src/plugins/platforms/xcb/xcb-plugin.pro b/src/plugins/platforms/xcb/xcb-plugin.pro
index 49a1c1b320..8968d020c4 100644
--- a/src/plugins/platforms/xcb/xcb-plugin.pro
+++ b/src/plugins/platforms/xcb/xcb-plugin.pro
@@ -81,7 +81,7 @@ contains(QT_CONFIG, xcb-sm) {
}
contains(QT_CONFIG, opengl) {
- contains(QT_CONFIG, xcb-xlib):contains(QT_CONFIG, glx) {
+ contains(QT_CONFIG, xcb-xlib):!contains(QT_CONFIG, opengles2) {
DEFINES += XCB_USE_GLX
HEADERS += qglxintegration.h
SOURCES += qglxintegration.cpp