diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/kernel/qjnihelpers.cpp | 39 | ||||
-rw-r--r-- | src/corelib/kernel/qjnihelpers_p.h | 13 | ||||
-rw-r--r-- | src/gui/kernel/qscreen.cpp | 38 | ||||
-rw-r--r-- | src/gui/kernel/qscreen.h | 7 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 39 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.h | 7 | ||||
-rw-r--r-- | src/plugins/platforms/android/androidjnimain.cpp | 5 | ||||
-rw-r--r-- | src/testlib/qtestblacklist.cpp | 59 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 59 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.h | 7 |
10 files changed, 247 insertions, 26 deletions
diff --git a/src/corelib/kernel/qjnihelpers.cpp b/src/corelib/kernel/qjnihelpers.cpp index dad2d5dc1e..f77fc4220c 100644 --- a/src/corelib/kernel/qjnihelpers.cpp +++ b/src/corelib/kernel/qjnihelpers.cpp @@ -122,6 +122,45 @@ void QtAndroidPrivate::handleNewIntent(JNIEnv *env, jobject intent) } } +namespace { + class ResumePauseListeners + { + public: + QMutex mutex; + QList<QtAndroidPrivate::ResumePauseListener *> listeners; + }; +} + +Q_GLOBAL_STATIC(ResumePauseListeners, g_resumePauseListeners) + +void QtAndroidPrivate::registerResumePauseListener(ResumePauseListener *listener) +{ + QMutexLocker locker(&g_resumePauseListeners()->mutex); + g_resumePauseListeners()->listeners.append(listener); +} + +void QtAndroidPrivate::unregisterResumePauseListener(ResumePauseListener *listener) +{ + QMutexLocker locker(&g_resumePauseListeners()->mutex); + g_resumePauseListeners()->listeners.removeAll(listener); +} + +void QtAndroidPrivate::handlePause() +{ + QMutexLocker locker(&g_resumePauseListeners()->mutex); + const QList<QtAndroidPrivate::ResumePauseListener *> &listeners = g_resumePauseListeners()->listeners; + for (int i=0; i<listeners.size(); ++i) + listeners.at(i)->handlePause(); +} + +void QtAndroidPrivate::handleResume() +{ + QMutexLocker locker(&g_resumePauseListeners()->mutex); + const QList<QtAndroidPrivate::ResumePauseListener *> &listeners = g_resumePauseListeners()->listeners; + for (int i=0; i<listeners.size(); ++i) + listeners.at(i)->handleResume(); +} + static inline bool exceptionCheck(JNIEnv *env) { if (env->ExceptionCheck()) { diff --git a/src/corelib/kernel/qjnihelpers_p.h b/src/corelib/kernel/qjnihelpers_p.h index 3ed8338b18..883b08ef60 100644 --- a/src/corelib/kernel/qjnihelpers_p.h +++ b/src/corelib/kernel/qjnihelpers_p.h @@ -68,6 +68,14 @@ namespace QtAndroidPrivate virtual bool handleNewIntent(JNIEnv *env, jobject intent) = 0; }; + class Q_CORE_EXPORT ResumePauseListener + { + public: + virtual ~ResumePauseListener() {} + virtual void handlePause() {}; + virtual void handleResume() {}; + }; + Q_CORE_EXPORT jobject activity(); Q_CORE_EXPORT JavaVM *javaVM(); Q_CORE_EXPORT jint initJNI(JavaVM *vm, JNIEnv *env); @@ -82,6 +90,11 @@ namespace QtAndroidPrivate Q_CORE_EXPORT void handleNewIntent(JNIEnv *env, jobject intent); Q_CORE_EXPORT void registerNewIntentListener(NewIntentListener *listener); Q_CORE_EXPORT void unregisterNewIntentListener(NewIntentListener *listener); + + Q_CORE_EXPORT void handlePause(); + Q_CORE_EXPORT void handleResume(); + Q_CORE_EXPORT void registerResumePauseListener(ResumePauseListener *listener); + Q_CORE_EXPORT void unregisterResumePauseListener(ResumePauseListener *listener); } QT_END_NAMESPACE diff --git a/src/gui/kernel/qscreen.cpp b/src/gui/kernel/qscreen.cpp index 038be09dc7..5785722918 100644 --- a/src/gui/kernel/qscreen.cpp +++ b/src/gui/kernel/qscreen.cpp @@ -37,6 +37,7 @@ #include "qguiapplication_p.h" #include <qpa/qplatformscreen.h> +#include <QtCore/QDebug> #include <QtCore/private/qobject_p.h> QT_BEGIN_NAMESPACE @@ -654,4 +655,41 @@ QPixmap QScreen::grabWindow(WId window, int x, int y, int width, int height) return platformScreen->grabWindow(window, x, y, width, height); } +#ifndef QT_NO_DEBUG_STREAM + +static inline void formatRect(QDebug &debug, const QRect r) +{ + debug << r.width() << 'x' << r.height() + << forcesign << r.x() << r.y() << noforcesign; +} + +Q_GUI_EXPORT QDebug operator<<(QDebug debug, const QScreen *screen) +{ + const QDebugStateSaver saver(debug); + debug.nospace(); + debug << "QScreen(" << (void *)screen; + if (screen) { + debug << ", name=" << screen->name(); + if (debug.verbosity() > 2) { + if (screen == QGuiApplication::primaryScreen()) + debug << ", primary"; + debug << ", geometry="; + formatRect(debug, screen->geometry()); + debug << ", available="; + formatRect(debug, screen->availableGeometry()); + debug << ", logical DPI=" << screen->logicalDotsPerInchX() + << ',' << screen->logicalDotsPerInchY() + << ", physical DPI=" << screen->physicalDotsPerInchX() + << ',' << screen->physicalDotsPerInchY() + << ", devicePixelRatio=" << screen->devicePixelRatio() + << ", orientation=" << screen->orientation() + << ", physical size=" << screen->physicalSize().width() + << 'x' << screen->physicalSize().height() << "mm"; + } + } + debug << ')'; + return debug; +} +#endif // !QT_NO_DEBUG_STREAM + QT_END_NAMESPACE diff --git a/src/gui/kernel/qscreen.h b/src/gui/kernel/qscreen.h index 255e735baf..f60fafcf63 100644 --- a/src/gui/kernel/qscreen.h +++ b/src/gui/kernel/qscreen.h @@ -52,6 +52,9 @@ class QScreenPrivate; class QWindow; class QRect; class QPixmap; +#ifndef QT_NO_DEBUG_STREAM +class QDebug; +#endif class Q_GUI_EXPORT QScreen : public QObject { @@ -153,6 +156,10 @@ private: friend class QPlatformScreen; }; +#ifndef QT_NO_DEBUG_STREAM +Q_GUI_EXPORT QDebug operator<<(QDebug, const QScreen *); +#endif + QT_END_NAMESPACE #endif // QSCREEN_H diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index 06674d204d..fd4c769049 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -2458,6 +2458,45 @@ void QWindowPrivate::applyCursor() } #endif // QT_NO_CURSOR +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug debug, const QWindow *window) +{ + QDebugStateSaver saver(debug); + debug.nospace(); + if (window) { + debug << window->metaObject()->className() << '(' << (void *)window; + if (!window->objectName().isEmpty()) + debug << ", name=" << window->objectName(); + if (debug.verbosity() > 2) { + const QRect geometry = window->geometry(); + if (window->isVisible()) + debug << ", visible"; + if (window->isExposed()) + debug << ", exposed"; + debug << ", state=" << window->windowState() + << ", type=" << window->type() << ", flags=" << window->flags() + << ", surface type=" << window->surfaceType(); + if (window->isTopLevel()) + debug << ", toplevel"; + debug << ", " << geometry.width() << 'x' << geometry.height() + << forcesign << geometry.x() << geometry.y() << noforcesign; + const QMargins margins = window->frameMargins(); + if (!margins.isNull()) + debug << ", margins=" << margins; + debug << ", devicePixelRatio=" << window->devicePixelRatio(); + if (const QPlatformWindow *platformWindow = window->handle()) + debug << ", winId=0x" << hex << platformWindow->winId() << dec; + if (const QScreen *screen = window->screen()) + debug << ", on " << screen->name(); + } + debug << ')'; + } else { + debug << "QWindow(0x0)"; + } + return debug; +} +#endif // !QT_NO_DEBUG_STREAM + QT_END_NAMESPACE #include "moc_qwindow.cpp" diff --git a/src/gui/kernel/qwindow.h b/src/gui/kernel/qwindow.h index f9fe37718c..67585ce963 100644 --- a/src/gui/kernel/qwindow.h +++ b/src/gui/kernel/qwindow.h @@ -78,6 +78,9 @@ class QBackingStore; class QScreen; class QAccessibleInterface; class QWindowContainer; +#ifndef QT_NO_DEBUG_STREAM +class QDebug; +#endif class Q_GUI_EXPORT QWindow : public QObject, public QSurface { @@ -367,6 +370,10 @@ template <> inline const QWindow *qobject_cast<const QWindow*>(const QObject *o) } #endif // !Q_QDOC +#ifndef QT_NO_DEBUG_STREAM +Q_GUI_EXPORT QDebug operator<<(QDebug, const QWindow *); +#endif + QT_END_NAMESPACE #endif // QWINDOW_H diff --git a/src/plugins/platforms/android/androidjnimain.cpp b/src/plugins/platforms/android/androidjnimain.cpp index a18e9dac5f..b30aab5b11 100644 --- a/src/plugins/platforms/android/androidjnimain.cpp +++ b/src/plugins/platforms/android/androidjnimain.cpp @@ -594,6 +594,11 @@ static void updateApplicationState(JNIEnv */*env*/, jobject /*thiz*/, jint state return; } + if (state == Qt::ApplicationActive) + QtAndroidPrivate::handleResume(); + else if (state == Qt::ApplicationInactive) + QtAndroidPrivate::handlePause(); + if (state <= Qt::ApplicationInactive) { // Don't send timers and sockets events anymore if we are going to hide all windows QAndroidEventDispatcherStopper::instance()->goingToStop(true); diff --git a/src/testlib/qtestblacklist.cpp b/src/testlib/qtestblacklist.cpp index 1cf2ee09e3..bf795fcd68 100644 --- a/src/testlib/qtestblacklist.cpp +++ b/src/testlib/qtestblacklist.cpp @@ -36,6 +36,9 @@ #include <QtTest/qtestcase.h> #include <QtCore/qbytearray.h> #include <QtCore/qfile.h> +#include <QtCore/qset.h> +#include <QtCore/qcoreapplication.h> +#include <QtCore/qvariant.h> #include <set> @@ -59,67 +62,71 @@ QT_BEGIN_NAMESPACE The known keys are listed below: */ -// this table can be extended with new keywords as required -const char *matchedConditions[] = +static QSet<QByteArray> keywords() { - "*", + // this list can be extended with new keywords as required + QSet<QByteArray> set = QSet<QByteArray>() + << "*" #ifdef Q_OS_LINUX - "linux", + << "linux" #endif #ifdef Q_OS_OSX - "osx", + << "osx" #endif #ifdef Q_OS_WIN - "windows", + << "windows" #endif #ifdef Q_OS_IOS - "ios", + << "ios" #endif #ifdef Q_OS_ANDROID - "android", + << "android" #endif #ifdef Q_OS_QNX - "qnx", + << "qnx" #endif #ifdef Q_OS_WINRT - "winrt", + << "winrt" #endif #ifdef Q_OS_WINCE - "wince", + << "wince" #endif #if QT_POINTER_SIZE == 8 - "64bit", + << "64bit" #else - "32bit", + << "32bit" #endif #ifdef Q_CC_GNU - "gcc", + << "gcc" #endif #ifdef Q_CC_CLANG - "clang", + << "clang" #endif #ifdef Q_CC_MSVC - "msvc", + << "msvc" #endif #ifdef Q_AUTOTEST_EXPORT - "developer-build", + << "developer-build" #endif - 0 -}; + ; + QCoreApplication *app = QCoreApplication::instance(); + if (app) { + const QVariant platformName = app->property("platformName"); + if (platformName.isValid()) + set << platformName.toByteArray(); + } + + return set; +} static bool checkCondition(const QByteArray &condition) { + static QSet<QByteArray> matchedConditions = keywords(); QList<QByteArray> conds = condition.split(' '); - std::set<QByteArray> matches; - const char **m = matchedConditions; - while (*m) { - matches.insert(*m); - ++m; - } for (int i = 0; i < conds.size(); ++i) { QByteArray c = conds.at(i); @@ -127,7 +134,7 @@ static bool checkCondition(const QByteArray &condition) if (result) c = c.mid(1); - result ^= (matches.find(c) != matches.end()); + result ^= matchedConditions.contains(c); if (!result) return false; } diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 07a39234ef..850490ff6b 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -12819,6 +12819,65 @@ void QWidgetPrivate::setWidgetParentHelper(QObject *widgetAsObject, QObject *new widget->setParent(static_cast<QWidget*>(newParent)); } +#ifndef QT_NO_DEBUG_STREAM + +static inline void formatWidgetAttributes(QDebug debug, const QWidget *widget) +{ + const QMetaObject *qtMo = qt_getEnumMetaObject(Qt::WA_AttributeCount); + const QMetaEnum me = qtMo->enumerator(qtMo->indexOfEnumerator("WidgetAttribute")); + debug << ", attributes=["; + int count = 0; + for (int a = 0; a < Qt::WA_AttributeCount; ++a) { + if (widget->testAttribute(static_cast<Qt::WidgetAttribute>(a))) { + if (count++) + debug << ','; + debug << me.valueToKey(a); + } + } + debug << ']'; +} + +QDebug operator<<(QDebug debug, const QWidget *widget) +{ + const QDebugStateSaver saver(debug); + debug.nospace(); + if (widget) { + debug << widget->metaObject()->className() << '(' << (void *)widget; + if (!widget->objectName().isEmpty()) + debug << ", name=" << widget->objectName(); + if (debug.verbosity() > 2) { + const QRect geometry = widget->geometry(); + const QRect frameGeometry = widget->frameGeometry(); + if (widget->isVisible()) + debug << ", visible"; + if (!widget->isEnabled()) + debug << ", disabled"; + debug << ", states=" << widget->windowState() + << ", type=" << widget->windowType() << ", flags=" << widget->windowFlags(); + formatWidgetAttributes(debug, widget); + if (widget->isWindow()) + debug << ", window"; + debug << ", " << geometry.width() << 'x' << geometry.height() + << forcesign << geometry.x() << geometry.y() << noforcesign; + if (frameGeometry != geometry) { + const QMargins margins(geometry.x() - frameGeometry.x(), + geometry.y() - frameGeometry.y(), + frameGeometry.right() - geometry.right(), + frameGeometry.bottom() - geometry.bottom()); + debug << ", margins=" << margins; + } + debug << ", devicePixelRatio=" << widget->devicePixelRatio(); + if (const WId wid = widget->internalWinId()) + debug << ", winId=0x" << hex << wid << dec; + } + debug << ')'; + } else { + debug << "QWidget(0x0)"; + } + return debug; +} +#endif // !QT_NO_DEBUG_STREAM + QT_END_NAMESPACE #include "moc_qwidget.cpp" diff --git a/src/widgets/kernel/qwidget.h b/src/widgets/kernel/qwidget.h index d49551f4f4..782c892a32 100644 --- a/src/widgets/kernel/qwidget.h +++ b/src/widgets/kernel/qwidget.h @@ -89,6 +89,9 @@ class QGraphicsEffect; class QRasterWindowSurface; class QUnifiedToolbarSurface; class QPixmap; +#ifndef QT_NO_DEBUG_STREAM +class QDebug; +#endif class QWidgetData { @@ -858,6 +861,10 @@ inline bool QWidget::testAttribute(Qt::WidgetAttribute attribute) const #define QWIDGETSIZE_MAX ((1<<24)-1) +#ifndef QT_NO_DEBUG_STREAM +Q_WIDGETS_EXPORT QDebug operator<<(QDebug, const QWidget *); +#endif + QT_END_NAMESPACE #endif // QWIDGET_H |