summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/windows
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/windows')
-rw-r--r--src/plugins/platforms/windows/qwindowsdrag.cpp43
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowsfontengine.cpp15
-rw-r--r--src/plugins/platforms/windows/qwindowsmime.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp28
5 files changed, 56 insertions, 34 deletions
diff --git a/src/plugins/platforms/windows/qwindowsdrag.cpp b/src/plugins/platforms/windows/qwindowsdrag.cpp
index bde9a77e77..2c6e6b9771 100644
--- a/src/plugins/platforms/windows/qwindowsdrag.cpp
+++ b/src/plugins/platforms/windows/qwindowsdrag.cpp
@@ -286,30 +286,33 @@ void QWindowsOleDropSource::createCursors()
const bool hasPixmap = !pixmap.isNull();
// Find screen for drag. Could be obtained from QDrag::source(), but that might be a QWidget.
-
- qreal scaleFactor = 1;
- QPlatformCursor *platformCursor = Q_NULLPTR;
- if (const QPlatformScreen *platformScreen = QWindowsContext::instance()->screenManager().screenAtDp(QWindowsCursor::mousePosition())) {
- scaleFactor = QHighDpiScaling::factor(platformScreen);
- platformCursor = platformScreen->cursor();
+ const QPlatformScreen *platformScreen = QWindowsContext::instance()->screenManager().screenAtDp(QWindowsCursor::mousePosition());
+ if (!platformScreen) {
+ if (const QScreen *primaryScreen = QGuiApplication::primaryScreen())
+ platformScreen = primaryScreen->handle();
+ }
+ Q_ASSERT(platformScreen);
+ QPlatformCursor *platformCursor = platformScreen->cursor();
+
+ qreal pixmapScaleFactor = 1;
+ qreal hotSpotScaleFactor = 1;
+ if (m_mode != TouchDrag) { // Touch drag: pixmap is shown in a separate QWindow, which will be scaled.)
+ hotSpotScaleFactor = QHighDpiScaling::factor(platformScreen);
+ pixmapScaleFactor = hotSpotScaleFactor / pixmap.devicePixelRatio();
}
- if (!platformCursor && QGuiApplication::primaryScreen())
- platformCursor = QGuiApplication::primaryScreen()->handle()->cursor();
-
- const bool scalePixmap = hasPixmap
- && m_mode != TouchDrag // Touch drag: pixmap is shown in a separate QWindow, which will be scaled.
- && (scaleFactor != 1 && scaleFactor != qRound(pixmap.devicePixelRatio()));
- const QPixmap scaledPixmap = scalePixmap
- ? pixmap.scaled((QSizeF(pixmap.size()) * scaleFactor).toSize(),
- Qt::KeepAspectRatio, Qt::SmoothTransformation)
- : pixmap;
+ QPixmap scaledPixmap = qFuzzyCompare(pixmapScaleFactor, 1.0)
+ ? pixmap
+ : pixmap.scaled((QSizeF(pixmap.size()) * pixmapScaleFactor).toSize(),
+ Qt::KeepAspectRatio, Qt::SmoothTransformation);
+ scaledPixmap.setDevicePixelRatio(1);
+
Qt::DropAction actions[] = { Qt::MoveAction, Qt::CopyAction, Qt::LinkAction, Qt::IgnoreAction };
int actionCount = int(sizeof(actions) / sizeof(actions[0]));
if (!hasPixmap)
--actionCount; // No Qt::IgnoreAction unless pixmap
- const QPoint hotSpot = scalePixmap
- ? (QPointF(drag->hotSpot()) * scaleFactor).toPoint()
- : drag->hotSpot();
+ const QPoint hotSpot = qFuzzyCompare(hotSpotScaleFactor, 1.0)
+ ? drag->hotSpot()
+ : (QPointF(drag->hotSpot()) * hotSpotScaleFactor).toPoint();
for (int cnum = 0; cnum < actionCount; ++cnum) {
const Qt::DropAction action = actions[cnum];
QPixmap cursorPixmap = drag->dragCursor(action);
@@ -462,7 +465,7 @@ QWindowsOleDropSource::GiveFeedback(DWORD dwEffect)
if (!m_touchDragWindow)
m_touchDragWindow = new QWindowsDragCursorWindow;
m_touchDragWindow->setPixmap(e.pixmap);
- m_touchDragWindow->setFramePosition(QWindowsCursor::mousePosition() - e.hotSpot);
+ m_touchDragWindow->setFramePosition(QCursor::pos() - e.hotSpot);
if (!m_touchDragWindow->isVisible())
m_touchDragWindow->show();
break;
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
index bfb76dfee7..2d5eb4b4b9 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
@@ -1620,7 +1620,7 @@ LOGFONT QWindowsFontDatabase::fontDefToLOGFONT(const QFontDef &request)
if (fam.isEmpty())
fam = QStringLiteral("MS Sans Serif");
- if ((fam == QStringLiteral("MS Sans Serif"))
+ if (fam == QLatin1String("MS Sans Serif")
&& (request.style == QFont::StyleItalic || (-lf.lfHeight > 18 && -lf.lfHeight != 24))) {
fam = QStringLiteral("Arial"); // MS Sans Serif has bearing problems in italic, and does not scale
}
diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp
index 3411381d4e..ed7fa441b2 100644
--- a/src/plugins/platforms/windows/qwindowsfontengine.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp
@@ -238,17 +238,10 @@ int QWindowsFontEngine::getGlyphIndexes(const QChar *str, int numChars, QGlyphLa
}
} else {
#endif
- wchar_t first = tm.tmFirstChar;
- wchar_t last = tm.tmLastChar;
-
QStringIterator it(str, str + numChars);
while (it.hasNext()) {
const uint uc = it.next();
- if (
-#ifdef Q_DEAD_CODE_FROM_QT4_WINCE
- tm.tmFirstChar > 60000 ||
-#endif
- uc >= first && uc <= last)
+ if (uc >= tm.tmFirstChar && uc <= tm.tmLastChar)
glyphs->glyphs[glyph_pos] = uc;
else
glyphs->glyphs[glyph_pos] = 0;
@@ -358,11 +351,9 @@ glyph_t QWindowsFontEngine::glyphIndex(uint ucs4) const
glyph = getTrueTypeGlyphIndex(cmap, cmapSize, ucs4 + 0xf000);
} else if (ttf) {
glyph = getTrueTypeGlyphIndex(cmap, cmapSize, ucs4);
-#else
- if (tm.tmFirstChar > 60000) {
- glyph = ucs4;
+ } else
#endif
- } else if (ucs4 >= tm.tmFirstChar && ucs4 <= tm.tmLastChar) {
+ if (ucs4 >= tm.tmFirstChar && ucs4 <= tm.tmLastChar) {
glyph = ucs4;
} else {
glyph = 0;
diff --git a/src/plugins/platforms/windows/qwindowsmime.cpp b/src/plugins/platforms/windows/qwindowsmime.cpp
index a16397f169..61c867cf07 100644
--- a/src/plugins/platforms/windows/qwindowsmime.cpp
+++ b/src/plugins/platforms/windows/qwindowsmime.cpp
@@ -1151,7 +1151,7 @@ QVariant QWindowsMimeImage::convertToMime(const QString &mimeType, IDataObject *
{
Q_UNUSED(preferredType);
QVariant result;
- if (mimeType != QStringLiteral("application/x-qt-image"))
+ if (mimeType != QLatin1String("application/x-qt-image"))
return result;
//Try to convert from a format which has more data
//DIBV5, use only if its is not synthesized
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 246ebcb238..e83d44bbfe 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -230,6 +230,30 @@ static inline QRect frameGeometry(HWND hwnd, bool topLevel)
return qrectFromRECT(rect);
}
+// Return the visibility of the Window (except full screen since it is not a window state).
+static QWindow::Visibility windowVisibility_sys(HWND hwnd)
+{
+ if (!IsWindowVisible(hwnd))
+ return QWindow::Hidden;
+#ifndef Q_OS_WINCE
+ WINDOWPLACEMENT windowPlacement;
+ windowPlacement.length = sizeof(WINDOWPLACEMENT);
+ if (GetWindowPlacement(hwnd, &windowPlacement)) {
+ switch (windowPlacement.showCmd) {
+ case SW_SHOWMINIMIZED:
+ case SW_MINIMIZE:
+ case SW_FORCEMINIMIZE:
+ return QWindow::Minimized;
+ case SW_SHOWMAXIMIZED:
+ return QWindow::Maximized;
+ default:
+ break;
+ }
+ }
+#endif // !Q_OS_WINCE
+ return QWindow::Windowed;
+}
+
static inline QSize clientSize(HWND hwnd)
{
RECT rect = { 0, 0, 0, 0 };
@@ -1867,6 +1891,10 @@ void QWindowsWindow::setWindowState_sys(Qt::WindowState newState)
swpf |= SWP_NOSIZE | SWP_NOMOVE;
const bool wasSync = testFlag(SynchronousGeometryChangeEvent);
setFlag(SynchronousGeometryChangeEvent);
+ // After maximized/fullscreen; the window can be in a maximized state. Clear
+ // it before applying the normal geometry.
+ if (windowVisibility_sys(m_data.hwnd) == QWindow::Maximized)
+ ShowWindow(m_data.hwnd, SW_SHOWNOACTIVATE);
SetWindowPos(m_data.hwnd, 0, m_savedFrameGeometry.x(), m_savedFrameGeometry.y(),
m_savedFrameGeometry.width(), m_savedFrameGeometry.height(), swpf);
if (!wasSync)