summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-02-01 21:00:55 +0100
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2017-02-01 21:00:55 +0100
commitdcd5cb973622d059818dba1a2c7b9a7b7601a14c (patch)
treefbda1c8c6d36cae42b084f7298cf5b1904e21e9f /src/plugins
parentf299b565b5904e39a47b6133643448e46810f0ed (diff)
parentff68e5d667cc62141f177d01f747a62c95f08d3e (diff)
Merge remote-tracking branch 'gerrit/dev' into HEAD
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/bearer/generic/qgenericengine.cpp3
-rw-r--r--src/plugins/bearer/platformdefs_win.h2
-rw-r--r--src/plugins/bearer/qnetworksession_impl.cpp9
-rw-r--r--src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp9
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp8
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm30
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.mm12
-rw-r--r--src/plugins/platforms/cocoa/qcocoakeymapper.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm6
-rw-r--r--src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp2
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp2
-rw-r--r--src/plugins/platforms/windows/qwin10helpers.cpp2
-rw-r--r--src/plugins/platforms/windows/qwindowscontext.cpp11
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp5
-rw-r--r--src/plugins/platforms/windows/qwindowskeymapper.cpp3
-rw-r--r--src/plugins/platforms/windows/qwindowsmousehandler.cpp21
-rw-r--r--src/plugins/platforms/windows/qwindowsscreen.cpp30
-rw-r--r--src/plugins/platforms/windows/qwindowswindow.cpp39
-rw-r--r--src/plugins/platforms/winrt/main.cpp6
-rw-r--r--src/plugins/platforms/winrt/qwinrtscreen.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbclipboard.cpp5
-rw-r--r--src/plugins/platforms/xcb/qxcbclipboard.h10
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp30
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.h100
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection_xi2.cpp23
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.cpp6
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.h14
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.cpp3
-rw-r--r--src/plugins/platforms/xcb/qxcbnativeinterface.h2
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.cpp130
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.h30
-rw-r--r--src/plugins/platforms/xcb/qxcbsystemtraytracker.cpp1
-rw-r--r--src/plugins/platforms/xcb/qxcbsystemtraytracker.h2
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp51
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h42
-rw-r--r--src/plugins/plugins.pro2
-rw-r--r--src/plugins/sqldrivers/mysql/qsql_mysql.cpp9
-rw-r--r--src/plugins/sqldrivers/oci/qsql_oci.cpp6
39 files changed, 317 insertions, 357 deletions
diff --git a/src/plugins/bearer/generic/qgenericengine.cpp b/src/plugins/bearer/generic/qgenericengine.cpp
index 02ea7abf88..059617b367 100644
--- a/src/plugins/bearer/generic/qgenericengine.cpp
+++ b/src/plugins/bearer/generic/qgenericengine.cpp
@@ -37,6 +37,9 @@
**
****************************************************************************/
+// see comment in ../platformdefs_win.h.
+#define WIN32_LEAN_AND_MEAN 1
+
#include "qgenericengine.h"
#include "../qnetworksession_impl.h"
diff --git a/src/plugins/bearer/platformdefs_win.h b/src/plugins/bearer/platformdefs_win.h
index 8fb2f1bcc5..5a8487d868 100644
--- a/src/plugins/bearer/platformdefs_win.h
+++ b/src/plugins/bearer/platformdefs_win.h
@@ -40,6 +40,8 @@
#ifndef QPLATFORMDEFS_WIN_H
#define QPLATFORMDEFS_WIN_H
+// Since we need to include winsock2.h, we need to define WIN32_LEAN_AND_MEAN
+// somewhere above so windows.h won't include winsock.h.
#include <winsock2.h>
#include <mswsock.h>
#undef interface
diff --git a/src/plugins/bearer/qnetworksession_impl.cpp b/src/plugins/bearer/qnetworksession_impl.cpp
index 5ce51670f7..847479047f 100644
--- a/src/plugins/bearer/qnetworksession_impl.cpp
+++ b/src/plugins/bearer/qnetworksession_impl.cpp
@@ -37,6 +37,9 @@
**
****************************************************************************/
+// see comment in ../platformdefs_win.h.
+#define WIN32_LEAN_AND_MEAN 1
+
#include "qnetworksession_impl.h"
#include "qbearerengine_impl.h"
@@ -207,10 +210,10 @@ QNetworkInterface QNetworkSessionPrivateImpl::currentInterface() const
if (!engine || state != QNetworkSession::Connected || !publicConfig.isValid())
return QNetworkInterface();
- QString interface = engine->getInterfaceFromId(activeConfig.identifier());
- if (interface.isEmpty())
+ QString iface = engine->getInterfaceFromId(activeConfig.identifier());
+ if (iface.isEmpty())
return QNetworkInterface();
- return QNetworkInterface::interfaceFromName(interface);
+ return QNetworkInterface::interfaceFromName(iface);
}
#endif
diff --git a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp
index bd25992457..ca9f7af127 100644
--- a/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp
+++ b/src/plugins/platforminputcontexts/compose/generator/qtablegenerator.cpp
@@ -194,8 +194,11 @@ static QVector<QComposeTableElement> loadCache(const QComposeCacheFileHeader &co
static bool saveCache(const QComposeCacheFileHeader &info, const QVector<QComposeTableElement> &vec)
{
const QString filePath = getCacheFilePath();
+#if QT_CONFIG(temporaryfile)
QSaveFile outputFile(filePath);
-
+#else
+ QFile outputFile(filePath);
+#endif
if (!outputFile.open(QIODevice::WriteOnly))
return false;
const char *data = reinterpret_cast<const char*>(&info);
@@ -207,7 +210,11 @@ static bool saveCache(const QComposeCacheFileHeader &info, const QVector<QCompos
if (outputFile.write(data, size) != size)
return false;
+#if QT_CONFIG(temporaryfile)
return outputFile.commit();
+#else
+ return true;
+#endif
}
TableGenerator::TableGenerator() : m_state(NoErrors),
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp
index 12e85046f8..4ab8a9d060 100644
--- a/src/plugins/platforms/android/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/qandroidinputcontext.cpp
@@ -354,10 +354,10 @@ static QRect inputItemRectangle()
? QHighDpiScaling::factor(window)
: QHighDpiScaling::factor(QtAndroid::androidPlatformIntegration()->screen());
if (pixelDensity != 1.0) {
- rect.setX(rect.x() * pixelDensity);
- rect.setY(rect.y() * pixelDensity);
- rect.setWidth(rect.width() * pixelDensity);
- rect.setHeight(rect.height() * pixelDensity);
+ rect.setRect(rect.x() * pixelDensity,
+ rect.y() * pixelDensity,
+ rect.width() * pixelDensity,
+ rect.height() * pixelDensity);
}
return rect;
}
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
index 97bd402b73..e743dd56bf 100644
--- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
+++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
@@ -235,19 +235,19 @@ static void convertLineOffset(QAccessibleTextInterface *text, int *line, int *of
if (!iface || !iface->isValid())
return nil;
- if (QWindow *window = iface->window()) {
- QCocoaWindow *win = static_cast<QCocoaWindow*>(window->handle());
- return qnsview_cast(win->view());
+ if (QAccessibleInterface *parent = iface->parent()) {
+ QAccessible::Id parentId = QAccessible::uniqueId(parent);
+ return [QMacAccessibilityElement elementWithId: parentId];
}
- QAccessibleInterface *parent = iface->parent();
- if (!parent) {
- qWarning() << "INVALID PARENT FOR INTERFACE: " << iface;
- return nil;
+ if (QWindow *window = iface->window()) {
+ QPlatformWindow *platformWindow = window->handle();
+ if (platformWindow) {
+ QCocoaWindow *win = static_cast<QCocoaWindow*>(platformWindow);
+ return qnsview_cast(win->view());
+ }
}
-
- QAccessible::Id parentId = QAccessible::uniqueId(parent);
- return [QMacAccessibilityElement elementWithId: parentId];
+ return nil;
}
@@ -537,7 +537,7 @@ static void convertLineOffset(QAccessibleTextInterface *text, int *line, int *of
- (void)accessibilityPerformAction:(NSString *)action {
QAccessibleInterface *iface = QAccessible::accessibleInterface(axid);
- if (iface) {
+ if (iface && iface->isValid()) {
const QString qtAction = QCocoaAccessible::translateAction(action, iface);
QAccessibleBridgeUtils::performEffectiveAction(iface, qtAction);
}
@@ -562,16 +562,16 @@ static void convertLineOffset(QAccessibleTextInterface *text, int *line, int *of
int y = qt_mac_flipYCoordinate(point.y);
QAccessibleInterface *childInterface = iface->childAt(point.x, y);
// No child found, meaning we hit this element.
- if (!childInterface)
+ if (!childInterface || !childInterface->isValid())
return NSAccessibilityUnignoredAncestor(self);
// find the deepest child at the point
QAccessibleInterface *childOfChildInterface = 0;
do {
childOfChildInterface = childInterface->childAt(point.x, y);
- if (childOfChildInterface)
+ if (childOfChildInterface && childOfChildInterface->isValid())
childInterface = childOfChildInterface;
- } while (childOfChildInterface);
+ } while (childOfChildInterface && childOfChildInterface->isValid());
QAccessible::Id childId = QAccessible::uniqueId(childInterface);
// hit a child, forward to child accessible interface.
@@ -590,7 +590,7 @@ static void convertLineOffset(QAccessibleTextInterface *text, int *line, int *of
}
QAccessibleInterface *childInterface = iface->focusChild();
- if (childInterface) {
+ if (childInterface && childInterface->isValid()) {
QAccessible::Id childAxid = QAccessible::uniqueId(childInterface);
QMacAccessibilityElement *accessibleElement = [QMacAccessibilityElement elementWithId:childAxid];
return NSAccessibilityUnignoredAncestor(accessibleElement);
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm
index fa0365dbf7..3e637b5db3 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.mm
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm
@@ -279,16 +279,8 @@ NSRect qt_mac_flipRect(const QRect &rect)
Qt::MouseButton cocoaButton2QtButton(NSInteger buttonNum)
{
- if (buttonNum == 0)
- return Qt::LeftButton;
- if (buttonNum == 1)
- return Qt::RightButton;
- if (buttonNum == 2)
- return Qt::MiddleButton;
- if (buttonNum >= 3 && buttonNum <= 31) { // handle XButton1 and higher via logical shift
- return Qt::MouseButton(uint(Qt::MiddleButton) << (buttonNum - 3));
- }
- // else error: buttonNum too high, or negative
+ if (buttonNum >= 0 && buttonNum <= 31)
+ return Qt::MouseButton(1 << buttonNum);
return Qt::NoButton;
}
diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.mm b/src/plugins/platforms/cocoa/qcocoakeymapper.mm
index e7952ae1f6..1ef7f11011 100644
--- a/src/plugins/platforms/cocoa/qcocoakeymapper.mm
+++ b/src/plugins/platforms/cocoa/qcocoakeymapper.mm
@@ -366,7 +366,9 @@ Qt::KeyboardModifiers QCocoaKeyMapper::queryKeyboardModifiers()
bool QCocoaKeyMapper::updateKeyboard()
{
const UCKeyboardLayout *uchrData = 0;
- QCFType<TISInputSourceRef> source = TISCopyCurrentKeyboardInputSource();
+ QCFType<TISInputSourceRef> source = TISCopyInputMethodKeyboardLayoutOverride();
+ if (!source)
+ source = TISCopyCurrentKeyboardInputSource();
if (keyboard_mode != NullMode && source == currentInputSource) {
return false;
}
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 43817febd4..fe24f95db4 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -749,7 +749,7 @@ void QCocoaWindow::setVisible(bool visible)
if (cocoaEventDispatcher)
cocoaEventDispatcherPrivate = static_cast<QCocoaEventDispatcherPrivate *>(QObjectPrivate::get(cocoaEventDispatcher));
- if (!(cocoaEventDispatcherPrivate && cocoaEventDispatcherPrivate->currentModalSession()))
+ if (cocoaEventDispatcherPrivate && cocoaEventDispatcherPrivate->cocoaModalSessionStack.isEmpty())
[m_nsWindow makeKeyAndOrderFront:nil];
else
[m_nsWindow orderFront:nil];
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index 689fd06d66..7ce407f7d0 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -754,9 +754,6 @@ static bool _q_dontOverrideCtrlLMB = false;
if (masked)
return false;
- if (button == Qt::RightButton)
- m_sendUpAsRightButton = true;
-
m_buttons |= button;
[self handleMouseEvent:theEvent];
@@ -2094,7 +2091,8 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin
}
NSPoint windowPoint = [self.window convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 1, 1)].origin;
- QPoint qtWindowPoint(windowPoint.x, windowPoint.y);
+ NSPoint nsViewPoint = [self convertPoint: windowPoint fromView: nil]; // NSView/QWindow coordinates
+ QPoint qtWindowPoint(nsViewPoint.x, nsViewPoint.y);
QPoint qtScreenPoint = QPoint(screenPoint.x, qt_mac_flipYCoordinate(screenPoint.y));
diff --git a/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp b/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp
index 80708fd17a..534467b32c 100644
--- a/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp
+++ b/src/plugins/platforms/eglfs/api/qeglfsdeviceintegration.cpp
@@ -228,7 +228,7 @@ QDpi QEglFSDeviceIntegration::logicalDpi() const
qreal QEglFSDeviceIntegration::pixelDensity() const
{
- return qRound(logicalDpi().first / qreal(100));
+ return qMax(1, qRound(logicalDpi().first / qreal(100)));
}
Qt::ScreenOrientation QEglFSDeviceIntegration::nativeOrientation() const
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp
index 0a547b832f..64d0d9b515 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_x11/qeglfsx11integration.cpp
@@ -114,7 +114,7 @@ void EventReader::run()
{
Qt::MouseButtons buttons;
- xcb_generic_event_t *event;
+ xcb_generic_event_t *event = nullptr;
while (running.load() && (event = xcb_wait_for_event(m_integration->connection()))) {
uint response_type = event->response_type & ~0x80;
switch (response_type) {
diff --git a/src/plugins/platforms/windows/qwin10helpers.cpp b/src/plugins/platforms/windows/qwin10helpers.cpp
index 977bbfd11b..12cccd124b 100644
--- a/src/plugins/platforms/windows/qwin10helpers.cpp
+++ b/src/plugins/platforms/windows/qwin10helpers.cpp
@@ -57,7 +57,7 @@
#endif
#ifdef HAS_UI_VIEW_SETTINGS_INTEROP
-# include <UIViewSettingsInterop.h>
+# include <uiviewsettingsinterop.h>
#endif
#ifndef HAS_UI_VIEW_SETTINGS_INTEROP
diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp
index 4248d5685e..fefc848d01 100644
--- a/src/plugins/platforms/windows/qwindowscontext.cpp
+++ b/src/plugins/platforms/windows/qwindowscontext.cpp
@@ -1013,11 +1013,18 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
case QtWindows::MouseWheelEvent:
case QtWindows::MouseEvent:
case QtWindows::LeaveEvent:
+ {
+ QWindow *window = platformWindow->window();
+ while (window->flags() & Qt::WindowTransparentForInput)
+ window = window->parent();
+ if (!window)
+ return false;
#if !defined(QT_NO_SESSIONMANAGER)
- return platformSessionManager()->isInteractionBlocked() ? true : d->m_mouseHandler.translateMouseEvent(platformWindow->window(), hwnd, et, msg, result);
+ return platformSessionManager()->isInteractionBlocked() ? true : d->m_mouseHandler.translateMouseEvent(window, hwnd, et, msg, result);
#else
- return d->m_mouseHandler.translateMouseEvent(platformWindow->window(), hwnd, et, msg, result);
+ return d->m_mouseHandler.translateMouseEvent(window, hwnd, et, msg, result);
#endif
+ }
case QtWindows::TouchEvent:
#if !defined(QT_NO_SESSIONMANAGER)
return platformSessionManager()->isInteractionBlocked() ? true : d->m_mouseHandler.translateTouchEvent(platformWindow->window(), hwnd, et, msg, result);
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index 2f88989b3c..5a3020387a 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -510,11 +510,6 @@ QVariant QWindowsIntegration::styleHint(QPlatformIntegration::StyleHint hint) co
return QVariant(keyBoardAutoRepeatRateMS());
#endif
case QPlatformIntegration::ShowIsMaximized:
-#ifndef QT_NO_CLIPBOARD
- return qt_windowsIsTabletMode(d->m_clipboard.clipboardViewer());
-#else
- break;
-#endif
case QPlatformIntegration::StartDragTime:
case QPlatformIntegration::StartDragDistance:
case QPlatformIntegration::KeyboardInputInterval:
diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp
index c2b1df26f8..24c2df86d4 100644
--- a/src/plugins/platforms/windows/qwindowskeymapper.cpp
+++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp
@@ -701,7 +701,8 @@ void QWindowsKeyMapper::updatePossibleKeyCodes(unsigned char *kbdBuffer, quint32
quint32 fallbackKey = winceKeyBend(vk_key);
if (!fallbackKey || fallbackKey == Qt::Key_unknown) {
fallbackKey = 0;
- if (vk_key != keyLayout[vk_key].qtKey[0] && vk_key < 0x5B && vk_key > 0x2F)
+ if (vk_key != keyLayout[vk_key].qtKey[0] && vk_key != keyLayout[vk_key].qtKey[1]
+ && vk_key < 0x5B && vk_key > 0x2F)
fallbackKey = vk_key;
}
keyLayout[vk_key].qtKey[8] = fallbackKey;
diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.cpp b/src/plugins/platforms/windows/qwindowsmousehandler.cpp
index 81349f2998..81abf24131 100644
--- a/src/plugins/platforms/windows/qwindowsmousehandler.cpp
+++ b/src/plugins/platforms/windows/qwindowsmousehandler.cpp
@@ -306,7 +306,8 @@ bool QWindowsMouseHandler::translateMouseEvent(QWindow *window, HWND hwnd,
// events, "click-through") can be considered as the window under mouse.
QWindow *currentWindowUnderMouse = platformWindow->hasMouseCapture() ?
QWindowsScreen::windowAt(globalPosition, CWP_SKIPINVISIBLE | CWP_SKIPTRANSPARENT) : window;
-
+ while (currentWindowUnderMouse && currentWindowUnderMouse->flags() & Qt::WindowTransparentForInput)
+ currentWindowUnderMouse = currentWindowUnderMouse->parent();
// QTBUG-44332: When Qt is running at low integrity level and
// a Qt Window is parented on a Window of a higher integrity process
// using QWindow::fromWinId() (for example, Qt running in a browser plugin)
@@ -425,22 +426,10 @@ static bool isValidWheelReceiver(QWindow *candidate)
static void redirectWheelEvent(QWindow *window, const QPoint &globalPos, int delta,
Qt::Orientation orientation, Qt::KeyboardModifiers mods)
{
- // Redirect wheel event to one of the following, in order of preference:
- // 1) The window under mouse
- // 2) The window receiving the event
// If a window is blocked by modality, it can't get the event.
-
- QWindow *receiver = QWindowsScreen::windowAt(globalPos, CWP_SKIPINVISIBLE);
- bool handleEvent = true;
- if (!isValidWheelReceiver(receiver)) {
- receiver = window;
- if (!isValidWheelReceiver(receiver))
- handleEvent = false;
- }
-
- if (handleEvent) {
- QWindowSystemInterface::handleWheelEvent(receiver,
- QWindowsGeometryHint::mapFromGlobal(receiver, globalPos),
+ if (isValidWheelReceiver(window)) {
+ QWindowSystemInterface::handleWheelEvent(window,
+ QWindowsGeometryHint::mapFromGlobal(window, globalPos),
globalPos, delta, orientation, mods);
}
}
diff --git a/src/plugins/platforms/windows/qwindowsscreen.cpp b/src/plugins/platforms/windows/qwindowsscreen.cpp
index fa2fe6942a..bd598630ba 100644
--- a/src/plugins/platforms/windows/qwindowsscreen.cpp
+++ b/src/plugins/platforms/windows/qwindowsscreen.cpp
@@ -181,14 +181,30 @@ QWindowsScreen::QWindowsScreen(const QWindowsScreenData &data) :
Q_GUI_EXPORT QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int hbitmapFormat = 0);
-QPixmap QWindowsScreen::grabWindow(WId window, int x, int y, int width, int height) const
+QPixmap QWindowsScreen::grabWindow(WId window, int xIn, int yIn, int width, int height) const
{
- RECT r;
- HWND hwnd = window ? reinterpret_cast<HWND>(window) : GetDesktopWindow();
- GetClientRect(hwnd, &r);
+ QSize windowSize;
+ int x = xIn;
+ int y = yIn;
+ HWND hwnd = reinterpret_cast<HWND>(window);
+ if (hwnd) {
+ RECT r;
+ GetClientRect(hwnd, &r);
+ windowSize = QSize(r.right - r.left, r.bottom - r.top);
+ } else {
+ // Grab current screen. The client rectangle of GetDesktopWindow() is the
+ // primary screen, but it is possible to grab other screens from it.
+ hwnd = GetDesktopWindow();
+ const QRect screenGeometry = geometry();
+ windowSize = screenGeometry.size();
+ x += screenGeometry.x();
+ y += screenGeometry.y();
+ }
- if (width < 0) width = r.right - r.left;
- if (height < 0) height = r.bottom - r.top;
+ if (width < 0)
+ width = windowSize.width() - xIn;
+ if (height < 0)
+ height = windowSize.height() - yIn;
// Create and setup bitmap
HDC display_dc = GetDC(0);
@@ -242,7 +258,7 @@ qreal QWindowsScreen::pixelDensity() const
// the pixel density since it is reflects the Windows UI scaling.
// High DPI auto scaling should be disabled when the user chooses
// small fonts on a High DPI monitor, resulting in lower logical DPI.
- return qRound(logicalDpi().first / 96);
+ return qMax(1, qRound(logicalDpi().first / 96));
}
/*!
diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp
index 5edf40b886..04db975360 100644
--- a/src/plugins/platforms/windows/qwindowswindow.cpp
+++ b/src/plugins/platforms/windows/qwindowswindow.cpp
@@ -43,7 +43,7 @@
#include "qwindowsscreen.h"
#include "qwindowsintegration.h"
#include "qwindowsnativeinterface.h"
-#include "qwindowsopenglcontext.h"
+#include "qwindowsglcontext.h"
#ifdef QT_NO_CURSOR
# include "qwindowscursor.h"
#endif
@@ -1300,6 +1300,12 @@ void QWindowsWindow::updateTransientParent() const
if (const QWindowsWindow *tw = QWindowsWindow::windowsWindowOf(tp))
if (!tw->testFlag(WithinDestroy)) // Prevent destruction by parent window (QTBUG-35499, QTBUG-36666)
newTransientParent = tw->handle();
+
+ // QTSOLBUG-71: When using the MFC/winmigrate solution, it is possible that a child
+ // window is found, which can cause issues with modality. Loop up to top level.
+ while (newTransientParent && (GetWindowLongPtr(newTransientParent, GWL_STYLE) & WS_CHILD) != 0)
+ newTransientParent = GetParent(newTransientParent);
+
if (newTransientParent != oldTransientParent)
SetWindowLongPtr(m_data.hwnd, GWL_HWNDPARENT, LONG_PTR(newTransientParent));
}
@@ -1488,18 +1494,22 @@ void QWindowsWindow::handleResized(int wParam)
case SIZE_MAXHIDE: // Some other window affected.
case SIZE_MAXSHOW:
return;
- case SIZE_MINIMIZED:
- handleWindowStateChange(Qt::WindowMinimized);
+ case SIZE_MINIMIZED: // QTBUG-53577, prevent state change events during programmatic state change
+ if (!testFlag(WithinSetStyle))
+ handleWindowStateChange(Qt::WindowMinimized);
return;
case SIZE_MAXIMIZED:
- handleWindowStateChange(Qt::WindowMaximized);
+ if (!testFlag(WithinSetStyle))
+ handleWindowStateChange(Qt::WindowMaximized);
handleGeometryChange();
break;
case SIZE_RESTORED:
- if (isFullScreen_sys())
- handleWindowStateChange(Qt::WindowFullScreen);
- else if (m_windowState != Qt::WindowNoState && !testFlag(MaximizeToFullScreen))
- handleWindowStateChange(Qt::WindowNoState);
+ if (!testFlag(WithinSetStyle)) {
+ if (isFullScreen_sys())
+ handleWindowStateChange(Qt::WindowFullScreen);
+ else if (m_windowState != Qt::WindowNoState && !testFlag(MaximizeToFullScreen))
+ handleWindowStateChange(Qt::WindowNoState);
+ }
handleGeometryChange();
break;
}
@@ -1507,9 +1517,6 @@ void QWindowsWindow::handleResized(int wParam)
void QWindowsWindow::handleGeometryChange()
{
- //Prevent recursive resizes for Windows CE
- if (testFlag(WithinSetStyle))
- return;
const QRect previousGeometry = m_data.geometry;
m_data.geometry = geometry_sys();
QPlatformWindow::setGeometry(m_data.geometry);
@@ -1609,6 +1616,16 @@ bool QWindowsWindow::handleWmPaint(HWND hwnd, UINT message,
return false;
PAINTSTRUCT ps;
+#if QT_CONFIG(dynamicgl)
+ // QTBUG-58178: GL software rendering needs InvalidateRect() to suppress
+ // artifacts while resizing.
+ if (testFlag(OpenGLSurface)
+ && QOpenGLStaticContext::opengl32.moduleIsNotOpengl32()
+ && QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) {
+ InvalidateRect(hwnd, 0, false);
+ }
+#endif // dynamicgl
+
BeginPaint(hwnd, &ps);
// Observed painting problems with Aero style disabled (QTBUG-7865).
diff --git a/src/plugins/platforms/winrt/main.cpp b/src/plugins/platforms/winrt/main.cpp
index 5d0d9e94eb..222287b3ef 100644
--- a/src/plugins/platforms/winrt/main.cpp
+++ b/src/plugins/platforms/winrt/main.cpp
@@ -49,15 +49,9 @@ class QWinRTIntegrationPlugin : public QPlatformIntegrationPlugin
Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "winrt.json")
public:
- QStringList keys() const;
QPlatformIntegration *create(const QString&, const QStringList&) override;
};
-QStringList QWinRTIntegrationPlugin::keys() const
-{
- return QStringList(QStringLiteral("WinRT"));
-}
-
QPlatformIntegration *QWinRTIntegrationPlugin::create(const QString& system, const QStringList& paramList)
{
Q_UNUSED(paramList);
diff --git a/src/plugins/platforms/winrt/qwinrtscreen.cpp b/src/plugins/platforms/winrt/qwinrtscreen.cpp
index 060f1839cf..d9a9d3b20f 100644
--- a/src/plugins/platforms/winrt/qwinrtscreen.cpp
+++ b/src/plugins/platforms/winrt/qwinrtscreen.cpp
@@ -647,7 +647,7 @@ QDpi QWinRTScreen::logicalDpi() const
qreal QWinRTScreen::pixelDensity() const
{
Q_D(const QWinRTScreen);
- return qRound(d->logicalDpi / 96);
+ return qMax(1, qRound(d->logicalDpi / 96));
}
qreal QWinRTScreen::scaleFactor() const
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.cpp b/src/plugins/platforms/xcb/qxcbclipboard.cpp
index cee011bbdf..6a5d40267a 100644
--- a/src/plugins/platforms/xcb/qxcbclipboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbclipboard.cpp
@@ -267,11 +267,6 @@ const int QXcbClipboard::clipboard_timeout = 5000;
QXcbClipboard::QXcbClipboard(QXcbConnection *c)
: QXcbObject(c), QPlatformClipboard()
- , m_requestor(XCB_NONE)
- , m_owner(XCB_NONE)
- , m_incr_active(false)
- , m_clipboard_closing(false)
- , m_incr_receive_time(0)
{
Q_ASSERT(QClipboard::Clipboard == 0);
Q_ASSERT(QClipboard::Selection == 1);
diff --git a/src/plugins/platforms/xcb/qxcbclipboard.h b/src/plugins/platforms/xcb/qxcbclipboard.h
index a0a4f4e5a1..bfeae13e10 100644
--- a/src/plugins/platforms/xcb/qxcbclipboard.h
+++ b/src/plugins/platforms/xcb/qxcbclipboard.h
@@ -102,14 +102,14 @@ private:
QMimeData *m_clientClipboard[2];
xcb_timestamp_t m_timestamp[2];
- xcb_window_t m_requestor;
- xcb_window_t m_owner;
+ xcb_window_t m_requestor = XCB_NONE;
+ xcb_window_t m_owner = XCB_NONE;
static const int clipboard_timeout;
- bool m_incr_active;
- bool m_clipboard_closing;
- xcb_timestamp_t m_incr_receive_time;
+ bool m_incr_active = false;
+ bool m_clipboard_closing = false;
+ xcb_timestamp_t m_incr_receive_time = 0;
};
#endif // QT_NO_CLIPBOARD
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 2834ff3224..3444b21654 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -417,7 +417,7 @@ void QXcbConnection::initializeScreens()
qWarning("failed to get the current screen resources");
free(error);
} else {
- xcb_timestamp_t timestamp;
+ xcb_timestamp_t timestamp = 0;
xcb_randr_output_t *outputs = Q_NULLPTR;
int outputCount = xcb_randr_get_screen_resources_current_outputs_length(resources_current.data());
if (outputCount) {
@@ -552,32 +552,10 @@ void QXcbConnection::initializeScreens()
}
QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGrabServer, xcb_visualid_t defaultVisualId, const char *displayName)
- : m_connection(0)
- , m_canGrabServer(canGrabServer)
+ : m_canGrabServer(canGrabServer)
, m_defaultVisualId(defaultVisualId)
- , m_primaryScreenNumber(0)
, m_displayName(displayName ? QByteArray(displayName) : qgetenv("DISPLAY"))
, m_nativeInterface(nativeInterface)
-#ifdef XCB_USE_XLIB
- , m_xlib_display(0)
-#endif
- , xfixes_first_event(0)
- , xrandr_first_event(0)
- , xkb_first_event(0)
- , has_xinerama_extension(false)
- , has_shape_extension(false)
- , has_randr_extension(false)
- , has_input_shape(false)
- , has_xkb(false)
- , m_buttons(0)
- , m_focusWindow(0)
- , m_mouseGrabber(0)
- , m_mousePressWindow(0)
- , m_clientLeader(0)
- , m_systemTrayTracker(0)
- , m_glIntegration(Q_NULLPTR)
- , m_xiGrab(false)
- , m_qtSelectionOwner(0)
{
#ifdef XCB_USE_XLIB
Display *dpy = XOpenDisplay(m_displayName.constData());
@@ -618,9 +596,6 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGra
initializeAllAtoms();
- m_time = XCB_CURRENT_TIME;
- m_netWmUserTime = XCB_CURRENT_TIME;
-
if (!qEnvironmentVariableIsSet("QT_XCB_NO_XRANDR"))
initializeXRandr();
if (!has_randr_extension)
@@ -630,7 +605,6 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGra
initializeXRender();
#if defined(XCB_USE_XINPUT2)
- m_xi2Enabled = false;
initializeXInput2();
#endif
initializeXShape();
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 3754890796..7f0d5cf2cc 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -517,6 +517,7 @@ public:
#ifdef XCB_USE_XINPUT22
bool xi2MouseEvents() const;
+ bool isTouchScreen(int id) const;
#endif
protected:
@@ -550,10 +551,9 @@ private:
void destroyScreen(QXcbScreen *screen);
void initializeScreens();
bool compressEvent(xcb_generic_event_t *event, int currentIndex, QXcbEventArray *eventqueue) const;
-
#ifdef XCB_USE_XINPUT2
- bool m_xi2Enabled;
- int m_xi2Minor;
+ bool m_xi2Enabled = false;
+ int m_xi2Minor = 2;
void initializeXInput2();
void finalizeXInput2();
void xi2SetupDevices();
@@ -567,20 +567,17 @@ private:
#endif // XCB_USE_XINPUT22
#ifndef QT_NO_TABLETEVENT
struct TabletData {
- TabletData() : deviceId(0), pointerType(QTabletEvent::UnknownPointer),
- tool(QTabletEvent::Stylus), buttons(0), serialId(0), inProximity(false) { }
- int deviceId;
- QTabletEvent::PointerType pointerType;
- QTabletEvent::TabletDevice tool;
- Qt::MouseButtons buttons;
- qint64 serialId;
- bool inProximity;
+ int deviceId = 0;
+ QTabletEvent::PointerType pointerType = QTabletEvent::UnknownPointer;
+ QTabletEvent::TabletDevice tool = QTabletEvent::Stylus;
+ Qt::MouseButtons buttons = 0;
+ qint64 serialId = 0;
+ bool inProximity = false;
struct ValuatorClassInfo {
- ValuatorClassInfo() : minVal(0.), maxVal(0.), curVal(0.) { }
- double minVal;
- double maxVal;
- double curVal;
- int number;
+ double minVal = 0;
+ double maxVal = 0;
+ double curVal = 0;
+ int number = -1;
};
QHash<int, ValuatorClassInfo> valuatorInfo;
};
@@ -592,12 +589,13 @@ private:
TabletData *tabletDataForDevice(int id);
#endif // !QT_NO_TABLETEVENT
struct ScrollingDevice {
- ScrollingDevice() : deviceId(0), verticalIndex(0), horizontalIndex(0), orientations(0), legacyOrientations(0) { }
- int deviceId;
- int verticalIndex, horizontalIndex;
- double verticalIncrement, horizontalIncrement;
- Qt::Orientations orientations;
- Qt::Orientations legacyOrientations;
+ int deviceId = 0;
+ int verticalIndex = 0;
+ int horizontalIndex = 0;
+ double verticalIncrement = 0;
+ double horizontalIncrement = 0;
+ Qt::Orientations orientations = 0;
+ Qt::Orientations legacyOrientations = 0;
QPointF lastScrollPosition;
};
void updateScrollingDevice(ScrollingDevice& scrollingDevice, int num_classes, void *classes);
@@ -608,36 +606,36 @@ private:
static void xi2PrepareXIGenericDeviceEvent(xcb_ge_event_t *event);
#endif
- xcb_connection_t *m_connection;
- const xcb_setup_t *m_setup;
- bool m_canGrabServer;
- xcb_visualid_t m_defaultVisualId;
+ xcb_connection_t *m_connection = nullptr;
+ const xcb_setup_t *m_setup = nullptr;
+ const bool m_canGrabServer;
+ const xcb_visualid_t m_defaultVisualId;
QList<QXcbVirtualDesktop *> m_virtualDesktops;
QList<QXcbScreen *> m_screens;
- int m_primaryScreenNumber;
+ int m_primaryScreenNumber = 0;
xcb_atom_t m_allAtoms[QXcbAtom::NAtoms];
- xcb_timestamp_t m_time;
- xcb_timestamp_t m_netWmUserTime;
+ xcb_timestamp_t m_time = XCB_CURRENT_TIME;
+ xcb_timestamp_t m_netWmUserTime = XCB_CURRENT_TIME;
QByteArray m_displayName;
- QXcbKeyboard *m_keyboard;
+ QXcbKeyboard *m_keyboard = nullptr;
#ifndef QT_NO_CLIPBOARD
- QXcbClipboard *m_clipboard;
+ QXcbClipboard *m_clipboard = nullptr;
#endif
#ifndef QT_NO_DRAGANDDROP
- QXcbDrag *m_drag;
+ QXcbDrag *m_drag = nullptr;
#endif
QScopedPointer<QXcbWMSupport> m_wmSupport;
- QXcbNativeInterface *m_nativeInterface;
+ QXcbNativeInterface *m_nativeInterface = nullptr;
#if defined(XCB_USE_XLIB)
- void *m_xlib_display;
+ void *m_xlib_display = nullptr;
#endif
- QXcbEventReader *m_reader;
+ QXcbEventReader *m_reader = nullptr;
#if defined(XCB_USE_XINPUT2)
QHash<int, XInput2TouchDeviceData*> m_touchDevices;
#ifdef XCB_USE_XINPUT22
@@ -670,29 +668,29 @@ private:
QVector<PeekFunc> m_peekFuncs;
- uint32_t xfixes_first_event;
- uint32_t xrandr_first_event;
- uint32_t xkb_first_event;
+ uint32_t xfixes_first_event = 0;
+ uint32_t xrandr_first_event = 0;
+ uint32_t xkb_first_event = 0;
- bool has_xinerama_extension;
- bool has_shape_extension;
- bool has_randr_extension;
+ bool has_xinerama_extension = false;
+ bool has_shape_extension = false;
+ bool has_randr_extension = false;
bool has_input_shape;
- bool has_xkb;
+ bool has_xkb = false;
- Qt::MouseButtons m_buttons;
+ Qt::MouseButtons m_buttons = 0;
- QXcbWindow *m_focusWindow;
- QXcbWindow *m_mouseGrabber;
- QXcbWindow *m_mousePressWindow;
+ QXcbWindow *m_focusWindow = nullptr;
+ QXcbWindow *m_mouseGrabber = nullptr;
+ QXcbWindow *m_mousePressWindow = nullptr;
- xcb_window_t m_clientLeader;
+ xcb_window_t m_clientLeader = 0;
QByteArray m_startupId;
- QXcbSystemTrayTracker *m_systemTrayTracker;
- QXcbGlIntegration *m_glIntegration;
- bool m_xiGrab;
+ QXcbSystemTrayTracker *m_systemTrayTracker = nullptr;
+ QXcbGlIntegration *m_glIntegration = nullptr;
+ bool m_xiGrab = false;
- xcb_window_t m_qtSelectionOwner;
+ xcb_window_t m_qtSelectionOwner = 0;
friend class QXcbEventReader;
};
diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
index 0ace79a4f5..acdcc996b7 100644
--- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
@@ -52,14 +52,8 @@
#include <X11/extensions/XI2proto.h>
struct XInput2TouchDeviceData {
- XInput2TouchDeviceData()
- : xiDeviceInfo(0)
- , qtTouchDevice(0)
- , providesTouchOrientation(false)
- {
- }
- XIDeviceInfo *xiDeviceInfo;
- QTouchDevice *qtTouchDevice;
+ XIDeviceInfo *xiDeviceInfo = nullptr;
+ QTouchDevice *qtTouchDevice = nullptr;
QHash<int, QWindowSystemInterface::TouchPoint> touchPoints;
QHash<int, QPointF> pointPressedPosition; // in screen coordinates where each point was pressed
@@ -67,7 +61,7 @@ struct XInput2TouchDeviceData {
QPointF firstPressedPosition; // in screen coordinates where the first point was pressed
QPointF firstPressedNormalPosition; // device coordinates (0 to 1, 0 to 1) where the first point was pressed
QSizeF size; // device size in mm
- bool providesTouchOrientation;
+ bool providesTouchOrientation = false;
};
void QXcbConnection::initializeXInput2()
@@ -80,7 +74,7 @@ void QXcbConnection::initializeXInput2()
Display *xDisplay = static_cast<Display *>(m_xlib_display);
if (XQueryExtension(xDisplay, "XInputExtension", &m_xiOpCode, &m_xiEventBase, &m_xiErrorBase)) {
int xiMajor = 2;
- m_xi2Minor = 2; // try 2.2 first, needed for TouchBegin/Update/End
+ // try 2.2 first, needed for TouchBegin/Update/End
if (XIQueryVersion(xDisplay, &xiMajor, &m_xi2Minor) == BadRequest) {
m_xi2Minor = 1; // for smooth scrolling 2.1 is enough
if (XIQueryVersion(xDisplay, &xiMajor, &m_xi2Minor) == BadRequest) {
@@ -1025,6 +1019,14 @@ Qt::MouseButton QXcbConnection::xiToQtMouseButton(uint32_t b)
return Qt::NoButton;
}
+bool QXcbConnection::isTouchScreen(int id) const
+{
+ auto device = m_touchDevices.value(id);
+ return device && device->qtTouchDevice
+ && device->qtTouchDevice->type() == QTouchDevice::TouchScreen;
+}
+
+#if QT_CONFIG(tabletevent)
static QTabletEvent::TabletDevice toolIdToTabletDevice(quint32 toolId) {
// keep in sync with wacom_intuos_inout() in Linux kernel driver wacom_wac.c
switch (toolId) {
@@ -1058,7 +1060,6 @@ static QTabletEvent::TabletDevice toolIdToTabletDevice(quint32 toolId) {
return QTabletEvent::Stylus; // Safe default assumption if nonzero
}
-#ifndef QT_NO_TABLETEVENT
bool QXcbConnection::xi2HandleTabletEvent(const void *event, TabletData *tabletData)
{
bool handled = true;
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
index a5aff7f11f..2e29c208c7 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -1136,12 +1136,6 @@ int QXcbKeyboard::keysymToQtKey(xcb_keysym_t keysym, Qt::KeyboardModifiers &modi
QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection)
: QXcbObject(connection)
- , m_autorepeat_code(0)
- , xkb_context(0)
- , xkb_keymap(0)
- , xkb_state(0)
- , latin_keymap(0)
- , m_hasLatinLayout(false)
{
memset(&xkb_names, 0, sizeof(xkb_names));
#if QT_CONFIG(xkb)
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h
index dfd2926435..74f9da0353 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.h
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.h
@@ -106,14 +106,14 @@ protected:
private:
void updateXKBStateFromState(struct xkb_state *kb_state, quint16 state);
- bool m_config;
- xcb_keycode_t m_autorepeat_code;
+ bool m_config = false;
+ xcb_keycode_t m_autorepeat_code = 0;
- struct xkb_context *xkb_context;
- struct xkb_keymap *xkb_keymap;
- struct xkb_state *xkb_state;
+ struct xkb_context *xkb_context = nullptr;
+ struct xkb_keymap *xkb_keymap = nullptr;
+ struct xkb_state *xkb_state = nullptr;
struct xkb_rule_names xkb_names;
- mutable struct xkb_keymap *latin_keymap;
+ mutable struct xkb_keymap *latin_keymap = nullptr;
struct _mod_masks {
uint alt;
@@ -143,7 +143,7 @@ private:
_mod_masks vmod_masks;
int core_device_id;
#endif
- bool m_hasLatinLayout;
+ bool m_hasLatinLayout = false;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
index b1575cbee4..725288633a 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.cpp
@@ -90,8 +90,7 @@ static int resourceType(const QByteArray &key)
}
QXcbNativeInterface::QXcbNativeInterface() :
- m_genericEventFilterType(QByteArrayLiteral("xcb_generic_event_t")),
- m_sysTraySelectionAtom(XCB_ATOM_NONE)
+ m_genericEventFilterType(QByteArrayLiteral("xcb_generic_event_t"))
{
}
diff --git a/src/plugins/platforms/xcb/qxcbnativeinterface.h b/src/plugins/platforms/xcb/qxcbnativeinterface.h
index a830829311..4186d77f4d 100644
--- a/src/plugins/platforms/xcb/qxcbnativeinterface.h
+++ b/src/plugins/platforms/xcb/qxcbnativeinterface.h
@@ -129,7 +129,7 @@ private:
const QByteArray m_genericEventFilterType;
- xcb_atom_t m_sysTraySelectionAtom;
+ xcb_atom_t m_sysTraySelectionAtom = XCB_ATOM_NONE;
static QXcbScreen *qPlatformScreenForWindow(QWindow *window);
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
index a9675935f4..5e136b5d7e 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
@@ -59,7 +59,6 @@ QXcbVirtualDesktop::QXcbVirtualDesktop(QXcbConnection *connection, xcb_screen_t
: QXcbObject(connection)
, m_screen(screen)
, m_number(number)
- , m_xSettings(Q_NULLPTR)
{
const QByteArray cmAtomName = "_NET_WM_CM_S" + QByteArray::number(m_number);
m_net_wm_cm_atom = connection->internAtom(cmAtomName.constData());
@@ -175,20 +174,10 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe
, m_virtualDesktop(virtualDesktop)
, m_output(outputId)
, m_crtc(output ? output->crtc : XCB_NONE)
- , m_mode(XCB_NONE)
- , m_primary(false)
- , m_rotation(XCB_RANDR_ROTATION_ROTATE_0)
, m_outputName(getOutputName(output))
, m_outputSizeMillimeters(output ? QSize(output->mm_width, output->mm_height) : QSize())
, m_virtualSize(virtualDesktop->size())
, m_virtualSizeMillimeters(virtualDesktop->physicalSize())
- , m_orientation(Qt::PrimaryOrientation)
- , m_refreshRate(60)
- , m_forcedDpi(-1)
- , m_pixelDensity(1)
- , m_hintStyle(QFontEngine::HintStyle(-1))
- , m_subpixelType(QFontEngine::SubpixelAntialiasingType(-1))
- , m_antialiasingEnabled(-1)
{
if (connection->hasXRandr()) {
xcb_randr_select_input(xcb_connection(), screen()->root, true);
@@ -631,7 +620,7 @@ void QXcbScreen::updateGeometry(const QRect &geom, uint8_t rotation)
m_sizeMillimeters = sizeInMillimeters(xGeometry.size(), virtualDpi());
qreal dpi = xGeometry.width() / physicalSize().width() * qreal(25.4);
- m_pixelDensity = qRound(dpi/96);
+ m_pixelDensity = qMax(1, qRound(dpi/96));
m_geometry = QRect(xGeometry.topLeft(), xGeometry.size());
m_availableGeometry = xGeometry & m_virtualDesktop->workArea();
QWindowSystemInterface::handleScreenGeometryChange(QPlatformScreen::screen(), m_geometry, m_availableGeometry);
@@ -678,85 +667,88 @@ void QXcbScreen::updateRefreshRate(xcb_randr_mode_t mode)
}
}
-QPixmap QXcbScreen::grabWindow(WId window, int x, int y, int width, int height) const
+static xcb_get_geometry_reply_t *getGeometryUnchecked(xcb_connection_t *connection, xcb_window_t window)
+{
+ const xcb_get_geometry_cookie_t geometry_cookie = xcb_get_geometry_unchecked(connection, window);
+ return xcb_get_geometry_reply(connection, geometry_cookie, NULL);
+}
+
+static inline bool translate(xcb_connection_t *connection, xcb_window_t child, xcb_window_t parent,
+ int *x, int *y)
+{
+ const xcb_translate_coordinates_cookie_t translate_cookie =
+ xcb_translate_coordinates_unchecked(connection, child, parent, *x, *y);
+ xcb_translate_coordinates_reply_t *translate_reply =
+ xcb_translate_coordinates_reply(connection, translate_cookie, NULL);
+ if (!translate_reply)
+ return false;
+ *x = translate_reply->dst_x;
+ *y = translate_reply->dst_y;
+ free(translate_reply);
+ return true;
+}
+
+QPixmap QXcbScreen::grabWindow(WId window, int xIn, int yIn, int width, int height) const
{
if (width == 0 || height == 0)
return QPixmap();
- // TODO: handle multiple screens
+ int x = xIn;
+ int y = yIn;
QXcbScreen *screen = const_cast<QXcbScreen *>(this);
xcb_window_t root = screen->root();
- if (window == 0)
- window = root;
-
- xcb_get_geometry_cookie_t geometry_cookie = xcb_get_geometry_unchecked(xcb_connection(), window);
-
- xcb_get_geometry_reply_t *reply =
- xcb_get_geometry_reply(xcb_connection(), geometry_cookie, NULL);
-
- if (!reply) {
+ xcb_get_geometry_reply_t *rootReply = getGeometryUnchecked(xcb_connection(), root);
+ if (!rootReply)
return QPixmap();
- }
-
- if (width < 0)
- width = reply->width - x;
- if (height < 0)
- height = reply->height - y;
-
- geometry_cookie = xcb_get_geometry_unchecked(xcb_connection(), root);
- xcb_get_geometry_reply_t *root_reply =
- xcb_get_geometry_reply(xcb_connection(), geometry_cookie, NULL);
- if (!root_reply) {
- free(reply);
- return QPixmap();
- }
-
- if (reply->depth == root_reply->depth) {
- // if the depth of the specified window and the root window are the
- // same, grab pixels from the root window (so that we get the any
- // overlapping windows and window manager frames)
-
- // map x and y to the root window
- xcb_translate_coordinates_cookie_t translate_cookie =
- xcb_translate_coordinates_unchecked(xcb_connection(), window, root, x, y);
+ const quint8 rootDepth = rootReply->depth;
+ free(rootReply);
- xcb_translate_coordinates_reply_t *translate_reply =
- xcb_translate_coordinates_reply(xcb_connection(), translate_cookie, NULL);
-
- if (!translate_reply) {
- free(reply);
- free(root_reply);
+ QSize windowSize;
+ quint8 effectiveDepth = 0;
+ if (window) {
+ xcb_get_geometry_reply_t *windowReply = getGeometryUnchecked(xcb_connection(), window);
+ if (!windowReply)
return QPixmap();
+ windowSize = QSize(windowReply->width, windowReply->height);
+ effectiveDepth = windowReply->depth;
+ free(windowReply);
+ if (effectiveDepth == rootDepth) {
+ // if the depth of the specified window and the root window are the
+ // same, grab pixels from the root window (so that we get the any
+ // overlapping windows and window manager frames)
+
+ // map x and y to the root window
+ if (!translate(xcb_connection(), window, root, &x, &y))
+ return QPixmap();
+
+ window = root;
}
-
- x = translate_reply->dst_x;
- y = translate_reply->dst_y;
-
- window = root;
-
- free(translate_reply);
- free(reply);
- reply = root_reply;
} else {
- free(root_reply);
- root_reply = 0;
+ window = root;
+ effectiveDepth = rootDepth;
+ windowSize = m_geometry.size();
+ x += m_geometry.x();
+ y += m_geometry.y();
}
+ if (width < 0)
+ width = windowSize.width() - xIn;
+ if (height < 0)
+ height = windowSize.height() - yIn;
+
xcb_get_window_attributes_reply_t *attributes_reply =
xcb_get_window_attributes_reply(xcb_connection(), xcb_get_window_attributes_unchecked(xcb_connection(), window), NULL);
- if (!attributes_reply) {
- free(reply);
+ if (!attributes_reply)
return QPixmap();
- }
const xcb_visualtype_t *visual = screen->visualForId(attributes_reply->visual);
free(attributes_reply);
xcb_pixmap_t pixmap = xcb_generate_id(xcb_connection());
- xcb_create_pixmap(xcb_connection(), reply->depth, pixmap, window, width, height);
+ xcb_create_pixmap(xcb_connection(), effectiveDepth, pixmap, window, width, height);
uint32_t gc_value_mask = XCB_GC_SUBWINDOW_MODE;
uint32_t gc_value_list[] = { XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS };
@@ -766,9 +758,7 @@ QPixmap QXcbScreen::grabWindow(WId window, int x, int y, int width, int height)
xcb_copy_area(xcb_connection(), window, pixmap, gc, x, y, 0, 0, width, height);
- QPixmap result = qt_xcb_pixmapFromXPixmap(connection(), pixmap, width, height, reply->depth, visual);
-
- free(reply);
+ QPixmap result = qt_xcb_pixmapFromXPixmap(connection(), pixmap, width, height, effectiveDepth, visual);
xcb_free_gc(xcb_connection(), gc);
xcb_free_pixmap(xcb_connection(), pixmap);
diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h
index 627397fcaf..4163be2969 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.h
+++ b/src/plugins/platforms/xcb/qxcbscreen.h
@@ -95,12 +95,12 @@ private:
QRect getWorkArea() const;
xcb_screen_t *m_screen;
- int m_number;
+ const int m_number;
QList<QPlatformScreen *> m_screens;
- QXcbXSettings *m_xSettings;
- xcb_atom_t m_net_wm_cm_atom;
- bool m_compositingActive;
+ QXcbXSettings *m_xSettings = nullptr;
+ xcb_atom_t m_net_wm_cm_atom = 0;
+ bool m_compositingActive = false;
QRect m_workArea;
};
@@ -186,9 +186,9 @@ private:
QXcbVirtualDesktop *m_virtualDesktop;
xcb_randr_output_t m_output;
xcb_randr_crtc_t m_crtc;
- xcb_randr_mode_t m_mode;
- bool m_primary;
- uint8_t m_rotation;
+ xcb_randr_mode_t m_mode = XCB_NONE;
+ bool m_primary = false;
+ uint8_t m_rotation = XCB_RANDR_ROTATION_ROTATE_0;
QString m_outputName;
QSizeF m_outputSizeMillimeters;
@@ -197,18 +197,18 @@ private:
QRect m_availableGeometry;
QSize m_virtualSize;
QSizeF m_virtualSizeMillimeters;
- Qt::ScreenOrientation m_orientation;
+ Qt::ScreenOrientation m_orientation = Qt::PrimaryOrientation;
QString m_windowManagerName;
- bool m_syncRequestSupported;
+ bool m_syncRequestSupported = false;
QMap<xcb_visualid_t, xcb_visualtype_t> m_visuals;
QMap<xcb_visualid_t, quint8> m_visualDepths;
QXcbCursor *m_cursor;
- int m_refreshRate;
- int m_forcedDpi;
- int m_pixelDensity;
- QFontEngine::HintStyle m_hintStyle;
- QFontEngine::SubpixelAntialiasingType m_subpixelType;
- int m_antialiasingEnabled;
+ int m_refreshRate = 60;
+ int m_forcedDpi = -1;
+ int m_pixelDensity = 1;
+ QFontEngine::HintStyle m_hintStyle = QFontEngine::HintStyle(-1);
+ QFontEngine::SubpixelAntialiasingType m_subpixelType = QFontEngine::SubpixelAntialiasingType(-1);
+ int m_antialiasingEnabled = -1;
};
#ifndef QT_NO_DEBUG_STREAM
diff --git a/src/plugins/platforms/xcb/qxcbsystemtraytracker.cpp b/src/plugins/platforms/xcb/qxcbsystemtraytracker.cpp
index 5522af86de..fb0a4a3939 100644
--- a/src/plugins/platforms/xcb/qxcbsystemtraytracker.cpp
+++ b/src/plugins/platforms/xcb/qxcbsystemtraytracker.cpp
@@ -80,7 +80,6 @@ QXcbSystemTrayTracker::QXcbSystemTrayTracker(QXcbConnection *connection,
, m_selection(selection)
, m_trayAtom(trayAtom)
, m_connection(connection)
- , m_trayWindow(0)
{
}
diff --git a/src/plugins/platforms/xcb/qxcbsystemtraytracker.h b/src/plugins/platforms/xcb/qxcbsystemtraytracker.h
index a6131e6d0e..a95b9374e9 100644
--- a/src/plugins/platforms/xcb/qxcbsystemtraytracker.h
+++ b/src/plugins/platforms/xcb/qxcbsystemtraytracker.h
@@ -77,7 +77,7 @@ private:
const xcb_atom_t m_selection;
const xcb_atom_t m_trayAtom;
QXcbConnection *m_connection;
- xcb_window_t m_trayWindow;
+ xcb_window_t m_trayWindow = 0;
};
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index 0275cf5630..756806108e 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -314,21 +314,6 @@ static const char *wm_window_role_property_id = "_q_xcb_wm_window_role";
QXcbWindow::QXcbWindow(QWindow *window)
: QPlatformWindow(window)
- , m_window(0)
- , m_syncCounter(0)
- , m_gravity(XCB_GRAVITY_STATIC)
- , m_mapped(false)
- , m_transparent(false)
- , m_usingSyncProtocol(false)
- , m_deferredActivation(false)
- , m_embedded(false)
- , m_alertState(false)
- , m_netWmUserTimeWindow(XCB_NONE)
- , m_dirtyFrameMargins(false)
- , m_lastWindowStateEvent(-1)
- , m_syncState(NoSyncNeeded)
- , m_pendingSyncRequest(0)
- , m_currentBitmapCursor(XCB_CURSOR_NONE)
{
setConnection(xcbScreen()->connection());
}
@@ -443,7 +428,6 @@ void QXcbWindow::create()
m_visualId = visual->visual_id;
m_depth = platformScreen->depthOfVisual(m_visualId);
m_imageFormat = imageFormatForVisual(m_depth, visual->red_mask, visual->blue_mask, &m_imageRgbSwap);
- xcb_colormap_t colormap = 0;
quint32 mask = XCB_CW_BACK_PIXMAP
| XCB_CW_BORDER_PIXEL
@@ -455,10 +439,10 @@ void QXcbWindow::create()
static const bool haveOpenGL = QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::OpenGL);
if ((window()->supportsOpenGL() && haveOpenGL) || m_format.hasAlpha()) {
- colormap = xcb_generate_id(xcb_connection());
+ m_cmap = xcb_generate_id(xcb_connection());
Q_XCB_CALL(xcb_create_colormap(xcb_connection(),
XCB_COLORMAP_ALLOC_NONE,
- colormap,
+ m_cmap,
xcb_parent_id,
m_visualId));
@@ -472,7 +456,7 @@ void QXcbWindow::create()
type == Qt::Popup || type == Qt::ToolTip || (window()->flags() & Qt::BypassWindowManagerHint),
type == Qt::Popup || type == Qt::Tool || type == Qt::SplashScreen || type == Qt::ToolTip || type == Qt::Drawer,
defaultEventMask,
- colormap
+ m_cmap
};
m_window = xcb_generate_id(xcb_connection());
@@ -638,6 +622,9 @@ void QXcbWindow::destroy()
Q_XCB_CALL(xcb_destroy_window(xcb_connection(), m_window));
m_window = 0;
}
+ if (m_cmap) {
+ xcb_free_colormap(xcb_connection(), m_cmap);
+ }
m_mapped = false;
if (m_pendingSyncRequest)
@@ -2420,22 +2407,27 @@ static inline int fixed1616ToInt(FP1616 val)
return int((qreal(val >> 16)) + (val & 0xFFFF) / (qreal)0xFFFF);
}
-void QXcbWindow::handleXIMouseButtonState(const xcb_ge_event_t *event)
+// With XI 2.2+ press/release/motion comes here instead of the above handlers.
+void QXcbWindow::handleXIMouseEvent(xcb_ge_event_t *event, Qt::MouseEventSource source)
{
QXcbConnection *conn = connection();
- const xXIDeviceEvent *ev = reinterpret_cast<const xXIDeviceEvent *>(event);
+ xXIDeviceEvent *ev = reinterpret_cast<xXIDeviceEvent *>(event);
+
if (ev->buttons_len > 0) {
unsigned char *buttonMask = (unsigned char *) &ev[1];
+ // There is a bug in the evdev driver which leads to receiving mouse events without
+ // XIPointerEmulated being set: https://bugs.freedesktop.org/show_bug.cgi?id=98188
+ // Filter them out by other attributes: when their source device is a touch screen
+ // and the LMB is pressed.
+ if (XIMaskIsSet(buttonMask, 1) && conn->isTouchScreen(ev->sourceid)) {
+ if (Q_UNLIKELY(lcQpaXInputEvents().isDebugEnabled()))
+ qCDebug(lcQpaXInput, "XI2 mouse event from touch device %d was ignored", ev->sourceid);
+ return;
+ }
for (int i = 1; i <= 15; ++i)
conn->setButton(conn->translateMouseButton(i), XIMaskIsSet(buttonMask, i));
}
-}
-// With XI 2.2+ press/release/motion comes here instead of the above handlers.
-void QXcbWindow::handleXIMouseEvent(xcb_ge_event_t *event, Qt::MouseEventSource source)
-{
- QXcbConnection *conn = connection();
- xXIDeviceEvent *ev = reinterpret_cast<xXIDeviceEvent *>(event);
const Qt::KeyboardModifiers modifiers = conn->keyboard()->translateModifiers(ev->mods.effective_mods);
const int event_x = fixed1616ToInt(ev->event_x);
const int event_y = fixed1616ToInt(ev->event_y);
@@ -2455,23 +2447,18 @@ void QXcbWindow::handleXIMouseEvent(xcb_ge_event_t *event, Qt::MouseEventSource
switch (ev->evtype) {
case XI_ButtonPress:
- handleXIMouseButtonState(event);
if (Q_UNLIKELY(lcQpaXInputEvents().isDebugEnabled()))
qCDebug(lcQpaXInputEvents, "XI2 mouse press, button %d, time %d, source %s", button, ev->time, sourceName);
conn->setButton(button, true);
handleButtonPressEvent(event_x, event_y, root_x, root_y, ev->detail, modifiers, ev->time, source);
break;
case XI_ButtonRelease:
- handleXIMouseButtonState(event);
if (Q_UNLIKELY(lcQpaXInputEvents().isDebugEnabled()))
qCDebug(lcQpaXInputEvents, "XI2 mouse release, button %d, time %d, source %s", button, ev->time, sourceName);
conn->setButton(button, false);
handleButtonReleaseEvent(event_x, event_y, root_x, root_y, ev->detail, modifiers, ev->time, source);
break;
case XI_Motion:
- // Here we do NOT call handleXIMouseButtonState because we don't expect button state change to be bundled with motion.
- // When a touchscreen is pressed, an XI_Motion event occurs in which XIMaskIsSet says the left button is pressed,
- // but we don't want QGuiApplicationPrivate::processMouseEvent() to react by generating a mouse press event.
if (Q_UNLIKELY(lcQpaXInputEvents().isDebugEnabled()))
qCDebug(lcQpaXInputEvents, "XI2 mouse motion %d,%d, time %d, source %s", event_x, event_y, ev->time, sourceName);
handleMotionNotifyEvent(event_x, event_y, root_x, root_y, modifiers, ev->time, source);
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index 41befbf66f..b4d947e700 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -139,7 +139,6 @@ public:
void handleFocusOutEvent(const xcb_focus_out_event_t *event) override;
void handlePropertyNotifyEvent(const xcb_property_notify_event_t *event) override;
#ifdef XCB_USE_XINPUT22
- void handleXIMouseButtonState(const xcb_ge_event_t *);
void handleXIMouseEvent(xcb_ge_event_t *, Qt::MouseEventSource source = Qt::MouseEventNotSynthesized) override;
void handleXIEnterLeave(xcb_ge_event_t *) override;
#endif
@@ -234,47 +233,48 @@ protected:
void handleLeaveNotifyEvent(int root_x, int root_y,
quint8 mode, quint8 detail, xcb_timestamp_t timestamp);
- xcb_window_t m_window;
+ xcb_window_t m_window = 0;
+ xcb_colormap_t m_cmap = 0;
- uint m_depth;
- QImage::Format m_imageFormat;
- bool m_imageRgbSwap;
+ uint m_depth = 0;
+ QImage::Format m_imageFormat = QImage::Format_ARGB32_Premultiplied;
+ bool m_imageRgbSwap = false;
xcb_sync_int64_t m_syncValue;
- xcb_sync_counter_t m_syncCounter;
+ xcb_sync_counter_t m_syncCounter = 0;
- Qt::WindowState m_windowState;
+ Qt::WindowState m_windowState = Qt::WindowNoState;
- xcb_gravity_t m_gravity;
+ xcb_gravity_t m_gravity = XCB_GRAVITY_STATIC;
- bool m_mapped;
- bool m_transparent;
- bool m_usingSyncProtocol;
- bool m_deferredActivation;
- bool m_embedded;
- bool m_alertState;
- xcb_window_t m_netWmUserTimeWindow;
+ bool m_mapped = false;
+ bool m_transparent = false;
+ bool m_usingSyncProtocol = false;
+ bool m_deferredActivation = false;
+ bool m_embedded = false;
+ bool m_alertState = false;
+ xcb_window_t m_netWmUserTimeWindow = XCB_NONE;
QSurfaceFormat m_format;
- mutable bool m_dirtyFrameMargins;
+ mutable bool m_dirtyFrameMargins = false;
mutable QMargins m_frameMargins;
QRegion m_exposeRegion;
QSize m_oldWindowSize;
- xcb_visualid_t m_visualId;
- int m_lastWindowStateEvent;
+ xcb_visualid_t m_visualId = 0;
+ int m_lastWindowStateEvent = -1;
enum SyncState {
NoSyncNeeded,
SyncReceived,
SyncAndConfigureReceived
};
- SyncState m_syncState;
+ SyncState m_syncState = NoSyncNeeded;
- QXcbSyncWindowRequest *m_pendingSyncRequest;
- xcb_cursor_t m_currentBitmapCursor;
+ QXcbSyncWindowRequest *m_pendingSyncRequest = nullptr;
+ xcb_cursor_t m_currentBitmapCursor = XCB_CURSOR_NONE;
};
QT_END_NAMESPACE
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 941c25361f..620d9cb8c9 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -1,7 +1,7 @@
TEMPLATE = subdirs
QT_FOR_CONFIG += network
-SUBDIRS *= sqldrivers
+qtHaveModule(sql): SUBDIRS += sqldrivers
qtHaveModule(network):qtConfig(bearermanagement): SUBDIRS += bearer
qtHaveModule(gui) {
SUBDIRS *= platforms platforminputcontexts platformthemes
diff --git a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
index 0bea9ebfa1..7cfa554418 100644
--- a/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
+++ b/src/plugins/sqldrivers/mysql/qsql_mysql.cpp
@@ -699,10 +699,8 @@ QVariant QMYSQLResult::data(int field)
}
if(ok)
return v;
- else
- return QVariant();
+ return QVariant();
}
- return QVariant(val.toDouble());
case QVariant::Date:
return qDateFromString(val);
case QVariant::Time:
@@ -719,12 +717,11 @@ QVariant QMYSQLResult::data(int field)
}
return QVariant(ba);
}
- default:
case QVariant::String:
+ default:
return QVariant(val);
}
- qWarning("QMYSQLResult::data: unknown data type");
- return QVariant();
+ Q_UNREACHABLE();
}
bool QMYSQLResult::isNull(int field)
diff --git a/src/plugins/sqldrivers/oci/qsql_oci.cpp b/src/plugins/sqldrivers/oci/qsql_oci.cpp
index 47d6db7ea4..32d3681a17 100644
--- a/src/plugins/sqldrivers/oci/qsql_oci.cpp
+++ b/src/plugins/sqldrivers/oci/qsql_oci.cpp
@@ -2405,16 +2405,16 @@ static QString make_where_clause(const QString &user, Expression e)
static const char joinC[][4] = { "or" , "and" };
static Q_CONSTEXPR QLatin1Char bang[] = { QLatin1Char(' '), QLatin1Char('!') };
- const QLatin1String join(joinC[e], -1); // -1: force strlen call
+ const QLatin1String join(joinC[e]);
QString result;
result.reserve(sizeof sysUsers / sizeof *sysUsers *
// max-sizeof(owner != <sysuser> and )
(9 + sizeof *sysUsers + 5));
for (const auto &sysUser : sysUsers) {
- const QLatin1String l1(sysUser, -1); // -1: force strlen call
+ const QLatin1String l1(sysUser);
if (l1 != user)
- result += QLatin1String("owner ") + bang[e] + QLatin1String("= '") + l1 + QLatin1Char(' ') + join + QLatin1Char(' ');
+ result += QLatin1String("owner ") + bang[e] + QLatin1String("= '") + l1 + QLatin1String("' ") + join + QLatin1Char(' ');
}
result.chop(join.size() + 2); // remove final " <join> "