diff options
Diffstat (limited to 'src/plugins')
16 files changed, 95 insertions, 101 deletions
diff --git a/src/plugins/platforms/android/androidjniaccessibility.cpp b/src/plugins/platforms/android/androidjniaccessibility.cpp index eeaecd53b4..06624415d3 100644 --- a/src/plugins/platforms/android/androidjniaccessibility.cpp +++ b/src/plugins/platforms/android/androidjniaccessibility.cpp @@ -80,6 +80,7 @@ namespace QtAndroidAccessibility static void setActive(JNIEnv */*env*/, jobject /*thiz*/, jboolean active) { + QMutexLocker lock(QtAndroid::platformInterfaceMutex()); QAndroidPlatformIntegration *platformIntegration = QtAndroid::androidPlatformIntegration(); if (platformIntegration) platformIntegration->accessibility()->setActive(active); diff --git a/src/plugins/platforms/android/androidjniinput.cpp b/src/plugins/platforms/android/androidjniinput.cpp index 75cffe3854..dabab553c2 100644 --- a/src/plugins/platforms/android/androidjniinput.cpp +++ b/src/plugins/platforms/android/androidjniinput.cpp @@ -273,6 +273,7 @@ namespace QtAndroidInput if (m_touchPoints.isEmpty()) return; + QMutexLocker lock(QtAndroid::platformInterfaceMutex()); QAndroidPlatformIntegration *platformIntegration = QtAndroid::androidPlatformIntegration(); if (!platformIntegration) return; diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index 4a24f3fb47..8b0b18a846 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -83,7 +83,7 @@ static jmethodID m_setSurfaceGeometryMethodID = nullptr; static jmethodID m_destroySurfaceMethodID = nullptr; static int m_pendingApplicationState = -1; -static QBasicMutex m_pendingAppStateMtx; +static QBasicMutex m_platformMutex; static jclass m_bitmapClass = nullptr; static jmethodID m_createBitmapMethodID = nullptr; @@ -104,7 +104,7 @@ static sem_t m_exitSemaphore, m_terminateSemaphore; QHash<int, AndroidSurfaceClient *> m_surfaces; -static QMutex m_surfacesMutex; +static QBasicMutex m_surfacesMutex; static int m_surfaceId = 1; @@ -123,28 +123,26 @@ static const char m_qtTag[] = "Qt"; static const char m_classErrorMsg[] = "Can't find class \"%s\""; static const char m_methodErrorMsg[] = "Can't find method \"%s%s\""; -static void flushPendingApplicationState(); - namespace QtAndroid { + QBasicMutex *platformInterfaceMutex() + { + return &m_platformMutex; + } + void setAndroidPlatformIntegration(QAndroidPlatformIntegration *androidPlatformIntegration) { - QMutexLocker lock(&m_surfacesMutex); m_androidPlatformIntegration = androidPlatformIntegration; // flush the pending state if necessary. - if (m_androidPlatformIntegration) { - flushPendingApplicationState(); - m_androidPlatformIntegration->flushPendingUpdates(); - } else { - QMutexLocker locker(&m_pendingAppStateMtx); - m_pendingApplicationState = -1; - } + if (m_androidPlatformIntegration && (m_pendingApplicationState != -1)) + QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationState(m_pendingApplicationState)); + + m_pendingApplicationState = -1; } QAndroidPlatformIntegration *androidPlatformIntegration() { - QMutexLocker locker(&m_surfacesMutex); return m_androidPlatformIntegration; } @@ -443,17 +441,6 @@ namespace QtAndroid } // namespace QtAndroid -// Force an update of the pending application state (state set before the platform plugin was created) -static void flushPendingApplicationState() -{ - QMutexLocker locker(&m_pendingAppStateMtx); - if (m_pendingApplicationState == -1) - return; - - QWindowSystemInterface::handleApplicationStateChanged(Qt::ApplicationState(m_pendingApplicationState)); - m_pendingApplicationState = -1; -} - static jboolean startQtAndroidPlugin(JNIEnv* /*env*/, jobject /*object*//*, jobject applicationAssetManager*/) { m_androidPlatformIntegration = nullptr; @@ -628,7 +615,7 @@ static void setDisplayMetrics(JNIEnv */*env*/, jclass /*clazz*/, m_scaledDensity = scaledDensity; m_density = density; - QMutexLocker lock(&m_surfacesMutex); + QMutexLocker lock(&m_platformMutex); if (!m_androidPlatformIntegration) { QAndroidPlatformIntegration::setDefaultDisplayMetrics(desktopWidthPixels, desktopHeightPixels, @@ -670,18 +657,22 @@ static void updateWindow(JNIEnv */*env*/, jobject /*thiz*/) static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state) { - if (!m_main || !QtAndroid::androidPlatformIntegration()) { - QMutexLocker locker(&m_pendingAppStateMtx); - m_pendingApplicationState = Qt::ApplicationState(state); + QMutexLocker lock(&m_platformMutex); + if (!m_main || !m_androidPlatformIntegration) { + m_pendingApplicationState = state; return; } - flushPendingApplicationState(); - + // We're about to call user code from the Android thread, since we don't know + //the side effects we'll unlock first! + lock.unlock(); if (state == Qt::ApplicationActive) QtAndroidPrivate::handleResume(); else if (state == Qt::ApplicationInactive) QtAndroidPrivate::handlePause(); + lock.relock(); + if (!m_androidPlatformIntegration) + return; if (state <= Qt::ApplicationInactive) { // NOTE: sometimes we will receive two consecutive suspended notifications, @@ -729,6 +720,7 @@ static void handleOrientationChanged(JNIEnv */*env*/, jobject /*thiz*/, jint new Qt::ScreenOrientation native = orientations[nativeOrientation - 1]; QAndroidPlatformIntegration::setScreenOrientation(screenOrientation, native); + QMutexLocker lock(&m_platformMutex); if (m_androidPlatformIntegration) { QPlatformScreen *screen = m_androidPlatformIntegration->screen(); QWindowSystemInterface::handleScreenOrientationChange(screen->screen(), diff --git a/src/plugins/platforms/android/androidjnimain.h b/src/plugins/platforms/android/androidjnimain.h index 170596082d..08f1d50fe3 100644 --- a/src/plugins/platforms/android/androidjnimain.h +++ b/src/plugins/platforms/android/androidjnimain.h @@ -58,9 +58,11 @@ class QWidget; class QString; class QWindow; class AndroidSurfaceClient; +class QBasicMutex; namespace QtAndroid { + QBasicMutex *platformInterfaceMutex(); QAndroidPlatformIntegration *androidPlatformIntegration(); void setAndroidPlatformIntegration(QAndroidPlatformIntegration *androidPlatformIntegration); void setQtThread(QThread *thread); diff --git a/src/plugins/platforms/android/qandroidplatformintegration.cpp b/src/plugins/platforms/android/qandroidplatformintegration.cpp index 3088546148..763b294660 100644 --- a/src/plugins/platforms/android/qandroidplatformintegration.cpp +++ b/src/plugins/platforms/android/qandroidplatformintegration.cpp @@ -143,8 +143,13 @@ void *QAndroidPlatformNativeInterface::nativeResourceForWindow(const QByteArray void QAndroidPlatformNativeInterface::customEvent(QEvent *event) { - if (event->type() == QEvent::User) - QtAndroid::setAndroidPlatformIntegration(static_cast<QAndroidPlatformIntegration *>(QGuiApplicationPrivate::platformIntegration())); + if (event->type() != QEvent::User) + return; + + QMutexLocker lock(QtAndroid::platformInterfaceMutex()); + QAndroidPlatformIntegration *api = static_cast<QAndroidPlatformIntegration *>(QGuiApplicationPrivate::platformIntegration()); + QtAndroid::setAndroidPlatformIntegration(api); + api->flushPendingUpdates(); } QAndroidPlatformIntegration::QAndroidPlatformIntegration(const QStringList ¶mList) diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index 82c405baa6..4cdf004dd1 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -303,7 +303,23 @@ void QCocoaMenuBar::resetKnownMenuItemsToQt() // Undo the effect of redirectKnownMenuItemsToFirstResponder(): // set the menu items' actions to itemFired and their targets to // the QCocoaMenuDelegate. - updateMenuBarImmediately(); + foreach (QCocoaMenuBar *mb, static_menubars) { + foreach (QCocoaMenu *m, mb->m_menus) { + foreach (QCocoaMenuItem *i, m->items()) { + switch (i->effectiveRole()) { + case QPlatformMenuItem::CutRole: + case QPlatformMenuItem::CopyRole: + case QPlatformMenuItem::PasteRole: + case QPlatformMenuItem::SelectAllRole: + [i->nsItem() setTarget:m->nsMenu().delegate]; + [i->nsItem() setAction:@selector(itemFired:)]; + break; + default: + break; + } + } + } + } } void QCocoaMenuBar::updateMenuBarImmediately() diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index ef893f8a63..49c11ba2b7 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -1118,7 +1118,7 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, #endif } break; case QtWindows::DpiChangedEvent: { - if (GetWindowLongPtr(hwnd, GWL_STYLE) & WS_DLGFRAME) + if (platformWindow->window()->flags().testFlag(Qt::MSWindowsFixedSizeDialogHint)) return false; // Fixed-size window should not be resized platformWindow->setFlag(QWindowsWindow::WithinDpiChanged); diff --git a/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri b/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri index e6e352a21d..df471f1105 100644 --- a/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri +++ b/src/plugins/platforms/xcb/gl_integrations/gl_integrations_plugin_base.pri @@ -5,19 +5,10 @@ INCLUDEPATH += $$PWD/../ load(qt_build_paths) -# build with session management support -qtConfig(xcb-sm) { - DEFINES += XCB_USE_SM -} - !qtConfig(system-xcb) { - DEFINES += XCB_USE_RENDER QMAKE_USE += xcb-static xcb } else { qtConfig(xkb): QMAKE_USE += xcb_xkb - # to support custom cursors with depth > 1 - qtConfig(xcb-render) { - DEFINES += XCB_USE_RENDER - } + qtConfig(xcb-render): QMAKE_USE += xcb_render QMAKE_USE += xcb_syslibs } diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp index 40103a42d7..377066df61 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/qxcbglxintegration.cpp @@ -39,7 +39,7 @@ #include "qxcbglxintegration.h" -#if defined(XCB_HAS_XCB_GLX) +#if QT_CONFIG(xcb_glx) #include <xcb/glx.h> #endif @@ -56,37 +56,34 @@ QT_BEGIN_NAMESPACE -#if defined(XCB_HAS_XCB_GLX) && XCB_GLX_MAJOR_VERSION == 1 && XCB_GLX_MINOR_VERSION < 4 - -#define XCB_GLX_BUFFER_SWAP_COMPLETE 1 - -typedef struct xcb_glx_buffer_swap_complete_event_t { - uint8_t response_type; - uint8_t pad0; - uint16_t sequence; - uint16_t event_type; - uint8_t pad1[2]; - xcb_glx_drawable_t drawable; - uint32_t ust_hi; - uint32_t ust_lo; - uint32_t msc_hi; - uint32_t msc_lo; - uint32_t sbc; -} xcb_glx_buffer_swap_complete_event_t; -#endif - -#if defined(XCB_USE_GLX) -typedef struct { - int type; - unsigned long serial; /* # of last request processed by server */ - Bool send_event; /* true if this came from a SendEvent request */ - Display *display; /* Display the event was read from */ - Drawable drawable; /* drawable on which event was requested in event mask */ - int event_type; - int64_t ust; - int64_t msc; - int64_t sbc; -} QGLXBufferSwapComplete; +#if QT_CONFIG(xcb_glx) + #if XCB_GLX_MAJOR_VERSION == 1 && XCB_GLX_MINOR_VERSION < 4 + #define XCB_GLX_BUFFER_SWAP_COMPLETE 1 + typedef struct xcb_glx_buffer_swap_complete_event_t { + uint8_t response_type; + uint8_t pad0; + uint16_t sequence; + uint16_t event_type; + uint8_t pad1[2]; + xcb_glx_drawable_t drawable; + uint32_t ust_hi; + uint32_t ust_lo; + uint32_t msc_hi; + uint32_t msc_lo; + uint32_t sbc; + } xcb_glx_buffer_swap_complete_event_t; + #endif + typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + Drawable drawable; /* drawable on which event was requested in event mask */ + int event_type; + int64_t ust; + int64_t msc; + int64_t sbc; + } QGLXBufferSwapComplete; #endif QXcbGlxIntegration::QXcbGlxIntegration() @@ -103,7 +100,7 @@ QXcbGlxIntegration::~QXcbGlxIntegration() bool QXcbGlxIntegration::initialize(QXcbConnection *connection) { m_connection = connection; -#ifdef XCB_HAS_XCB_GLX +#if QT_CONFIG(xcb_glx) const xcb_query_extension_reply_t *reply = xcb_get_extension_data(m_connection->xcb_connection(), &xcb_glx_id); if (!reply || !reply->present) @@ -140,7 +137,7 @@ bool QXcbGlxIntegration::handleXcbEvent(xcb_generic_event_t *event, uint respons XEvent dummy; event->sequence = LastKnownRequestProcessed(xdisplay); if (proc(xdisplay, &dummy, (xEvent*)event)) { -#ifdef XCB_HAS_XCB_GLX +#if QT_CONFIG(xcb_glx) // DRI2 clients don't receive GLXBufferSwapComplete events on the wire. // Instead the GLX event is synthesized from the DRI2BufferSwapComplete event // by DRI2WireToEvent(). For an application to be able to see the event diff --git a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/xcb_glx.pro b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/xcb_glx.pro index 5af6172301..9d537b18f3 100644 --- a/src/plugins/platforms/xcb/gl_integrations/xcb_glx/xcb_glx.pro +++ b/src/plugins/platforms/xcb/gl_integrations/xcb_glx/xcb_glx.pro @@ -3,14 +3,9 @@ TARGET = qxcb-glx-integration include(../gl_integrations_plugin_base.pri) QT += glx_support-private -#should be removed from the sources -DEFINES += XCB_USE_GLX DEFINES += QT_NO_FOREACH -qtConfig(xcb-glx) { - DEFINES += XCB_HAS_XCB_GLX - QMAKE_USE += xcb_glx -} +qtConfig(xcb-glx): QMAKE_USE += xcb_glx !static:qtConfig(dlopen): QMAKE_USE += libdl diff --git a/src/plugins/platforms/xcb/qxcbconnection.cpp b/src/plugins/platforms/xcb/qxcbconnection.cpp index f0c1659b8e..92b8261bae 100644 --- a/src/plugins/platforms/xcb/qxcbconnection.cpp +++ b/src/plugins/platforms/xcb/qxcbconnection.cpp @@ -80,7 +80,7 @@ #include <X11/extensions/XI2proto.h> #endif -#ifdef XCB_USE_RENDER +#if QT_CONFIG(xcb_render) #include <xcb/render.h> #endif @@ -566,7 +566,7 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGra #if QT_CONFIG(xkb) &xcb_xkb_id, #endif -#ifdef XCB_USE_RENDER +#if QT_CONFIG(xcb_render) &xcb_render_id, #endif 0 @@ -1467,7 +1467,7 @@ xcb_window_t QXcbConnection::clientLeader() 1, &m_clientLeader); -#if !defined(QT_NO_SESSIONMANAGER) && defined(XCB_USE_SM) +#if QT_CONFIG(xcb_sm) // If we are session managed, inform the window manager about it QByteArray session = qGuiApp->sessionId().toLatin1(); if (!session.isEmpty()) { @@ -1988,7 +1988,7 @@ void QXcbConnection::initializeXFixes() void QXcbConnection::initializeXRender() { -#ifdef XCB_USE_RENDER +#if QT_CONFIG(xcb_render) const xcb_query_extension_reply_t *reply = xcb_get_extension_data(m_connection, &xcb_render_id); if (!reply || !reply->present) return; diff --git a/src/plugins/platforms/xcb/qxcbimage.cpp b/src/plugins/platforms/xcb/qxcbimage.cpp index 67a959d8a4..f3dfa1916b 100644 --- a/src/plugins/platforms/xcb/qxcbimage.cpp +++ b/src/plugins/platforms/xcb/qxcbimage.cpp @@ -41,7 +41,7 @@ #include <QtGui/QColor> #include <QtGui/private/qimage_p.h> #include <QtGui/private/qdrawhelper_p.h> -#ifdef XCB_USE_RENDER +#if QT_CONFIG(xcb_render) #include <xcb/render.h> // 'template' is used as a function argument name in xcb_renderutil.h #define template template_param @@ -193,7 +193,7 @@ xcb_pixmap_t qt_xcb_XPixmapFromBitmap(QXcbScreen *screen, const QImage &image) xcb_cursor_t qt_xcb_createCursorXRender(QXcbScreen *screen, const QImage &image, const QPoint &spot) { -#ifdef XCB_USE_RENDER +#if QT_CONFIG(xcb_render) xcb_connection_t *conn = screen->xcb_connection(); const int w = image.width(); const int h = image.height(); diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index 4f78f806be..8ba6834565 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -495,7 +495,7 @@ QByteArray QXcbIntegration::wmClass() const return m_wmClass; } -#if !defined(QT_NO_SESSIONMANAGER) && defined(XCB_USE_SM) +#if QT_CONFIG(xcb_sm) QPlatformSessionManager *QXcbIntegration::createPlatformSessionManager(const QString &id, const QString &key) const { return new QXcbSessionManager(id, key); diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h index 561aa9dce6..186b6c5ddd 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.h +++ b/src/plugins/platforms/xcb/qxcbintegration.h @@ -40,6 +40,7 @@ #ifndef QXCBINTEGRATION_H #define QXCBINTEGRATION_H +#include <QtGui/private/qtguiglobal_p.h> #include <qpa/qplatformintegration.h> #include <qpa/qplatformscreen.h> @@ -106,7 +107,7 @@ public: QByteArray wmClass() const; -#if !defined(QT_NO_SESSIONMANAGER) && defined(XCB_USE_SM) +#if QT_CONFIG(xcb_sm) QPlatformSessionManager *createPlatformSessionManager(const QString &id, const QString &key) const override; #endif diff --git a/src/plugins/platforms/xcb/xcb_qpa_lib.pro b/src/plugins/platforms/xcb/xcb_qpa_lib.pro index ba748ea14d..6956d04083 100644 --- a/src/plugins/platforms/xcb/xcb_qpa_lib.pro +++ b/src/plugins/platforms/xcb/xcb_qpa_lib.pro @@ -61,9 +61,7 @@ qtConfig(xcb-xlib) { } } -# build with session management support qtConfig(xcb-sm) { - DEFINES += XCB_USE_SM QMAKE_USE += x11sm SOURCES += qxcbsessionmanager.cpp HEADERS += qxcbsessionmanager.h @@ -83,16 +81,11 @@ qtConfig(vulkan) { } !qtConfig(system-xcb) { - DEFINES += XCB_USE_RENDER QMAKE_USE += xcb-static xcb } else { LIBS += -lxcb-xinerama ### there is no configure test for this! qtConfig(xkb): QMAKE_USE += xcb_xkb - # to support custom cursors with depth > 1 - qtConfig(xcb-render) { - DEFINES += XCB_USE_RENDER - QMAKE_USE += xcb_render - } + qtConfig(xcb-render): QMAKE_USE += xcb_render QMAKE_USE += xcb_syslibs } diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 710a6c94c1..cd4d301194 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -10,5 +10,5 @@ qtHaveModule(gui) { } qtHaveModule(widgets): SUBDIRS += styles -!winrt:!wince:qtHaveModule(printsupport): \ +!winrt:qtHaveModule(printsupport): \ SUBDIRS += printsupport |