diff options
Diffstat (limited to 'src/plugins/platforms/windows')
25 files changed, 121 insertions, 88 deletions
diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp index 17ee6eb82c..6f2a601c50 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp +++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.cpp @@ -51,7 +51,7 @@ #include <QtCore/qsettings.h> #include <QtGui/qaccessible.h> #include <QtGui/qaccessible2.h> -#include <QtGui/qplatformnativeinterface_qpa.h> +#include <qpa/qplatformnativeinterface.h> #include <QtGui/qwindow.h> #include <QtGui/qguiapplication.h> diff --git a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.h b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.h index 3366c32daa..67aaa5b993 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsaccessibility.h +++ b/src/plugins/platforms/windows/accessible/qwindowsaccessibility.h @@ -44,7 +44,7 @@ #include "../qtwindowsglobal.h" #include "../qwindowscontext.h" -#include <QtGui/QPlatformAccessibility> +#include <qpa/qplatformaccessibility.h> #include <oleacc.h> diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp index 5003d9effd..fafe624e4b 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp +++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.cpp @@ -56,7 +56,7 @@ #include <QtGui/qaccessible.h> #include <QtGui/qaccessible2.h> #include <QtGui/qguiapplication.h> -#include <QtGui/qplatformnativeinterface_qpa.h> +#include <qpa/qplatformnativeinterface.h> #include <QtGui/qwindow.h> #include <QtWidgets/qapplication.h> #include <QtWidgets/qgraphicsitem.h> diff --git a/src/plugins/platforms/windows/main.cpp b/src/plugins/platforms/windows/main.cpp index 9f6ce99836..5404d91679 100644 --- a/src/plugins/platforms/windows/main.cpp +++ b/src/plugins/platforms/windows/main.cpp @@ -40,7 +40,7 @@ ****************************************************************************/ -#include <QtGui/QPlatformIntegrationPlugin> +#include <qpa/qplatformintegrationplugin.h> #include <QtCore/QStringList> #include "qwindowsintegration.h" diff --git a/src/plugins/platforms/windows/qwindowsbackingstore.h b/src/plugins/platforms/windows/qwindowsbackingstore.h index 14ce6c3438..75b6e5f736 100644 --- a/src/plugins/platforms/windows/qwindowsbackingstore.h +++ b/src/plugins/platforms/windows/qwindowsbackingstore.h @@ -44,7 +44,7 @@ #include "qtwindows_additional.h" -#include <QtGui/QPlatformBackingStore> +#include <qpa/qplatformbackingstore.h> #include <QtCore/QScopedPointer> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsclipboard.h b/src/plugins/platforms/windows/qwindowsclipboard.h index 643c785e8b..00c975eae6 100644 --- a/src/plugins/platforms/windows/qwindowsclipboard.h +++ b/src/plugins/platforms/windows/qwindowsclipboard.h @@ -44,7 +44,7 @@ #include "qwindowsinternalmimedata.h" -#include <QtGui/QPlatformClipboard> +#include <qpa/qplatformclipboard.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 6913bc8dd4..3a2113520d 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -55,7 +55,7 @@ #include <QtGui/QWindow> #include <QtGui/QWindowSystemInterface> -#include <QtGui/QPlatformNativeInterface> +#include <qpa/qplatformnativeinterface.h> #include <QtGui/QGuiApplication> #include <QtCore/QSet> @@ -595,37 +595,39 @@ QByteArray QWindowsContext::comErrorString(HRESULT hr) { switch (hr) { case S_OK: - return QByteArray("S_OK"); + return QByteArrayLiteral("S_OK"); case S_FALSE: - return QByteArray("S_FALSE"); + return QByteArrayLiteral("S_FALSE"); case E_UNEXPECTED: - return QByteArray("E_UNEXPECTED"); + return QByteArrayLiteral("E_UNEXPECTED"); case CO_E_ALREADYINITIALIZED: - return QByteArray("CO_E_ALREADYINITIALIZED"); + return QByteArrayLiteral("CO_E_ALREADYINITIALIZED"); case CO_E_NOTINITIALIZED: - return QByteArray("CO_E_NOTINITIALIZED"); + return QByteArrayLiteral("CO_E_NOTINITIALIZED"); case RPC_E_CHANGED_MODE: - return QByteArray("RPC_E_CHANGED_MODE"); + return QByteArrayLiteral("RPC_E_CHANGED_MODE"); case OLE_E_WRONGCOMPOBJ: - return QByteArray("OLE_E_WRONGCOMPOBJ"); + return QByteArrayLiteral("OLE_E_WRONGCOMPOBJ"); case CO_E_NOT_SUPPORTED: - return QByteArray("CO_E_NOT_SUPPORTED"); + return QByteArrayLiteral("CO_E_NOT_SUPPORTED"); case E_NOTIMPL: - return QByteArray("E_NOTIMPL"); + return QByteArrayLiteral("E_NOTIMPL"); case E_INVALIDARG: - return QByteArray(""); + return QByteArrayLiteral("E_INVALIDARG"); case E_NOINTERFACE: - return QByteArray(""); + return QByteArrayLiteral("E_NOINTERFACE"); case E_POINTER: - return QByteArray(""); + return QByteArrayLiteral("E_POINTER"); case E_HANDLE: - return QByteArray(""); + return QByteArrayLiteral("E_HANDLE"); case E_ABORT: - return QByteArray(""); + return QByteArrayLiteral("E_ABORT"); case E_FAIL: - return QByteArray(""); - case E_ACCESSDENIED: - return QByteArray(""); + return QByteArrayLiteral("E_FAIL"); + case RPC_E_WRONG_THREAD: + return QByteArrayLiteral("RPC_E_WRONG_THREAD"); + case RPC_E_THREAD_NOT_INIT: + return QByteArrayLiteral("RPC_E_THREAD_NOT_INIT"); default: break; } diff --git a/src/plugins/platforms/windows/qwindowscursor.h b/src/plugins/platforms/windows/qwindowscursor.h index 61c43dc4d2..c1bccde46c 100644 --- a/src/plugins/platforms/windows/qwindowscursor.h +++ b/src/plugins/platforms/windows/qwindowscursor.h @@ -44,7 +44,7 @@ #include "qtwindows_additional.h" -#include <QtGui/QPlatformCursor> +#include <qpa/qplatformcursor.h> #include <QtCore/QSharedDataPointer> #include <QtCore/QHash> diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp index 7cd857e3a4..ea47d0abb2 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp @@ -519,29 +519,12 @@ void QWindowsDialogHelperBase<BaseClass>::hide_sys() } template <class BaseClass> -void QWindowsDialogHelperBase<BaseClass>::platformNativeDialogModalHelp() +void QWindowsDialogHelperBase<BaseClass>::exec_sys() { if (QWindowsContext::verboseDialogs) qDebug("%s" , __FUNCTION__); - if (QWindowsNativeDialogBase *nd =nativeDialog()) - nd->metaObject()->invokeMethod(this, - "emitLaunchNativeAppModalPanel", - Qt::QueuedConnection); -} - -template <class BaseClass> -void QWindowsDialogHelperBase<BaseClass>::_q_platformRunNativeAppModalPanel() -{ - if (QWindowsNativeDialogBase *nd =nativeDialog()) - nd->exec(m_ownerWindow); -} - -template <class BaseClass> -QPlatformDialogHelper::DialogCode QWindowsDialogHelperBase<BaseClass>::dialogResultCode_sys() -{ - if (QWindowsNativeDialogBase *nd =nativeDialog()) - return nd->result(); - return QPlatformDialogHelper::Rejected; + if (QWindowsNativeDialogBase *nd = nativeDialog()) + nd->exec(m_ownerWindow); } static inline bool snapToDefaultButtonHint() @@ -1105,6 +1088,13 @@ QWindowsNativeFileDialogBase *QWindowsNativeFileDialogBase::create(QFileDialogOp \class QWindowsFileDialogHelper \brief Helper for native Windows file dialogs + Non-modal dialogs are disabled for now. The functionality is + implemented in principle, however there are failures + when querying the results from a dialog run in another thread. + This could probably be fixed be calling CoInitializeEx() with + the right parameters from each thread. The problem is though + that calls to CoInitialize() occur in several places in Qt. + \ingroup qt-lighthouse-win */ @@ -1112,6 +1102,7 @@ class QWindowsFileDialogHelper : public QWindowsDialogHelperBase<QPlatformFileDi { public: QWindowsFileDialogHelper() {} + virtual bool supportsNonModalDialog() const { return false; } virtual bool defaultNameFilterDisables() const { return true; } @@ -1135,19 +1126,14 @@ QWindowsNativeDialogBase *QWindowsFileDialogHelper::createNativeDialog() QWindowsNativeFileDialogBase *result = QWindowsNativeFileDialogBase::create(options()->acceptMode()); if (!result) return 0; - QObject::connect(result, SIGNAL(accepted()), this, SIGNAL(accept()), - Qt::QueuedConnection); - QObject::connect(result, SIGNAL(rejected()), this, SIGNAL(reject()), - Qt::QueuedConnection); + QObject::connect(result, SIGNAL(accepted()), this, SIGNAL(accept())); + QObject::connect(result, SIGNAL(rejected()), this, SIGNAL(reject())); QObject::connect(result, SIGNAL(directoryEntered(QString)), - this, SIGNAL(directoryEntered(QString)), - Qt::QueuedConnection); + this, SIGNAL(directoryEntered(QString))); QObject::connect(result, SIGNAL(currentChanged(QString)), - this, SIGNAL(currentChanged(QString)), - Qt::QueuedConnection); + this, SIGNAL(currentChanged(QString))); QObject::connect(result, SIGNAL(filterSelected(QString)), - this, SIGNAL(filterSelected(QString)), - Qt::QueuedConnection); + this, SIGNAL(filterSelected(QString))); // Apply settings. const QSharedPointer<QFileDialogOptions> &opts = options(); diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.h b/src/plugins/platforms/windows/qwindowsdialoghelpers.h index 909ce5984e..8a06c35167 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.h +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.h @@ -43,8 +43,8 @@ #define QWINDOWSDIALOGHELPER_H #include "qtwindows_additional.h" -#include <QtGui/QPlatformDialogHelper> -#include <QtGui/QPlatformTheme> +#include <qpa/qplatformdialoghelper.h> +#include <qpa/qplatformtheme.h> #include <QtCore/QStringList> QT_BEGIN_NAMESPACE @@ -66,8 +66,7 @@ class QWindowsDialogHelperBase : public BaseClass { public: - virtual void platformNativeDialogModalHelp(); - virtual void _q_platformRunNativeAppModalPanel(); + virtual void exec_sys(); virtual void deleteNativeDialog_sys(); virtual bool show_sys(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, @@ -75,8 +74,6 @@ public: virtual void hide_sys(); virtual QVariant styleHint(QPlatformDialogHelper::StyleHint) const; - virtual QPlatformDialogHelper::DialogCode dialogResultCode_sys(); - virtual bool supportsNonModalDialog() const { return true; } protected: diff --git a/src/plugins/platforms/windows/qwindowsdrag.h b/src/plugins/platforms/windows/qwindowsdrag.h index 7b629baccc..867093ab60 100644 --- a/src/plugins/platforms/windows/qwindowsdrag.h +++ b/src/plugins/platforms/windows/qwindowsdrag.h @@ -44,7 +44,7 @@ #include "qwindowsinternalmimedata.h" -#include <QtGui/QPlatformDrag> +#include <qpa/qplatformdrag.h> #include <QtGui/QPixmap> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.h b/src/plugins/platforms/windows/qwindowsfontdatabase.h index f442f492aa..6441e79177 100644 --- a/src/plugins/platforms/windows/qwindowsfontdatabase.h +++ b/src/plugins/platforms/windows/qwindowsfontdatabase.h @@ -42,7 +42,7 @@ #ifndef QWINDOWSFONTDATABASE_H #define QWINDOWSFONTDATABASE_H -#include <QtGui/QPlatformFontDatabase> +#include <qpa/qplatformfontdatabase.h> #include <QtCore/QSharedPointer> #include "qtwindows_additional.h" diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp index f4bd3f0c53..e367707ea3 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.cpp +++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp @@ -227,7 +227,7 @@ int QWindowsFontEngine::getGlyphIndexes(const QChar *str, int numChars, QGlyphLa if (symbol) { for (; i < numChars; ++i, ++glyph_pos) { unsigned int uc = getChar(str, i, numChars); - glyphs->glyphs[i] = getTrueTypeGlyphIndex(cmap, uc); + glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, uc); if(!glyphs->glyphs[glyph_pos] && uc < 0x100) glyphs->glyphs[glyph_pos] = getTrueTypeGlyphIndex(cmap, uc + 0xf000); } diff --git a/src/plugins/platforms/windows/qwindowsglcontext.cpp b/src/plugins/platforms/windows/qwindowsglcontext.cpp index f16a0ca73d..607dabc966 100644 --- a/src/plugins/platforms/windows/qwindowsglcontext.cpp +++ b/src/plugins/platforms/windows/qwindowsglcontext.cpp @@ -46,7 +46,7 @@ #include <QtCore/QDebug> #include <QtCore/QSysInfo> #include <QtGui/QGuiApplication> -#include <QtGui/QPlatformNativeInterface> +#include <qpa/qplatformnativeinterface.h> #include <wingdi.h> #include <GL/gl.h> diff --git a/src/plugins/platforms/windows/qwindowsglcontext.h b/src/plugins/platforms/windows/qwindowsglcontext.h index a0489e2d02..b83a57d13a 100644 --- a/src/plugins/platforms/windows/qwindowsglcontext.h +++ b/src/plugins/platforms/windows/qwindowsglcontext.h @@ -45,7 +45,7 @@ #include "array.h" #include "qtwindows_additional.h" -#include <QtGui/QPlatformOpenGLContext> +#include <qpa/qplatformopenglcontext.h> #include <QtGui/QOpenGLContext> #include <QtCore/QSharedPointer> diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.h b/src/plugins/platforms/windows/qwindowsinputcontext.h index 610bad08dd..134dfdbd2e 100644 --- a/src/plugins/platforms/windows/qwindowsinputcontext.h +++ b/src/plugins/platforms/windows/qwindowsinputcontext.h @@ -44,7 +44,7 @@ #include "qtwindows_additional.h" -#include <QtGui/QPlatformInputContext> +#include <qpa/qplatforminputcontext.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index 45f6ecf652..255cf1454c 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -60,7 +60,7 @@ #include "accessible/qwindowsaccessibility.h" #endif -#include <QtGui/QPlatformNativeInterface> +#include <qpa/qplatformnativeinterface.h> #include <QtGui/QWindowSystemInterface> #include <QtGui/QBackingStore> #include <QtGui/private/qpixmap_raster_p.h> @@ -244,8 +244,10 @@ QPlatformWindow *QWindowsIntegration::createPlatformWindow(QWindow *window) cons = QWindowsWindow::WindowData::create(window, requested, window->windowTitle()); if (QWindowsContext::verboseIntegration || QWindowsContext::verboseWindows) qDebug().nospace() - << __FUNCTION__ << ' ' << window << '\n' - << " Requested: " << requested.geometry << " Flags=" + << __FUNCTION__ << '<' << window << '\n' + << " Requested: " << requested.geometry << "frame incl.: " + << QWindowsGeometryHint::positionIncludesFrame(window) + << " Flags=" << QWindowsWindow::debugWindowFlags(requested.flags) << '\n' << " Obtained : " << obtained.geometry << " Margins " << obtained.frame << " Flags=" @@ -255,8 +257,6 @@ QPlatformWindow *QWindowsIntegration::createPlatformWindow(QWindow *window) cons return 0; if (requested.flags != obtained.flags) window->setWindowFlags(obtained.flags); - if (requested.geometry != obtained.geometry) - QWindowSystemInterface::handleGeometryChange(window, obtained.geometry); return new QWindowsWindow(window, obtained); } diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h index 84bbf6103a..76393be402 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.h +++ b/src/plugins/platforms/windows/qwindowsintegration.h @@ -42,7 +42,7 @@ #ifndef QWINDOWSINTEGRATION_H #define QWINDOWSINTEGRATION_H -#include <QtGui/QPlatformIntegration> +#include <qpa/qplatformintegration.h> #include <QtCore/QScopedPointer> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp index 2476e15169..cc694fe0ea 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.cpp +++ b/src/plugins/platforms/windows/qwindowsscreen.cpp @@ -59,7 +59,8 @@ QT_BEGIN_NAMESPACE QWindowsScreenData::QWindowsScreenData() : dpi(96, 96), depth(32), format(QImage::Format_ARGB32_Premultiplied), - flags(VirtualDesktop), orientation(Qt::LandscapeOrientation) + flags(VirtualDesktop), orientation(Qt::LandscapeOrientation), + refreshRateHz(60) { } @@ -103,6 +104,9 @@ BOOL QT_WIN_CALLBACK monitorEnumCallback(HMONITOR hMonitor, HDC, LPRECT, LPARAM data.depth = GetDeviceCaps(hdc, BITSPIXEL); data.format = data.depth == 16 ? QImage::Format_RGB16 : QImage::Format_RGB32; data.physicalSizeMM = QSizeF(GetDeviceCaps(hdc, HORZSIZE), GetDeviceCaps(hdc, VERTSIZE)); + const int refreshRate = GetDeviceCaps(hdc, VREFRESH); + if (refreshRate > 1) // 0,1 means heardware default. + data.refreshRateHz = refreshRate; DeleteDC(hdc); } else { qWarning("%s: Unable to obtain handle for monitor '%s', defaulting to %g DPI.", diff --git a/src/plugins/platforms/windows/qwindowsscreen.h b/src/plugins/platforms/windows/qwindowsscreen.h index 5b9a50b2ab..615d4faf15 100644 --- a/src/plugins/platforms/windows/qwindowsscreen.h +++ b/src/plugins/platforms/windows/qwindowsscreen.h @@ -47,7 +47,7 @@ #include <QtCore/QList> #include <QtCore/QPair> #include <QtCore/QSharedPointer> -#include <QtGui/QPlatformScreen> +#include <qpa/qplatformscreen.h> QT_BEGIN_NAMESPACE @@ -70,6 +70,7 @@ struct QWindowsScreenData unsigned flags; QString name; Qt::ScreenOrientation orientation; + qreal refreshRateHz; }; class QWindowsScreen : public QPlatformScreen @@ -87,6 +88,7 @@ public: virtual QImage::Format format() const { return m_data.format; } virtual QSizeF physicalSize() const { return m_data.physicalSizeMM; } virtual QDpi logicalDpi() const { return m_data.dpi; } + virtual qreal refreshRate() const { return m_data.refreshRateHz; } virtual QString name() const { return m_data.name; } virtual Qt::ScreenOrientation primaryOrientation() { return m_data.orientation; } virtual QList<QPlatformScreen *> virtualSiblings() const; diff --git a/src/plugins/platforms/windows/qwindowsservices.h b/src/plugins/platforms/windows/qwindowsservices.h index d979ed1af1..c9954b5257 100644 --- a/src/plugins/platforms/windows/qwindowsservices.h +++ b/src/plugins/platforms/windows/qwindowsservices.h @@ -42,7 +42,7 @@ #ifndef QWINDOWSDESKTOPSERVICES_H #define QWINDOWSDESKTOPSERVICES_H -#include <QtGui/qplatformservices_qpa.h> +#include <qpa/qplatformservices.h> QT_BEGIN_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index 000311a807..63ed20eeef 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -296,6 +296,22 @@ static inline QStringList styleNames() return result; } +static inline int uiEffects() +{ + int result = 0; + if (booleanSystemParametersInfo(SPI_GETUIEFFECTS, false)) + result |= QPlatformTheme::GeneralUiEffect; + if (booleanSystemParametersInfo(SPI_GETMENUANIMATION, false)) + result |= QPlatformTheme::AnimateMenuUiEffect; + if (booleanSystemParametersInfo(SPI_GETMENUFADE, false)) + result |= QPlatformTheme::FadeMenuUiEffect; + if (booleanSystemParametersInfo(SPI_GETCOMBOBOXANIMATION, false)) + result |= QPlatformTheme::AnimateComboUiEffect; + if (booleanSystemParametersInfo(SPI_GETTOOLTIPANIMATION, false)) + result |= QPlatformTheme::AnimateTooltipUiEffect; + return result; +} + QVariant QWindowsTheme::themeHint(ThemeHint hint) const { switch (hint) { @@ -315,6 +331,8 @@ QVariant QWindowsTheme::themeHint(ThemeHint hint) const return QVariant(qRound(qreal(QWindowsContext::instance()->defaultDPI()) * 1.375)); case KeyboardScheme: return QVariant(int(WindowsKeyboardScheme)); + case UiEffects: + return QVariant(uiEffects()); default: break; } diff --git a/src/plugins/platforms/windows/qwindowstheme.h b/src/plugins/platforms/windows/qwindowstheme.h index 7515a13a72..223a98caf5 100644 --- a/src/plugins/platforms/windows/qwindowstheme.h +++ b/src/plugins/platforms/windows/qwindowstheme.h @@ -42,7 +42,7 @@ #ifndef QWINDOWSTHEME_H #define QWINDOWSTHEME_H -#include <QtGui/QPlatformTheme> +#include <qpa/qplatformtheme.h> #include <QtGui/QColor> #include "qtwindows_additional.h" diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 87980487b7..c300f0f5a9 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -542,6 +542,12 @@ void QWindowsGeometryHint::applyToMinMaxInfo(DWORD style, DWORD exStyle, MINMAXI << " out " << *mmi; } +bool QWindowsGeometryHint::positionIncludesFrame(const QWindow *w) +{ + return qt_window_private(const_cast<QWindow *>(w))->positionPolicy + == QWindowPrivate::WindowFrameInclusive; +} + /*! \class QWindowCreationContext \brief Active Context for creating windows. @@ -576,17 +582,24 @@ QWindowCreationContext::QWindowCreationContext(const QWindow *w, // CW_USEDEFAULT unless set. For now, assume that 0,0 means 'default' // for toplevels. if (geometry.isValid()) { - if (!w->isTopLevel() || geometry.y() >= margins.top()) { - frameX = geometry.x() - margins.left(); - frameY = geometry.y() - margins.top(); + frameX = geometry.x(); + frameY = geometry.y(); + frameWidth = margins.left() + geometry.width() + margins.right(); + frameHeight = margins.top() + geometry.height() + margins.bottom(); + const bool isDefaultPosition = !frameX && !frameY && w->isTopLevel(); + if (!QWindowsGeometryHint::positionIncludesFrame(w) && !isDefaultPosition) { + frameX -= margins.left(); + frameY -= margins.top(); } - frameWidth = geometry.width() + margins.left() + margins.right(); - frameHeight = geometry.height() + margins.top() + margins.bottom(); } if (QWindowsContext::verboseWindows) qDebug().nospace() - << __FUNCTION__ << ' ' << w << " min" << geometryHint.minimumSize - << " min" << geometryHint.maximumSize; + << __FUNCTION__ << ' ' << w << geometry + << " pos incl. frame" << QWindowsGeometryHint::positionIncludesFrame(w) + << " frame: " << frameWidth << 'x' << frameHeight << '+' + << frameX << '+' << frameY + << " min" << geometryHint.minimumSize + << " max" << geometryHint.maximumSize; } /*! @@ -819,7 +832,7 @@ void QWindowsWindow::setGeometry(const QRect &rectIn) QRect rect = rectIn; // This means it is a call from QWindow::setFramePos() and // the coordinates include the frame (size is still the contents rectangle). - if (qt_window_private(window())->positionPolicy == QWindowPrivate::WindowFrameInclusive) { + if (QWindowsGeometryHint::positionIncludesFrame(window())) { const QMargins margins = frameMargins(); rect.moveTopLeft(rect.topLeft() + QPoint(margins.left(), margins.top())); } @@ -1004,21 +1017,30 @@ Qt::WindowFlags QWindowsWindow::setWindowFlags(Qt::WindowFlags flags) qDebug() << '>' << __FUNCTION__ << this << window() << "\n from: " << QWindowsWindow::debugWindowFlags(m_data.flags) << "\n to: " << QWindowsWindow::debugWindowFlags(flags); + const QRect oldGeometry = geometry(); if (m_data.flags != flags) { m_data.flags = flags; if (m_data.hwnd) m_data = setWindowFlags_sys(flags); } + // When switching to a frameless window, geometry + // may change without a WM_MOVE. Report change manually. + // Do not send synchronously as not to clobber the widget + // geometry in a sequence of setting flags and geometry. + const QRect newGeometry = geometry_sys(); + if (oldGeometry != newGeometry) + handleGeometryChange(); + if (QWindowsContext::verboseWindows) qDebug() << '<' << __FUNCTION__ << "\n returns: " - << QWindowsWindow::debugWindowFlags(m_data.flags); + << QWindowsWindow::debugWindowFlags(m_data.flags) + << " geometry " << oldGeometry << "->" << newGeometry; return m_data.flags; } QWindowsWindow::WindowData QWindowsWindow::setWindowFlags_sys(Qt::WindowFlags wt, unsigned flags) const { - // Geometry changes have not been observed here. Frames change, though. WindowCreationData creationData; creationData.fromWindow(window(), wt, flags); creationData.applyWindowFlags(m_data.hwnd); diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index badc229718..64fd78d1ce 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -45,7 +45,7 @@ #include "qtwindows_additional.h" #include "qwindowscursor.h" -#include <QtGui/QPlatformWindow> +#include <qpa/qplatformwindow.h> QT_BEGIN_NAMESPACE @@ -66,6 +66,8 @@ struct QWindowsGeometryHint static inline QPoint mapFromGlobal(const HWND hwnd, const QPoint &); static inline QPoint mapFromGlobal(const QWindow *w, const QPoint &); + static bool positionIncludesFrame(const QWindow *w); + QSize minimumSize; QSize maximumSize; }; |