summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/bearer/bearer.pro2
-rw-r--r--src/plugins/bearer/nativewifi/main.cpp21
-rw-r--r--src/plugins/bearer/nativewifi/qnativewifiengine.cpp2
-rw-r--r--src/plugins/platforms/android/qandroidinputcontext.cpp7
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoacursor.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoafiledialoghelper.h14
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.h26
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.h4
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.h22
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h52
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm4
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.mm40
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmscursor.cpp45
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp25
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.h6
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp9
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.h3
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.cpp5
-rw-r--r--src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.h7
-rw-r--r--src/plugins/platforms/ios/qiosfileengineassetslibrary.mm4
-rw-r--r--src/plugins/platforms/ios/qioswindow.h2
-rw-r--r--src/plugins/platforms/ios/qioswindow.mm7
-rw-r--r--src/plugins/platforms/qnx/qqnxintegration.cpp4
-rw-r--r--src/plugins/platforms/windows/windows.pri16
-rw-r--r--src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp4
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.cpp11
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection.h1
-rw-r--r--src/plugins/platforms/xcb/qxcbconnection_xi2.cpp25
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.cpp6
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.cpp12
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.h2
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.cpp117
-rw-r--r--src/plugins/platforms/xcb/qxcbwindow.h3
-rw-r--r--src/plugins/plugins.pro2
37 files changed, 320 insertions, 198 deletions
diff --git a/src/plugins/bearer/bearer.pro b/src/plugins/bearer/bearer.pro
index 7637bf1f5e..2239d52737 100644
--- a/src/plugins/bearer/bearer.pro
+++ b/src/plugins/bearer/bearer.pro
@@ -8,7 +8,7 @@ TEMPLATE = subdirs
#win32:SUBDIRS += nla
win32:SUBDIRS += generic
blackberry:SUBDIRS += blackberry
-win32:!wince*:SUBDIRS += nativewifi
+win32:!wince: SUBDIRS += nativewifi
mac:contains(QT_CONFIG, corewlan):SUBDIRS += corewlan
mac:SUBDIRS += generic
android:!android-no-sdk:SUBDIRS += android
diff --git a/src/plugins/bearer/nativewifi/main.cpp b/src/plugins/bearer/nativewifi/main.cpp
index d5669e803a..48d79d37ee 100644
--- a/src/plugins/bearer/nativewifi/main.cpp
+++ b/src/plugins/bearer/nativewifi/main.cpp
@@ -56,26 +56,27 @@ static void resolveLibrary()
#endif
if (!triedResolve.load()) {
+ QLibrary wlanapiLib(QLatin1String("wlanapi"));
local_WlanOpenHandle = (WlanOpenHandleProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanOpenHandle");
+ wlanapiLib.resolve("WlanOpenHandle");
local_WlanRegisterNotification = (WlanRegisterNotificationProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanRegisterNotification");
+ wlanapiLib.resolve("WlanRegisterNotification");
local_WlanEnumInterfaces = (WlanEnumInterfacesProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanEnumInterfaces");
+ wlanapiLib.resolve("WlanEnumInterfaces");
local_WlanGetAvailableNetworkList = (WlanGetAvailableNetworkListProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanGetAvailableNetworkList");
+ wlanapiLib.resolve("WlanGetAvailableNetworkList");
local_WlanQueryInterface = (WlanQueryInterfaceProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanQueryInterface");
+ wlanapiLib.resolve("WlanQueryInterface");
local_WlanConnect = (WlanConnectProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanConnect");
+ wlanapiLib.resolve("WlanConnect");
local_WlanDisconnect = (WlanDisconnectProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanDisconnect");
+ wlanapiLib.resolve("WlanDisconnect");
local_WlanScan = (WlanScanProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanScan");
+ wlanapiLib.resolve("WlanScan");
local_WlanFreeMemory = (WlanFreeMemoryProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanFreeMemory");
+ wlanapiLib.resolve("WlanFreeMemory");
local_WlanCloseHandle = (WlanCloseHandleProto)
- QLibrary::resolve(QLatin1String("wlanapi.dll"), "WlanCloseHandle");
+ wlanapiLib.resolve("WlanCloseHandle");
triedResolve.storeRelease(true);
}
diff --git a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
index 19852b70a8..7baea55ee7 100644
--- a/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
+++ b/src/plugins/bearer/nativewifi/qnativewifiengine.cpp
@@ -606,7 +606,7 @@ bool QNativeWifiEngine::requiresPolling() const
{
// On Windows XP SP2 and SP3 only connection and disconnection notifications are available.
// We need to poll for changes in available wireless networks.
- return true;
+ return QSysInfo::WindowsVersion <= QSysInfo::WV_2003;
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp
index 5c8406ca03..d264f74d66 100644
--- a/src/plugins/platforms/android/qandroidinputcontext.cpp
+++ b/src/plugins/platforms/android/qandroidinputcontext.cpp
@@ -650,6 +650,11 @@ jboolean QAndroidInputContext::deleteSurroundingText(jint leftLength, jint right
m_composingText.clear();
m_composingTextStart = -1;
+ if (leftLength < 0) {
+ rightLength += -leftLength;
+ leftLength = 0;
+ }
+
QInputMethodEvent event;
event.setCommitString(QString(), -leftLength, leftLength+rightLength);
sendInputMethodEventThreadSafe(&event);
@@ -912,7 +917,7 @@ jboolean QAndroidInputContext::setComposingRegion(jint start, jint end)
m_blockUpdateSelection = updateSelectionWasBlocked;
#ifdef QT_DEBUG_ANDROID_IM_PROTOCOL
- QSharedPointer<QInputMethodQueryEvent> query2 = focusObjectInputMethodQuery();
+ QSharedPointer<QInputMethodQueryEvent> query2 = focusObjectInputMethodQueryThreadSafe();
if (!query2.isNull()) {
qDebug() << "Setting. Prev local cpos:" << localPos << "block pos:" <<blockPosition << "comp.start:" << m_composingTextStart << "rel.start:" << relativeStart << "len:" << length << "cpos attr:" << localPos - localStart;
qDebug() << "New cursor pos" << getAbsoluteCursorPosition(query2);
diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
index f3a0216870..6c673a4f5d 100644
--- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
+++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm
@@ -131,8 +131,8 @@ QT_END_NAMESPACE
@synchronized(self) {
if (sharedCocoaApplicationDelegate == nil) {
sharedCocoaApplicationDelegate = [super allocWithZone:zone];
- return sharedCocoaApplicationDelegate;
qAddPostRoutine(cleanupCocoaApplicationDelegate);
+ return sharedCocoaApplicationDelegate;
}
}
return nil;
diff --git a/src/plugins/platforms/cocoa/qcocoacursor.mm b/src/plugins/platforms/cocoa/qcocoacursor.mm
index 06e957cd86..922809f90d 100644
--- a/src/plugins/platforms/cocoa/qcocoacursor.mm
+++ b/src/plugins/platforms/cocoa/qcocoacursor.mm
@@ -73,7 +73,7 @@ void QCocoaCursor::setPos(const QPoint &position)
pos.x = position.x();
pos.y = position.y();
- CGEventRef e = CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, 0);
+ CGEventRef e = CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, kCGMouseButtonLeft);
CGEventPost(kCGHIDEventTap, e);
CFRelease(e);
}
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h
index 48d7efe174..576bb3af08 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h
@@ -50,19 +50,19 @@ public:
QCocoaFileDialogHelper();
virtual ~QCocoaFileDialogHelper();
- void exec();
+ void exec() Q_DECL_OVERRIDE;
- bool defaultNameFilterDisables() const;
+ bool defaultNameFilterDisables() const Q_DECL_OVERRIDE;
- bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent);
- void hide();
+ bool show(Qt::WindowFlags windowFlags, Qt::WindowModality windowModality, QWindow *parent) Q_DECL_OVERRIDE;
+ void hide() Q_DECL_OVERRIDE;
void setDirectory(const QUrl &directory) Q_DECL_OVERRIDE;
QUrl directory() const Q_DECL_OVERRIDE;
void selectFile(const QUrl &filename) Q_DECL_OVERRIDE;
QList<QUrl> selectedFiles() const Q_DECL_OVERRIDE;
- void setFilter();
- void selectNameFilter(const QString &filter);
- QString selectedNameFilter() const;
+ void setFilter() Q_DECL_OVERRIDE;
+ void selectNameFilter(const QString &filter) Q_DECL_OVERRIDE;
+ QString selectedNameFilter() const Q_DECL_OVERRIDE;
public:
bool showCocoaFilePanel(Qt::WindowModality windowModality, QWindow *parent);
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h
index ee42a83446..8b5d78826c 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.h
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.h
@@ -61,19 +61,19 @@ public:
// ----------------------------------------------------
// Virtual methods overridden from QPlatformScreen
- QPixmap grabWindow(WId window, int x, int y, int width, int height) const;
- QRect geometry() const { return m_geometry; }
- QRect availableGeometry() const { return m_availableGeometry; }
- int depth() const { return m_depth; }
- QImage::Format format() const { return m_format; }
- qreal devicePixelRatio() const;
- QSizeF physicalSize() const { return m_physicalSize; }
- QDpi logicalDpi() const { return m_logicalDpi; }
- qreal refreshRate() const { return m_refreshRate; }
- QString name() const { return m_name; }
- QPlatformCursor *cursor() const { return m_cursor; }
- QWindow *topLevelAt(const QPoint &point) const;
- QList<QPlatformScreen *> virtualSiblings() const { return m_siblings; }
+ QPixmap grabWindow(WId window, int x, int y, int width, int height) const Q_DECL_OVERRIDE;
+ QRect geometry() const Q_DECL_OVERRIDE { return m_geometry; }
+ QRect availableGeometry() const Q_DECL_OVERRIDE { return m_availableGeometry; }
+ int depth() const Q_DECL_OVERRIDE { return m_depth; }
+ QImage::Format format() const Q_DECL_OVERRIDE { return m_format; }
+ qreal devicePixelRatio() const Q_DECL_OVERRIDE;
+ QSizeF physicalSize() const Q_DECL_OVERRIDE { return m_physicalSize; }
+ QDpi logicalDpi() const Q_DECL_OVERRIDE { return m_logicalDpi; }
+ qreal refreshRate() const Q_DECL_OVERRIDE { return m_refreshRate; }
+ QString name() const Q_DECL_OVERRIDE { return m_name; }
+ QPlatformCursor *cursor() const Q_DECL_OVERRIDE { return m_cursor; }
+ QWindow *topLevelAt(const QPoint &point) const Q_DECL_OVERRIDE;
+ QList<QPlatformScreen *> virtualSiblings() const Q_DECL_OVERRIDE { return m_siblings; }
// ----------------------------------------------------
// Additional methods
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm
index dd2c37d914..6668080725 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenu.mm
@@ -163,6 +163,8 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QCocoaMenuDelegate);
// Whatever the current first responder is, let's give it a chance
// and do not touch the Qt's focusObject (which is different from some native view
// having a focus inside NSSave/OpenPanel.
+ *target = nil;
+ *action = menuItem.action;
return YES;
}
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.h b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
index 0b95fea7ae..2250f7c084 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.h
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.h
@@ -54,9 +54,9 @@ public:
QCocoaNativeInterface();
#ifndef QT_NO_OPENGL
- void *nativeResourceForContext(const QByteArray &resourceString, QOpenGLContext *context);
+ void *nativeResourceForContext(const QByteArray &resourceString, QOpenGLContext *context) Q_DECL_OVERRIDE;
#endif
- void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window);
+ void *nativeResourceForWindow(const QByteArray &resourceString, QWindow *window) Q_DECL_OVERRIDE;
NativeResourceForIntegrationFunction nativeResourceFunctionForIntegration(const QByteArray &resource) Q_DECL_OVERRIDE;
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.h b/src/plugins/platforms/cocoa/qcocoatheme.h
index 203f05c8bb..0cd7b7d4c8 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.h
+++ b/src/plugins/platforms/cocoa/qcocoatheme.h
@@ -46,25 +46,25 @@ public:
QCocoaTheme();
~QCocoaTheme();
- virtual QPlatformMenuItem* createPlatformMenuItem() const;
- virtual QPlatformMenu* createPlatformMenu() const;
- virtual QPlatformMenuBar* createPlatformMenuBar() const;
+ QPlatformMenuItem* createPlatformMenuItem() const Q_DECL_OVERRIDE;
+ QPlatformMenu* createPlatformMenu() const Q_DECL_OVERRIDE;
+ QPlatformMenuBar* createPlatformMenuBar() const Q_DECL_OVERRIDE;
#ifndef QT_NO_SYSTEMTRAYICON
- QPlatformSystemTrayIcon *createPlatformSystemTrayIcon() const;
+ QPlatformSystemTrayIcon *createPlatformSystemTrayIcon() const Q_DECL_OVERRIDE;
#endif
- bool usePlatformNativeDialog(DialogType dialogType) const;
- QPlatformDialogHelper *createPlatformDialogHelper(DialogType dialogType) const;
+ bool usePlatformNativeDialog(DialogType dialogType) const Q_DECL_OVERRIDE;
+ QPlatformDialogHelper *createPlatformDialogHelper(DialogType dialogType) const Q_DECL_OVERRIDE;
- const QPalette *palette(Palette type = SystemPalette) const;
- const QFont *font(Font type = SystemFont) const;
- QPixmap standardPixmap(StandardPixmap sp, const QSizeF &size) const;
+ const QPalette *palette(Palette type = SystemPalette) const Q_DECL_OVERRIDE;
+ const QFont *font(Font type = SystemFont) const Q_DECL_OVERRIDE;
+ QPixmap standardPixmap(StandardPixmap sp, const QSizeF &size) const Q_DECL_OVERRIDE;
QPixmap fileIconPixmap(const QFileInfo &fileInfo,
const QSizeF &size,
- QPlatformTheme::IconOptions options = 0) const;
+ QPlatformTheme::IconOptions options = 0) const Q_DECL_OVERRIDE;
- QVariant themeHint(ThemeHint hint) const;
+ QVariant themeHint(ThemeHint hint) const Q_DECL_OVERRIDE;
QString standardButtonText(int button) const Q_DECL_OVERRIDE;
static const char *name;
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 4064f31cd7..455d4a8580 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -142,37 +142,37 @@ public:
QCocoaWindow(QWindow *tlw);
~QCocoaWindow();
- void setGeometry(const QRect &rect);
- QRect geometry() const;
+ void setGeometry(const QRect &rect) Q_DECL_OVERRIDE;
+ QRect geometry() const Q_DECL_OVERRIDE;
void setCocoaGeometry(const QRect &rect);
void clipChildWindows();
void clipWindow(const NSRect &clipRect);
void show(bool becauseOfAncestor = false);
void hide(bool becauseOfAncestor = false);
- void setVisible(bool visible);
- void setWindowFlags(Qt::WindowFlags flags);
- void setWindowState(Qt::WindowState state);
- void setWindowTitle(const QString &title);
- void setWindowFilePath(const QString &filePath);
- void setWindowIcon(const QIcon &icon);
- void setAlertState(bool enabled);
- bool isAlertState() const;
- void raise();
- void lower();
- bool isExposed() const;
+ void setVisible(bool visible) Q_DECL_OVERRIDE;
+ void setWindowFlags(Qt::WindowFlags flags) Q_DECL_OVERRIDE;
+ void setWindowState(Qt::WindowState state) Q_DECL_OVERRIDE;
+ void setWindowTitle(const QString &title) Q_DECL_OVERRIDE;
+ void setWindowFilePath(const QString &filePath) Q_DECL_OVERRIDE;
+ void setWindowIcon(const QIcon &icon) Q_DECL_OVERRIDE;
+ void setAlertState(bool enabled) Q_DECL_OVERRIDE;
+ bool isAlertState() const Q_DECL_OVERRIDE;
+ void raise() Q_DECL_OVERRIDE;
+ void lower() Q_DECL_OVERRIDE;
+ bool isExposed() const Q_DECL_OVERRIDE;
bool isOpaque() const;
- void propagateSizeHints();
- void setOpacity(qreal level);
- void setMask(const QRegion &region);
- bool setKeyboardGrabEnabled(bool grab);
- bool setMouseGrabEnabled(bool grab);
- QMargins frameMargins() const;
- QSurfaceFormat format() const;
+ void propagateSizeHints() Q_DECL_OVERRIDE;
+ void setOpacity(qreal level) Q_DECL_OVERRIDE;
+ void setMask(const QRegion &region) Q_DECL_OVERRIDE;
+ bool setKeyboardGrabEnabled(bool grab) Q_DECL_OVERRIDE;
+ bool setMouseGrabEnabled(bool grab) Q_DECL_OVERRIDE;
+ QMargins frameMargins() const Q_DECL_OVERRIDE;
+ QSurfaceFormat format() const Q_DECL_OVERRIDE;
- void requestActivateWindow();
+ void requestActivateWindow() Q_DECL_OVERRIDE;
- WId winId() const;
- void setParent(const QPlatformWindow *window);
+ WId winId() const Q_DECL_OVERRIDE;
+ void setParent(const QPlatformWindow *window) Q_DECL_OVERRIDE;
NSView *contentView() const;
void setContentView(NSView *contentView);
@@ -202,8 +202,8 @@ public:
bool setWindowModified(bool modified) Q_DECL_OVERRIDE;
- void setFrameStrutEventsEnabled(bool enabled);
- bool frameStrutEventsEnabled() const
+ void setFrameStrutEventsEnabled(bool enabled) Q_DECL_OVERRIDE;
+ bool frameStrutEventsEnabled() const Q_DECL_OVERRIDE
{ return m_frameStrutEventsEnabled; }
void setMenubar(QCocoaMenuBar *mb);
@@ -220,7 +220,7 @@ public:
void applyContentBorderThickness(NSWindow *window);
void updateNSToolbar();
- qreal devicePixelRatio() const;
+ qreal devicePixelRatio() const Q_DECL_OVERRIDE;
bool isWindowExposable();
void exposeWindow();
void obscureWindow();
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index 92fc66a04f..3188463dbe 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -1254,7 +1254,9 @@ QCocoaGLContext *QCocoaWindow::currentContext() const
void QCocoaWindow::recreateWindow(const QPlatformWindow *parentWindow)
{
bool wasNSWindowChild = m_isNSWindowChild;
- m_isNSWindowChild = parentWindow && (window()->property("_q_platform_MacUseNSWindow").toBool());
+ BOOL requestNSWindowChild = qt_mac_resolveOption(NO, window(), "_q_platform_MacUseNSWindow",
+ "QT_MAC_USE_NSWINDOW");
+ m_isNSWindowChild = parentWindow && requestNSWindowChild;
bool needsNSWindow = m_isNSWindowChild || !parentWindow;
QCocoaWindow *oldParentCocoaWindow = m_parentCocoaWindow;
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index 32bc15d092..05ab8ae2c7 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -57,7 +57,7 @@ Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(QNSViewMouseMoveHelper));
CGImageRef m_maskImage;
uchar *m_maskData;
bool m_shouldInvalidateWindowShadow;
- QWindow *m_window;
+ QPointer<QWindow> m_window;
QCocoaWindow *m_platformWindow;
NSTrackingArea *m_trackingArea;
Qt::MouseButtons m_buttons;
diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm
index d44cdb392c..355704ff37 100644
--- a/src/plugins/platforms/cocoa/qnsview.mm
+++ b/src/plugins/platforms/cocoa/qnsview.mm
@@ -608,7 +608,7 @@ QT_WARNING_POP
- (BOOL)becomeFirstResponder
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return NO;
if (!m_platformWindow->windowIsPopupType())
QWindowSystemInterface::handleWindowActivated([self topLevelWindow]);
@@ -619,7 +619,7 @@ QT_WARNING_POP
{
if (m_platformWindow->shouldRefuseKeyWindowAndFirstResponder())
return NO;
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return NO;
if ((m_window->flags() & Qt::ToolTip) == Qt::ToolTip)
return NO;
@@ -629,7 +629,7 @@ QT_WARNING_POP
- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent
{
Q_UNUSED(theEvent)
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return NO;
return YES;
}
@@ -768,7 +768,7 @@ QT_WARNING_POP
- (void)mouseDown:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super mouseDown:theEvent];
m_sendUpAsRightButton = false;
@@ -819,7 +819,7 @@ QT_WARNING_POP
- (void)mouseDragged:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super mouseDragged:theEvent];
if (!(m_buttons & (m_sendUpAsRightButton ? Qt::RightButton : Qt::LeftButton)))
qWarning("QNSView mouseDragged: Internal mouse button tracking invalid (missing Qt::LeftButton)");
@@ -828,7 +828,7 @@ QT_WARNING_POP
- (void)mouseUp:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super mouseUp:theEvent];
if (m_sendUpAsRightButton) {
m_buttons &= ~Qt::RightButton;
@@ -884,7 +884,7 @@ QT_WARNING_POP
- (void)mouseMovedImpl:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return;
QPointF windowPoint;
@@ -917,7 +917,7 @@ QT_WARNING_POP
Q_UNUSED(theEvent)
m_platformWindow->m_windowUnderMouse = true;
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return;
// Top-level windows generate enter events for sub-windows.
@@ -936,7 +936,7 @@ QT_WARNING_POP
Q_UNUSED(theEvent);
m_platformWindow->m_windowUnderMouse = false;
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return;
// Top-level windows generate leave events for sub-windows.
@@ -949,7 +949,7 @@ QT_WARNING_POP
- (void)rightMouseDown:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super rightMouseDown:theEvent];
m_buttons |= Qt::RightButton;
m_sendUpAsRightButton = true;
@@ -958,7 +958,7 @@ QT_WARNING_POP
- (void)rightMouseDragged:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super rightMouseDragged:theEvent];
if (!(m_buttons & Qt::RightButton))
qWarning("QNSView rightMouseDragged: Internal mouse button tracking invalid (missing Qt::RightButton)");
@@ -967,7 +967,7 @@ QT_WARNING_POP
- (void)rightMouseUp:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super rightMouseUp:theEvent];
m_buttons &= ~Qt::RightButton;
m_sendUpAsRightButton = false;
@@ -976,7 +976,7 @@ QT_WARNING_POP
- (void)otherMouseDown:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super otherMouseDown:theEvent];
m_buttons |= cocoaButton2QtButton([theEvent buttonNumber]);
[self handleMouseEvent:theEvent];
@@ -984,7 +984,7 @@ QT_WARNING_POP
- (void)otherMouseDragged:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super otherMouseDragged:theEvent];
if (!(m_buttons & ~(Qt::LeftButton | Qt::RightButton)))
qWarning("QNSView otherMouseDragged: Internal mouse button tracking invalid (missing Qt::MiddleButton or Qt::ExtraButton*)");
@@ -993,7 +993,7 @@ QT_WARNING_POP
- (void)otherMouseUp:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super otherMouseUp:theEvent];
m_buttons &= ~cocoaButton2QtButton([theEvent buttonNumber]);
[self handleMouseEvent:theEvent];
@@ -1072,7 +1072,7 @@ Q_GLOBAL_STATIC(QCocoaTabletDeviceDataHash, tabletDeviceDataHash)
- (void)tabletPoint: (NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super tabletPoint:theEvent];
[self handleTabletEvent: theEvent];
@@ -1120,7 +1120,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
- (void)tabletProximity: (NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super tabletProximity:theEvent];
ulong timestamp = [theEvent timestamp] * 1000;
@@ -1292,7 +1292,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
#ifndef QT_NO_WHEELEVENT
- (void)scrollWheel:(NSEvent *)theEvent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super scrollWheel:theEvent];
QPoint angleDelta;
@@ -1465,14 +1465,14 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
- (void)keyDown:(NSEvent *)nsevent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super keyDown:nsevent];
[self handleKeyEvent:nsevent eventType:int(QEvent::KeyPress)];
}
- (void)keyUp:(NSEvent *)nsevent
{
- if (m_window->flags() & Qt::WindowTransparentForInput)
+ if (m_window && (m_window->flags() & Qt::WindowTransparentForInput) )
return [super keyUp:nsevent];
[self handleKeyEvent:nsevent eventType:int(QEvent::KeyRelease)];
}
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmscursor.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmscursor.cpp
index cd92c49ff1..fe47c947b4 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmscursor.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmscursor.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
@@ -87,8 +88,11 @@ QEglFSKmsCursor::QEglFSKmsCursor(QEglFSKmsScreen *screen)
QEglFSKmsCursor::~QEglFSKmsCursor()
{
- drmModeSetCursor(m_screen->device()->fd(), m_screen->output().crtc_id, 0, 0, 0);
- drmModeMoveCursor(m_screen->device()->fd(), m_screen->output().crtc_id, 0, 0);
+ Q_FOREACH (QPlatformScreen *screen, m_screen->virtualSiblings()) {
+ QEglFSKmsScreen *kmsScreen = static_cast<QEglFSKmsScreen *>(screen);
+ drmModeSetCursor(kmsScreen->device()->fd(), kmsScreen->output().crtc_id, 0, 0, 0);
+ drmModeMoveCursor(kmsScreen->device()->fd(), kmsScreen->output().crtc_id, 0, 0);
+ }
gbm_bo_destroy(m_bo);
m_bo = Q_NULLPTR;
@@ -143,10 +147,15 @@ void QEglFSKmsCursor::changeCursor(QCursor *windowCursor, QWindow *window)
gbm_bo_write(m_bo, cursorImage.constBits(), cursorImage.byteCount());
uint32_t handle = gbm_bo_get_handle(m_bo).u32;
- int status = drmModeSetCursor(m_screen->device()->fd(), m_screen->output().crtc_id, handle,
- m_cursorSize.width(), m_cursorSize.height());
- if (status != 0)
- qWarning("Could not set cursor: %d", status);
+
+ Q_FOREACH (QPlatformScreen *screen, m_screen->virtualSiblings()) {
+ QEglFSKmsScreen *kmsScreen = static_cast<QEglFSKmsScreen *>(screen);
+
+ int status = drmModeSetCursor(kmsScreen->device()->fd(), kmsScreen->output().crtc_id, handle,
+ m_cursorSize.width(), m_cursorSize.height());
+ if (status != 0)
+ qWarning("Could not set cursor on screen %s: %d", kmsScreen->name().toLatin1().constData(), status);
+ }
}
#endif // QT_NO_CURSOR
@@ -157,12 +166,17 @@ QPoint QEglFSKmsCursor::pos() const
void QEglFSKmsCursor::setPos(const QPoint &pos)
{
- QPoint adjustedPos = pos - m_cursorImage.hotspot();
- int ret = drmModeMoveCursor(m_screen->device()->fd(), m_screen->output().crtc_id, adjustedPos.x(), adjustedPos.y());
- if (ret == 0) {
- m_pos = pos;
- } else {
- qWarning("Failed to move cursor: %d", ret);
+ Q_FOREACH (QPlatformScreen *screen, m_screen->virtualSiblings()) {
+ QEglFSKmsScreen *kmsScreen = static_cast<QEglFSKmsScreen *>(screen);
+ QPoint origin = kmsScreen->geometry().topLeft();
+ QPoint localPos = pos - origin;
+ QPoint adjustedPos = localPos - m_cursorImage.hotspot();
+
+ int ret = drmModeMoveCursor(kmsScreen->device()->fd(), kmsScreen->output().crtc_id, adjustedPos.x(), adjustedPos.y());
+ if (ret == 0)
+ m_pos = pos;
+ else
+ qWarning("Failed to move cursor on screen %s: %d", kmsScreen->name().toLatin1().constData(), ret);
}
}
@@ -176,8 +190,11 @@ void QEglFSKmsCursor::initCursorAtlas()
QFile file(QString::fromUtf8(json));
if (!file.open(QFile::ReadOnly)) {
- drmModeSetCursor(m_screen->device()->fd(), m_screen->output().crtc_id, 0, 0, 0);
- drmModeMoveCursor(m_screen->device()->fd(), m_screen->output().crtc_id, 0, 0);
+ Q_FOREACH (QPlatformScreen *screen, m_screen->virtualSiblings()) {
+ QEglFSKmsScreen *kmsScreen = static_cast<QEglFSKmsScreen *>(screen);
+ drmModeSetCursor(kmsScreen->device()->fd(), kmsScreen->output().crtc_id, 0, 0, 0);
+ drmModeMoveCursor(kmsScreen->device()->fd(), kmsScreen->output().crtc_id, 0, 0);
+ }
m_visible = false;
return;
}
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp
index bafe1e3324..18a66e34f5 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
@@ -308,6 +309,7 @@ QEglFSKmsDevice::QEglFSKmsDevice(QEglFSKmsIntegration *integration, const QStrin
, m_gbm_device(Q_NULLPTR)
, m_crtc_allocator(0)
, m_connector_allocator(0)
+ , m_globalCursor(Q_NULLPTR)
{
}
@@ -347,6 +349,10 @@ void QEglFSKmsDevice::close()
qt_safe_close(m_dri_fd);
m_dri_fd = -1;
}
+
+ if (m_globalCursor)
+ m_globalCursor->deleteLater();
+ m_globalCursor = Q_NULLPTR;
}
void QEglFSKmsDevice::createScreens()
@@ -357,6 +363,8 @@ void QEglFSKmsDevice::createScreens()
return;
}
+ QEglFSKmsScreen *primaryScreen = Q_NULLPTR;
+ QList<QPlatformScreen *> siblings;
QPoint pos(0, 0);
QEglFSIntegration *integration = static_cast<QEglFSIntegration *>(QGuiApplicationPrivate::platformIntegration());
@@ -369,12 +377,24 @@ void QEglFSKmsDevice::createScreens()
if (screen) {
integration->addScreen(screen);
pos.rx() += screen->geometry().width();
+ siblings << screen;
+
+ if (!primaryScreen)
+ primaryScreen = screen;
}
drmModeFreeConnector(connector);
}
drmModeFreeResources(resources);
+
+ if (!m_integration->separateScreens()) {
+ Q_FOREACH (QPlatformScreen *screen, siblings)
+ static_cast<QEglFSKmsScreen *>(screen)->setVirtualSiblings(siblings);
+
+ if (primaryScreen)
+ m_globalCursor = new QEglFSKmsCursor(primaryScreen);
+ }
}
gbm_device *QEglFSKmsDevice::device() const
@@ -387,6 +407,11 @@ int QEglFSKmsDevice::fd() const
return m_dri_fd;
}
+QPlatformCursor *QEglFSKmsDevice::globalCursor() const
+{
+ return m_globalCursor;
+}
+
void QEglFSKmsDevice::handleDrmEvent()
{
drmEventContext drmEvent = {
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.h
index 29a1332c9a..23fca934e5 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.h
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsdevice.h
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
@@ -34,6 +35,7 @@
#ifndef QEGLFSKMSDEVICE_H
#define QEGLFSKMSDEVICE_H
+#include "qeglfskmscursor.h"
#include "qeglfskmsintegration.h"
#include <xf86drm.h>
@@ -57,6 +59,8 @@ public:
gbm_device *device() const;
int fd() const;
+ QPlatformCursor *globalCursor() const;
+
void handleDrmEvent();
private:
@@ -70,6 +74,8 @@ private:
quint32 m_crtc_allocator;
quint32 m_connector_allocator;
+ QEglFSKmsCursor *m_globalCursor;
+
int crtcForConnector(drmModeResPtr resources, drmModeConnectorPtr connector);
QEglFSKmsScreen *screenForConnector(drmModeResPtr resources, drmModeConnectorPtr connector, QPoint pos);
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp
index 7bb932cf00..45224ccb87 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
@@ -60,6 +61,7 @@ QEglFSKmsIntegration::QEglFSKmsIntegration()
: m_device(Q_NULLPTR)
, m_hwCursor(true)
, m_pbuffers(false)
+ , m_separateScreens(false)
{}
void QEglFSKmsIntegration::platformInit()
@@ -203,6 +205,11 @@ bool QEglFSKmsIntegration::hwCursor() const
return m_hwCursor;
}
+bool QEglFSKmsIntegration::separateScreens() const
+{
+ return m_separateScreens;
+}
+
QMap<QString, QVariantMap> QEglFSKmsIntegration::outputSettings() const
{
return m_outputSettings;
@@ -235,6 +242,7 @@ void QEglFSKmsIntegration::loadConfig()
m_hwCursor = object.value(QStringLiteral("hwcursor")).toBool(m_hwCursor);
m_pbuffers = object.value(QStringLiteral("pbuffers")).toBool(m_pbuffers);
m_devicePath = object.value(QStringLiteral("device")).toString();
+ m_separateScreens = object.value(QStringLiteral("separateScreens")).toBool(m_separateScreens);
const QJsonArray outputs = object.value(QStringLiteral("outputs")).toArray();
for (int i = 0; i < outputs.size(); i++) {
@@ -254,6 +262,7 @@ void QEglFSKmsIntegration::loadConfig()
qCDebug(qLcEglfsKmsDebug) << "Configuration:\n"
<< "\thwcursor:" << m_hwCursor << "\n"
<< "\tpbuffers:" << m_pbuffers << "\n"
+ << "\tseparateScreens:" << m_separateScreens << "\n"
<< "\toutputs:" << m_outputSettings;
}
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.h
index 9a160d2570..edb6906a4b 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.h
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsintegration.h
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
@@ -65,6 +66,7 @@ public:
bool supportsPBuffers() const Q_DECL_OVERRIDE;
bool hwCursor() const;
+ bool separateScreens() const;
QMap<QString, QVariantMap> outputSettings() const;
private:
@@ -73,6 +75,7 @@ private:
QEglFSKmsDevice *m_device;
bool m_hwCursor;
bool m_pbuffers;
+ bool m_separateScreens;
QString m_devicePath;
QMap<QString, QVariantMap> m_outputSettings;
};
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.cpp b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.cpp
index a27819d1dd..5e49c224a0 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.cpp
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
@@ -120,6 +121,7 @@ QEglFSKmsScreen::QEglFSKmsScreen(QEglFSKmsIntegration *integration,
, m_cursor(Q_NULLPTR)
, m_interruptHandler(new QEglFSKmsInterruptHandler(this))
{
+ m_siblings << this;
}
QEglFSKmsScreen::~QEglFSKmsScreen()
@@ -185,6 +187,9 @@ QString QEglFSKmsScreen::name() const
QPlatformCursor *QEglFSKmsScreen::cursor() const
{
if (m_integration->hwCursor()) {
+ if (!m_integration->separateScreens())
+ return m_device->globalCursor();
+
if (m_cursor.isNull()) {
QEglFSKmsScreen *that = const_cast<QEglFSKmsScreen *>(this);
that->m_cursor.reset(new QEglFSKmsCursor(that));
diff --git a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.h b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.h
index 16521c7fe0..4c1b0d02ad 100644
--- a/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.h
+++ b/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsscreen.h
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2015 Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
@@ -85,6 +86,10 @@ public:
qreal refreshRate() const Q_DECL_OVERRIDE;
+ QList<QPlatformScreen *> virtualSiblings() const Q_DECL_OVERRIDE { return m_siblings; }
+ void setVirtualSiblings(QList<QPlatformScreen *> sl) { m_siblings = sl; }
+
+ QEglFSKmsIntegration *integration() const { return m_integration; }
QEglFSKmsDevice *device() const { return m_device; }
gbm_surface *surface() const { return m_gbm_surface; }
@@ -110,6 +115,8 @@ private:
QPoint m_pos;
QScopedPointer<QEglFSKmsCursor> m_cursor;
+ QList<QPlatformScreen *> m_siblings;
+
struct FrameBuffer {
FrameBuffer() : fb(0) {}
uint32_t fb;
diff --git a/src/plugins/platforms/ios/qiosfileengineassetslibrary.mm b/src/plugins/platforms/ios/qiosfileengineassetslibrary.mm
index 44a7901160..f0b6afce2d 100644
--- a/src/plugins/platforms/ios/qiosfileengineassetslibrary.mm
+++ b/src/plugins/platforms/ios/qiosfileengineassetslibrary.mm
@@ -429,11 +429,11 @@ void QIOSFileEngineAssetsLibrary::setFileName(const QString &file)
// QUrl::fromLocalFile() will remove double slashes. Since the asset url is
// passed around as a file name in the app (and converted to/from a file url, e.g
// in QFileDialog), we need to ensure that m_assetUrl ends up being valid.
- int index = file.indexOf(QLatin1String("asset.JPG?"));
+ int index = file.indexOf(QLatin1String("/asset"));
if (index == -1)
m_assetUrl = QLatin1String("assets-library://");
else
- m_assetUrl = QLatin1String("assets-library://asset/") + file.mid(index);
+ m_assetUrl = QLatin1String("assets-library:/") + file.mid(index);
}
QStringList QIOSFileEngineAssetsLibrary::entryList(QDir::Filters filters, const QStringList &filterNames) const
diff --git a/src/plugins/platforms/ios/qioswindow.h b/src/plugins/platforms/ios/qioswindow.h
index b45f629310..c53eee1afd 100644
--- a/src/plugins/platforms/ios/qioswindow.h
+++ b/src/plugins/platforms/ios/qioswindow.h
@@ -80,6 +80,8 @@ public:
void clearAccessibleCache();
+ QSurfaceFormat format() const Q_DECL_OVERRIDE;
+
private:
void applicationStateChanged(Qt::ApplicationState state);
void applyGeometry(const QRect &rect);
diff --git a/src/plugins/platforms/ios/qioswindow.mm b/src/plugins/platforms/ios/qioswindow.mm
index 80fba00ffb..3045a15380 100644
--- a/src/plugins/platforms/ios/qioswindow.mm
+++ b/src/plugins/platforms/ios/qioswindow.mm
@@ -93,6 +93,13 @@ QIOSWindow::~QIOSWindow()
[m_view release];
}
+
+QSurfaceFormat QIOSWindow::format() const
+{
+ return window()->requestedFormat();
+}
+
+
bool QIOSWindow::blockedByModal()
{
QWindow *modalWindow = QGuiApplication::modalWindow();
diff --git a/src/plugins/platforms/qnx/qqnxintegration.cpp b/src/plugins/platforms/qnx/qqnxintegration.cpp
index 1bcf8036bb..071bab7920 100644
--- a/src/plugins/platforms/qnx/qqnxintegration.cpp
+++ b/src/plugins/platforms/qnx/qqnxintegration.cpp
@@ -560,7 +560,9 @@ void QQnxIntegration::removeDisplay(QQnxScreen *screen)
void QQnxIntegration::destroyDisplays()
{
qIntegrationDebug() << Q_FUNC_INFO;
- qDeleteAll(m_screens);
+ Q_FOREACH (QQnxScreen *screen, m_screens) {
+ QPlatformIntegration::destroyScreen(screen);
+ }
m_screens.clear();
}
diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri
index a0460630a7..de901aaeb1 100644
--- a/src/plugins/platforms/windows/windows.pri
+++ b/src/plugins/platforms/windows/windows.pri
@@ -1,14 +1,14 @@
# Note: OpenGL32 must precede Gdi32 as it overwrites some functions.
LIBS *= -lole32
-!wince*:LIBS *= -luser32 -lwinspool -limm32 -lwinmm -loleaut32
+!wince: LIBS *= -luser32 -lwinspool -limm32 -lwinmm -loleaut32
contains(QT_CONFIG, opengl):!contains(QT_CONFIG, opengles2):!contains(QT_CONFIG, dynamicgl): LIBS *= -lopengl32
mingw: LIBS *= -luuid
# For the dialog helpers:
-!wince*:LIBS *= -lshlwapi -lshell32
-!wince*:LIBS *= -ladvapi32
-wince*:DEFINES *= QT_LIBINFIX=L"\"\\\"$${QT_LIBINFIX}\\\"\""
+!wince: LIBS *= -lshlwapi -lshell32
+!wince: LIBS *= -ladvapi32
+wince: DEFINES *= QT_LIBINFIX=L"\"\\\"$${QT_LIBINFIX}\\\"\""
DEFINES *= QT_NO_CAST_FROM_ASCII
@@ -103,22 +103,22 @@ contains(QT_CONFIG,dynamicgl) {
}
}
-!wince*:!contains( DEFINES, QT_NO_TABLETEVENT ) {
+!wince:!contains( DEFINES, QT_NO_TABLETEVENT ) {
INCLUDEPATH += $$QT_SOURCE_TREE/src/3rdparty/wintab
HEADERS += $$PWD/qwindowstabletsupport.h
SOURCES += $$PWD/qwindowstabletsupport.cpp
}
-!wince*:!contains( DEFINES, QT_NO_SESSIONMANAGER ) {
+!wince:!contains( DEFINES, QT_NO_SESSIONMANAGER ) {
SOURCES += $$PWD/qwindowssessionmanager.cpp
HEADERS += $$PWD/qwindowssessionmanager.h
}
-!wince*:!contains( DEFINES, QT_NO_IMAGEFORMAT_PNG ) {
+!wince:!contains( DEFINES, QT_NO_IMAGEFORMAT_PNG ) {
RESOURCES += $$PWD/cursors.qrc
}
-!wince*: RESOURCES += $$PWD/openglblacklists.qrc
+!wince: RESOURCES += $$PWD/openglblacklists.qrc
contains(QT_CONFIG, freetype) {
DEFINES *= QT_NO_FONTCONFIG
diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
index 5166372364..8b14fc7d70 100644
--- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
+++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qglxintegration.cpp
@@ -540,6 +540,9 @@ void QGLXContext::swapBuffers(QPlatformSurface *surface)
void (*QGLXContext::getProcAddress(const QByteArray &procName)) ()
{
+#ifdef QT_STATIC
+ return glXGetProcAddressARB(reinterpret_cast<const GLubyte *>(procName.constData()));
+#else
typedef void *(*qt_glXGetProcAddressARB)(const GLubyte *);
static qt_glXGetProcAddressARB glXGetProcAddressARB = 0;
static bool resolved = false;
@@ -569,6 +572,7 @@ void (*QGLXContext::getProcAddress(const QByteArray &procName)) ()
if (!glXGetProcAddressARB)
return 0;
return (void (*)())glXGetProcAddressARB(reinterpret_cast<const GLubyte *>(procName.constData()));
+#endif
}
QSurfaceFormat QGLXContext::format() const
diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp
index 80c844e658..b8b665157b 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection.cpp
@@ -532,9 +532,14 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGra
QStringList glIntegrationNames;
glIntegrationNames << QStringLiteral("xcb_glx") << QStringLiteral("xcb_egl");
QString glIntegrationName = QString::fromLocal8Bit(qgetenv("QT_XCB_GL_INTEGRATION"));
- if (glIntegrationName.size()) {
- glIntegrationNames.removeAll(glIntegrationName);
- glIntegrationNames.prepend(glIntegrationName);
+ if (!glIntegrationName.isEmpty()) {
+ qCDebug(QT_XCB_GLINTEGRATION) << "QT_XCB_GL_INTEGRATION is set to" << glIntegrationName;
+ if (glIntegrationName != QStringLiteral("none")) {
+ glIntegrationNames.removeAll(glIntegrationName);
+ glIntegrationNames.prepend(glIntegrationName);
+ } else {
+ glIntegrationNames.clear();
+ }
}
qCDebug(QT_XCB_GLINTEGRATION) << "Choosing xcb gl-integration based on following priority\n" << glIntegrationNames;
diff --git a/src/plugins/platforms/xcb/qxcbconnection.h b/src/plugins/platforms/xcb/qxcbconnection.h
index 2005ae0701..291193612c 100644
--- a/src/plugins/platforms/xcb/qxcbconnection.h
+++ b/src/plugins/platforms/xcb/qxcbconnection.h
@@ -607,7 +607,6 @@ private:
#endif
QXcbEventReader *m_reader;
#if defined(XCB_USE_XINPUT2)
- QHash<int, QWindowSystemInterface::TouchPoint> m_touchPoints;
QHash<int, XInput2TouchDeviceData*> m_touchDevices;
#endif
#ifdef Q_XCB_DEBUG
diff --git a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
index 0e8a162a7d..2f46436ce2 100644
--- a/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
+++ b/src/plugins/platforms/xcb/qxcbconnection_xi2.cpp
@@ -52,6 +52,7 @@ struct XInput2TouchDeviceData {
}
XIDeviceInfo *xiDeviceInfo;
QTouchDevice *qtTouchDevice;
+ QHash<int, QWindowSystemInterface::TouchPoint> touchPoints;
// Stuff that is relevant only for touchpads
QHash<int, QPointF> pointPressedPosition; // in screen coordinates where each point was pressed
@@ -364,8 +365,8 @@ void QXcbConnection::xi2Select(xcb_window_t window)
XInput2TouchDeviceData *QXcbConnection::touchDeviceForId(int id)
{
XInput2TouchDeviceData *dev = Q_NULLPTR;
- QHash<int, XInput2TouchDeviceData*>::const_iterator devIt = m_touchDevices.find(id);
- if ( devIt != m_touchDevices.end() ) {
+ QHash<int, XInput2TouchDeviceData*>::const_iterator devIt = m_touchDevices.constFind(id);
+ if (devIt != m_touchDevices.cend()) {
dev = devIt.value();
} else {
int nrDevices = 0;
@@ -525,7 +526,7 @@ void QXcbConnection::xi2HandleEvent(xcb_ge_event_t *event)
case XI_ButtonPress:
case XI_ButtonRelease:
case XI_Motion:
- if (xi2MouseEvents() && eventListener)
+ if (xi2MouseEvents() && eventListener && !(xiDeviceEvent->flags & XIPointerEmulated))
eventListener->handleXIMouseEvent(event);
break;
@@ -552,19 +553,21 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo
xXIDeviceEvent *xiDeviceEvent = static_cast<xXIDeviceEvent *>(xiDevEvent);
XInput2TouchDeviceData *dev = touchDeviceForId(xiDeviceEvent->sourceid);
Q_ASSERT(dev);
- const bool firstTouch = m_touchPoints.isEmpty();
+ const bool firstTouch = dev->touchPoints.isEmpty();
if (xiDeviceEvent->evtype == XI_TouchBegin) {
QWindowSystemInterface::TouchPoint tp;
tp.id = xiDeviceEvent->detail % INT_MAX;
tp.state = Qt::TouchPointPressed;
tp.pressure = -1.0;
- m_touchPoints[tp.id] = tp;
+ dev->touchPoints[tp.id] = tp;
}
- QWindowSystemInterface::TouchPoint &touchPoint = m_touchPoints[xiDeviceEvent->detail];
- qreal x = fixed1616ToReal(xiDeviceEvent->root_x);
- qreal y = fixed1616ToReal(xiDeviceEvent->root_y);
+ QWindowSystemInterface::TouchPoint &touchPoint = dev->touchPoints[xiDeviceEvent->detail];
+ QXcbScreen* screen = platformWindow->xcbScreen();
+ QPointF pos = screen->mapFromNative(QPointF(fixed1616ToReal(xiDeviceEvent->root_x),
+ fixed1616ToReal(xiDeviceEvent->root_y)));
+ qreal x = pos.x();
+ qreal y = pos.y();
qreal nx = -1.0, ny = -1.0, d = 0.0;
- QXcbScreen* screen = m_screens.at(0);
for (int i = 0; i < dev->xiDeviceInfo->num_classes; ++i) {
XIAnyClassInfo *classinfo = dev->xiDeviceInfo->classes[i];
if (classinfo->type == XIValuatorClass) {
@@ -677,10 +680,10 @@ void QXcbConnection::xi2ProcessTouch(void *xiDevEvent, QXcbWindow *platformWindo
if (Q_UNLIKELY(lcQpaXInput().isDebugEnabled()))
qCDebug(lcQpaXInput) << " touchpoint " << touchPoint.id << " state " << touchPoint.state << " pos norm " << touchPoint.normalPosition <<
" area " << touchPoint.area << " pressure " << touchPoint.pressure;
- QWindowSystemInterface::handleTouchEvent(platformWindow->window(), xiDeviceEvent->time, dev->qtTouchDevice, m_touchPoints.values());
+ QWindowSystemInterface::handleTouchEvent(platformWindow->window(), xiDeviceEvent->time, dev->qtTouchDevice, dev->touchPoints.values());
if (touchPoint.state == Qt::TouchPointReleased)
// If a touchpoint was released, we can forget it, because the ID won't be reused.
- m_touchPoints.remove(touchPoint.id);
+ dev->touchPoints.remove(touchPoint.id);
else
// Make sure that we don't send TouchPointPressed/Moved in more than one QTouchEvent
// with this touch point if the next XI2 event is about a different touch point.
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
index 2d96ed1c21..ea541e4556 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -1473,8 +1473,6 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
}
QString string = lookupString(xkb_state, code);
- int count = string.size();
- string.truncate(count);
// Ιf control modifier is set we should prefer latin character, this is
// used for standard shortcuts in checks like "key == QKeySequence::Copy",
@@ -1506,7 +1504,7 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
bool filtered = false;
if (inputContext) {
- QKeyEvent event(type, qtcode, modifiers, code, sym, state, string, isAutoRepeat, count);
+ QKeyEvent event(type, qtcode, modifiers, code, sym, state, string, isAutoRepeat, string.length());
event.setTimestamp(time);
filtered = inputContext->filterEvent(&event);
}
@@ -1535,7 +1533,7 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
}
if (!filtered && inputContext) {
- QKeyEvent event(QEvent::KeyPress, qtcode, modifiers, code, sym, state, string, isAutoRepeat, count);
+ QKeyEvent event(QEvent::KeyPress, qtcode, modifiers, code, sym, state, string, isAutoRepeat, string.length());
event.setTimestamp(time);
filtered = inputContext->filterEvent(&event);
}
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
index 63e4d9e75b..040cea1cb2 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
@@ -282,6 +282,18 @@ QPoint QXcbScreen::mapFromNative(const QPoint &pos) const
return (pos - m_nativeGeometry.topLeft()) / dpr + m_geometry.topLeft();
}
+QPointF QXcbScreen::mapToNative(const QPointF &pos) const
+{
+ const int dpr = int(devicePixelRatio());
+ return (pos - m_geometry.topLeft()) * dpr + m_nativeGeometry.topLeft();
+}
+
+QPointF QXcbScreen::mapFromNative(const QPointF &pos) const
+{
+ const int dpr = int(devicePixelRatio());
+ return (pos - m_nativeGeometry.topLeft()) / dpr + m_geometry.topLeft();
+}
+
QRect QXcbScreen::mapToNative(const QRect &rect) const
{
const int dpr = int(devicePixelRatio());
diff --git a/src/plugins/platforms/xcb/qxcbscreen.h b/src/plugins/platforms/xcb/qxcbscreen.h
index ec05e3bb25..44519470e9 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.h
+++ b/src/plugins/platforms/xcb/qxcbscreen.h
@@ -143,6 +143,8 @@ public:
QPoint mapToNative(const QPoint &pos) const;
QPoint mapFromNative(const QPoint &pos) const;
+ QPointF mapToNative(const QPointF &pos) const;
+ QPointF mapFromNative(const QPointF &pos) const;
QRect mapToNative(const QRect &rect) const;
QRect mapFromNative(const QRect &rect) const;
diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp
index d1b688857d..6e021ced23 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.cpp
+++ b/src/plugins/platforms/xcb/qxcbwindow.cpp
@@ -873,11 +873,6 @@ void QXcbWindow::show()
updateNetWmStateBeforeMap();
}
- if (window()->metaObject()->indexOfProperty(wm_window_type_property_id) >= 0) {
- QXcbWindowFunctions::WmWindowTypes wmWindowTypes(window()->property(wm_window_type_property_id).value<int>());
- setWmWindowType(wmWindowTypes);
- }
-
if (connection()->time() != XCB_TIME_CURRENT_TIME)
updateNetWmUserTime(connection()->time());
@@ -1140,7 +1135,13 @@ void QXcbWindow::setWindowFlags(Qt::WindowFlags flags)
xcb_change_window_attributes(xcb_connection(), xcb_window(), mask, values);
- setNetWmWindowFlags(flags);
+ QXcbWindowFunctions::WmWindowTypes wmWindowTypes = 0;
+ if (window()->dynamicPropertyNames().contains(wm_window_type_property_id)) {
+ wmWindowTypes = static_cast<QXcbWindowFunctions::WmWindowTypes>(
+ window()->property(wm_window_type_property_id).value<int>());
+ }
+
+ setWmWindowType(wmWindowTypes, flags);
setMotifWindowFlags(flags);
setTransparentForMouseEvents(flags & Qt::WindowTransparentForInput);
@@ -1291,42 +1292,6 @@ void QXcbWindow::setWindowState(Qt::WindowState state)
m_windowState = state;
}
-void QXcbWindow::setNetWmWindowFlags(Qt::WindowFlags flags)
-{
- // in order of decreasing priority
- QVector<uint> windowTypes;
-
- Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
-
- switch (type) {
- case Qt::Dialog:
- case Qt::Sheet:
- windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DIALOG));
- break;
- case Qt::Tool:
- case Qt::Drawer:
- windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_UTILITY));
- break;
- case Qt::ToolTip:
- windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLTIP));
- break;
- case Qt::SplashScreen:
- windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_SPLASH));
- break;
- default:
- break;
- }
-
- if (flags & Qt::FramelessWindowHint)
- windowTypes.append(atom(QXcbAtom::_KDE_NET_WM_WINDOW_TYPE_OVERRIDE));
-
- windowTypes.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NORMAL));
-
- Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
- atom(QXcbAtom::_NET_WM_WINDOW_TYPE), XCB_ATOM_ATOM, 32,
- windowTypes.count(), windowTypes.constData()));
-}
-
void QXcbWindow::updateMotifWmHintsBeforeMap()
{
QtMotifWmHints mwmhints = getMotifWmHints(connection(), m_window);
@@ -1703,10 +1668,10 @@ QSurfaceFormat QXcbWindow::format() const
void QXcbWindow::setWmWindowTypeStatic(QWindow *window, QXcbWindowFunctions::WmWindowTypes windowTypes)
{
+ window->setProperty(wm_window_type_property_id, QVariant::fromValue(static_cast<int>(windowTypes)));
+
if (window->handle())
- static_cast<QXcbWindow *>(window->handle())->setWmWindowType(windowTypes);
- else
- window->setProperty(wm_window_type_property_id, QVariant::fromValue(static_cast<int>(windowTypes)));
+ static_cast<QXcbWindow *>(window->handle())->setWmWindowType(windowTypes, window->flags());
}
uint QXcbWindow::visualIdStatic(QWindow *window)
@@ -1787,40 +1752,82 @@ QXcbWindowFunctions::WmWindowTypes QXcbWindow::wmWindowTypes() const
return result;
}
-void QXcbWindow::setWmWindowType(QXcbWindowFunctions::WmWindowTypes types)
+void QXcbWindow::setWmWindowType(QXcbWindowFunctions::WmWindowTypes types, Qt::WindowFlags flags)
{
QVector<xcb_atom_t> atoms;
+ // manual selection 1 (these are never set by Qt and take precedence)
if (types & QXcbWindowFunctions::Normal)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NORMAL));
if (types & QXcbWindowFunctions::Desktop)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DESKTOP));
if (types & QXcbWindowFunctions::Dock)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DOCK));
- if (types & QXcbWindowFunctions::Toolbar)
- atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLBAR));
- if (types & QXcbWindowFunctions::Menu)
- atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_MENU));
+ if (types & QXcbWindowFunctions::Notification)
+ atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NOTIFICATION));
+
+ // manual selection 2 (Qt uses these during auto selection);
if (types & QXcbWindowFunctions::Utility)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_UTILITY));
if (types & QXcbWindowFunctions::Splash)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_SPLASH));
if (types & QXcbWindowFunctions::Dialog)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DIALOG));
+ if (types & QXcbWindowFunctions::Tooltip)
+ atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLTIP));
+ if (types & QXcbWindowFunctions::KdeOverride)
+ atoms.append(atom(QXcbAtom::_KDE_NET_WM_WINDOW_TYPE_OVERRIDE));
+
+ // manual selection 3 (these can be set by Qt, but don't have a
+ // corresponding Qt::WindowType). note that order of the *MENU
+ // atoms is important
+ if (types & QXcbWindowFunctions::Menu)
+ atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_MENU));
if (types & QXcbWindowFunctions::DropDownMenu)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DROPDOWN_MENU));
if (types & QXcbWindowFunctions::PopupMenu)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_POPUP_MENU));
- if (types & QXcbWindowFunctions::Tooltip)
- atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLTIP));
- if (types & QXcbWindowFunctions::Notification)
- atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NOTIFICATION));
+ if (types & QXcbWindowFunctions::Toolbar)
+ atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLBAR));
if (types & QXcbWindowFunctions::Combo)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_COMBO));
if (types & QXcbWindowFunctions::Dnd)
atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DND));
- if (types & QXcbWindowFunctions::KdeOverride)
+
+ // automatic selection
+ Qt::WindowType type = static_cast<Qt::WindowType>(int(flags & Qt::WindowType_Mask));
+ switch (type) {
+ case Qt::Dialog:
+ case Qt::Sheet:
+ if (!(types & QXcbWindowFunctions::Dialog))
+ atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_DIALOG));
+ break;
+ case Qt::Tool:
+ case Qt::Drawer:
+ if (!(types & QXcbWindowFunctions::Utility))
+ atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_UTILITY));
+ break;
+ case Qt::ToolTip:
+ if (!(types & QXcbWindowFunctions::Tooltip))
+ atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_TOOLTIP));
+ break;
+ case Qt::SplashScreen:
+ if (!(types & QXcbWindowFunctions::Splash))
+ atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_SPLASH));
+ break;
+ default:
+ break;
+ }
+
+ if ((flags & Qt::FramelessWindowHint) && !(type & QXcbWindowFunctions::KdeOverride)) {
+ // override netwm type - quick and easy for KDE noborder
atoms.append(atom(QXcbAtom::_KDE_NET_WM_WINDOW_TYPE_OVERRIDE));
+ }
+
+ if (atoms.size() == 1 && atoms.first() == atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NORMAL))
+ atoms.clear();
+ else
+ atoms.append(atom(QXcbAtom::_NET_WM_WINDOW_TYPE_NORMAL));
if (atoms.isEmpty()) {
Q_XCB_CALL(xcb_delete_property(xcb_connection(), m_window, atom(QXcbAtom::_NET_WM_WINDOW_TYPE)));
diff --git a/src/plugins/platforms/xcb/qxcbwindow.h b/src/plugins/platforms/xcb/qxcbwindow.h
index e62bfcba64..a379a6f9db 100644
--- a/src/plugins/platforms/xcb/qxcbwindow.h
+++ b/src/plugins/platforms/xcb/qxcbwindow.h
@@ -143,7 +143,7 @@ public:
static uint visualIdStatic(QWindow *window);
QXcbWindowFunctions::WmWindowTypes wmWindowTypes() const;
- void setWmWindowType(QXcbWindowFunctions::WmWindowTypes types);
+ void setWmWindowType(QXcbWindowFunctions::WmWindowTypes types, Qt::WindowFlags flags);
uint visualId() const;
@@ -179,7 +179,6 @@ protected:
NetWmStates netWmStates();
void setNetWmStates(NetWmStates);
- void setNetWmWindowFlags(Qt::WindowFlags flags);
void setMotifWindowFlags(Qt::WindowFlags flags);
void updateMotifWmHintsBeforeMap();
diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro
index 587063b100..af4f6fc8fe 100644
--- a/src/plugins/plugins.pro
+++ b/src/plugins/plugins.pro
@@ -5,4 +5,4 @@ SUBDIRS *= sqldrivers
qtHaveModule(gui): SUBDIRS *= imageformats platforms platforminputcontexts platformthemes generic
qtHaveModule(widgets): SUBDIRS *= styles
-!winrt:!wince*:qtHaveModule(widgets):SUBDIRS += printsupport
+!winrt:!wince:qtHaveModule(widgets): SUBDIRS += printsupport