From 366aba402f7ed53f83447f23d044cbc950f87252 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Tue, 23 Jul 2013 11:51:08 +0200 Subject: [PATCH 001/131] Bump Qt version to 5.1.2 Change-Id: Ibe3e6a37a874b75ea9a20e0a9ed8aa5f21bf6be2 Reviewed-by: Oswald Buddenhagen --- src/corelib/global/qglobal.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/corelib/global/qglobal.h b/src/corelib/global/qglobal.h index 4e63e5d0ba..cde3e96ed1 100644 --- a/src/corelib/global/qglobal.h +++ b/src/corelib/global/qglobal.h @@ -45,11 +45,11 @@ #include -#define QT_VERSION_STR "5.1.1" +#define QT_VERSION_STR "5.1.2" /* QT_VERSION is (major << 16) + (minor << 8) + patch. */ -#define QT_VERSION 0x050101 +#define QT_VERSION 0x050102 /* can be used like #if (QT_VERSION >= QT_VERSION_CHECK(4, 4, 0)) */ From bd602a2dc4bc9491f80919b09a8990edb6fbee97 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Tue, 23 Jul 2013 15:57:59 +0200 Subject: [PATCH 002/131] QPrintDialog: document the modality on OS X and Windows You can't programmatically close the dialog because it's modal. Task-number: QTBUG-32464 Change-Id: I2f24581dc660a088b4e741fa4ee1518e27adea4a Reviewed-by: Friedemann Kleint Reviewed-by: Jerome Pasion --- src/printsupport/dialogs/qabstractprintdialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/printsupport/dialogs/qabstractprintdialog.cpp b/src/printsupport/dialogs/qabstractprintdialog.cpp index 6951d8c7bc..ba5320f040 100644 --- a/src/printsupport/dialogs/qabstractprintdialog.cpp +++ b/src/printsupport/dialogs/qabstractprintdialog.cpp @@ -460,6 +460,10 @@ void QAbstractPrintDialog::setOptionTabs(const QList &tabs) is shown with exec(), done() causes the local event loop to finish, and exec() to return \a result. + \note This function does not apply to the Native Print Dialog on the Mac + OS X and Windows platforms, because the dialog is required to be modal + and only the user can close it. + \sa QDialog::done() */ void QPrintDialog::done(int result) From 0edf1390ca0cd70cd2b4d4c971a9631f0f35c24c Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 23 Jul 2013 11:40:43 +0200 Subject: [PATCH 003/131] Windows: Mark window margins as dirty when the theme changes. Task-number: QTBUG-31523 Change-Id: Ibd8ed4e3fc5b6d1723f94dc32b3bf86b74e71020 Reviewed-by: Joerg Bornemann --- src/plugins/platforms/windows/qwindowscontext.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 872fd07729..42b0ee9bfe 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -848,10 +848,15 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, case QtWindows::CloseEvent: QWindowSystemInterface::handleCloseEvent(platformWindow->window()); return true; - case QtWindows::ThemeChanged: // ### fixme: Compress these events? + case QtWindows::ThemeChanged: { + // Switch from Aero to Classic changes margins. + const Qt::WindowFlags flags = platformWindow->window()->flags(); + if ((flags & Qt::WindowType_Mask) != Qt::Desktop && !(flags & Qt::FramelessWindowHint)) + platformWindow->setFlag(QWindowsWindow::FrameDirty); if (QWindowsTheme *theme = QWindowsTheme::instance()) theme->windowsThemeChanged(platformWindow->window()); return true; + } #ifndef Q_OS_WINCE case QtWindows::ActivateWindowEvent: if (platformWindow->testFlag(QWindowsWindow::BlockedByModal)) From 77833b90c8d93b86904b744f7be2926ba377ca6e Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 23 Jul 2013 15:42:55 +0200 Subject: [PATCH 004/131] Fix crashes when invoking toVariant() on empty QJsonValue objects. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I51cd114e862c6fad564484e990348f324ad56ab9 Reviewed-by: Jędrzej Nowacki --- src/corelib/json/qjsonvalue.cpp | 8 ++++++-- tests/auto/corelib/json/tst_qtjson.cpp | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/corelib/json/qjsonvalue.cpp b/src/corelib/json/qjsonvalue.cpp index a540626579..3fbc811948 100644 --- a/src/corelib/json/qjsonvalue.cpp +++ b/src/corelib/json/qjsonvalue.cpp @@ -384,9 +384,13 @@ QVariant QJsonValue::toVariant() const case String: return toString(); case Array: - return QJsonArray(d, static_cast(base)).toVariantList(); + return d ? + QJsonArray(d, static_cast(base)).toVariantList() : + QVariantList(); case Object: - return QJsonObject(d, static_cast(base)).toVariantMap(); + return d ? + QJsonObject(d, static_cast(base)).toVariantMap() : + QVariantMap(); case Null: case Undefined: break; diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp index bdf8c86442..94e6e1129e 100644 --- a/tests/auto/corelib/json/tst_qtjson.cpp +++ b/tests/auto/corelib/json/tst_qtjson.cpp @@ -1062,6 +1062,8 @@ void tst_QtJson::fromVariantMap() void tst_QtJson::toVariantMap() { + QCOMPARE(QMetaType::Type(QJsonValue(QJsonObject()).toVariant().type()), QMetaType::QVariantMap); // QTBUG-32524 + QJsonObject object; QVariantMap map = object.toVariantMap(); QVERIFY(map.isEmpty()); @@ -1091,6 +1093,8 @@ void tst_QtJson::toVariantMap() void tst_QtJson::toVariantList() { + QCOMPARE(QMetaType::Type(QJsonValue(QJsonArray()).toVariant().type()), QMetaType::QVariantList); // QTBUG-32524 + QJsonArray array; QVariantList list = array.toVariantList(); QVERIFY(list.isEmpty()); From 37ab8b4ed744f403d6c958284a9108dd1979b7f1 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Jul 2013 11:32:32 +0200 Subject: [PATCH 005/131] CMake: Remove copy-pasto for the IMPORTED_LOCATION Task-number: QTBUG-32579 Change-Id: Ibe9dd92824091989168fca842a59b556937b1f08 Reviewed-by: Oswald Buddenhagen Reviewed-by: Stephen Kelly --- mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in index bcff3166d3..478d1d13d5 100644 --- a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in +++ b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in @@ -49,7 +49,7 @@ macro(_populate_$${CMAKE_MODULE_NAME}_target_properties Configuration LIB_LOCATI !!IF isEmpty(CMAKE_DLL_DIR_IS_ABSOLUTE) set(imported_location \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$${CMAKE_DLL_DIR}${LIB_LOCATION}\") !!ELSE - set(imported_location \"IMPORTED_LOCATION_${Configuration}\" \"$${CMAKE_DLL_DIR}${LIB_LOCATION}\") + set(imported_location \"$${CMAKE_DLL_DIR}${LIB_LOCATION}\") !!ENDIF _qt5_$${CMAKE_MODULE_NAME}_check_file_exists(${imported_location}) set_target_properties(Qt5::$${CMAKE_MODULE_NAME} PROPERTIES From 27313d12449cf9e84ca1e3ebb723c23a889edc18 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Jul 2013 09:43:15 +0200 Subject: [PATCH 006/131] CMake: Add a clean_path before returning a path. The $$path may already be absolute, so prepending a slash may result in //usr/lib, for example. Task-number: QTBUG-32570 Change-Id: If7a4f6fbec0216404cfe48c1da62d21d75b3e272 Reviewed-by: Oswald Buddenhagen Reviewed-by: Stephen Kelly --- mkspecs/features/cmake_functions.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/cmake_functions.prf b/mkspecs/features/cmake_functions.prf index 2dc72a7a2f..fac73b464c 100644 --- a/mkspecs/features/cmake_functions.prf +++ b/mkspecs/features/cmake_functions.prf @@ -29,7 +29,7 @@ defineReplace(cmakeTargetPath) { SYSR = $$[QT_SYSROOT] !isEmpty(SYSR): path = $$relative_path($$1, $$[QT_SYSROOT]) else: path = $$1 - return(/$$path) + return($$clean_path(/$$path)) } defineReplace(cmakeTargetPaths) { From 9b7adfa081b5ded58b682b88ef8f378a5ff53a18 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Jul 2013 10:23:08 +0200 Subject: [PATCH 007/131] Move the cmakeRelativePath function to cmake_functions. Task-number: QTBUG-32570 Change-Id: I05bbf7084ef8501bf17698f2ecc1cf3d8fd4d460 Reviewed-by: Oswald Buddenhagen Reviewed-by: Stephen Kelly --- mkspecs/features/cmake_functions.prf | 5 +++++ mkspecs/features/create_cmake.prf | 5 ----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mkspecs/features/cmake_functions.prf b/mkspecs/features/cmake_functions.prf index fac73b464c..a9b0c86cad 100644 --- a/mkspecs/features/cmake_functions.prf +++ b/mkspecs/features/cmake_functions.prf @@ -63,3 +63,8 @@ defineReplace(cmakeProcessLibs) { } return ($$join(out, ";")) } + +defineReplace(cmakeRelativePath) { + path = $$relative_path($$1, $$2) + return($$replace(path, ([^/])$, \\1/)) +} diff --git a/mkspecs/features/create_cmake.prf b/mkspecs/features/create_cmake.prf index 7a200056ae..58a0620e01 100644 --- a/mkspecs/features/create_cmake.prf +++ b/mkspecs/features/create_cmake.prf @@ -11,11 +11,6 @@ load(cmake_functions) -defineReplace(cmakeRelativePath) { - path = $$relative_path($$1, $$2) - return($$replace(path, ([^/])$, \\1/)) -} - CMAKE_MODULE_NAME = $$cmakeModuleName($${MODULE}) CMAKE_MODULE_DEPS = $$cmakeModuleList($$sort_depends(QT.$${MODULE}.depends, QT.)) From 880f73d1f0382d4ac91f54f47e1c6be0b760c393 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 23 Jul 2013 10:23:47 +0200 Subject: [PATCH 008/131] Use absolute path in the /usr move workaround if -libdir is specified Change-Id: I68d087b15839418008db5bf1c0c76ca303245519 Reviewed-by: Oswald Buddenhagen Reviewed-by: Stephen Kelly --- mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in index 478d1d13d5..c4b58fe7d7 100644 --- a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in +++ b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in @@ -4,6 +4,9 @@ if (CMAKE_VERSION VERSION_LESS 2.8.3) endif() !!IF !isEmpty(CMAKE_USR_MOVE_WORKAROUND) +!!IF !isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE) +set(_qt5$${CMAKE_MODULE_NAME}_install_prefix \"$$[QT_INSTALL_PREFIX]\") +!!ELSE get_filename_component(_IMPORT_PREFIX \"${CMAKE_CURRENT_LIST_FILE}\" PATH) # Use original install prefix when loaded through a # cross-prefix symbolic link such as /lib -> /usr/lib. @@ -17,6 +20,7 @@ endif() unset(_realOrig) unset(_realCurr) unset(_IMPORT_PREFIX) +!!ENDIF !!ELIF isEmpty(CMAKE_LIB_DIR_IS_ABSOLUTE) get_filename_component(_qt5$${CMAKE_MODULE_NAME}_install_prefix \"${CMAKE_CURRENT_LIST_DIR}/$${CMAKE_RELATIVE_INSTALL_DIR}\" ABSOLUTE) !!ELSE From 3f95ae8e2f7568313da5e4c3157e3285b5fdda09 Mon Sep 17 00:00:00 2001 From: Topi Reinio Date: Tue, 23 Jul 2013 11:22:44 +0200 Subject: [PATCH 009/131] Doc: Update documentation of Qt::HANDLE Qt::HANDLE is always defined as 'void *' on Qt 5.0 Task-number: QTBUG-32469 Change-Id: I3f0f2b19e65d54c88604e1cb65b5791c456b3003 Reviewed-by: Jerome Pasion --- src/corelib/global/qnamespace.qdoc | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index f9248eb68d..677cddc87e 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -1207,12 +1207,8 @@ /*! \typedef Qt::HANDLE - Platform-specific handle type for system objects. This is - equivalent to \c{void *} on Mac OS X and embedded Linux, - and to \c{unsigned long} on X11. On Windows it is the - DWORD returned by the Win32 function getCurrentThreadId(). - - \warning Using this type is not portable. + A handle type for system objects, defined as \c{void *} + on all platforms. */ /*! From 78f9f4b4970e6f4155b7cf2e88c6ac540dec47bc Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Mon, 22 Jul 2013 12:14:41 +0200 Subject: [PATCH 010/131] HTTP internals: do not access reply that was deleted already ... rather than crashing. Task-number: QTBUG-32404 Change-Id: Ia2f938394fb451459564ef5966419f952b3e2d0e Reviewed-by: Richard J. Moore --- src/network/access/qhttpnetworkconnectionchannel.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp index 5c537691e2..e14f426583 100644 --- a/src/network/access/qhttpnetworkconnectionchannel.cpp +++ b/src/network/access/qhttpnetworkconnectionchannel.cpp @@ -1116,6 +1116,9 @@ void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socket errorCode = QNetworkReply::RemoteHostClosedError; } } else if (state == QHttpNetworkConnectionChannel::ReadingState) { + if (!reply) + break; + if (!reply->d_func()->expectContent()) { // No content expected, this is a valid way to have the connection closed by the server return; From f2a611ce6cb0f86d9331641a804de6a507900db7 Mon Sep 17 00:00:00 2001 From: Tomasz Olszak Date: Thu, 18 Jul 2013 20:45:47 +0000 Subject: [PATCH 011/131] Fixed mkspecs/devices/linux_device_post.conf for non-arm platforms. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now arm specific -mfloat-abi flag is added to compiler flags only for arm architecture in linux_arm_device_post.conf. Change-Id: Ie77ac6e0717d9d1fd9c14e1d6a26e86f08ab418c Reviewed-by: Jarosław Staniek Reviewed-by: Oswald Buddenhagen --- mkspecs/devices/common/linux_arm_device_post.conf | 7 +++++++ mkspecs/devices/common/linux_device_post.conf | 6 ------ mkspecs/devices/linux-imx53qsb-g++/qmake.conf | 2 +- mkspecs/devices/linux-imx6-g++/qmake.conf | 2 +- mkspecs/devices/linux-rasp-pi-g++/qmake.conf | 2 +- mkspecs/devices/linux-tegra2-g++/qmake.conf | 2 +- 6 files changed, 11 insertions(+), 10 deletions(-) create mode 100644 mkspecs/devices/common/linux_arm_device_post.conf diff --git a/mkspecs/devices/common/linux_arm_device_post.conf b/mkspecs/devices/common/linux_arm_device_post.conf new file mode 100644 index 0000000000..7ce47592a9 --- /dev/null +++ b/mkspecs/devices/common/linux_arm_device_post.conf @@ -0,0 +1,7 @@ +contains(DISTRO_OPTS, hard-float) { + COMPILER_FLAGS += -mfloat-abi=hard +} else { + COMPILER_FLAGS += -mfloat-abi=softfp +} + +include(linux_device_post.conf) diff --git a/mkspecs/devices/common/linux_device_post.conf b/mkspecs/devices/common/linux_device_post.conf index f8dbf762d8..548e75affa 100644 --- a/mkspecs/devices/common/linux_device_post.conf +++ b/mkspecs/devices/common/linux_device_post.conf @@ -3,12 +3,6 @@ contains(DISTRO_OPTS, deb-multi-arch) { -Wl,-rpath-link,$$[QT_SYSROOT]/lib/$${GCC_MACHINE_DUMP} } -contains(DISTRO_OPTS, hard-float) { - COMPILER_FLAGS += -mfloat-abi=hard -} else { - COMPILER_FLAGS += -mfloat-abi=softfp -} - QMAKE_CFLAGS += $$COMPILER_FLAGS QMAKE_CXXFLAGS += $$COMPILER_FLAGS diff --git a/mkspecs/devices/linux-imx53qsb-g++/qmake.conf b/mkspecs/devices/linux-imx53qsb-g++/qmake.conf index 0a5ed89feb..3a9766c4cb 100644 --- a/mkspecs/devices/linux-imx53qsb-g++/qmake.conf +++ b/mkspecs/devices/linux-imx53qsb-g++/qmake.conf @@ -32,6 +32,6 @@ QMAKE_CXXFLAGS_RELEASE += $$IMX5_CFLAGS_RELEASE QMAKE_CFLAGS_DEBUG += $$IMX5_CFLAGS QMAKE_CXXFLAGS_DEBUG += $$IMX5_CFLAGS -include(../common/linux_device_post.conf) +include(../common/linux_arm_device_post.conf) load(qt_config) diff --git a/mkspecs/devices/linux-imx6-g++/qmake.conf b/mkspecs/devices/linux-imx6-g++/qmake.conf index 20f6d115bf..2b8dbf6b67 100644 --- a/mkspecs/devices/linux-imx6-g++/qmake.conf +++ b/mkspecs/devices/linux-imx6-g++/qmake.conf @@ -34,6 +34,6 @@ QMAKE_CXXFLAGS_RELEASE += $$IMX6_CFLAGS_RELEASE QMAKE_CFLAGS_DEBUG += $$IMX6_CFLAGS QMAKE_CXXFLAGS_DEBUG += $$IMX6_CFLAGS -include(../common/linux_device_post.conf) +include(../common/linux_arm_device_post.conf) load(qt_config) diff --git a/mkspecs/devices/linux-rasp-pi-g++/qmake.conf b/mkspecs/devices/linux-rasp-pi-g++/qmake.conf index d6fea474a6..5f923ad5c6 100644 --- a/mkspecs/devices/linux-rasp-pi-g++/qmake.conf +++ b/mkspecs/devices/linux-rasp-pi-g++/qmake.conf @@ -42,6 +42,6 @@ QMAKE_CXXFLAGS = $$QMAKE_CFLAGS EGLFS_PLATFORM_HOOKS_SOURCES = $$PWD/qeglfshooks_pi.cpp EGLFS_PLATFORM_HOOKS_LIBS = -lbcm_host -include(../common/linux_device_post.conf) +include(../common/linux_arm_device_post.conf) load(qt_config) diff --git a/mkspecs/devices/linux-tegra2-g++/qmake.conf b/mkspecs/devices/linux-tegra2-g++/qmake.conf index 1c7a8cc52a..320e1b8a21 100644 --- a/mkspecs/devices/linux-tegra2-g++/qmake.conf +++ b/mkspecs/devices/linux-tegra2-g++/qmake.conf @@ -26,6 +26,6 @@ TEGRA2_CFLAGS = -mtune=cortex-a9 -march=armv7-a -mhard-float -mfloat-a QMAKE_CFLAGS += $$TEGRA2_CFLAGS QMAKE_CXXFLAGS += $$TEGRA2_CFLAGS -include(../common/linux_device_post.conf) +include(../common/linux_arm_device_post.conf) load(qt_config) From 03855decfcb4e05817424843564a4b66636bb347 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Tue, 23 Jul 2013 15:48:41 +0200 Subject: [PATCH 012/131] QPrintDialog OSX: don't crash if ApplicationModal and no parent Task-number: QTBUG-32464 Change-Id: I5ee2741735255254c17555dfb977ce73941d3e22 Reviewed-by: Friedemann Kleint Reviewed-by: Liang Qi --- src/printsupport/dialogs/qprintdialog_mac.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/printsupport/dialogs/qprintdialog_mac.mm b/src/printsupport/dialogs/qprintdialog_mac.mm index e76bb18626..9839268af4 100644 --- a/src/printsupport/dialogs/qprintdialog_mac.mm +++ b/src/printsupport/dialogs/qprintdialog_mac.mm @@ -198,7 +198,9 @@ void QPrintDialogPrivate::openCocoaPrintPanel(Qt::WindowModality modality) qApp->processEvents(QEventLoop::ExcludeUserInputEvents, QEventLoop::ExcludeSocketNotifiers); QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate) *delegate = [[QT_MANGLE_NAMESPACE(QCocoaPrintPanelDelegate) alloc] init]; - if (modality == Qt::ApplicationModal) { + if (modality == Qt::ApplicationModal || !q->parentWidget()) { + if (modality == Qt::NonModal) + qWarning("QPrintDialog is required to be modal on OS X"); int rval = [printPanel runModalWithPrintInfo:printInfo]; [delegate printPanelDidEnd:printPanel returnCode:rval contextInfo:q]; } else { From 4acff670c522501417aa5159a8aea42b1ae962bb Mon Sep 17 00:00:00 2001 From: Wouter Huysentruit Date: Mon, 22 Jul 2013 13:45:30 +0200 Subject: [PATCH 013/131] Configure: add -no-wmf-backend option This option is required to build qtmultimedia without Windows Media Foundation backend. In this case, a full DirectShow backend will be build instead. Change-Id: Ib29ba81ca6cbb00b609cc97fab7da29e61d31d6d Reviewed-by: Oswald Buddenhagen Reviewed-by: Yoann Lopes --- tools/configure/configureapp.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index a6376bbb7d..de91a1558d 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -192,6 +192,7 @@ Configure::Configure(int& argc, char** argv) dictionary[ "CETEST" ] = "auto"; dictionary[ "CE_SIGNATURE" ] = "no"; dictionary[ "AUDIO_BACKEND" ] = "auto"; + dictionary[ "WMF_BACKEND" ] = "auto"; dictionary[ "WMSDK" ] = "auto"; dictionary[ "V8SNAPSHOT" ] = "auto"; dictionary[ "QML_DEBUG" ] = "yes"; @@ -855,6 +856,10 @@ void Configure::parseCmdLine() dictionary[ "AUDIO_BACKEND" ] = "yes"; } else if (configCmdLine.at(i) == "-no-audio-backend") { dictionary[ "AUDIO_BACKEND" ] = "no"; + } else if (configCmdLine.at(i) == "-wmf-backend") { + dictionary[ "WMF_BACKEND" ] = "yes"; + } else if (configCmdLine.at(i) == "-no-wmf-backend") { + dictionary[ "WMF_BACKEND" ] = "no"; } else if (configCmdLine.at(i) == "-no-qml-debug") { dictionary[ "QML_DEBUG" ] = "no"; } else if (configCmdLine.at(i) == "-qml-debug") { @@ -1869,6 +1874,8 @@ bool Configure::displayHelp() desc("DBUS", "linked", "-dbus-linked", "Compile in D-Bus support and link to libdbus-1.\n"); desc("AUDIO_BACKEND", "no","-no-audio-backend", "Do not compile in the platform audio backend into\nQt Multimedia."); desc("AUDIO_BACKEND", "yes","-audio-backend", "Compile in the platform audio backend into Qt Multimedia.\n"); + desc("WMF_BACKEND", "no","-no-wmf-backend", "Do not compile in the windows media foundation backend\ninto Qt Multimedia."); + desc("WMF_BACKEND", "yes","-wmf-backend", "Compile in the windows media foundation backend into Qt Multimedia.\n"); desc("QML_DEBUG", "no", "-no-qml-debug", "Do not build the in-process QML debugging support."); desc("QML_DEBUG", "yes", "-qml-debug", "Build the in-process QML debugging support.\n"); desc("DIRECTWRITE", "no", "-no-directwrite", "Do not build support for DirectWrite font rendering."); @@ -2145,6 +2152,8 @@ bool Configure::checkAvailability(const QString &part) available = true; } else if (part == "AUDIO_BACKEND") { available = true; + } else if (part == "WMF_BACKEND") { + available = findFile("mfapi.h") && findFile("mf.lib"); } else if (part == "DIRECTWRITE") { available = findFile("dwrite.h") && findFile("d2d1.h") && findFile("dwrite.lib"); } else if (part == "ICONV") { @@ -2264,6 +2273,8 @@ void Configure::autoDetection() dictionary["QML_DEBUG"] = dictionary["QML"] == "yes" ? "yes" : "no"; if (dictionary["AUDIO_BACKEND"] == "auto") dictionary["AUDIO_BACKEND"] = checkAvailability("AUDIO_BACKEND") ? "yes" : "no"; + if (dictionary["WMF_BACKEND"] == "auto") + dictionary["WMF_BACKEND"] = checkAvailability("WMF_BACKEND") ? "yes" : "no"; if (dictionary["WMSDK"] == "auto") dictionary["WMSDK"] = checkAvailability("WMSDK") ? "yes" : "no"; @@ -2629,6 +2640,9 @@ void Configure::generateOutputVars() if (dictionary["AUDIO_BACKEND"] == "yes") qtConfig += "audio-backend"; + if (dictionary["WMF_BACKEND"] == "yes") + qtConfig += "wmf-backend"; + if (dictionary["DIRECTWRITE"] == "yes") qtConfig += "directwrite"; From ec2aa7d282e007dcf62c79a7098286bdd9a6e1f5 Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Fri, 19 Jul 2013 15:27:16 +0200 Subject: [PATCH 014/131] xcb: Fix minor leaks in XSettings code If some of the X11 requests fail, QXcbXSettings::QXcbXSettings() prints a warning and returns. These error paths all caused memory leaks. Change-Id: Idfecf03dd412c35552c3bbbebdda9c039aeadc13 Signed-off-by: Uli Schlachter Reviewed-by: Laszlo Papp Reviewed-by: Dmitry Shachnev Reviewed-by: Robin Burchell --- src/plugins/platforms/xcb/qxcbxsettings.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/xcb/qxcbxsettings.cpp b/src/plugins/platforms/xcb/qxcbxsettings.cpp index c106bd00f8..1423c6262d 100644 --- a/src/plugins/platforms/xcb/qxcbxsettings.cpp +++ b/src/plugins/platforms/xcb/qxcbxsettings.cpp @@ -221,6 +221,7 @@ QXcbXSettings::QXcbXSettings(QXcbScreen *screen) xcb_intern_atom_reply_t *atom_reply = xcb_intern_atom_reply(screen->xcb_connection(),atom_cookie,&error); if (error) { qWarning() << Q_FUNC_INFO << "Failed to find XSETTINGS_S atom"; + free(error); return; } xcb_atom_t selection_owner_atom = atom_reply->atom; @@ -233,14 +234,15 @@ QXcbXSettings::QXcbXSettings(QXcbScreen *screen) xcb_get_selection_owner_reply(screen->xcb_connection(), selection_cookie, &error); if (error) { qWarning() << Q_FUNC_INFO << "Failed to get selection owner for XSETTINGS_S atom"; + free(error); return; } d_ptr->x_settings_window = selection_result->owner; + free(selection_result); if (!d_ptr->x_settings_window) { return; } - free(selection_result); const uint32_t event = XCB_CW_EVENT_MASK; const uint32_t event_mask[] = { XCB_EVENT_MASK_STRUCTURE_NOTIFY|XCB_EVENT_MASK_PROPERTY_CHANGE }; From 651a03b0dd9a5fe54e78648414327f9ba7bef4a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simo=20F=C3=A4lt?= Date: Wed, 24 Jul 2013 14:26:27 +0300 Subject: [PATCH 015/131] Fix for tst_qundostack autotest in shadow build Added full path to src dir for testdata. Task-number: QTBUG-32536 Change-Id: I5ef215d451a6407c277d2c98f21ffc35a8657e28 Reviewed-by: Friedemann Kleint --- tests/auto/widgets/util/qundostack/tst_qundostack.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/auto/widgets/util/qundostack/tst_qundostack.cpp b/tests/auto/widgets/util/qundostack/tst_qundostack.cpp index 4556816655..6e6c72db5e 100644 --- a/tests/auto/widgets/util/qundostack/tst_qundostack.cpp +++ b/tests/auto/widgets/util/qundostack/tst_qundostack.cpp @@ -2974,10 +2974,14 @@ void tst_QUndoStack::commandTextFormat() if (QProcess::execute(binDir + "/lrelease -version") != 0) QSKIP("lrelease is missing or broken"); - QVERIFY(!QProcess::execute(binDir + "/lrelease testdata/qundostack.ts")); + const QString tsFile = QFINDTESTDATA("testdata/qundostack.ts"); + QVERIFY(!tsFile.isEmpty()); + QVERIFY(!QProcess::execute(binDir + "/lrelease " + tsFile)); QTranslator translator; - QVERIFY(translator.load("testdata/qundostack.qm")); + const QString qmFile = QFINDTESTDATA("testdata/qundostack.qm"); + QVERIFY(!qmFile.isEmpty()); + QVERIFY(translator.load(qmFile)); qApp->installTranslator(&translator); QUndoStack stack; From 34d2abe3093a71ca098dd35bd6ac0aa78fe42249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simo=20F=C3=A4lt?= Date: Wed, 24 Jul 2013 14:51:05 +0300 Subject: [PATCH 016/131] Fix for tst_qundogroup autotest in shadow build Added full path to src dir for testdata. Task-number: QTBUG-32535 Change-Id: I38e96216e9a016869151adf0ae995e068b8b5354 Reviewed-by: Friedemann Kleint Reviewed-by: Sergio Ahumada --- tests/auto/widgets/util/qundogroup/tst_qundogroup.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/auto/widgets/util/qundogroup/tst_qundogroup.cpp b/tests/auto/widgets/util/qundogroup/tst_qundogroup.cpp index ddab98ebc6..7e0e942be5 100644 --- a/tests/auto/widgets/util/qundogroup/tst_qundogroup.cpp +++ b/tests/auto/widgets/util/qundogroup/tst_qundogroup.cpp @@ -615,10 +615,15 @@ void tst_QUndoGroup::commandTextFormat() if (QProcess::execute(binDir + "/lrelease -version") != 0) QSKIP("lrelease is missing or broken"); - QVERIFY(!QProcess::execute(binDir + "/lrelease testdata/qundogroup.ts")); + const QString tsFile = QFINDTESTDATA("testdata/qundogroup.ts"); + QVERIFY(!tsFile.isEmpty()); + QVERIFY(!QProcess::execute(binDir + "/lrelease " + tsFile)); QTranslator translator; - QVERIFY(translator.load("testdata/qundogroup.qm")); + + const QString qmFile = QFINDTESTDATA("testdata/qundogroup.qm"); + QVERIFY(!qmFile.isEmpty()); + QVERIFY(translator.load(qmFile)); qApp->installTranslator(&translator); QUndoGroup group; From 4b3346145543f5fd2ebc83c329a60407058468db Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 23 Jul 2013 10:17:26 +0200 Subject: [PATCH 017/131] Fix updating of screens in QDesktopWidget. Task-number: QTBUG-32567 Change-Id: Ib7442aed518427aa995cfc365ade6e6ffaf9c428 Reviewed-by: Shawn Rutledge --- src/widgets/kernel/qdesktopwidget.h | 1 + src/widgets/kernel/qdesktopwidget_qpa.cpp | 44 +++++++++++++++++------ src/widgets/kernel/qdesktopwidget_qpa_p.h | 2 +- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/src/widgets/kernel/qdesktopwidget.h b/src/widgets/kernel/qdesktopwidget.h index da44242b86..42c338f696 100644 --- a/src/widgets/kernel/qdesktopwidget.h +++ b/src/widgets/kernel/qdesktopwidget.h @@ -92,6 +92,7 @@ protected: private: Q_DISABLE_COPY(QDesktopWidget) Q_DECLARE_PRIVATE(QDesktopWidget) + Q_PRIVATE_SLOT(d_func(), void _q_updateScreens()) friend class QApplication; friend class QApplicationPrivate; diff --git a/src/widgets/kernel/qdesktopwidget_qpa.cpp b/src/widgets/kernel/qdesktopwidget_qpa.cpp index 64236321a4..015573dfbe 100644 --- a/src/widgets/kernel/qdesktopwidget_qpa.cpp +++ b/src/widgets/kernel/qdesktopwidget_qpa.cpp @@ -49,12 +49,13 @@ QT_BEGIN_NAMESPACE QT_USE_NAMESPACE -void QDesktopWidgetPrivate::updateScreenList() +void QDesktopWidgetPrivate::_q_updateScreens() { Q_Q(QDesktopWidget); - QList screenList = QGuiApplication::screens(); - int targetLength = screenList.length(); - int currentLength = screens.length(); + const QList screenList = QGuiApplication::screens(); + const int targetLength = screenList.length(); + const int oldLength = screens.length(); + int currentLength = oldLength; // Add or remove screen widgets as necessary if(currentLength > targetLength) { @@ -65,23 +66,41 @@ void QDesktopWidgetPrivate::updateScreenList() } } else if (currentLength < targetLength) { - QDesktopScreenWidget *screen; while (currentLength < targetLength) { - screen = new QDesktopScreenWidget(currentLength++); - screens.append(screen); + QScreen *qScreen = screenList.at(currentLength); + QDesktopScreenWidget *screenWidget = new QDesktopScreenWidget(currentLength++); + screenWidget->setGeometry(qScreen->geometry()); + QObject::connect(qScreen, SIGNAL(geometryChanged(QRect)), + q, SLOT(_q_updateScreens()), Qt::QueuedConnection); + QObject::connect(qScreen, SIGNAL(destroyed()), + q, SLOT(_q_updateScreens()), Qt::QueuedConnection); + screens.append(screenWidget); } } QRegion virtualGeometry; - // update the geometry of each screen widget + // update the geometry of each screen widget, determine virtual geometry + // and emit change signals afterwards. + QList changedScreens; for (int i = 0; i < screens.length(); i++) { - QRect screenGeometry = screenList.at(i)->geometry(); - screens.at(i)->setGeometry(screenGeometry); + const QRect screenGeometry = screenList.at(i)->geometry(); + if (screenGeometry != screens.at(i)->geometry()) { + screens.at(i)->setGeometry(screenGeometry); + changedScreens.push_back(i); + } virtualGeometry += screenGeometry; } q->setGeometry(virtualGeometry.boundingRect()); + + if (oldLength != targetLength) + emit q->screenCountChanged(targetLength); + + foreach (int changedScreen, changedScreens) { + emit q->resized(changedScreen); + emit q->workAreaResized(changedScreen); + } } QDesktopWidget::QDesktopWidget() @@ -89,7 +108,8 @@ QDesktopWidget::QDesktopWidget() { Q_D(QDesktopWidget); setObjectName(QLatin1String("desktop")); - d->updateScreenList(); + d->_q_updateScreens(); + connect(qApp, SIGNAL(screenAdded(QScreen*)), this, SLOT(_q_updateScreens())); } QDesktopWidget::~QDesktopWidget() @@ -169,3 +189,5 @@ void QDesktopWidget::resizeEvent(QResizeEvent *) } QT_END_NAMESPACE + +#include "moc_qdesktopwidget.cpp" diff --git a/src/widgets/kernel/qdesktopwidget_qpa_p.h b/src/widgets/kernel/qdesktopwidget_qpa_p.h index 017934fbf1..f461869f1b 100644 --- a/src/widgets/kernel/qdesktopwidget_qpa_p.h +++ b/src/widgets/kernel/qdesktopwidget_qpa_p.h @@ -74,7 +74,7 @@ class QDesktopWidgetPrivate : public QWidgetPrivate { public: ~QDesktopWidgetPrivate() {foreach(QDesktopScreenWidget *s, screens) delete s; } - void updateScreenList(); + void _q_updateScreens(); QList screens; }; From 28ff65f4dc67349ff88e4cd161b6bced7e9bf477 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Mon, 22 Jul 2013 14:58:27 +0200 Subject: [PATCH 018/131] QNX: hardcode on-demand SSL root cert loading The c_rehash'ed symlinks are always there on QNX, so no need to check at every app start for the feature. This saves ~ 17ms at each app start. Task-number: QTBUG-32549 Change-Id: Ia9df60aba9d1bd70868b7004b847867a2128f600 Reviewed-by: Andreas Holzammer Reviewed-by: Rafael Roquetto --- src/network/ssl/qsslsocket_openssl.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp index 675bd7d9f7..9de2811374 100644 --- a/src/network/ssl/qsslsocket_openssl.cpp +++ b/src/network/ssl/qsslsocket_openssl.cpp @@ -522,6 +522,8 @@ void QSslSocketPrivate::ensureCiphersAndCertsLoaded() } else { qWarning("could not load crypt32 library"); // should never happen } +#elif defined(Q_OS_QNX) + s_loadRootCertsOnDemand = true; #elif defined(Q_OS_UNIX) && !defined(Q_OS_MAC) // check whether we can enable on-demand root-cert loading (i.e. check whether the sym links are there) QList dirs = unixRootCertDirectories(); From 5d51634b4e42892841e10e47d081e10cfd8d3446 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Fri, 26 Jul 2013 10:50:34 +0200 Subject: [PATCH 019/131] Android: Add QT_NO_PRINTER to DEFINES Printing is not enabled for Android. Change-Id: I5f589a036355fd63a7616fd57eeba1354d91281b Reviewed-by: Paul Olav Tvete --- mkspecs/android-g++/qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/android-g++/qmake.conf b/mkspecs/android-g++/qmake.conf index 95fa8a9786..48b8e2119a 100644 --- a/mkspecs/android-g++/qmake.conf +++ b/mkspecs/android-g++/qmake.conf @@ -4,7 +4,7 @@ QMAKE_PLATFORM = android QMAKE_COMPILER = gcc CONFIG += android_install -DEFINES += QT_NO_PRINTDIALOG +DEFINES += QT_NO_PRINTER QT_NO_PRINTDIALOG include(../common/linux.conf) include(../common/gcc-base-unix.conf) From 06b6061b43a866d100c922f918c3b118a14dfaee Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Fri, 26 Jul 2013 14:22:58 +0200 Subject: [PATCH 020/131] test: Remove insignificant mark from tst_qfilesystemmodel Tests are passing nowaways on OS X. Task-number: QTBUG-27890 Change-Id: I6a0a881ece844ef931cb8af51b58d33c40be4d2c Reviewed-by: Friedemann Kleint --- .../auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro b/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro index e77364c3f0..fc9ec46e11 100644 --- a/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro +++ b/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro @@ -7,5 +7,3 @@ QT += core-private gui testlib SOURCES += tst_qfilesystemmodel.cpp TARGET = tst_qfilesystemmodel - -mac:CONFIG+=insignificant_test # QTBUG-27890 From 9fabb548daed933a54d24871eade9f60f9c2ae55 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 28 Jun 2013 15:54:09 +0200 Subject: [PATCH 021/131] EGLFS and MinimalEGL windows are not marked as OpenGL surfaces Several QOpenGLContext methods fails incorrectly on QWindows from EGL or MinimalEGL. This is happens because they are incorrectly marked as raster surfaces instead of OpenGL surfaces. Change-Id: Ic9b3859915a9049fce442216b01dce89521fa5ee Reviewed-by: Paul Olav Tvete --- src/plugins/platforms/eglfs/qeglfsbackingstore.cpp | 2 -- src/plugins/platforms/eglfs/qeglfswindow.cpp | 1 + src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp | 3 --- src/plugins/platforms/minimalegl/qminimaleglwindow.cpp | 1 + 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp index 1898cde886..eccb7f42c5 100644 --- a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp +++ b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp @@ -192,8 +192,6 @@ void QEglFSBackingStore::flush(QWindow *window, const QRegion ®ion, const QPo void QEglFSBackingStore::makeCurrent() { - // needed to prevent QOpenGLContext::makeCurrent() from failing - window()->setSurfaceType(QSurface::OpenGLSurface); (static_cast(window()->handle()))->create(); m_context->makeCurrent(window()); } diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp index 98c54e0ee0..9aece1ea83 100644 --- a/src/plugins/platforms/eglfs/qeglfswindow.cpp +++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp @@ -59,6 +59,7 @@ QEglFSWindow::QEglFSWindow(QWindow *w) #ifdef QEGL_EXTRA_DEBUG qWarning("QEglWindow %p: %p 0x%x\n", this, w, uint(m_winid)); #endif + w->setSurfaceType(QSurface::OpenGLSurface); } QEglFSWindow::~QEglFSWindow() diff --git a/src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp b/src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp index cb245f2e5c..db6e5d94da 100644 --- a/src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp +++ b/src/plugins/platforms/minimalegl/qminimaleglbackingstore.cpp @@ -80,9 +80,6 @@ void QMinimalEglBackingStore::flush(QWindow *window, const QRegion ®ion, cons void QMinimalEglBackingStore::beginPaint(const QRegion &) { - // needed to prevent QOpenGLContext::makeCurrent() from failing - window()->setSurfaceType(QSurface::OpenGLSurface); - m_context->makeCurrent(window()); m_device = new QOpenGLPaintDevice(window()->size()); } diff --git a/src/plugins/platforms/minimalegl/qminimaleglwindow.cpp b/src/plugins/platforms/minimalegl/qminimaleglwindow.cpp index 13640b73d6..956b5470e5 100644 --- a/src/plugins/platforms/minimalegl/qminimaleglwindow.cpp +++ b/src/plugins/platforms/minimalegl/qminimaleglwindow.cpp @@ -58,6 +58,7 @@ QMinimalEglWindow::QMinimalEglWindow(QWindow *w) if (w->geometry() != screenGeometry) { QWindowSystemInterface::handleGeometryChange(w, screenGeometry); } + w->setSurfaceType(QSurface::OpenGLSurface); } void QMinimalEglWindow::setGeometry(const QRect &) From 64dd24ae0744bce0fdd218cd1fb373746c7f079e Mon Sep 17 00:00:00 2001 From: Marcel Krems Date: Wed, 24 Jul 2013 08:28:36 +0200 Subject: [PATCH 022/131] Remove duplicated call to QGraphicsSceneMouseEvent::setButtons. Task-number: QTBUG-8061 Change-Id: I1326d6b3d6c6b7c3f6dc383aa5fe66d5e1f0b229 Reviewed-by: Laszlo Papp Reviewed-by: Giuseppe D'Angelo Reviewed-by: Andreas Aardal Hanssen --- src/widgets/graphicsview/qgraphicsview.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/widgets/graphicsview/qgraphicsview.cpp b/src/widgets/graphicsview/qgraphicsview.cpp index d78e32205f..846858ab31 100644 --- a/src/widgets/graphicsview/qgraphicsview.cpp +++ b/src/widgets/graphicsview/qgraphicsview.cpp @@ -3214,7 +3214,6 @@ void QGraphicsView::mouseDoubleClickEvent(QMouseEvent *event) mouseEvent.setLastScenePos(d->lastMouseMoveScenePoint); mouseEvent.setLastScreenPos(d->lastMouseMoveScreenPoint); mouseEvent.setButtons(event->buttons()); - mouseEvent.setButtons(event->buttons()); mouseEvent.setAccepted(false); mouseEvent.setButton(event->button()); mouseEvent.setModifiers(event->modifiers()); From 456a4740cced1eb84d73d0e10869764e79e303f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simo=20F=C3=A4lt?= Date: Fri, 26 Jul 2013 10:08:27 +0300 Subject: [PATCH 023/131] Mark tst_exceptionsafety as insignificant We're rolling back exception safety support Task-number: QTBUG-32642 Change-Id: I25f20b554a93f25d00cca19b3e308d6cc8fe85e2 Reviewed-by: Thiago Macieira --- tests/auto/other/exceptionsafety/exceptionsafety.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/other/exceptionsafety/exceptionsafety.pro b/tests/auto/other/exceptionsafety/exceptionsafety.pro index 558c1d6636..3e9c996cd8 100644 --- a/tests/auto/other/exceptionsafety/exceptionsafety.pro +++ b/tests/auto/other/exceptionsafety/exceptionsafety.pro @@ -2,5 +2,5 @@ CONFIG += testcase TARGET = tst_exceptionsafety SOURCES += tst_exceptionsafety.cpp QT = core testlib -CONFIG += parallel_test +CONFIG += parallel_test insignificant_test DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 From 4f7727d861cc7df8125cbc6f637120c18d679034 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Fri, 26 Jul 2013 14:50:11 +0200 Subject: [PATCH 024/131] Correct QHash::values() documentation. Change-Id: Ia19bd0578591f77e5aee1c7e3e619ba97754f384 Reviewed-by: Jerome Pasion --- src/corelib/tools/qhash.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/tools/qhash.cpp b/src/corelib/tools/qhash.cpp index 59e7a979dc..4b9d120bb3 100644 --- a/src/corelib/tools/qhash.cpp +++ b/src/corelib/tools/qhash.cpp @@ -1226,7 +1226,7 @@ void QHashData::checkSanity() /*! \fn QList QHash::values() const Returns a list containing all the values in the hash, in an - arbitrary order. If a key is associated multiple values, all of + arbitrary order. If a key is associated with multiple values, all of its values will be in the list, and not just the most recently inserted one. From ee8b7466bc943f015a47c492e0ded28c5f76aed4 Mon Sep 17 00:00:00 2001 From: Topi Reinio Date: Mon, 29 Jul 2013 13:39:02 +0200 Subject: [PATCH 025/131] Doc: Re-highlight Tweet Search demo The Qt Quick demo Tweet Search works again, add it back as one of the highlighted examples. Task-number: QTBUG-31745 Change-Id: I4fc7d1a836159e9bb54fcd9e1a9c2760d97aa80a Reviewed-by: Sergio Ahumada --- doc/global/manifest-meta.qdocconf | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/global/manifest-meta.qdocconf b/doc/global/manifest-meta.qdocconf index a86f3a14e4..ccf3622be9 100644 --- a/doc/global/manifest-meta.qdocconf +++ b/doc/global/manifest-meta.qdocconf @@ -36,6 +36,7 @@ manifestmeta.filters = highlighted webkit1 webkit2 android manifestmeta.highlighted.names = "QtQuick/Qt Quick Demo - Same Game" \ "QtQuick/Qt Quick Demo - Photo Surface" \ + "QtQuick/Qt Quick Demo - Tweet Search" \ "QtQuick/Qt Quick Demo - Maroon*" \ "QtQuick/Qt Quick Demo - Calqlatr" \ "QtQuick/Qt Quick Particles Examples - Emitters" \ From 3693ada1a638507a283d0dd216b433f2c6043024 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Br=C3=BCning?= Date: Thu, 11 Jul 2013 15:31:34 +0200 Subject: [PATCH 026/131] Fix text being cut off at the right side in print preview. This patch now also copies the state of the QPainter returned from QPaintEngine::painter for the first page of a print preview, as it is done for all other pages of a preview in QPreviewPaintEngine::newPage(). Task-number: QTBUG-30621 Change-Id: I50001231c4006b9627ff80504618cbe0fa6d9f65 Reviewed-by: Gunnar Sletta --- src/printsupport/kernel/qpaintengine_preview.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/printsupport/kernel/qpaintengine_preview.cpp b/src/printsupport/kernel/qpaintengine_preview.cpp index d8c653fed8..d0578c5543 100644 --- a/src/printsupport/kernel/qpaintengine_preview.cpp +++ b/src/printsupport/kernel/qpaintengine_preview.cpp @@ -94,6 +94,7 @@ bool QPreviewPaintEngine::begin(QPaintDevice *) page->d_func()->in_memory_only = true; d->painter = new QPainter(page); d->engine = d->painter->paintEngine(); + *d->painter->d_func()->state = *painter()->d_func()->state; d->pages.append(page); d->state = QPrinter::Active; return true; From 71535ad6bcad71793e29a7cd92197dda5274b331 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 29 Jul 2013 10:16:00 +0200 Subject: [PATCH 027/131] Build offscreen plugin only if freetype is available on Windows. Task-number: QTBUG-29685 Change-Id: I0d80437d07ad7f9e11343bfa7afbdeb30583f8c5 Reviewed-by: Shawn Rutledge Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/plugins/platforms/platforms.pro | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/platforms.pro b/src/plugins/platforms/platforms.pro index 92664826ab..377ca32e64 100644 --- a/src/plugins/platforms/platforms.pro +++ b/src/plugins/platforms/platforms.pro @@ -2,7 +2,9 @@ TEMPLATE = subdirs android:!android-no-sdk: SUBDIRS += android -SUBDIRS += minimal offscreen +SUBDIRS += minimal + +!win32|contains(QT_CONFIG, freetype):SUBDIRS += offscreen contains(QT_CONFIG, xcb) { SUBDIRS += xcb From 591584d9a940d374e20a62573d71054e0081c6ac Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Thu, 25 Jul 2013 14:40:06 +0200 Subject: [PATCH 028/131] Android: Get SSL root certificates from TrustManager On Android, when not using Ministro, we cannot read certificates from the file system, so we have to get them through Java APIs instead. Change-Id: I415329fcb45836735c1112dbe832214b3c73dc9a Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../org/qtproject/qt5/android/QtNative.java | 33 ++++ src/network/ssl/qsslsocket_openssl.cpp | 69 ++++--- .../ssl/qsslsocket_openssl_android.cpp | 179 ++++++++++++++++++ src/network/ssl/qsslsocket_p.h | 3 + src/network/ssl/ssl.pri | 2 + 5 files changed, 255 insertions(+), 31 deletions(-) create mode 100644 src/network/ssl/qsslsocket_openssl_android.cpp diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 4586ae2002..22e3701e47 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -57,6 +57,12 @@ import android.view.ContextMenu; import android.view.Menu; import android.view.MotionEvent; +import java.security.KeyStore; +import java.security.cert.X509Certificate; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + public class QtNative { private static Activity m_activity = null; @@ -534,6 +540,33 @@ public class QtNative }); } + private static byte[][] getSSLCertificates() + { + ArrayList certificateList = new ArrayList(); + + try { + TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + factory.init((KeyStore) null); + + for (TrustManager manager : factory.getTrustManagers()) { + if (manager instanceof X509TrustManager) { + X509TrustManager trustManager = (X509TrustManager) manager; + + for (X509Certificate certificate : trustManager.getAcceptedIssuers()) { + byte buffer[] = certificate.getEncoded(); + certificateList.add(buffer); + } + } + } + } catch (Exception e) { + Log.e(QtTAG, "Failed to get certificates", e); + } + + byte[][] certificateArray = new byte[certificateList.size()][]; + certificateArray = certificateList.toArray(certificateArray); + return certificateArray; + } + // screen methods public static native void setDisplayMetrics(int screenWidthPixels, int screenHeightPixels, diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp index 9de2811374..30103edc29 100644 --- a/src/network/ssl/qsslsocket_openssl.cpp +++ b/src/network/ssl/qsslsocket_openssl.cpp @@ -688,41 +688,48 @@ QList QSslSocketPrivate::systemCaCertificates() } #elif defined(Q_OS_UNIX) QSet certFiles; -# ifdef Q_OS_ANDROID - QList directories; - directories << qgetenv("MINISTRO_SSL_CERTS_PATH"); // Set by Ministro -# else - QList directories = unixRootCertDirectories(); -# endif QDir currentDir; QStringList nameFilters; -# ifdef Q_OS_ANDROID - nameFilters << QLatin1String("*.der"); -#else - nameFilters << QLatin1String("*.pem") << QLatin1String("*.crt"); -# endif - currentDir.setNameFilters(nameFilters); - for (int a = 0; a < directories.count(); a++) { - currentDir.setPath(QLatin1String(directories.at(a))); - QDirIterator it(currentDir); - while(it.hasNext()) { - it.next(); - // use canonical path here to not load the same certificate twice if symlinked - certFiles.insert(it.fileInfo().canonicalFilePath()); - } - } - QSetIterator it(certFiles); - while(it.hasNext()) { -# ifdef Q_OS_ANDROID - systemCerts.append(QSslCertificate::fromPath(it.next(), QSsl::Der)); -# else - systemCerts.append(QSslCertificate::fromPath(it.next(), QSsl::Pem)); -# endif - } + QList directories; + QSsl::EncodingFormat platformEncodingFormat; # ifndef Q_OS_ANDROID - systemCerts.append(QSslCertificate::fromPath(QLatin1String("/etc/pki/tls/certs/ca-bundle.crt"), QSsl::Pem)); // Fedora, Mandriva - systemCerts.append(QSslCertificate::fromPath(QLatin1String("/usr/local/share/certs/ca-root-nss.crt"), QSsl::Pem)); // FreeBSD's ca_root_nss + directories = unixRootCertDirectories(); + nameFilters << QLatin1String("*.pem") << QLatin1String("*.crt"); + platformEncodingFormat = QSsl::Pem; +# else + // Q_OS_ANDROID + QByteArray ministroPath = qgetenv("MINISTRO_SSL_CERTS_PATH"); // Set by Ministro + directories << ministroPath; + nameFilters << QLatin1String("*.der"); + platformEncodingFormat = QSsl::Der; +# ifndef Q_OS_ANDROID_NO_SDK + if (ministroPath.isEmpty()) { + QList certificateData = fetchSslCertificateData(); + for (int i = 0; i < certificateData.size(); ++i) { + systemCerts.append(QSslCertificate::fromData(certificateData.at(i), QSsl::Der)); + } + } else +# endif //Q_OS_ANDROID_NO_SDK +# endif //Q_OS_ANDROID + { + currentDir.setNameFilters(nameFilters); + for (int a = 0; a < directories.count(); a++) { + currentDir.setPath(QLatin1String(directories.at(a))); + QDirIterator it(currentDir); + while (it.hasNext()) { + it.next(); + // use canonical path here to not load the same certificate twice if symlinked + certFiles.insert(it.fileInfo().canonicalFilePath()); + } + } + QSetIterator it(certFiles); + while (it.hasNext()) + systemCerts.append(QSslCertificate::fromPath(it.next(), platformEncodingFormat)); +# ifndef Q_OS_ANDROID + systemCerts.append(QSslCertificate::fromPath(QLatin1String("/etc/pki/tls/certs/ca-bundle.crt"), QSsl::Pem)); // Fedora, Mandriva + systemCerts.append(QSslCertificate::fromPath(QLatin1String("/usr/local/share/certs/ca-root-nss.crt"), QSsl::Pem)); // FreeBSD's ca_root_nss # endif + } #endif #ifdef QSSLSOCKET_DEBUG qDebug() << "systemCaCertificates retrieval time " << timer.elapsed() << "ms"; diff --git a/src/network/ssl/qsslsocket_openssl_android.cpp b/src/network/ssl/qsslsocket_openssl_android.cpp new file mode 100644 index 0000000000..fa612a75a6 --- /dev/null +++ b/src/network/ssl/qsslsocket_openssl_android.cpp @@ -0,0 +1,179 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtNetwork module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/**************************************************************************** +** +** In addition, as a special exception, the copyright holders listed above give +** permission to link the code of its release of Qt with the OpenSSL project's +** "OpenSSL" library (or modified versions of the "OpenSSL" library that use the +** same license as the original version), and distribute the linked executables. +** +** You must comply with the GNU General Public License version 2 in all +** respects for all of the code used other than the "OpenSSL" code. If you +** modify this file, you may extend this exception to your version of the file, +** but you are not obligated to do so. If you do not wish to do so, delete +** this exception statement from your version of this file. +** +****************************************************************************/ + +#include "qsslsocket_openssl_p.h" + + + +#include +#include + +static JavaVM *javaVM = 0; +static jclass appClass; + +static jmethodID getSslCertificatesMethodID; + +struct AttachedJNIEnv +{ + AttachedJNIEnv() + { + attached = false; + if (javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) < 0) { + if (javaVM->AttachCurrentThread(&jniEnv, NULL) < 0) { + __android_log_print(ANDROID_LOG_ERROR, "Qt", "AttachCurrentThread failed"); + jniEnv = 0; + return; + } + attached = true; + } + } + + ~AttachedJNIEnv() + { + if (attached) + javaVM->DetachCurrentThread(); + } + bool attached; + JNIEnv *jniEnv; +}; + +static const char logTag[] = "Qt"; +static const char classErrorMsg[] = "Can't find class \"%s\""; +static const char methodErrorMsg[] = "Can't find method \"%s%s\""; + + +#define FIND_AND_CHECK_CLASS(CLASS_NAME) \ +clazz = env->FindClass(CLASS_NAME); \ +if (!clazz) { \ + __android_log_print(ANDROID_LOG_FATAL, logTag, classErrorMsg, CLASS_NAME); \ + return JNI_FALSE; \ +} + +#define GET_AND_CHECK_STATIC_METHOD(VAR, CLASS, METHOD_NAME, METHOD_SIGNATURE) \ +VAR = env->GetStaticMethodID(CLASS, METHOD_NAME, METHOD_SIGNATURE); \ +if (!VAR) { \ + __android_log_print(ANDROID_LOG_FATAL, logTag, methodErrorMsg, METHOD_NAME, METHOD_SIGNATURE); \ + return JNI_FALSE; \ +} + +static bool registerNatives(JNIEnv *env) +{ + jclass clazz; + FIND_AND_CHECK_CLASS("org/qtproject/qt5/android/QtNative"); + appClass = static_cast(env->NewGlobalRef(clazz)); + +#if 0 //we don't call C++ functions from Java at this time + if (env->RegisterNatives(appClass, methods, sizeof(methods) / sizeof(methods[0])) < 0) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "RegisterNatives failed"); + return JNI_FALSE; + } +#endif + + GET_AND_CHECK_STATIC_METHOD(getSslCertificatesMethodID, appClass, "getSSLCertificates", "()[[B"); + + return true; +} + +Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/) +{ + typedef union { + JNIEnv *nativeEnvironment; + void *venv; + } UnionJNIEnvToVoid; + + __android_log_print(ANDROID_LOG_INFO, logTag, "Network start"); + UnionJNIEnvToVoid uenv; + uenv.venv = NULL; + javaVM = 0; + + if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "GetEnv failed"); + return -1; + } + JNIEnv *env = uenv.nativeEnvironment; + if (!registerNatives(env)) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "registerNatives failed"); + return -1; + } + + javaVM = vm; + return JNI_VERSION_1_4; +} + +QList QSslSocketPrivate::fetchSslCertificateData() +{ + QList certificateData; + AttachedJNIEnv env; + + if (env.jniEnv) { + jobjectArray jcertificates = + static_cast(env.jniEnv->CallStaticObjectMethod(appClass, getSslCertificatesMethodID)); + jint nCertificates = env.jniEnv->GetArrayLength(jcertificates); + + for (int i = 0; i < nCertificates; ++i) { + jbyteArray jCert = static_cast(env.jniEnv->GetObjectArrayElement(jcertificates, i)); + + const uint sz = env.jniEnv->GetArrayLength(jCert); + jbyte *buffer = env.jniEnv->GetByteArrayElements(jCert, 0); + certificateData.append(QByteArray(reinterpret_cast(buffer), sz)); + + env.jniEnv->ReleaseByteArrayElements(jCert, buffer, JNI_ABORT); // don't copy back the elements + env.jniEnv->DeleteLocalRef(jCert); + } + } + + return certificateData; +} diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h index 9369dab8e7..6ce34ba06f 100644 --- a/src/network/ssl/qsslsocket_p.h +++ b/src/network/ssl/qsslsocket_p.h @@ -197,6 +197,9 @@ public: private: static bool ensureLibraryLoaded(); static void ensureCiphersAndCertsLoaded(); +#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK) + static QList fetchSslCertificateData(); +#endif static bool s_libraryLoaded; static bool s_loadedCiphersAndCerts; diff --git a/src/network/ssl/ssl.pri b/src/network/ssl/ssl.pri index 1d8c8e1ab7..0fe231357b 100644 --- a/src/network/ssl/ssl.pri +++ b/src/network/ssl/ssl.pri @@ -28,6 +28,8 @@ contains(QT_CONFIG, openssl) | contains(QT_CONFIG, openssl-linked) { ssl/qsslcertificateextension.cpp \ ssl/qsslcontext.cpp +android:!android-no-sdk: SOURCES += ssl/qsslsocket_openssl_android.cpp + # Add optional SSL libs # Static linking of OpenSSL with msvc: # - Binaries http://slproweb.com/products/Win32OpenSSL.html From 32e6778bda06f348796df60dce7c2d40f3d97452 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Fri, 26 Jul 2013 18:25:44 +0200 Subject: [PATCH 029/131] Stop unconditional synth of mouse events on Android Before this patch we always send mouse events for each touch event that happens. This is redundant (we already synthesize in QGuiApplicatioin) and breaks some touch handling in QtQuick2. Change-Id: I4bc1686a7a46039901315619a0acdf2888ad6775 Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../org/qtproject/qt5/android/QtNative.java | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 22e3701e47..122fc55aad 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -343,28 +343,6 @@ public class QtNative touchEnd(id,1); } //@ANDROID-5 - - switch (event.getAction()) { - case MotionEvent.ACTION_UP: - mouseUp(id,(int) event.getX(), (int) event.getY()); - break; - - case MotionEvent.ACTION_DOWN: - mouseDown(id,(int) event.getX(), (int) event.getY()); - m_oldx = (int) event.getX(); - m_oldy = (int) event.getY(); - break; - - case MotionEvent.ACTION_MOVE: - int dx = (int) (event.getX() - m_oldx); - int dy = (int) (event.getY() - m_oldy); - if (Math.abs(dx) > m_moveThreshold || Math.abs(dy) > m_moveThreshold) { - mouseMove(id, (int) event.getX(), (int) event.getY()); - m_oldx = (int) event.getX(); - m_oldy = (int) event.getY(); - } - break; - } } static public void sendTrackballEvent(MotionEvent event, int id) From 9eeb1bd4d44b71c4251090e9f3b7427a493d873d Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Mon, 29 Jul 2013 13:49:42 +0200 Subject: [PATCH 030/131] Add workaround for GL on Android emulator On the Android Emulator, the shaders will be compiled by a desktop GL driver, since the GL driver in the emulator is just a thin wrapper. The GL driver does not necessarily support the precision qualifiers, which can cause applications to break. We detect this at runtime in the platform plugin and set a workaround flag to Task-number: QTBUG-32557 Change-Id: Ied00cfe8e804d1f7862697dd379a14f3bed3d980 Reviewed-by: Gunnar Sletta --- src/gui/kernel/qopenglcontext_p.h | 7 +++++++ src/gui/opengl/qopenglshaderprogram.cpp | 4 +++- .../android/src/opengl/qandroidopenglcontext.cpp | 15 +++++++++++++++ .../android/src/opengl/qandroidopenglcontext.h | 1 + 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qopenglcontext_p.h b/src/gui/kernel/qopenglcontext_p.h index 3cbcd1c06d..280e2e1e33 100644 --- a/src/gui/kernel/qopenglcontext_p.h +++ b/src/gui/kernel/qopenglcontext_p.h @@ -203,6 +203,7 @@ public: , max_texture_size(-1) , workaround_brokenFBOReadBack(false) , workaround_brokenTexSubImage(false) + , workaround_missingPrecisionQualifiers(false) , active_engine(0) { } @@ -233,6 +234,7 @@ public: bool workaround_brokenFBOReadBack; bool workaround_brokenTexSubImage; + bool workaround_missingPrecisionQualifiers; QPaintEngineEx *active_engine; @@ -240,6 +242,11 @@ public: int maxTextureSize(); + static QOpenGLContextPrivate *get(QOpenGLContext *context) + { + return context->d_func(); + } + #if !defined(QT_NO_DEBUG) static bool toggleMakeCurrentTracker(QOpenGLContext *context, bool value) { diff --git a/src/gui/opengl/qopenglshaderprogram.cpp b/src/gui/opengl/qopenglshaderprogram.cpp index 8278e4fb5a..c0e250b0fa 100644 --- a/src/gui/opengl/qopenglshaderprogram.cpp +++ b/src/gui/opengl/qopenglshaderprogram.cpp @@ -429,7 +429,9 @@ bool QOpenGLShader::compileSourceCode(const char *source) // The precision qualifiers are useful on OpenGL/ES systems, // but usually not present on desktop systems. const QSurfaceFormat currentSurfaceFormat = QOpenGLContext::currentContext()->format(); + QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(QOpenGLContext::currentContext()); if (currentSurfaceFormat.renderableType() == QSurfaceFormat::OpenGL + || ctx_d->workaround_missingPrecisionQualifiers #ifdef QT_OPENGL_FORCE_SHADER_DEFINES || true #endif @@ -439,7 +441,7 @@ bool QOpenGLShader::compileSourceCode(const char *source) } #ifdef QOpenGL_REDEFINE_HIGHP - if (d->shaderType == Fragment) { + if (d->shaderType == Fragment && !ctx_d->workaround_missingPrecisionQualifiers) { src.append(redefineHighp); srclen.append(GLint(sizeof(redefineHighp) - 1)); } diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.cpp b/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.cpp index 4d741807d0..9d6d4003f7 100644 --- a/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.cpp +++ b/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.cpp @@ -46,6 +46,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE QAndroidOpenGLContext::QAndroidOpenGLContext(const QAndroidPlatformIntegration *integration, @@ -75,4 +77,17 @@ void QAndroidOpenGLContext::swapBuffers(QPlatformSurface *surface) } } +bool QAndroidOpenGLContext::makeCurrent(QPlatformSurface *surface) +{ + bool ret = QEglFSContext::makeCurrent(surface); + + const char *rendererString = reinterpret_cast(glGetString(GL_RENDERER)); + if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0) { + QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context()); + ctx_d->workaround_missingPrecisionQualifiers = true; + } + + return ret; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.h b/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.h index c4c5a430ad..c419ae8392 100644 --- a/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.h +++ b/src/plugins/platforms/android/src/opengl/qandroidopenglcontext.h @@ -58,6 +58,7 @@ public: EGLenum eglApi = EGL_OPENGL_ES_API); void swapBuffers(QPlatformSurface *surface); + bool makeCurrent(QPlatformSurface *surface); private: const QAndroidPlatformIntegration *m_platformIntegration; From af96c6fed931564c95037539f07e9c8e33c69529 Mon Sep 17 00:00:00 2001 From: Peter Hartmann Date: Thu, 25 Jul 2013 12:05:29 -0400 Subject: [PATCH 031/131] QHttpMultiPart: fix data corruption in readData method When readData() is called repeatedly, we need to keep track which part of the multipart message we are currently reading from. Hereby we also need to take the boundary size into account, and not only the size of the multipart; otherwise we would skip a not completely read part. This would then later lead to advancing the read pointer by negative indexes and data loss. Task-number: QTBUG-32534 Change-Id: Ibb6dff16adaf4ea67181d23d1d0c8459e33a0ed0 Reviewed-by: Jonathan Liu Reviewed-by: Shane Kearns --- src/network/access/qhttpmultipart.cpp | 3 +- .../qnetworkreply/tst_qnetworkreply.cpp | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/network/access/qhttpmultipart.cpp b/src/network/access/qhttpmultipart.cpp index 4397ef8205..5985ed94e0 100644 --- a/src/network/access/qhttpmultipart.cpp +++ b/src/network/access/qhttpmultipart.cpp @@ -497,7 +497,8 @@ qint64 QHttpMultiPartIODevice::readData(char *data, qint64 maxSize) // skip the parts we have already read while (index < multiPart->parts.count() && - readPointer >= partOffsets.at(index) + multiPart->parts.at(index).d->size()) + readPointer >= partOffsets.at(index) + multiPart->parts.at(index).d->size() + + multiPart->boundary.count() + 6) // 6 == 2 boundary dashes, \r\n after boundary, \r\n after multipart index++; // read the data diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp index 5c04ac8a01..ce8293edbc 100644 --- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp @@ -221,6 +221,7 @@ private Q_SLOTS: void postToHttpSynchronous(); void postToHttpMultipart_data(); void postToHttpMultipart(); + void multipartSkipIndices(); // QTBUG-32534 #ifndef QT_NO_SSL void putToHttps_data(); void putToHttps(); @@ -2382,6 +2383,49 @@ void tst_QNetworkReply::postToHttpMultipart() QCOMPARE(replyData, expectedReplyData); } +void tst_QNetworkReply::multipartSkipIndices() // QTBUG-32534 +{ + QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::MixedType); + QUrl url("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/multipart.cgi"); + QNetworkRequest request(url); + QList parts; + parts << QByteArray(56083, 'X') << QByteArray(468, 'X') << QByteArray(24952, 'X'); + + QHttpPart part1; + part1.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"field1\"; filename=\"aaaa.bin\""); + part1.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream"); + part1.setBody(parts.at(0)); + multiPart->append(part1); + + QHttpPart part2; + part2.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"field2\"; filename=\"bbbb.txt\""); + part2.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); + part2.setBody(parts.at(1)); + multiPart->append(part2); + + QHttpPart part3; + part3.setHeader(QNetworkRequest::ContentDispositionHeader, "form-data; name=\"text-3\"; filename=\"cccc.txt\""); + part3.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain"); + part3.setBody(parts.at(2)); + multiPart->append(part3); + + QNetworkReplyPtr reply; + RUN_REQUEST(runMultipartRequest(request, reply, multiPart, "POST")); + + QCOMPARE(reply->error(), QNetworkReply::NoError); + + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200); // 200 Ok + QByteArray line; + int partIndex = 0; + while ((line = reply->readLine()) != QByteArray("")) { + if (line.startsWith("content:")) { + // before, the 3rd part would return garbled output at the end + QCOMPARE("content: " + parts[partIndex++] + "\n", line); + } + } + multiPart->deleteLater(); +} + void tst_QNetworkReply::putToHttpMultipart_data() { postToHttpMultipart_data(); From 64e3bd481e5d54d555959ceecbd5c4576c571241 Mon Sep 17 00:00:00 2001 From: Peter Seiderer Date: Mon, 17 Jun 2013 20:17:08 +0200 Subject: [PATCH 032/131] Fix unprotected access to QDBusPendingCallPrivate::pending. In QDBusConnectionPrivate::waitForFinished() pcall->pending was used after the protection by pcall->mutex was released. A simultaneous call to QDBusConnectionPrivate::processFinishedCall() was able to reset pcall->pending to null before it was used for the q_dbus_pending_call_block(pcall->pending) call. Fixed by releasing (and setting to 0) of pcall->pending in processFinishedCall() only in case no one is waiting yet, otherwise release pcall->pending by the first thread waiting in waitForFinished(). There is still a race condition about deleting QDBusPendingCallPrivate (too early) which will be fixed in the next two commits. Task-number: QTBUG-27809 Change-Id: I040173810ad90653fe1bd1915f22d8dd70d47d8c Reviewed-by: Thiago Macieira --- src/dbus/qdbusintegrator.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index d5c359aea1..ed019cb662 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -1844,6 +1844,12 @@ void QDBusConnectionPrivate::waitForFinished(QDBusPendingCallPrivate *pcall) // QDBusConnectionPrivate::processFinishedCall() is called automatically } pcall->mutex.lock(); + + if (pcall->pending) { + q_dbus_pending_call_unref(pcall->pending); + pcall->pending = 0; + } + pcall->waitForFinishedCondition.wakeAll(); } } @@ -1890,9 +1896,10 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call) qDBusDebug() << "Deliver failed!"; } - if (call->pending) + if (call->pending && !call->waitingForFinished) { q_dbus_pending_call_unref(call->pending); - call->pending = 0; + call->pending = 0; + } locker.unlock(); From 72ecf5a7ecb688a7e19cbc2f70e358a94d02edf7 Mon Sep 17 00:00:00 2001 From: Peter Seiderer Date: Mon, 17 Jun 2013 20:56:08 +0200 Subject: [PATCH 033/131] Remove QDBusPendingCallPrivate::autoDelete logic. First step to fix race condition about deleting QDBusPendingCallPrivate. In a multithreaded application on a slow/single core cpu the following race (and segmentation fault) can occur: First thread A is running: A: QDBusPendingReply<> reply = pi->asyncCallWithArgumentList(method, argumentList); Then when the dbus answer arrives thread B will call: B: QDBusConnectionPrivate::processFinishedCall() B: ... B: locker.unlock() and runs until here, go on with thread A: A: reply.waitForFinished(); A: QDBusPendingCallPrivate::waitForFinished() A: { A: QMutexLocker locker(&mutex); A: if (replyMessage.type() != QDBusMessage::InvalidMessage) A: return; which returns immediately (mutex acquired, replyMessage alread set), now reply goes out of scope (destructor called) and QDBusPendingCall::d's destructor of type QExplicitlySharedDataPointer deletes the reference counted object QDBusPendingCallPrivate. Now thread B continues, still in processFinishedCall() B: if (call->watcherHelper) B: call->watcherHelper->emitSignals(msg, call->sentMessage); B: B: if (msg.type() == QDBusMessage::ErrorMessage) B: emit connection->callWithCallbackFailed(QDBusError(msg), B: call->sentMessage); accessing alread deleted object QDBusPendingCallPrivate via call->... Fixed QDBusPendingCallPrivate deletion by proper reference counting will be done in the next commit. Task-number: QTBUG-27809 Change-Id: I15b3f0242471b62eaafadc763fb6a33339ff2fe1 Reviewed-by: Thiago Macieira --- src/dbus/qdbusintegrator.cpp | 14 -------------- src/dbus/qdbuspendingcall_p.h | 3 +-- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index ed019cb662..4b9bfc3fc8 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -1828,7 +1828,6 @@ static void qDBusResultReceived(DBusPendingCall *pending, void *user_data) void QDBusConnectionPrivate::waitForFinished(QDBusPendingCallPrivate *pcall) { Q_ASSERT(pcall->pending); - Q_ASSERT(!pcall->autoDelete); //Q_ASSERT(pcall->mutex.isLocked()); // there's no such function if (pcall->waitingForFinished) { @@ -1854,13 +1853,6 @@ void QDBusConnectionPrivate::waitForFinished(QDBusPendingCallPrivate *pcall) } } -// this function is called only in a Q_ASSERT -static inline Q_DECL_UNUSED bool waitingForFinishedIsSet(QDBusPendingCallPrivate *call) -{ - const QMutexLocker locker(&call->mutex); - return call->waitingForFinished; -} - void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call) { QDBusConnectionPrivate *connection = const_cast(call->connection); @@ -1909,11 +1901,6 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call) if (msg.type() == QDBusMessage::ErrorMessage) emit connection->callWithCallbackFailed(QDBusError(msg), call->sentMessage); - - if (call->autoDelete) { - Q_ASSERT(!waitingForFinishedIsSet(call)); // can't wait on a call with autoDelete! - delete call; - } } int QDBusConnectionPrivate::send(const QDBusMessage& message) @@ -2132,7 +2119,6 @@ int QDBusConnectionPrivate::sendWithReplyAsync(const QDBusMessage &message, QObj return 1; } - pcall->autoDelete = true; pcall->ref.ref(); pcall->setReplyCallback(receiver, returnMethod); diff --git a/src/dbus/qdbuspendingcall_p.h b/src/dbus/qdbuspendingcall_p.h index 36d0b9023a..d0b28b3c0e 100644 --- a/src/dbus/qdbuspendingcall_p.h +++ b/src/dbus/qdbuspendingcall_p.h @@ -85,7 +85,6 @@ public: QVector metaTypes; int methodIdx; - bool autoDelete; // } mutable QMutex mutex; @@ -102,7 +101,7 @@ public: // } QDBusPendingCallPrivate(const QDBusMessage &sent, QDBusConnectionPrivate *connection) - : sentMessage(sent), connection(connection), autoDelete(false), watcherHelper(0), pending(0), waitingForFinished(false) + : sentMessage(sent), connection(connection), watcherHelper(0), pending(0), waitingForFinished(false) { } ~QDBusPendingCallPrivate(); bool setReplyCallback(QObject *target, const char *member); From 6c21f42657b494e24112c90d8b9fff719f1f8791 Mon Sep 17 00:00:00 2001 From: Peter Seiderer Date: Mon, 17 Jun 2013 22:44:30 +0200 Subject: [PATCH 034/131] Change QDBusPendingCallPrivate to full reference counting for deletion. Fixes race between QDBusConnectionPrivate::processFinishedCall() releasing the mutex before emitting signals (using various members of QDBusPendingCallPrivate) and deletion of the QDBusPendingCallPrivate object through QDBusPendingCall::d's destructor (a member of type QExplicitlySharedDataPointer) leeds to segmentation fault with CrashTest example on slow/single core arm cpu). Task-number: QTBUG-27809 Change-Id: I3590d74d1cfa5816ede764b50b83a7008ec780ff Reviewed-by: Thiago Macieira --- src/dbus/qdbusconnection.cpp | 3 +- src/dbus/qdbusconnection_p.h | 5 +- src/dbus/qdbusintegrator.cpp | 87 +++++++++++++++++++---------------- src/dbus/qdbuspendingcall.cpp | 6 +++ 4 files changed, 58 insertions(+), 43 deletions(-) diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp index 74a3a752a5..a29ba4cb0f 100644 --- a/src/dbus/qdbusconnection.cpp +++ b/src/dbus/qdbusconnection.cpp @@ -54,6 +54,7 @@ #include "qdbusinterface_p.h" #include "qdbusutil_p.h" #include "qdbusconnectionmanager_p.h" +#include "qdbuspendingcall_p.h" #include "qdbusthreaddebug_p.h" @@ -611,7 +612,7 @@ QDBusPendingCall QDBusConnection::asyncCall(const QDBusMessage &message, int tim return QDBusPendingCall(0); // null pointer -> disconnected } - QDBusPendingCallPrivate *priv = d->sendWithReplyAsync(message, timeout); + QDBusPendingCallPrivate *priv = d->sendWithReplyAsync(message, 0, 0, 0, timeout); return QDBusPendingCall(priv); } diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index 73c8dcf411..c702de141a 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -199,9 +199,8 @@ public: int send(const QDBusMessage &message); QDBusMessage sendWithReply(const QDBusMessage &message, int mode, int timeout = -1); QDBusMessage sendWithReplyLocal(const QDBusMessage &message); - QDBusPendingCallPrivate *sendWithReplyAsync(const QDBusMessage &message, int timeout = -1); - int sendWithReplyAsync(const QDBusMessage &message, QObject *receiver, - const char *returnMethod, const char *errorMethod, int timeout = -1); + QDBusPendingCallPrivate *sendWithReplyAsync(const QDBusMessage &message, QObject *receiver, + const char *returnMethod, const char *errorMethod,int timeout = -1); bool connectSignal(const QString &service, const QString &path, const QString& interface, const QString &name, const QStringList &argumentMatch, const QString &signature, QObject *receiver, const char *slot); diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 4b9bfc3fc8..3f25f02bee 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -1901,6 +1901,9 @@ void QDBusConnectionPrivate::processFinishedCall(QDBusPendingCallPrivate *call) if (msg.type() == QDBusMessage::ErrorMessage) emit connection->callWithCallbackFailed(QDBusError(msg), call->sentMessage); + + if (!call->ref.deref()) + delete call; } int QDBusConnectionPrivate::send(const QDBusMessage& message) @@ -1983,7 +1986,7 @@ QDBusMessage QDBusConnectionPrivate::sendWithReply(const QDBusMessage &message, return amsg; } else { // use the event loop - QDBusPendingCallPrivate *pcall = sendWithReplyAsync(message, timeout); + QDBusPendingCallPrivate *pcall = sendWithReplyAsync(message, 0, 0, 0, timeout); Q_ASSERT(pcall); if (pcall->replyMessage.type() == QDBusMessage::InvalidMessage) { @@ -1999,6 +2002,10 @@ QDBusMessage QDBusConnectionPrivate::sendWithReply(const QDBusMessage &message, QDBusMessage reply = pcall->replyMessage; lastError = QDBusError(reply); // set or clear error + bool r = pcall->ref.deref(); + Q_ASSERT(!r); + Q_UNUSED(r); + delete pcall; return reply; } @@ -2038,19 +2045,55 @@ QDBusMessage QDBusConnectionPrivate::sendWithReplyLocal(const QDBusMessage &mess } QDBusPendingCallPrivate *QDBusConnectionPrivate::sendWithReplyAsync(const QDBusMessage &message, - int timeout) + QObject *receiver, const char *returnMethod, + const char *errorMethod, int timeout) { if (isServiceRegisteredByThread(message.service())) { // special case for local calls QDBusPendingCallPrivate *pcall = new QDBusPendingCallPrivate(message, this); pcall->replyMessage = sendWithReplyLocal(message); + if (receiver && returnMethod) + pcall->setReplyCallback(receiver, returnMethod); + if (errorMethod) { + pcall->watcherHelper = new QDBusPendingCallWatcherHelper; + connect(pcall->watcherHelper, SIGNAL(error(QDBusError,QDBusMessage)), receiver, errorMethod, + Qt::QueuedConnection); + pcall->watcherHelper->moveToThread(thread()); + } + + if ((receiver && returnMethod) || errorMethod) { + // no one waiting, will delete pcall in processFinishedCall() + pcall->ref.store(1); + } else { + // set double ref to prevent race between processFinishedCall() and ref counting + // by QDBusPendingCall::QExplicitlySharedDataPointer + pcall->ref.store(2); + } + processFinishedCall(pcall); return pcall; } checkThread(); QDBusPendingCallPrivate *pcall = new QDBusPendingCallPrivate(message, this); - pcall->ref.store(0); + if (receiver && returnMethod) + pcall->setReplyCallback(receiver, returnMethod); + + if (errorMethod) { + pcall->watcherHelper = new QDBusPendingCallWatcherHelper; + connect(pcall->watcherHelper, SIGNAL(error(QDBusError,QDBusMessage)), receiver, errorMethod, + Qt::QueuedConnection); + pcall->watcherHelper->moveToThread(thread()); + } + + if ((receiver && returnMethod) || errorMethod) { + // no one waiting, will delete pcall in processFinishedCall() + pcall->ref.store(1); + } else { + // set double ref to prevent race between processFinishedCall() and ref counting + // by QDBusPendingCall::QExplicitlySharedDataPointer + pcall->ref.store(2); + } QDBusError error; DBusMessage *msg = QDBusMessagePrivate::toDBusMessage(message, capabilities, &error); @@ -2061,6 +2104,7 @@ QDBusPendingCallPrivate *QDBusConnectionPrivate::sendWithReplyAsync(const QDBusM qPrintable(error.message())); pcall->replyMessage = QDBusMessage::createError(error); lastError = error; + processFinishedCall(pcall); return pcall; } @@ -2086,45 +2130,10 @@ QDBusPendingCallPrivate *QDBusConnectionPrivate::sendWithReplyAsync(const QDBusM q_dbus_message_unref(msg); pcall->replyMessage = QDBusMessage::createError(error); + processFinishedCall(pcall); return pcall; } -int QDBusConnectionPrivate::sendWithReplyAsync(const QDBusMessage &message, QObject *receiver, - const char *returnMethod, const char *errorMethod, - int timeout) -{ - QDBusPendingCallPrivate *pcall = sendWithReplyAsync(message, timeout); - Q_ASSERT(pcall); - - // has it already finished with success (dispatched locally)? - if (pcall->replyMessage.type() == QDBusMessage::ReplyMessage) { - pcall->setReplyCallback(receiver, returnMethod); - processFinishedCall(pcall); - delete pcall; - return 1; - } - - // either it hasn't finished or it has finished with error - if (errorMethod) { - pcall->watcherHelper = new QDBusPendingCallWatcherHelper; - connect(pcall->watcherHelper, SIGNAL(error(QDBusError,QDBusMessage)), receiver, errorMethod, - Qt::QueuedConnection); - pcall->watcherHelper->moveToThread(thread()); - } - - // has it already finished and is an error reply message? - if (pcall->replyMessage.type() == QDBusMessage::ErrorMessage) { - processFinishedCall(pcall); - delete pcall; - return 1; - } - - pcall->ref.ref(); - pcall->setReplyCallback(receiver, returnMethod); - - return 1; -} - bool QDBusConnectionPrivate::connectSignal(const QString &service, const QString &path, const QString &interface, const QString &name, const QStringList &argumentMatch, const QString &signature, diff --git a/src/dbus/qdbuspendingcall.cpp b/src/dbus/qdbuspendingcall.cpp index 0b4ff3a397..49f9fc0cd8 100644 --- a/src/dbus/qdbuspendingcall.cpp +++ b/src/dbus/qdbuspendingcall.cpp @@ -256,6 +256,11 @@ QDBusPendingCall::QDBusPendingCall(const QDBusPendingCall &other) QDBusPendingCall::QDBusPendingCall(QDBusPendingCallPrivate *dd) : d(dd) { + if (dd) { + bool r = dd->ref.deref(); + Q_ASSERT(r); + Q_UNUSED(r); + } } /*! @@ -469,6 +474,7 @@ QDBusPendingCall QDBusPendingCall::fromCompletedCall(const QDBusMessage &msg) msg.type() == QDBusMessage::ReplyMessage) { d = new QDBusPendingCallPrivate(QDBusMessage(), 0); d->replyMessage = msg; + d->ref.store(1); } return QDBusPendingCall(d); From 9f8a724cda6783ca275fb810e7d1fc05bf840e2e Mon Sep 17 00:00:00 2001 From: Richard Browne Date: Tue, 9 Jul 2013 21:07:29 +1000 Subject: [PATCH 035/131] Work around msvc /clr LNK2005 errors with QList This patch fixes a compatibility with Qt 5 and Microsoft C++ /clr mode. The QList copy constructor defines a Cleanup class that causes LNK2005 errors. It is a compiler problem, but the patch is simple. The use of QT_TRY/QT_RETHROW instead of a Cleanup class is more consistent with other Qt code, so is arguably preferable even without the compiler bug. Task-number: QTBUG-31949 Change-Id: I1acfbae1924f0a52ffb8d9722b52e01b61edd42e Reviewed-by: Oswald Buddenhagen Reviewed-by: Thiago Macieira --- src/corelib/tools/qlist.h | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/corelib/tools/qlist.h b/src/corelib/tools/qlist.h index 0592c24e9f..72e1403e76 100644 --- a/src/corelib/tools/qlist.h +++ b/src/corelib/tools/qlist.h @@ -715,18 +715,14 @@ Q_OUTOFLINE_TEMPLATE QList::QList(const QList &l) if (!d->ref.ref()) { p.detach(d->alloc); - struct Cleanup - { - Cleanup(QListData::Data *d) : d_(d) {} - ~Cleanup() { if (d_) QListData::dispose(d_); } - - QListData::Data *d_; - } tryCatch(d); - - node_copy(reinterpret_cast(p.begin()), - reinterpret_cast(p.end()), - reinterpret_cast(l.p.begin())); - tryCatch.d_ = 0; + QT_TRY { + node_copy(reinterpret_cast(p.begin()), + reinterpret_cast(p.end()), + reinterpret_cast(l.p.begin())); + } QT_CATCH(...) { + QListData::dispose(d); + QT_RETHROW; + } } } From fb25d6c7f6690402060027422343957c7d8ee718 Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Mon, 29 Jul 2013 14:51:54 -0400 Subject: [PATCH 036/131] Remove a left over cast that is now semantically incorrect. CFPropertyListRef is a typedef for void*, which is why this code was compiling OK prior to this change. Change-Id: I78d65652a76721434056bd9f6d011917e2864125 Reviewed-by: Thiago Macieira --- src/corelib/tools/qlocale_mac.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/tools/qlocale_mac.mm b/src/corelib/tools/qlocale_mac.mm index f399b7689d..43a0d67e74 100644 --- a/src/corelib/tools/qlocale_mac.mm +++ b/src/corelib/tools/qlocale_mac.mm @@ -434,7 +434,7 @@ QVariant QSystemLocale::query(QueryType type, QVariant in = QVariant()) const case CurrencyToString: return macFormatCurrency(in.value()); case UILanguages: { - QCFType languages = (CFArrayRef)CFPreferencesCopyValue( + QCFType languages = CFPreferencesCopyValue( CFSTR("AppleLanguages"), kCFPreferencesAnyApplication, kCFPreferencesCurrentUser, From f9f72aa1141f9be83b1f4678d155dfa75f5a791f Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 19 Jul 2013 16:05:07 -0700 Subject: [PATCH 037/131] Add support for Q_OS_FREEBSD_KERNEL and document Also clarify documentation for OSes with variants. Q_OS_ANDROID should have been called Q_OS_LINUX_ANDROID and Q_OS_BLACKBERRY should have been Q_OS_QNX_BLACKBERRY. Task-number: QTBUG-15402 Change-Id: I3a34d52a1c0ebb8eb73284bdf198443c209a5fd4 Reviewed-by: Oswald Buddenhagen --- src/corelib/global/qsystemdetection.h | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h index cb55fa808b..22ee28baad 100644 --- a/src/corelib/global/qsystemdetection.h +++ b/src/corelib/global/qsystemdetection.h @@ -62,8 +62,8 @@ SOLARIS - Sun Solaris HPUX - HP-UX ULTRIX - DEC Ultrix - LINUX - Linux - FREEBSD - FreeBSD + LINUX - Linux [has variants] + FREEBSD - FreeBSD [has variants] NETBSD - NetBSD OPENBSD - OpenBSD BSDI - BSD/OS @@ -76,12 +76,20 @@ DGUX - DG/UX RELIANT - Reliant UNIX DYNIX - DYNIX/ptx - QNX - QNX + QNX - QNX [has variants] QNX6 - QNX RTP 6.1 LYNX - LynxOS BSD4 - Any BSD 4.4 system UNIX - Any UNIX BSD/SYSV system ANDROID - Android platform + + The following operating systems have variants: + LINUX - both Q_OS_LINUX and Q_OS_ANDROID are defined when building for Android + - only Q_OS_LINUX is defined if building for other Linux systems + QNX - both Q_OS_QNX and Q_OS_BLACKBERRY are defined when building for Blackberry 10 + - only Q_OS_QNX is defined if building for other QNX targets + FREEBSD - Q_OS_FREEBSD is defined only when building for FreeBSD with a BSD userland + - Q_OS_FREEBSD_KERNEL is always defined on FreeBSD, even if the userland is from GNU */ #if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__)) @@ -118,8 +126,11 @@ # define Q_OS_NACL #elif defined(__linux__) || defined(__linux) # define Q_OS_LINUX -#elif defined(__FreeBSD__) || defined(__DragonFly__) -# define Q_OS_FREEBSD +#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) +# ifndef __FreeBSD_kernel__ +# define Q_OS_FREEBSD +# endif +# define Q_OS_FREEBSD_KERNEL # define Q_OS_BSD4 #elif defined(__NetBSD__) # define Q_OS_NETBSD From f52e9b117284d5dd80dcd4503e57d4cb8a839ae1 Mon Sep 17 00:00:00 2001 From: Illya Kovalevskyy Date: Sat, 20 Jul 2013 21:38:32 +0300 Subject: [PATCH 038/131] Symbol for max number of arguments in QMetaMethod::invoke() QMetaMethod::invoke(..) takes fixed number of arguments for execution. Adding preprocessor macros which literaly equals this number would be useful for writing some generic code. Task-number: QTBUG-31821 Change-Id: Ia2faf291f3f7df44a47c3cf18f5cd587d37d7d2e Reviewed-by: Oswald Buddenhagen Reviewed-by: Thiago Macieira --- src/corelib/kernel/qmetaobject.cpp | 8 ++++++++ src/corelib/kernel/qmetaobject.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp index 7211a730ec..4dc766ecc5 100644 --- a/src/corelib/kernel/qmetaobject.cpp +++ b/src/corelib/kernel/qmetaobject.cpp @@ -1589,6 +1589,14 @@ bool QMetaObject::invokeMethod(QObject *obj, \internal */ +/*! + \macro Q_METAMETHOD_INVOKE_MAX_ARGS + \relates QMetaMethod + + Equals maximum number of arguments available for + execution of the method via QMetaMethod::invoke() + */ + QByteArray QMetaMethodPrivate::signature() const { Q_ASSERT(priv(mobj->d.data)->revision >= 7); diff --git a/src/corelib/kernel/qmetaobject.h b/src/corelib/kernel/qmetaobject.h index 23fc89ffe3..0c8ad8591f 100644 --- a/src/corelib/kernel/qmetaobject.h +++ b/src/corelib/kernel/qmetaobject.h @@ -50,6 +50,8 @@ QT_BEGIN_NAMESPACE template class QList; +#define Q_METAMETHOD_INVOKE_MAX_ARGS 10 + class Q_CORE_EXPORT QMetaMethod { public: From 5d192deed9ef7289e44cd936576d98b3afa2601a Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Fri, 26 Jul 2013 17:11:19 +0200 Subject: [PATCH 039/131] Fix crash on qdbus when return type is a raw dbus type Assigning a -1 to type is going to make things crash since it basically means unresolved and when you try to access the string data go to a index that doesn't exist So what I do is save the return type in rawReturnType if it is a raw one and reassign the type to IsUnresolvedType | strings.enter(mm.rawReturnType) instead of -1 when "saving" the metaobject Task-number: QTBUG-32671 Change-Id: I67898dea8a1926eee80c16417e877ef4e22aa06b Reviewed-by: Thiago Macieira --- src/dbus/qdbusmetaobject.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/dbus/qdbusmetaobject.cpp b/src/dbus/qdbusmetaobject.cpp index 799c66f6f9..127cf6658c 100644 --- a/src/dbus/qdbusmetaobject.cpp +++ b/src/dbus/qdbusmetaobject.cpp @@ -75,6 +75,7 @@ private: QByteArray name; QVarLengthArray inputTypes; QVarLengthArray outputTypes; + QByteArray rawReturnType; int flags; }; @@ -276,6 +277,9 @@ void QDBusMetaObjectGenerator::parseMethods() mm.outputTypes.append(type.id); + if (i == 0 && type.id == -1) { + mm.rawReturnType = type.name; + } if (i != 0) { // non-const ref parameter mm.parameterNames.append(arg.name.toLatin1()); @@ -471,10 +475,14 @@ void QDBusMetaObjectGenerator::write(QDBusMetaObject *obj) int type; QByteArray typeName; if (i < 0) { // Return type - if (!mm.outputTypes.isEmpty()) + if (!mm.outputTypes.isEmpty()) { type = mm.outputTypes.first(); - else + if (type == -1) { + type = IsUnresolvedType | strings.enter(mm.rawReturnType); + } + } else { type = QMetaType::Void; + } } else if (i < mm.inputTypes.size()) { type = mm.inputTypes.at(i); } else { From 88f4baf089fddb227a22c5bc220d4a64610c0821 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 29 Jul 2013 12:25:48 +0200 Subject: [PATCH 040/131] Windows: Clear window under mouse in destruction of platform window. Task-number: QTBUG-32042 Change-Id: I8aa5df84b7ca6deb47e0c3eff9a6a7d2c4793553 Reviewed-by: Joerg Bornemann --- src/plugins/platforms/windows/qwindowscontext.cpp | 5 +++++ src/plugins/platforms/windows/qwindowscontext.h | 1 + src/plugins/platforms/windows/qwindowsmousehandler.h | 1 + src/plugins/platforms/windows/qwindowswindow.cpp | 5 ++++- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 872fd07729..7c6e82d0dc 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -582,6 +582,11 @@ QWindow *QWindowsContext::windowUnderMouse() const return d->m_mouseHandler.windowUnderMouse(); } +void QWindowsContext::clearWindowUnderMouse() +{ + d->m_mouseHandler.clearWindowUnderMouse(); +} + /*! \brief Find a child window at a screen point. diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h index d60b632beb..6b80075379 100644 --- a/src/plugins/platforms/windows/qwindowscontext.h +++ b/src/plugins/platforms/windows/qwindowscontext.h @@ -166,6 +166,7 @@ public: unsigned cwex_flags) const; QWindow *windowUnderMouse() const; + void clearWindowUnderMouse(); inline bool windowsProc(HWND hwnd, UINT message, QtWindows::WindowsEventType et, diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.h b/src/plugins/platforms/windows/qwindowsmousehandler.h index caf30e6b1a..7a7b92ca7e 100644 --- a/src/plugins/platforms/windows/qwindowsmousehandler.h +++ b/src/plugins/platforms/windows/qwindowsmousehandler.h @@ -72,6 +72,7 @@ public: static Qt::MouseButtons queryMouseButtons(); QWindow *windowUnderMouse() const { return m_windowUnderMouse.data(); } + void clearWindowUnderMouse() { m_windowUnderMouse = 0; } private: inline bool translateMouseWheelEvent(QWindow *window, HWND hwnd, diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index dc51dbfc88..6549b9da3e 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -871,6 +871,9 @@ void QWindowsWindow::destroyWindow() qDebug() << __FUNCTION__ << this << window() << m_data.hwnd; if (m_data.hwnd) { // Stop event dispatching before Window is destroyed. setFlag(WithinDestroy); + QWindowsContext *context = QWindowsContext::instance(); + if (context->windowUnderMouse() == window()) + context->clearWindowUnderMouse(); if (hasMouseCapture()) setMouseGrabEnabled(false); unregisterDropSite(); @@ -893,7 +896,7 @@ void QWindowsWindow::destroyWindow() #endif // !Q_OS_WINCE if (m_data.hwnd != GetDesktopWindow()) DestroyWindow(m_data.hwnd); - QWindowsContext::instance()->removeWindow(m_data.hwnd); + context->removeWindow(m_data.hwnd); m_data.hwnd = 0; } } From cf3e435299ef2705fb217279bb5e93847cfc7d8c Mon Sep 17 00:00:00 2001 From: Nils Jeisecke Date: Fri, 26 Jul 2013 17:51:42 +0200 Subject: [PATCH 041/131] Cocoa: Make sure that resizeEvent is invoked after calling resize The QWindow::resizeEvent documentation states that resizeEvent is invoked after the windowing system has acknowledged a setGeometry() or resize() request. The Cocoa plugin however did set the platform window geometry immediately so that the qnsview's updateGeometry returned too early. Task-number: QTBUG-32706 Change-Id: I1f359ab368833d174ab6740f4467b0848c290f13 Reviewed-by: Friedemann Kleint Reviewed-by: Gunnar Sletta --- src/plugins/platforms/cocoa/qcocoawindow.mm | 7 +++++-- tests/auto/gui/kernel/qwindow/tst_qwindow.cpp | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index 057eb7e144..bba5b6fdf1 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -267,7 +267,6 @@ void QCocoaWindow::setGeometry(const QRect &rect) #ifdef QT_COCOA_ENABLE_WINDOW_DEBUG qDebug() << "QCocoaWindow::setGeometry" << this << rect; #endif - QPlatformWindow::setGeometry(rect); setCocoaGeometry(rect); } @@ -275,8 +274,10 @@ void QCocoaWindow::setCocoaGeometry(const QRect &rect) { QCocoaAutoReleasePool pool; - if (m_contentViewIsEmbedded) + if (m_contentViewIsEmbedded) { + QPlatformWindow::setGeometry(rect); return; + } if (m_nsWindow) { NSRect bounds = qt_mac_flipRect(rect, window()); @@ -284,6 +285,8 @@ void QCocoaWindow::setCocoaGeometry(const QRect &rect) } else { [m_contentView setFrame : NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height())]; } + + // will call QPlatformWindow::setGeometry(rect) during resize confirmation (see qnsview.mm) } void QCocoaWindow::setVisible(bool visible) diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp index b4208949b0..7ad7880330 100644 --- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp +++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp @@ -59,6 +59,7 @@ class tst_QWindow: public QObject private slots: void eventOrderOnShow(); + void resizeEventAfterResize(); void mapGlobal(); void positioning(); void isExposed(); @@ -168,6 +169,25 @@ void tst_QWindow::eventOrderOnShow() QVERIFY(window.eventIndex(QEvent::Resize) < window.eventIndex(QEvent::Expose)); } +void tst_QWindow::resizeEventAfterResize() +{ + // Some platforms enforce minimum widths for windows, which can cause extra resize + // events, so set the width to suitably large value to avoid those. + QRect geometry(QGuiApplication::primaryScreen()->availableGeometry().topLeft() + QPoint(20, 20), QSize(300, 40)); + + Window window; + window.setGeometry(geometry); + window.show(); + + QTRY_COMPARE(window.received(QEvent::Resize), 1); + + // QTBUG-32706 + // Make sure we get a resizeEvent after calling resize + window.resize(400, 100); + + QTRY_COMPARE(window.received(QEvent::Resize), 2); +} + void tst_QWindow::positioning() { if (!QGuiApplicationPrivate::platformIntegration()->hasCapability( From 85325202af03919c9e818c5371c922c48b4a2d6d Mon Sep 17 00:00:00 2001 From: Topi Reinio Date: Mon, 29 Jul 2013 15:45:11 +0200 Subject: [PATCH 042/131] Doc: Add keywords for qmake variable/function reference pages In the Help mode in Qt Creator, many have accustomed to search e.g. for 'qmake variable reference' which no longer exists as a title in the qmake documentation. This change provides easier access to the qmake reference by creating keywords for them, making them appear in search results for searches starting with 'qmake'. Task-number: QTBUG-32268 Change-Id: If60a0cdc11464a8aeb50c62ddbde9683326e1384 Reviewed-by: Jerome Pasion Reviewed-by: Oswald Buddenhagen Reviewed-by: J-P Nurmi --- qmake/doc/src/qmake-manual.qdoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc index 2bc6cc508f..5f8672c163 100644 --- a/qmake/doc/src/qmake-manual.qdoc +++ b/qmake/doc/src/qmake-manual.qdoc @@ -851,6 +851,7 @@ \contentspage {qmake Manual}{Contents} \previouspage Reference \nextpage Replace Functions + \keyword qmake Variable Reference The fundamental behavior of qmake is influenced by variable declarations that define the build process of each project. Some of these declare resources, @@ -2422,6 +2423,7 @@ \contentspage {qmake Manual}{Contents} \previouspage Variables \nextpage Test Functions + \keyword qmake Function Reference - Replace Functions qmake provides functions for processing the contents of variables during the configuration process. These functions are called @@ -2751,6 +2753,7 @@ \title Test Functions \contentspage {qmake Manual}{Contents} \previouspage Replace Functions + \keyword qmake Function Reference - Test Functions Test functions return a boolean value that you can test for in the conditional parts of scopes. Test functions can be divided into From db13d9b8a13b82df71f199f20f03a24a4c5b8175 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Tue, 30 Jul 2013 10:58:29 +0200 Subject: [PATCH 043/131] Fix upload of glyphs when using RGB32 masks on OpenGL ES OpenGL ES doesn't allow internal format to be different from external format, so always do the conversion from BGRA -> RGBA. We are anyway iterating over all the pixels so the performance impact of this should be minimal. Change-Id: Ie891665ad66e31692b69db02d34be8d303a7d631 Reviewed-by: Andy Shaw Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/opengl/qopengltextureglyphcache.cpp | 18 ++++-------------- .../gl2paintengineex/qtextureglyphcache_gl.cpp | 8 ++++++-- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/gui/opengl/qopengltextureglyphcache.cpp b/src/gui/opengl/qopengltextureglyphcache.cpp index 7d49c03f5b..66ca5c601f 100644 --- a/src/gui/opengl/qopengltextureglyphcache.cpp +++ b/src/gui/opengl/qopengltextureglyphcache.cpp @@ -305,11 +305,6 @@ void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed const int maskWidth = mask.width(); const int maskHeight = mask.height(); -#if defined(QT_OPENGL_ES_2) - QOpenGLExtensions extensions(ctx); - bool hasBGRA = extensions.hasOpenGLExtension(QOpenGLExtensions::BGRATextureFormat); -#endif - if (mask.format() == QImage::Format_Mono) { mask = mask.convertToFormat(QImage::Format_Indexed8); for (int y = 0; y < maskHeight; ++y) { @@ -321,9 +316,6 @@ void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed if (mask.format() == QImage::Format_RGB32 // We need to make the alpha component equal to the average of the RGB values. // This is needed when drawing sub-pixel antialiased text on translucent targets. -#if defined(QT_OPENGL_ES_2) - || !hasBGRA // We need to reverse the bytes -#endif ) { for (int y = 0; y < maskHeight; ++y) { quint32 *src = (quint32 *) mask.scanLine(y); @@ -338,12 +330,10 @@ void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed avg = src[x] >> 24; #if defined(QT_OPENGL_ES_2) - if (!hasBGRA) { - // Reverse bytes to match GL_RGBA - src[x] = (avg << 24) | (quint32(r) << 0) | (quint32(g) << 8) | (quint32(b) << 16); - } else + // swizzle the bits to accommodate for the GL_RGBA upload. + src[x] = (avg << 24) | (quint32(r) << 0) | (quint32(g) << 8) | (quint32(b) << 16); #endif - src[x] = (src[x] & 0x00ffffff) | (avg << 24); + src[x] = (src[x] & 0x00ffffff) | (avg << 24); } } } @@ -352,7 +342,7 @@ void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture); if (mask.depth() == 32) { #if defined(QT_OPENGL_ES_2) - glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, hasBGRA ? GL_BGRA_EXT : GL_RGBA, GL_UNSIGNED_BYTE, mask.bits()); + glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_RGBA, GL_UNSIGNED_BYTE, mask.bits()); #else glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_BGRA, GL_UNSIGNED_BYTE, mask.bits()); #endif diff --git a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp index 59401fe1e9..8e397295d1 100644 --- a/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp +++ b/src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp @@ -317,7 +317,12 @@ void QGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed sub uchar g = src[x] >> 8; uchar b = src[x]; quint32 avg = (quint32(r) + quint32(g) + quint32(b) + 1) / 3; // "+1" for rounding. +#if defined(QT_OPENGL_ES_2) + // swizzle the bits to accommodate for the GL_RGBA upload. + src[x] = (avg << 24) | (quint32(r) << 0) | (quint32(g) << 8) | (quint32(b) << 16); +#else src[x] = (src[x] & 0x00ffffff) | (avg << 24); +#endif } } } @@ -325,8 +330,7 @@ void QGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed sub glBindTexture(GL_TEXTURE_2D, m_textureResource->m_texture); if (mask.format() == QImage::Format_RGB32) { #if defined(QT_OPENGL_ES_2) - // ###TODO Ensure extension is actually present on ES2 - glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_BGRA_EXT, GL_UNSIGNED_BYTE, mask.bits()); + glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_RGBA, GL_UNSIGNED_BYTE, mask.bits()); #else glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_BGRA, GL_UNSIGNED_BYTE, mask.bits()); #endif From 8fd3d53a93d50506a0c3fa620e560cf1b03ba3c0 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 30 Jul 2013 12:16:31 +0200 Subject: [PATCH 044/131] QByteArray: Remove some reinterpret_cast<>. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix warning: QByteArray(QByteArrayDataPtr dd) constructor warning C4946: reinterpret_cast used between related classes: 'QArrayData' and 'QTypedArrayData'. Task-number: QTBUG-32559 Change-Id: I06356902f79ed6bf784127ff0c3a97d3263a25da Reviewed-by: Jędrzej Nowacki --- src/corelib/tools/qbytearray.cpp | 6 +++--- src/corelib/tools/qbytearray.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp index 75900e9775..6ce17e5e13 100644 --- a/src/corelib/tools/qbytearray.cpp +++ b/src/corelib/tools/qbytearray.cpp @@ -585,7 +585,7 @@ QByteArray qUncompress(const uchar* data, int nbytes) d->data()[len] = 0; { - QByteArrayDataPtr dataPtr = { reinterpret_cast(d.take()) }; + QByteArrayDataPtr dataPtr = { d.take() }; return QByteArray(dataPtr); } @@ -3151,7 +3151,7 @@ QByteArray QByteArray::trimmed() const } int l = end - start + 1; if (l <= 0) { - QByteArrayDataPtr empty = { reinterpret_cast(Data::allocate(0)) }; + QByteArrayDataPtr empty = { Data::allocate(0) }; return QByteArray(empty); } return QByteArray(s+start, l); @@ -3888,7 +3888,7 @@ QByteArray QByteArray::fromRawData(const char *data, int size) x = Data::fromRawData(data, size); Q_CHECK_PTR(x); } - QByteArrayDataPtr dataPtr = { reinterpret_cast(x) }; + QByteArrayDataPtr dataPtr = { x }; return QByteArray(dataPtr); } diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h index f3cc301a49..85d1f0ab90 100644 --- a/src/corelib/tools/qbytearray.h +++ b/src/corelib/tools/qbytearray.h @@ -373,7 +373,7 @@ public: bool isNull() const; inline QByteArray(QByteArrayDataPtr dd) - : d(reinterpret_cast(dd.ptr)) + : d(static_cast(dd.ptr)) { } From c3f485c5250a503832e767e1fe5e40595126f6c5 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Thu, 25 Jul 2013 17:06:16 +0200 Subject: [PATCH 045/131] Expose invokables that are not slots in the xml Without it the invocations were working but were not listed on introspection Change-Id: Ie62f7dc3577f52b6888ddebf0392fdf51f2845d5 Reviewed-by: Thiago Macieira --- src/dbus/qdbusxmlgenerator.cpp | 5 +- tests/auto/dbus/dbus.pro | 1 + .../qdbusxmlgenerator/qdbusxmlgenerator.pro | 5 + .../tst_qdbusxmlgenerator.cpp | 125 ++++++++++++++++++ 4 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 tests/auto/dbus/qdbusxmlgenerator/qdbusxmlgenerator.pro create mode 100644 tests/auto/dbus/qdbusxmlgenerator/tst_qdbusxmlgenerator.cpp diff --git a/src/dbus/qdbusxmlgenerator.cpp b/src/dbus/qdbusxmlgenerator.cpp index 8c822162e4..bf5e24cd5f 100644 --- a/src/dbus/qdbusxmlgenerator.cpp +++ b/src/dbus/qdbusxmlgenerator.cpp @@ -209,12 +209,13 @@ static QString generateInterfaceXml(const QMetaObject *mo, int flags, int method } int wantedMask; + const bool isSlot = mm.methodType() == QMetaMethod::Slot; if (isScriptable) wantedMask = isSignal ? QDBusConnection::ExportScriptableSignals - : QDBusConnection::ExportScriptableSlots; + : isSlot ? QDBusConnection::ExportScriptableSlots : QDBusConnection::ExportScriptableInvokables; else wantedMask = isSignal ? QDBusConnection::ExportNonScriptableSignals - : QDBusConnection::ExportNonScriptableSlots; + : isSlot ? QDBusConnection::ExportNonScriptableSlots : QDBusConnection::ExportNonScriptableInvokables; if ((flags & wantedMask) != wantedMask) continue; diff --git a/tests/auto/dbus/dbus.pro b/tests/auto/dbus/dbus.pro index cd845d7043..52ee154008 100644 --- a/tests/auto/dbus/dbus.pro +++ b/tests/auto/dbus/dbus.pro @@ -17,6 +17,7 @@ SUBDIRS=\ qdbustype \ qdbusthreading \ qdbusxmlparser \ + qdbusxmlgenerator \ !contains(QT_CONFIG,private_tests): SUBDIRS -= \ qdbusmarshall \ diff --git a/tests/auto/dbus/qdbusxmlgenerator/qdbusxmlgenerator.pro b/tests/auto/dbus/qdbusxmlgenerator/qdbusxmlgenerator.pro new file mode 100644 index 0000000000..5bf8523c42 --- /dev/null +++ b/tests/auto/dbus/qdbusxmlgenerator/qdbusxmlgenerator.pro @@ -0,0 +1,5 @@ +CONFIG += testcase +TARGET = tst_qdbusxmlgenerator +QT = core dbus testlib xml +SOURCES += tst_qdbusxmlgenerator.cpp +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/dbus/qdbusxmlgenerator/tst_qdbusxmlgenerator.cpp b/tests/auto/dbus/qdbusxmlgenerator/tst_qdbusxmlgenerator.cpp new file mode 100644 index 0000000000..1ff613b5ca --- /dev/null +++ b/tests/auto/dbus/qdbusxmlgenerator/tst_qdbusxmlgenerator.cpp @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Canonical Limited +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include + +#include +#include +#include + +static const QString serviceName = "org.example.qdbus"; +static const QString interfaceName = serviceName; + +Q_DECLARE_METATYPE(QDBusConnection::RegisterOption); + +class DBusXmlGenetarorObject : public QObject +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.example.qdbus") +public: + Q_INVOKABLE void nonScriptableInvokable() {} + Q_SCRIPTABLE Q_INVOKABLE void scriptableInvokable() {} +}; + +class tst_QDBusXmlGenerator : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + void introspect_data(); + void introspect(); +}; + +void tst_QDBusXmlGenerator::initTestCase() +{ + QDBusConnection::sessionBus().registerService(serviceName); +} + +void tst_QDBusXmlGenerator::introspect_data() +{ + QTest::addColumn("methodName"); + QTest::addColumn("flags"); + + QTest::newRow("scriptableInvokable") << "scriptableInvokable" << QDBusConnection::ExportScriptableInvokables; + QTest::newRow("nonScriptableInvokable") << "nonScriptableInvokable" << QDBusConnection::ExportNonScriptableInvokables; +} + +void tst_QDBusXmlGenerator::introspect() +{ + QFETCH(QString, methodName); + QFETCH(QDBusConnection::RegisterOption, flags); + DBusXmlGenetarorObject obj; + + QDBusConnection::sessionBus().registerObject("/" + methodName, &obj, flags ); + + QDBusInterface dif(serviceName, "/" + methodName, "", QDBusConnection::sessionBus()); + QDBusReply reply = dif.call("Introspect"); + + bool found = false; + QDomDocument d; + d.setContent(reply.value(), false); + QDomNode n = d.documentElement().firstChild(); + while (!found && !n.isNull()) { + QDomElement e = n.toElement(); // try to convert the node to an element. + if (!e.isNull()) { + if (e.tagName() == "interface" && e.attribute("name") == interfaceName ) { + QDomNode n2 = e.firstChild(); + while (!n2.isNull()) { + QDomElement e2 = n2.toElement(); // try to convert the node to an element. + if (!e2.isNull()) { + if (e2.tagName() == "method") { + found = e2.attribute("name") == methodName; + } + } + n2 = n2.nextSibling(); + } + } + } + n = n.nextSibling(); + } + + QVERIFY(found); +} + +QTEST_MAIN(tst_QDBusXmlGenerator) + +#include "tst_qdbusxmlgenerator.moc" + From 130f43c9c17669ce02747176a7b3c2bf5f667204 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Tue, 30 Jul 2013 07:20:35 +0200 Subject: [PATCH 046/131] Gtk theme: emit currentFontChanged() in font dialog helper There is no signal for it in gtk font selection. We should emit this signal just before accept() was emitted. Change-Id: Ie31d96b789436607b134c84dd77a4b9be9e9a550 Reviewed-by: J-P Nurmi --- src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp index 77a78d2140..91a23afac5 100644 --- a/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp +++ b/src/plugins/platformthemes/gtk2/qgtk2dialoghelpers.cpp @@ -587,6 +587,7 @@ QFont QGtk2FontDialogHelper::currentFont() const void QGtk2FontDialogHelper::onAccepted() { + emit currentFontChanged(currentFont()); emit accept(); emit fontSelected(currentFont()); } From e54ef7f23bf976f264ecb5ca77e080b324f18a62 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Tue, 23 Jul 2013 13:54:37 +0200 Subject: [PATCH 047/131] xcb: mouse wheel does not focus a window The window should react to the wheel event (e.g. scroll content) but without becoming focused; this is the X11 convention. Task-number: QTBUG-32517 Change-Id: I7e12425e5a6e1549b7f23dc318612a436c24d14b Reviewed-by: Friedemann Kleint --- src/plugins/platforms/xcb/qxcbwindow.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 0325338a13..5006aab35b 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -1641,7 +1641,8 @@ void QXcbWindow::handleUnmapNotifyEvent(const xcb_unmap_notify_event_t *event) void QXcbWindow::handleButtonPressEvent(const xcb_button_press_event_t *event) { - if (window() != QGuiApplication::focusWindow()) { + const bool isWheel = event->detail >= 4 && event->detail <= 7; + if (!isWheel && window() != QGuiApplication::focusWindow()) { QWindow *w = static_cast(QObjectPrivate::get(window()))->eventReceiver(); if (!(w->flags() & Qt::WindowDoesNotAcceptFocus)) w->requestActivate(); @@ -1663,7 +1664,7 @@ void QXcbWindow::handleButtonPressEvent(const xcb_button_press_event_t *event) Qt::KeyboardModifiers modifiers = connection()->keyboard()->translateModifiers(event->state); - if (event->detail >= 4 && event->detail <= 7) { + if (isWheel) { // Logic borrowed from qapplication_x11.cpp int delta = 120 * ((event->detail == 4 || event->detail == 6) ? 1 : -1); bool hor = (((event->detail == 4 || event->detail == 5) From f29bbbde5fa2c8b095d3317d3f935f46febe04ca Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Tue, 30 Jul 2013 14:23:09 +0200 Subject: [PATCH 048/131] Check if the widgetItem is valid before accessing widget() on it If a state was restored but not all the dockwidgets that were available before are available at the time of restoration then when dragging a dockwidget to where the unavailable one is expected to be would cause a crash. Change-Id: I829d93041b7950a3546ba4e6c3764b169f276315 Reviewed-by: Friedemann Kleint --- src/widgets/widgets/qdockarealayout.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index ac061e7071..72a463b30b 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -1471,7 +1471,7 @@ QList QDockAreaLayoutInfo::indexOf(QWidget *widget) const continue; } - if (!(item.flags & QDockAreaLayoutItem::GapItem) && item.widgetItem->widget() == widget) { + if (!(item.flags & QDockAreaLayoutItem::GapItem) && item.widgetItem && item.widgetItem->widget() == widget) { QList result; result << i; return result; From 87a30db468b187c9c667feefdb31a63028ee9fad Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Tue, 30 Jul 2013 10:13:31 +0200 Subject: [PATCH 049/131] eglfs: Fix updates when resizing backing store We would resize the backing store without resizing the viewport, which would cause all subsequent blits of the backing store to the screen to look broken. Task-number: QTBUG-32146 Change-Id: I65bae051b7cfbbc61fc285e4baa74685d5639569 Reviewed-by: Gunnar Sletta --- src/plugins/platforms/eglfs/qeglfsbackingstore.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp index eccb7f42c5..e09154bb59 100644 --- a/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp +++ b/src/plugins/platforms/eglfs/qeglfsbackingstore.cpp @@ -79,6 +79,9 @@ void QEglFSBackingStore::flush(QWindow *window, const QRegion ®ion, const QPo makeCurrent(); + QRectF sr = window->screen()->geometry(); + glViewport(0, 0, sr.width(), sr.height()); + #ifdef QEGL_EXTRA_DEBUG qWarning("QEglBackingStore::flush %p", window); #endif @@ -120,7 +123,6 @@ void QEglFSBackingStore::flush(QWindow *window, const QRegion ®ion, const QPo }; QRectF r = window->geometry(); - QRectF sr = window->screen()->geometry(); GLfloat x1 = (r.left() / sr.width()) * 2 - 1; GLfloat x2 = (r.right() / sr.width()) * 2 - 1; From d9ea4bb1441534cfb9253303ac258951dfcc4d9e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 29 Jul 2013 13:47:15 +0200 Subject: [PATCH 050/131] Mark qt5_use_modules as obsolete. Forward-port of cb7f32f5b861fe115fa71f64500a5cbb0b643f1b (Mark qt4_use_modules and qt4_automoc as obsolete., 2013-07-04) from cmake.git. Change-Id: I0c24408ef06bc93eb0e55108cf4eab2f8cbd19cb Reviewed-by: Jerome Pasion Reviewed-by: Stephen Kelly --- src/corelib/Qt5CoreMacros.cmake | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/corelib/Qt5CoreMacros.cmake b/src/corelib/Qt5CoreMacros.cmake index f549fead59..6630885257 100644 --- a/src/corelib/Qt5CoreMacros.cmake +++ b/src/corelib/Qt5CoreMacros.cmake @@ -219,6 +219,18 @@ set(_Qt5_COMPONENT_PATH "${CMAKE_CURRENT_LIST_DIR}/..") if (NOT CMAKE_VERSION VERSION_LESS 2.8.9) macro(qt5_use_modules _target _link_type) + if(NOT CMAKE_MINIMUM_REQUIRED_VERSION VERSION_LESS 2.8.11) + if(CMAKE_WARN_DEPRECATED) + set(messageType WARNING) + endif() + if(CMAKE_ERROR_DEPRECATED) + set(messageType FATAL_ERROR) + endif() + if(messageType) + message(${messageType} "The qt5_use_modules macro is obsolete. Use target_link_libraries with IMPORTED targets instead.") + endif() + endif() + if (NOT TARGET ${_target}) message(FATAL_ERROR "The first argument to qt5_use_modules must be an existing target.") endif() From 22fbb5be6edd1b128d582f68c095ff5118dadc29 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Thu, 4 Jul 2013 19:59:56 +0200 Subject: [PATCH 051/131] Clear focus if the widget being deleted is the parent's focus child. If a widget is deleted as a result of a window activation changed then it is possible that the parent does not clear the focus because of the activation change. If the focus child is actually part of an embedded widget in the graphicsview then it needs to be handled explicitly in this case too. Change-Id: I3e7a2b963f175828de4c19283178560abca91235 Reviewed-by: Friedemann Kleint Reviewed-by: Andreas Aardal Hanssen --- src/widgets/kernel/qwidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 7cb0979c06..49d64c5cd8 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -1401,7 +1401,7 @@ QWidget::~QWidget() w = w->d_func()->extra->focus_proxy; QWidget *window = w->window(); QWExtra *e = window ? window->d_func()->extra : 0; - if (!e || !e->proxyWidget) + if (!e || !e->proxyWidget || (w->parentWidget() && w->parentWidget()->d_func()->focus_child == this)) #endif clearFocus(); } QT_CATCH(...) { From 7654f71f80266fd35f3c8b04d2534c876afec3a6 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Tue, 16 Jul 2013 14:18:58 +0200 Subject: [PATCH 052/131] Fix handling of non-latin1 shortcuts This patch enables non-latin1 shortcut handling on Qt5/X11. Task-number: QTBUG-32274 Change-Id: Ia084258b956128ffade8eddfbcb18af334d79a59 Reviewed-by: Friedemann Kleint Reviewed-by: Lars Knoll --- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 69 +++++++++++++++------- src/plugins/platforms/xcb/qxcbkeyboard.h | 4 +- 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index ae8bcb802b..38cbfaf183 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -575,7 +575,7 @@ static const Qt::KeyboardModifiers ModsTbl[] = { Qt::AltModifier | Qt::ShiftModifier, // 5 Qt::AltModifier | Qt::ControlModifier, // 6 Qt::AltModifier | Qt::ShiftModifier | Qt::ControlModifier, // 7 - Qt::NoModifier // Fall-back to raw Key_* + Qt::NoModifier // Fall-back to raw Key_*, for non-latin1 kb layouts }; Qt::KeyboardModifiers QXcbKeyboard::translateModifiers(int s) const @@ -594,8 +594,9 @@ Qt::KeyboardModifiers QXcbKeyboard::translateModifiers(int s) const return ret; } -void QXcbKeyboard::readXKBConfig(struct xkb_rule_names *xkb_names) +void QXcbKeyboard::readXKBConfig() { + clearXKBConfig(); xcb_generic_error_t *error; xcb_get_property_cookie_t cookie; xcb_get_property_reply_t *config_reply; @@ -626,15 +627,30 @@ void QXcbKeyboard::readXKBConfig(struct xkb_rule_names *xkb_names) length -= len + 1; } while (p < end || i < 5); - xkb_names->rules = qstrdup(names[0]); - xkb_names->model = qstrdup(names[1]); - xkb_names->layout = qstrdup(names[2]); - xkb_names->variant = qstrdup(names[3]); - xkb_names->options = qstrdup(names[4]); + xkb_names.rules = qstrdup(names[0]); + xkb_names.model = qstrdup(names[1]); + xkb_names.layout = qstrdup(names[2]); + xkb_names.variant = qstrdup(names[3]); + xkb_names.options = qstrdup(names[4]); free(config_reply); } +void QXcbKeyboard::clearXKBConfig() +{ + if (xkb_names.rules) + delete[] xkb_names.rules; + if (xkb_names.model) + delete[] xkb_names.model; + if (xkb_names.layout) + delete[] xkb_names.layout; + if (xkb_names.variant) + delete[] xkb_names.variant; + if (xkb_names.options) + delete[] xkb_names.options; + memset(&xkb_names, 0, sizeof(xkb_names)); +} + void QXcbKeyboard::updateKeymap() { m_config = true; @@ -646,22 +662,13 @@ void QXcbKeyboard::updateKeymap() return; } } - - struct xkb_rule_names xkb_names = {0, 0, 0, 0, 0}; - - readXKBConfig(&xkb_names); + readXKBConfig(); // Compile a keymap from RMLVO (rules, models, layouts, variants and options) names if (xkb_keymap) xkb_keymap_unref(xkb_keymap); xkb_keymap = xkb_keymap_new_from_names(xkb_context, &xkb_names, (xkb_keymap_compile_flags)0); - delete[] xkb_names.rules; - delete[] xkb_names.model; - delete[] xkb_names.layout; - delete[] xkb_names.variant; - delete[] xkb_names.options; - if (!xkb_keymap) { qWarning("Qt: Failed to compile a keymap"); m_config = false; @@ -830,7 +837,7 @@ QList QXcbKeyboard::possibleKeys(const QKeyEvent *event) const xkb_mod_index_t controlMod = xkb_keymap_mod_get_index(xkb_keymap, "Control"); xkb_mod_mask_t depressed; - + struct xkb_keymap *fallback_keymap = 0; int qtKey = 0; //obtain a list of possible shortcuts for the given key event for (uint i = 1; i < sizeof(ModsTbl) / sizeof(*ModsTbl) ; ++i) { @@ -846,8 +853,23 @@ QList QXcbKeyboard::possibleKeys(const QKeyEvent *event) const depressed |= (1 << controlMod); // update a keyboard state from a set of explicit masks - xkb_state_update_mask(kb_state, depressed, latchedMods, lockedMods, - baseLayout, latchedLayout, lockedLayout); + if (i == 8) { + // Add a fall back key for layouts with non Latin-1 characters + if (baseQtKey > 255) { + struct xkb_rule_names names = { xkb_names.rules, xkb_names.model, "us", 0, 0 }; + fallback_keymap = xkb_keymap_new_from_names(xkb_context, &names, (xkb_keymap_compile_flags)0); + if (!fallback_keymap) + continue; + xkb_state_unref(kb_state); + kb_state = xkb_state_new(fallback_keymap); + if (!kb_state) + continue; + } else + continue; + } else { + xkb_state_update_mask(kb_state, depressed, latchedMods, lockedMods, + baseLayout, latchedLayout, lockedLayout); + } sym = xkb_state_key_get_one_sym(kb_state, event->nativeScanCode()); if (sym == XKB_KEY_NoSymbol) @@ -862,8 +884,11 @@ QList QXcbKeyboard::possibleKeys(const QKeyEvent *event) const result += (qtKey + mods); } } + if (kb_state) + xkb_state_unref(kb_state); + if (fallback_keymap) + xkb_keymap_unref(fallback_keymap); - xkb_state_unref(kb_state); return result; } @@ -933,6 +958,7 @@ QXcbKeyboard::QXcbKeyboard(QXcbConnection *connection) , core_device_id(0) #endif { + memset(&xkb_names, 0, sizeof(xkb_names)); updateKeymap(); #ifndef QT_NO_XKB if (connection->hasXKB()) { @@ -974,6 +1000,7 @@ QXcbKeyboard::~QXcbKeyboard() #ifdef QT_NO_XKB xcb_key_symbols_free(m_key_symbols); #endif + clearXKBConfig(); } #ifndef QT_NO_XKB diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.h b/src/plugins/platforms/xcb/qxcbkeyboard.h index 770a7eabea..0256602782 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.h +++ b/src/plugins/platforms/xcb/qxcbkeyboard.h @@ -91,7 +91,8 @@ protected: int keysymToQtKey(xcb_keysym_t keysym) const; int keysymToQtKey(xcb_keysym_t keysym, Qt::KeyboardModifiers &modifiers, QString text) const; - void readXKBConfig(struct xkb_rule_names *names); + void readXKBConfig(); + void clearXKBConfig(); #ifdef QT_NO_XKB void updateModifiers(); @@ -107,6 +108,7 @@ private: struct xkb_context *xkb_context; struct xkb_keymap *xkb_keymap; struct xkb_state *xkb_state; + struct xkb_rule_names xkb_names; struct _mod_masks { uint alt; From c837dbecdd9ab6707798cd26ae7979063eb8d93b Mon Sep 17 00:00:00 2001 From: Samuli Piippo Date: Mon, 29 Jul 2013 14:39:15 +0300 Subject: [PATCH 053/131] eglfs: allow egl native window to be zero Change the checking for created EGLNativeWindowType so that zero is a valid value. This is the case e.g, with BeagleBoard, where widget application cannot be run without this change. Change-Id: I36c30091e1a5a0598ae3822d0be8dc4362779c0b Reviewed-by: Gunnar Sletta --- src/plugins/platforms/eglfs/qeglfswindow.cpp | 10 ++++++---- src/plugins/platforms/eglfs/qeglfswindow.h | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp index 9aece1ea83..3b0c7de8e7 100644 --- a/src/plugins/platforms/eglfs/qeglfswindow.cpp +++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp @@ -53,6 +53,7 @@ QEglFSWindow::QEglFSWindow(QWindow *w) : QPlatformWindow(w) , m_surface(0) , m_window(0) + , has_window(false) { static int serialNo = 0; m_winid = ++serialNo; @@ -69,7 +70,7 @@ QEglFSWindow::~QEglFSWindow() void QEglFSWindow::create() { - if (m_window) + if (has_window) return; setWindowState(Qt::WindowFullScreen); @@ -91,7 +92,7 @@ void QEglFSWindow::create() void QEglFSWindow::invalidateSurface() { // Native surface has been deleted behind our backs - m_window = 0; + has_window = false; if (m_surface != 0) { EGLDisplay display = (static_cast(window()->screen()->handle()))->display(); eglDestroySurface(display, m_surface); @@ -104,6 +105,7 @@ void QEglFSWindow::resetSurface() EGLDisplay display = static_cast(screen())->display(); m_window = QEglFSHooks::hooks()->createNativeWindow(QEglFSHooks::hooks()->screenSize(), m_format); + has_window = true; m_surface = eglCreateWindowSurface(display, m_config, m_window, NULL); if (m_surface == EGL_NO_SURFACE) { EGLint error = eglGetError(); @@ -120,9 +122,9 @@ void QEglFSWindow::destroy() m_surface = 0; } - if (m_window) { + if (has_window) { QEglFSHooks::hooks()->destroyNativeWindow(m_window); - m_window = 0; + has_window = false; } } diff --git a/src/plugins/platforms/eglfs/qeglfswindow.h b/src/plugins/platforms/eglfs/qeglfswindow.h index 67a64973ce..a119c9f815 100644 --- a/src/plugins/platforms/eglfs/qeglfswindow.h +++ b/src/plugins/platforms/eglfs/qeglfswindow.h @@ -76,6 +76,7 @@ private: WId m_winid; EGLConfig m_config; QSurfaceFormat m_format; + bool has_window; }; QT_END_NAMESPACE #endif // QEGLFSWINDOW_H From ded8c6a08f43c13302d3c616a3d0bbeba97dcd2f Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Wed, 31 Jul 2013 12:39:51 +0200 Subject: [PATCH 054/131] configure: Fix qtwebkit-examples-and-demos -> qtwebkit-examples Change-Id: I950912a883c263ee4bbae4d1da53c66aa870be70 Reviewed-by: Oswald Buddenhagen --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 140c7b4131..6c4abeb9ce 100755 --- a/configure +++ b/configure @@ -2886,7 +2886,7 @@ if [ "$XPLATFORM_IOS" = "yes" ]; then CFG_NOBUILD_PARTS="$CFG_NOBUILD_PARTS examples tests" CFG_SHARED="no" # iOS builds should be static to be able to submit to the App Store CFG_CXX11="no" # C++11 support disabled for now - CFG_SKIP_MODULES="$CFG_SKIP_MODULES qtdeclarative qtquickcontrols qtwebkit qtgraphicaleffects qtdoc qtmultimedia qtwebkit-examples-and-demos qttools" + CFG_SKIP_MODULES="$CFG_SKIP_MODULES qtdeclarative qtquickcontrols qtwebkit qtgraphicaleffects qtdoc qtmultimedia qtwebkit-examples qttools" fi # disable GTK style support auto-detection on Mac From c707bb441486656b88748f0dfb29810181ce3460 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Wed, 31 Jul 2013 13:38:17 +0100 Subject: [PATCH 055/131] Don't run this code on WinCE, the variable will be unused. Change-Id: Id472e6e18759227943a24aa723963671bdb52164 Reviewed-by: Friedemann Kleint --- src/plugins/platforms/windows/qwindowstheme.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index 844e46eec5..0fcd20f7bb 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -226,7 +226,6 @@ static inline QPalette menuPalette(const QPalette &systemPalette) const QColor menuColor(getSysColor(COLOR_MENU)); const QColor menuTextColor(getSysColor(COLOR_MENUTEXT)); const QColor disabled(getSysColor(COLOR_GRAYTEXT)); - const bool isFlat = booleanSystemParametersInfo(SPI_GETFLATMENU, false); // we might need a special color group for the result. result.setColor(QPalette::Active, QPalette::Button, menuColor); result.setColor(QPalette::Active, QPalette::Text, menuTextColor); @@ -235,6 +234,7 @@ static inline QPalette menuPalette(const QPalette &systemPalette) result.setColor(QPalette::Disabled, QPalette::WindowText, disabled); result.setColor(QPalette::Disabled, QPalette::Text, disabled); #ifndef Q_OS_WINCE + const bool isFlat = booleanSystemParametersInfo(SPI_GETFLATMENU, false); result.setColor(QPalette::Disabled, QPalette::Highlight, getSysColor(isFlat ? COLOR_MENUHILIGHT : COLOR_HIGHLIGHT)); #else From 0ec917123f49e398e884b887b9de22f2b8b82425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Martins?= Date: Wed, 31 Jul 2013 13:29:17 +0100 Subject: [PATCH 056/131] Fix build with QT_NO_CURSOR. Just moved applyCursor() and defaultCursor() to a #ifndef block. Change-Id: I14c21aa509395fb1bd72d389cfc46f0f34ab7649 Reviewed-by: Friedemann Kleint --- .../platforms/windows/qwindowswindow.cpp | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index dc51dbfc88..dcab51ce3e 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -1795,6 +1795,7 @@ void QWindowsWindow::getSizeHints(MINMAXINFO *mmi) const } #endif // !Q_OS_WINCE +#ifndef QT_NO_CURSOR // Return the default cursor (Arrow) from QWindowsCursor's cache. static inline QWindowsWindowCursor defaultCursor(const QWindow *w) { @@ -1805,6 +1806,24 @@ static inline QWindowsWindowCursor defaultCursor(const QWindow *w) return QWindowsWindowCursor(Qt::ArrowCursor); } +// Check whether to apply a new cursor. Either the window in question is +// currently under mouse, or it is the parent of the window under mouse and +// there is no other window with an explicitly set cursor in-between. +static inline bool applyNewCursor(const QWindow *w) +{ + const QWindow *underMouse = QWindowsContext::instance()->windowUnderMouse(); + if (underMouse == w) + return true; + for (const QWindow *p = underMouse; p ; p = p->parent()) { + if (p == w) + return true; + if (!QWindowsWindow::baseWindowOf(p)->cursor().isNull()) + return false; + } + return false; +} +#endif // !QT_NO_CURSOR + /*! \brief Applies to cursor property set on the window to the global cursor. @@ -1826,23 +1845,6 @@ void QWindowsWindow::applyCursor() #endif } -// Check whether to apply a new cursor. Either the window in question is -// currently under mouse, or it is the parent of the window under mouse and -// there is no other window with an explicitly set cursor in-between. -static inline bool applyNewCursor(const QWindow *w) -{ - const QWindow *underMouse = QWindowsContext::instance()->windowUnderMouse(); - if (underMouse == w) - return true; - for (const QWindow *p = underMouse; p ; p = p->parent()) { - if (p == w) - return true; - if (!QWindowsWindow::baseWindowOf(p)->cursor().isNull()) - return false; - } - return false; -} - void QWindowsWindow::setCursor(const QWindowsWindowCursor &c) { #ifndef QT_NO_CURSOR From 49869f2a7d0e5d33ea2444ea7b35e6f9dc93231e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Wed, 31 Jul 2013 11:18:01 +0200 Subject: [PATCH 057/131] Fix typo form->from Change-Id: Ifa47cec0e454228d33c917c0baa6d0686955af5a Reviewed-by: Gunnar Sletta --- src/gui/opengl/qopengl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/opengl/qopengl.h b/src/gui/opengl/qopengl.h index 6e8be66806..6eb656cd09 100644 --- a/src/gui/opengl/qopengl.h +++ b/src/gui/opengl/qopengl.h @@ -106,7 +106,7 @@ typedef GLfloat GLdouble; # endif # include # else -# define GL_GLEXT_LEGACY // Prevents GL/gl.h form #including system glext.h +# define GL_GLEXT_LEGACY // Prevents GL/gl.h from #including system glext.h # include # include # endif // Q_OS_MAC From e440b35bb34023998f62fd426987c23bd5983f46 Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Wed, 31 Jul 2013 10:37:31 -0400 Subject: [PATCH 058/131] Update Info.plist templates to use the current standard plist format. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change the version number to 1.0, and use the public doctype. Change-Id: I9b071c80c410c31c38813c4447edd7b186226fab Reviewed-by: Jake Petroules Reviewed-by: Tor Arne Vestbø --- mkspecs/macx-clang-32/Info.plist.app | 4 +-- mkspecs/macx-clang-32/Info.plist.lib | 10 +++---- mkspecs/macx-clang/Info.plist.app | 4 +-- mkspecs/macx-clang/Info.plist.lib | 10 +++---- mkspecs/macx-g++-32/Info.plist.app | 4 +-- mkspecs/macx-g++-32/Info.plist.lib | 10 +++---- mkspecs/macx-g++/Info.plist.app | 4 +-- mkspecs/macx-g++/Info.plist.lib | 10 +++---- mkspecs/macx-g++40/Info.plist.app | 4 +-- mkspecs/macx-g++40/Info.plist.lib | 10 +++---- mkspecs/macx-g++42/Info.plist.app | 4 +-- mkspecs/macx-g++42/Info.plist.lib | 10 +++---- mkspecs/macx-llvm/Info.plist.app | 4 +-- mkspecs/macx-llvm/Info.plist.lib | 10 +++---- mkspecs/macx-xcode/Info.plist.app | 4 +-- mkspecs/macx-xcode/Info.plist.lib | 10 +++---- .../unsupported/macx-ios-clang/Info.plist.app | 4 +-- .../unsupported/macx-ios-clang/Info.plist.lib | 10 +++---- tests/auto/other/macplist/tst_macplist.cpp | 30 +++++++++---------- 19 files changed, 78 insertions(+), 78 deletions(-) diff --git a/mkspecs/macx-clang-32/Info.plist.app b/mkspecs/macx-clang-32/Info.plist.app index b822c2851f..187a8e0aa4 100644 --- a/mkspecs/macx-clang-32/Info.plist.app +++ b/mkspecs/macx-clang-32/Info.plist.app @@ -1,6 +1,6 @@ - - + + NSPrincipalClass NSApplication diff --git a/mkspecs/macx-clang-32/Info.plist.lib b/mkspecs/macx-clang-32/Info.plist.lib index 97609ed0ce..63f1a945c2 100644 --- a/mkspecs/macx-clang-32/Info.plist.lib +++ b/mkspecs/macx-clang-32/Info.plist.lib @@ -1,12 +1,12 @@ - - + + CFBundlePackageType FMWK - CFBundleShortVersionString - @SHORT_VERSION@ - CFBundleGetInfoString + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString Created by Qt/QMake CFBundleSignature @TYPEINFO@ diff --git a/mkspecs/macx-clang/Info.plist.app b/mkspecs/macx-clang/Info.plist.app index b822c2851f..187a8e0aa4 100644 --- a/mkspecs/macx-clang/Info.plist.app +++ b/mkspecs/macx-clang/Info.plist.app @@ -1,6 +1,6 @@ - - + + NSPrincipalClass NSApplication diff --git a/mkspecs/macx-clang/Info.plist.lib b/mkspecs/macx-clang/Info.plist.lib index 97609ed0ce..63f1a945c2 100644 --- a/mkspecs/macx-clang/Info.plist.lib +++ b/mkspecs/macx-clang/Info.plist.lib @@ -1,12 +1,12 @@ - - + + CFBundlePackageType FMWK - CFBundleShortVersionString - @SHORT_VERSION@ - CFBundleGetInfoString + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString Created by Qt/QMake CFBundleSignature @TYPEINFO@ diff --git a/mkspecs/macx-g++-32/Info.plist.app b/mkspecs/macx-g++-32/Info.plist.app index b822c2851f..187a8e0aa4 100644 --- a/mkspecs/macx-g++-32/Info.plist.app +++ b/mkspecs/macx-g++-32/Info.plist.app @@ -1,6 +1,6 @@ - - + + NSPrincipalClass NSApplication diff --git a/mkspecs/macx-g++-32/Info.plist.lib b/mkspecs/macx-g++-32/Info.plist.lib index 97609ed0ce..63f1a945c2 100644 --- a/mkspecs/macx-g++-32/Info.plist.lib +++ b/mkspecs/macx-g++-32/Info.plist.lib @@ -1,12 +1,12 @@ - - + + CFBundlePackageType FMWK - CFBundleShortVersionString - @SHORT_VERSION@ - CFBundleGetInfoString + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString Created by Qt/QMake CFBundleSignature @TYPEINFO@ diff --git a/mkspecs/macx-g++/Info.plist.app b/mkspecs/macx-g++/Info.plist.app index b822c2851f..187a8e0aa4 100644 --- a/mkspecs/macx-g++/Info.plist.app +++ b/mkspecs/macx-g++/Info.plist.app @@ -1,6 +1,6 @@ - - + + NSPrincipalClass NSApplication diff --git a/mkspecs/macx-g++/Info.plist.lib b/mkspecs/macx-g++/Info.plist.lib index 97609ed0ce..63f1a945c2 100644 --- a/mkspecs/macx-g++/Info.plist.lib +++ b/mkspecs/macx-g++/Info.plist.lib @@ -1,12 +1,12 @@ - - + + CFBundlePackageType FMWK - CFBundleShortVersionString - @SHORT_VERSION@ - CFBundleGetInfoString + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString Created by Qt/QMake CFBundleSignature @TYPEINFO@ diff --git a/mkspecs/macx-g++40/Info.plist.app b/mkspecs/macx-g++40/Info.plist.app index b822c2851f..187a8e0aa4 100644 --- a/mkspecs/macx-g++40/Info.plist.app +++ b/mkspecs/macx-g++40/Info.plist.app @@ -1,6 +1,6 @@ - - + + NSPrincipalClass NSApplication diff --git a/mkspecs/macx-g++40/Info.plist.lib b/mkspecs/macx-g++40/Info.plist.lib index 97609ed0ce..63f1a945c2 100644 --- a/mkspecs/macx-g++40/Info.plist.lib +++ b/mkspecs/macx-g++40/Info.plist.lib @@ -1,12 +1,12 @@ - - + + CFBundlePackageType FMWK - CFBundleShortVersionString - @SHORT_VERSION@ - CFBundleGetInfoString + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString Created by Qt/QMake CFBundleSignature @TYPEINFO@ diff --git a/mkspecs/macx-g++42/Info.plist.app b/mkspecs/macx-g++42/Info.plist.app index b822c2851f..187a8e0aa4 100644 --- a/mkspecs/macx-g++42/Info.plist.app +++ b/mkspecs/macx-g++42/Info.plist.app @@ -1,6 +1,6 @@ - - + + NSPrincipalClass NSApplication diff --git a/mkspecs/macx-g++42/Info.plist.lib b/mkspecs/macx-g++42/Info.plist.lib index 97609ed0ce..63f1a945c2 100644 --- a/mkspecs/macx-g++42/Info.plist.lib +++ b/mkspecs/macx-g++42/Info.plist.lib @@ -1,12 +1,12 @@ - - + + CFBundlePackageType FMWK - CFBundleShortVersionString - @SHORT_VERSION@ - CFBundleGetInfoString + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString Created by Qt/QMake CFBundleSignature @TYPEINFO@ diff --git a/mkspecs/macx-llvm/Info.plist.app b/mkspecs/macx-llvm/Info.plist.app index b822c2851f..187a8e0aa4 100644 --- a/mkspecs/macx-llvm/Info.plist.app +++ b/mkspecs/macx-llvm/Info.plist.app @@ -1,6 +1,6 @@ - - + + NSPrincipalClass NSApplication diff --git a/mkspecs/macx-llvm/Info.plist.lib b/mkspecs/macx-llvm/Info.plist.lib index 97609ed0ce..63f1a945c2 100644 --- a/mkspecs/macx-llvm/Info.plist.lib +++ b/mkspecs/macx-llvm/Info.plist.lib @@ -1,12 +1,12 @@ - - + + CFBundlePackageType FMWK - CFBundleShortVersionString - @SHORT_VERSION@ - CFBundleGetInfoString + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString Created by Qt/QMake CFBundleSignature @TYPEINFO@ diff --git a/mkspecs/macx-xcode/Info.plist.app b/mkspecs/macx-xcode/Info.plist.app index b822c2851f..187a8e0aa4 100755 --- a/mkspecs/macx-xcode/Info.plist.app +++ b/mkspecs/macx-xcode/Info.plist.app @@ -1,6 +1,6 @@ - - + + NSPrincipalClass NSApplication diff --git a/mkspecs/macx-xcode/Info.plist.lib b/mkspecs/macx-xcode/Info.plist.lib index 97609ed0ce..63f1a945c2 100644 --- a/mkspecs/macx-xcode/Info.plist.lib +++ b/mkspecs/macx-xcode/Info.plist.lib @@ -1,12 +1,12 @@ - - + + CFBundlePackageType FMWK - CFBundleShortVersionString - @SHORT_VERSION@ - CFBundleGetInfoString + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString Created by Qt/QMake CFBundleSignature @TYPEINFO@ diff --git a/mkspecs/unsupported/macx-ios-clang/Info.plist.app b/mkspecs/unsupported/macx-ios-clang/Info.plist.app index c7d660b8d1..91f4b3d07e 100755 --- a/mkspecs/unsupported/macx-ios-clang/Info.plist.app +++ b/mkspecs/unsupported/macx-ios-clang/Info.plist.app @@ -1,6 +1,6 @@ - - + + CFBundleIconFile @ICON@ diff --git a/mkspecs/unsupported/macx-ios-clang/Info.plist.lib b/mkspecs/unsupported/macx-ios-clang/Info.plist.lib index 97609ed0ce..63f1a945c2 100644 --- a/mkspecs/unsupported/macx-ios-clang/Info.plist.lib +++ b/mkspecs/unsupported/macx-ios-clang/Info.plist.lib @@ -1,12 +1,12 @@ - - + + CFBundlePackageType FMWK - CFBundleShortVersionString - @SHORT_VERSION@ - CFBundleGetInfoString + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString Created by Qt/QMake CFBundleSignature @TYPEINFO@ diff --git a/tests/auto/other/macplist/tst_macplist.cpp b/tests/auto/other/macplist/tst_macplist.cpp index 5ce72bac53..1f0a572ce8 100644 --- a/tests/auto/other/macplist/tst_macplist.cpp +++ b/tests/auto/other/macplist/tst_macplist.cpp @@ -65,14 +65,14 @@ void tst_MacPlist::test_plist_data() QTest::newRow("control") << QString::fromLatin1( "" -"\n" -"\n" +"\n" +"\n" "\n" " CFBundleIconFile\n" " \n" " CFBundlePackageType\n" " APPL\n" -" CFBundleGetInfoString\n" +" CFBundleGetInfoString\n" " Created by Qt/QMake\n" " CFBundleExecutable\n" " app\n" @@ -83,14 +83,14 @@ void tst_MacPlist::test_plist_data() QTest::newRow("LSUIElement-as-string") << QString::fromLatin1( "" -"\n" -"\n" +"\n" +"\n" "\n" " CFBundleIconFile\n" " \n" " CFBundlePackageType\n" " APPL\n" -" CFBundleGetInfoString\n" +" CFBundleGetInfoString\n" " Created by Qt/QMake\n" " CFBundleExecutable\n" " app\n" @@ -103,14 +103,14 @@ void tst_MacPlist::test_plist_data() QTest::newRow("LSUIElement-as-bool") << QString::fromLatin1( "" -"\n" -"\n" +"\n" +"\n" "\n" " CFBundleIconFile\n" " \n" " CFBundlePackageType\n" " APPL\n" -" CFBundleGetInfoString\n" +" CFBundleGetInfoString\n" " Created by Qt/QMake\n" " CFBundleExecutable\n" " app\n" @@ -123,14 +123,14 @@ void tst_MacPlist::test_plist_data() QTest::newRow("LSUIElement-as-int") << QString::fromLatin1( "" -"\n" -"\n" +"\n" +"\n" "\n" " CFBundleIconFile\n" " \n" " CFBundlePackageType\n" " APPL\n" -" CFBundleGetInfoString\n" +" CFBundleGetInfoString\n" " Created by Qt/QMake\n" " CFBundleExecutable\n" " app\n" @@ -143,14 +143,14 @@ void tst_MacPlist::test_plist_data() QTest::newRow("LSUIElement-as-garbage") << QString::fromLatin1( "" -"\n" -"\n" +"\n" +"\n" "\n" " CFBundleIconFile\n" " \n" " CFBundlePackageType\n" " APPL\n" -" CFBundleGetInfoString\n" +" CFBundleGetInfoString\n" " Created by Qt/QMake\n" " CFBundleExecutable\n" " app\n" From b59c257a04f16dfefc6a7a8a1a920a8277db1326 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Wed, 31 Jul 2013 15:40:40 +0200 Subject: [PATCH 059/131] Fix stuck modifier issue in the non-xcb_xkb code path Since updating the xkb_state throght core events is more tricky (opposed to the xcb-xkb code path) where we have to use xkb_state_update_key, we need to make sure that our local state is in sync with the X server's state. The local state was getting out of sync if key was pressed down in a Qt application and released in other X client (by changing the focus to another window with a mouse, for example). Task-number: QTBUG-32660 Change-Id: I662bf5aad3ab0e8591109994e746d85ff61ad6ef Reviewed-by: Lars Knoll --- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 41 ++++++++++++---------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index ae8bcb802b..14893d9acc 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -716,14 +716,14 @@ void QXcbKeyboard::updateXKBState(xcb_xkb_state_notify_event_t *state) if (connection()->hasXKB()) { - xkb_state_component newState; - newState = xkb_state_update_mask(xkb_state, - state->baseMods, - state->latchedMods, - state->lockedMods, - state->baseGroup, - state->latchedGroup, - state->lockedGroup); + const xkb_state_component newState + = xkb_state_update_mask(xkb_state, + state->baseMods, + state->latchedMods, + state->lockedMods, + state->baseGroup, + state->latchedGroup, + state->lockedGroup); if ((newState & XKB_STATE_LAYOUT_EFFECTIVE) == XKB_STATE_LAYOUT_EFFECTIVE) { //qWarning("TODO: Support KeyboardLayoutChange on QPA (QTBUG-27681)"); @@ -737,17 +737,22 @@ void QXcbKeyboard::updateXKBStateFromCore(quint16 state) if (!m_config) return; - quint32 modsDepressed, modsLatched, modsLocked; - modsDepressed = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_DEPRESSED); - modsLatched = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LATCHED); - modsLocked = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LOCKED); + const quint32 modsDepressed = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_DEPRESSED); + const quint32 modsLatched = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LATCHED); + const quint32 modsLocked = xkb_state_serialize_mods(xkb_state, XKB_STATE_MODS_LOCKED); + const quint32 xkbMask = xkbModMask(state); - quint32 xkbMask = xkbModMask(state); - xkb_state_component newState; - newState = xkb_state_update_mask(xkb_state, - modsDepressed & xkbMask, - modsLatched & xkbMask, - modsLocked & xkbMask, + const quint32 latched = modsLatched & xkbMask; + const quint32 locked = modsLocked & xkbMask; + quint32 depressed = modsDepressed & xkbMask; + // set modifiers in depressed if they don't appear in any of the final masks + depressed |= ~(depressed | latched | locked) & xkbMask; + + const xkb_state_component newState + = xkb_state_update_mask(xkb_state, + depressed, + latched, + locked, 0, 0, (state >> 13) & 3); // bits 13 and 14 report the state keyboard group From 1ff8ed1bf5c8f0fe0f0c2e7a5ab62ae539f8c97e Mon Sep 17 00:00:00 2001 From: Venu Date: Thu, 1 Aug 2013 12:24:43 +0200 Subject: [PATCH 060/131] Doc: Corrected the example path in the tutorial Task-number: QTBUG-32688 Change-Id: I12c264f29bc1d49322c60debdec3758859f62fa8 Reviewed-by: Jerome Pasion --- src/widgets/doc/src/modelview.qdoc | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/widgets/doc/src/modelview.qdoc b/src/widgets/doc/src/modelview.qdoc index 97d1c72e85..b2f9da9563 100644 --- a/src/widgets/doc/src/modelview.qdoc +++ b/src/widgets/doc/src/modelview.qdoc @@ -73,7 +73,7 @@ This tutorial includes example code for you to edit and integrate into your project. The tutorial's source code is located in Qt's - \c examples/tutorials/modelview directory. + \e examples/widgets/tutorials/modelview directory. For more detailed information you may also want to look at the \l{model-view-programming.html}{reference documentation} @@ -190,14 +190,14 @@ Below are 7 very simple and independent applications that show different sides of model/view programming. The source code can be found inside the - \c{examples/tutorials/modelview} directory. + \c{examples/widgets/tutorials/modelview} directory. \section2 2.1 A Read Only Table We start with an application that uses a QTableView to show data. We will add editing capabilities later. - (file source: examples/tutorials/modelview/1_readonly/main.cpp) + (file source: examples/widgets/tutorials/modelview/1_readonly/main.cpp) \snippet tutorials/modelview/1_readonly/main.cpp Quoting ModelView Tutorial We have the usual \l {modelview-part2-main-cpp.html}{main()} function: @@ -218,12 +218,12 @@ We have a table data set, so let's start with QAbstractTableModel since it is easier to use than the more general QAbstractItemModel. - (file source: examples/tutorials/modelview/1_readonly/mymodel.h) + (file source: examples/widgets/tutorials/modelview/1_readonly/mymodel.h) \snippet tutorials/modelview/1_readonly/mymodel.h Quoting ModelView Tutorial QAbstractTableModel requires the implementation of three abstract methods. - (file source: examples/tutorials/modelview/1_readonly/mymodel.cpp) + (file source: examples/widgets/tutorials/modelview/1_readonly/mymodel.cpp) \snippet tutorials/modelview/1_readonly/mymodel.cpp Quoting ModelView Tutorial The number of rows and columns is provided by @@ -259,7 +259,7 @@ result shown above. The difference is that this time we use parameter int role to return different pieces of information depending on its value. - (file source: examples/tutorials/modelview/2_formatting/mymodel.cpp) + (file source: examples/widgets/tutorials/modelview/2_formatting/mymodel.cpp) \snippet tutorials/modelview/2_formatting/mymodel.cpp Quoting ModelView Tutorial Each formatting property will be requested from the model with a separate @@ -320,7 +320,7 @@ We still have a read only table, but this time the content changes every second because we are showing the current time. - (file source: examples/tutorials/modelview/3_changingmodel/mymodel.cpp) + (file source: examples/widgets/tutorials/modelview/3_changingmodel/mymodel.cpp) \snippet tutorials/modelview/3_changingmodel/mymodel.cpp quoting mymodel_QVariant Something is missing to make the clock tick. We need to tell the view every @@ -328,12 +328,12 @@ this with a timer. In the constructor, we set its interval to 1 second and connect its timeout signal. - (file source: examples/tutorials/modelview/3_changingmodel/mymodel.cpp) + (file source: examples/widgets/tutorials/modelview/3_changingmodel/mymodel.cpp) \snippet tutorials/modelview/3_changingmodel/mymodel.cpp quoting mymodel_a Here is the corresponding slot: - (file source: examples/tutorials/modelview/3_changingmodel/mymodel.cpp) + (file source: examples/widgets/tutorials/modelview/3_changingmodel/mymodel.cpp) \snippet tutorials/modelview/3_changingmodel/mymodel.cpp quoting mymodel_b We ask the view to read the data in the top left cell again by emitting the @@ -349,7 +349,7 @@ The header content, however, is set via the model, so we reimplement the \l{QAbstractItemModel::headerData()}{headerData()} method: - (file source: examples/tutorials/modelview/4_headers/mymodel.cpp) + (file source: examples/widgets/tutorials/modelview/4_headers/mymodel.cpp) \snippet tutorials/modelview/4_headers/mymodel.cpp quoting mymodel_c Note that method \l{QAbstractItemModel::headerData()}{headerData()} also has @@ -368,7 +368,7 @@ enabled. This is done by reimplementing the following virtual methods: \l{QAbstractItemModel::}{setData()} and \l{QAbstractItemModel::}{flags()}. - (file source: examples/tutorials/modelview/5_edit/mymodel.h) + (file source: examples/widgets/tutorials/modelview/5_edit/mymodel.h) \snippet tutorials/modelview/5_edit/mymodel.h Quoting ModelView Tutorial We use \c the two-dimensional array QString \c m_gridData to store our data. @@ -377,7 +377,7 @@ interface. We have also introduced the \c editCompleted() signal, which makes it possible to transfer the modified text to the window title. - (file source: examples/tutorials/modelview/5_edit/mymodel.cpp) + (file source: examples/widgets/tutorials/modelview/5_edit/mymodel.cpp) \snippet tutorials/modelview/5_edit/mymodel.cpp quoting mymodel_e \l{QAbstractItemModel::setData()}{setData()} will be called each time the @@ -388,7 +388,7 @@ checkbox to be selected, calls would also be made with the role set to \l Qt::CheckStateRole. - (file source: examples/tutorials/modelview/5_edit/mymodel.cpp) + (file source: examples/widgets/tutorials/modelview/5_edit/mymodel.cpp) \snippet tutorials/modelview/5_edit/mymodel.cpp quoting mymodel_f Various properties of a cell can be adjusted with @@ -432,7 +432,7 @@ \image tree_2_with_algorithm.png - (file source: examples/tutorials/modelview/6_treeview/mainwindow.cpp) + (file source: examples/widgets/tutorials/modelview/6_treeview/mainwindow.cpp) \snippet tutorials/modelview/6_treeview/mainwindow.cpp Quoting ModelView Tutorial We simply instantiate a QStandardItemModel and add a couple of @@ -450,7 +450,7 @@ So let's create a couple of items: - (file source: examples/tutorials/modelview/7_selections/mainwindow.cpp) + (file source: examples/widgets/tutorials/modelview/7_selections/mainwindow.cpp) \snippet tutorials/modelview/7_selections/mainwindow.cpp quoting modelview_a Views manage selections within a separate selection model, which can be @@ -458,7 +458,7 @@ retrieve the selection Model in order to connect a slot to its \l{QAbstractItemView::}{selectionChanged()} signal. - (file source: examples/tutorials/modelview/7_selections/mainwindow.cpp) + (file source: examples/widgets/tutorials/modelview/7_selections/mainwindow.cpp) \snippet tutorials/modelview/7_selections/mainwindow.cpp quoting modelview_b We get the model index that corresponds to the selection by calling From c6e32b740ca7893e74c97b38073dbc7cf0ae0a97 Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Wed, 31 Jul 2013 14:20:37 +0200 Subject: [PATCH 061/131] OSX: do not force a plain window to be on the same level as its parent 2af0a778f464980594c36098e4a8ba4448edfd29 the fix for QTBUG-27410 caused this Designer bug. Doing the automatic level escalation only for "special" windows and avoiding it for plain Qt::Window type windows is one way of fixing the Designer problem. Task-number: QTBUG-31779 Change-Id: I1da5454f31111f36480fac3b53be6d5f0ce40047 Reviewed-by: Friedemann Kleint Reviewed-by: Gabriel de Dietrich --- src/plugins/platforms/cocoa/qcocoawindow.mm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index bba5b6fdf1..1126315126 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -423,11 +423,13 @@ NSInteger QCocoaWindow::windowLevel(Qt::WindowFlags flags) if (type == Qt::ToolTip) windowLevel = NSScreenSaverWindowLevel; - // A window should be in at least the same level as its parent. - const QWindow * const transientParent = window()->transientParent(); - const QCocoaWindow * const transientParentWindow = transientParent ? static_cast(transientParent->handle()) : 0; - if (transientParentWindow) - windowLevel = qMax([transientParentWindow->m_nsWindow level], windowLevel); + // Any "special" window should be in at least the same level as its parent. + if (type != Qt::Window) { + const QWindow * const transientParent = window()->transientParent(); + const QCocoaWindow * const transientParentWindow = transientParent ? static_cast(transientParent->handle()) : 0; + if (transientParentWindow) + windowLevel = qMax([transientParentWindow->m_nsWindow level], windowLevel); + } return windowLevel; } From bb05c4129ebd19263f7515b925db1e2e2c75a5a0 Mon Sep 17 00:00:00 2001 From: Samuli Piippo Date: Wed, 31 Jul 2013 12:33:35 +0300 Subject: [PATCH 062/131] Fix CapsLock handling in EvdevKeyboard plugin CapsLock was incorrectly handled in EvdevKeyboard, which led non-letter keys to be masked with Qt::ShiftModifier. The default builtin keymap is modified to have IsLetter flags for correct keys. Task-number: QTBUG-32560 Change-Id: I561bbad7bcffe1f4c4bbed7bf72106b689e57fe0 Reviewed-by: Andy Nichols --- .../qevdevkeyboard_defaultmap_p.h | 832 +++++++++--------- .../evdevkeyboard/qevdevkeyboardhandler.cpp | 13 +- 2 files changed, 425 insertions(+), 420 deletions(-) diff --git a/src/platformsupport/input/evdevkeyboard/qevdevkeyboard_defaultmap_p.h b/src/platformsupport/input/evdevkeyboard/qevdevkeyboard_defaultmap_p.h index 2aa8248c32..22d1622516 100644 --- a/src/platformsupport/input/evdevkeyboard/qevdevkeyboard_defaultmap_p.h +++ b/src/platformsupport/input/evdevkeyboard/qevdevkeyboard_defaultmap_p.h @@ -89,166 +89,166 @@ const QEvdevKeyboardMap::Mapping QEvdevKeyboardHandler::s_keymap_default[] = { { 14, 0xffff, 0x01000003, 0x00, 0x00, 0x0000 }, { 14, 0xffff, 0x01000000, 0x0c, 0x08, 0x0300 }, { 15, 0xffff, 0x01000001, 0x00, 0x00, 0x0000 }, - { 16, 0x0071, 0x00000051, 0x00, 0x00, 0x0000 }, - { 16, 0x0051, 0x00000051, 0x01, 0x00, 0x0000 }, - { 16, 0x0071, 0x00000051, 0x02, 0x00, 0x0000 }, - { 16, 0x0051, 0x00000051, 0x03, 0x00, 0x0000 }, - { 16, 0x0071, 0x04000051, 0x04, 0x00, 0x0000 }, - { 16, 0x0071, 0x04000051, 0x05, 0x00, 0x0000 }, - { 16, 0x0071, 0x04000051, 0x06, 0x00, 0x0000 }, - { 16, 0x0071, 0x04000051, 0x07, 0x00, 0x0000 }, - { 16, 0x0071, 0x08000051, 0x08, 0x00, 0x0000 }, - { 16, 0x0071, 0x08000051, 0x09, 0x00, 0x0000 }, - { 16, 0x0071, 0x08000051, 0x0a, 0x00, 0x0000 }, - { 16, 0x0071, 0x08000051, 0x0b, 0x00, 0x0000 }, - { 16, 0x0071, 0x0c000051, 0x0c, 0x00, 0x0000 }, - { 16, 0x0071, 0x0c000051, 0x0d, 0x00, 0x0000 }, - { 16, 0x0071, 0x0c000051, 0x0e, 0x00, 0x0000 }, - { 16, 0x0071, 0x0c000051, 0x0f, 0x00, 0x0000 }, - { 17, 0x0077, 0x00000057, 0x00, 0x00, 0x0000 }, - { 17, 0x0057, 0x00000057, 0x01, 0x00, 0x0000 }, - { 17, 0x0077, 0x00000057, 0x02, 0x00, 0x0000 }, - { 17, 0x0057, 0x00000057, 0x03, 0x00, 0x0000 }, - { 17, 0x0077, 0x04000057, 0x04, 0x00, 0x0000 }, - { 17, 0x0077, 0x04000057, 0x05, 0x00, 0x0000 }, - { 17, 0x0077, 0x04000057, 0x06, 0x00, 0x0000 }, - { 17, 0x0077, 0x04000057, 0x07, 0x00, 0x0000 }, - { 17, 0x0077, 0x08000057, 0x08, 0x00, 0x0000 }, - { 17, 0x0077, 0x08000057, 0x09, 0x00, 0x0000 }, - { 17, 0x0077, 0x08000057, 0x0a, 0x00, 0x0000 }, - { 17, 0x0077, 0x08000057, 0x0b, 0x00, 0x0000 }, - { 17, 0x0077, 0x0c000057, 0x0c, 0x00, 0x0000 }, - { 17, 0x0077, 0x0c000057, 0x0d, 0x00, 0x0000 }, - { 17, 0x0077, 0x0c000057, 0x0e, 0x00, 0x0000 }, - { 17, 0x0077, 0x0c000057, 0x0f, 0x00, 0x0000 }, - { 18, 0x0065, 0x00000045, 0x00, 0x00, 0x0000 }, - { 18, 0x0045, 0x00000045, 0x01, 0x00, 0x0000 }, - { 18, 0x0065, 0x00000045, 0x02, 0x00, 0x0000 }, - { 18, 0x0045, 0x00000045, 0x03, 0x00, 0x0000 }, - { 18, 0x0065, 0x04000045, 0x04, 0x00, 0x0000 }, - { 18, 0x0065, 0x04000045, 0x05, 0x00, 0x0000 }, - { 18, 0x0065, 0x04000045, 0x06, 0x00, 0x0000 }, - { 18, 0x0065, 0x04000045, 0x07, 0x00, 0x0000 }, - { 18, 0x0065, 0x08000045, 0x08, 0x00, 0x0000 }, - { 18, 0x0065, 0x08000045, 0x09, 0x00, 0x0000 }, - { 18, 0x0065, 0x08000045, 0x0a, 0x00, 0x0000 }, - { 18, 0x0065, 0x08000045, 0x0b, 0x00, 0x0000 }, - { 18, 0x0065, 0x0c000045, 0x0c, 0x00, 0x0000 }, - { 18, 0x0065, 0x0c000045, 0x0d, 0x00, 0x0000 }, - { 18, 0x0065, 0x0c000045, 0x0e, 0x00, 0x0000 }, - { 18, 0x0065, 0x0c000045, 0x0f, 0x00, 0x0000 }, - { 19, 0x0072, 0x00000052, 0x00, 0x00, 0x0000 }, - { 19, 0x0052, 0x00000052, 0x01, 0x00, 0x0000 }, - { 19, 0x0072, 0x00000052, 0x02, 0x00, 0x0000 }, - { 19, 0x0052, 0x00000052, 0x03, 0x00, 0x0000 }, - { 19, 0x0072, 0x04000052, 0x04, 0x00, 0x0000 }, - { 19, 0x0072, 0x04000052, 0x05, 0x00, 0x0000 }, - { 19, 0x0072, 0x04000052, 0x06, 0x00, 0x0000 }, - { 19, 0x0072, 0x04000052, 0x07, 0x00, 0x0000 }, - { 19, 0x0072, 0x08000052, 0x08, 0x00, 0x0000 }, - { 19, 0x0072, 0x08000052, 0x09, 0x00, 0x0000 }, - { 19, 0x0072, 0x08000052, 0x0a, 0x00, 0x0000 }, - { 19, 0x0072, 0x08000052, 0x0b, 0x00, 0x0000 }, - { 19, 0x0072, 0x0c000052, 0x0c, 0x00, 0x0000 }, - { 19, 0x0072, 0x0c000052, 0x0d, 0x00, 0x0000 }, - { 19, 0x0072, 0x0c000052, 0x0e, 0x00, 0x0000 }, - { 19, 0x0072, 0x0c000052, 0x0f, 0x00, 0x0000 }, - { 20, 0x0074, 0x00000054, 0x00, 0x00, 0x0000 }, - { 20, 0x0054, 0x00000054, 0x01, 0x00, 0x0000 }, - { 20, 0x0074, 0x00000054, 0x02, 0x00, 0x0000 }, - { 20, 0x0054, 0x00000054, 0x03, 0x00, 0x0000 }, - { 20, 0x0074, 0x04000054, 0x04, 0x00, 0x0000 }, - { 20, 0x0074, 0x04000054, 0x05, 0x00, 0x0000 }, - { 20, 0x0074, 0x04000054, 0x06, 0x00, 0x0000 }, - { 20, 0x0074, 0x04000054, 0x07, 0x00, 0x0000 }, - { 20, 0x0074, 0x08000054, 0x08, 0x00, 0x0000 }, - { 20, 0x0074, 0x08000054, 0x09, 0x00, 0x0000 }, - { 20, 0x0074, 0x08000054, 0x0a, 0x00, 0x0000 }, - { 20, 0x0074, 0x08000054, 0x0b, 0x00, 0x0000 }, - { 20, 0x0074, 0x0c000054, 0x0c, 0x00, 0x0000 }, - { 20, 0x0074, 0x0c000054, 0x0d, 0x00, 0x0000 }, - { 20, 0x0074, 0x0c000054, 0x0e, 0x00, 0x0000 }, - { 20, 0x0074, 0x0c000054, 0x0f, 0x00, 0x0000 }, - { 21, 0x0079, 0x00000059, 0x00, 0x00, 0x0000 }, - { 21, 0x0059, 0x00000059, 0x01, 0x00, 0x0000 }, - { 21, 0x0079, 0x00000059, 0x02, 0x00, 0x0000 }, - { 21, 0x0059, 0x00000059, 0x03, 0x00, 0x0000 }, - { 21, 0x0079, 0x04000059, 0x04, 0x00, 0x0000 }, - { 21, 0x0079, 0x04000059, 0x05, 0x00, 0x0000 }, - { 21, 0x0079, 0x04000059, 0x06, 0x00, 0x0000 }, - { 21, 0x0079, 0x04000059, 0x07, 0x00, 0x0000 }, - { 21, 0x0079, 0x08000059, 0x08, 0x00, 0x0000 }, - { 21, 0x0079, 0x08000059, 0x09, 0x00, 0x0000 }, - { 21, 0x0079, 0x08000059, 0x0a, 0x00, 0x0000 }, - { 21, 0x0079, 0x08000059, 0x0b, 0x00, 0x0000 }, - { 21, 0x0079, 0x0c000059, 0x0c, 0x00, 0x0000 }, - { 21, 0x0079, 0x0c000059, 0x0d, 0x00, 0x0000 }, - { 21, 0x0079, 0x0c000059, 0x0e, 0x00, 0x0000 }, - { 21, 0x0079, 0x0c000059, 0x0f, 0x00, 0x0000 }, - { 22, 0x0075, 0x00000055, 0x00, 0x00, 0x0000 }, - { 22, 0x0055, 0x00000055, 0x01, 0x00, 0x0000 }, - { 22, 0x0075, 0x00000055, 0x02, 0x00, 0x0000 }, - { 22, 0x0055, 0x00000055, 0x03, 0x00, 0x0000 }, - { 22, 0x0075, 0x04000055, 0x04, 0x00, 0x0000 }, - { 22, 0x0075, 0x04000055, 0x05, 0x00, 0x0000 }, - { 22, 0x0075, 0x04000055, 0x06, 0x00, 0x0000 }, - { 22, 0x0075, 0x04000055, 0x07, 0x00, 0x0000 }, - { 22, 0x0075, 0x08000055, 0x08, 0x00, 0x0000 }, - { 22, 0x0075, 0x08000055, 0x09, 0x00, 0x0000 }, - { 22, 0x0075, 0x08000055, 0x0a, 0x00, 0x0000 }, - { 22, 0x0075, 0x08000055, 0x0b, 0x00, 0x0000 }, - { 22, 0x0075, 0x0c000055, 0x0c, 0x00, 0x0000 }, - { 22, 0x0075, 0x0c000055, 0x0d, 0x00, 0x0000 }, - { 22, 0x0075, 0x0c000055, 0x0e, 0x00, 0x0000 }, - { 22, 0x0075, 0x0c000055, 0x0f, 0x00, 0x0000 }, - { 23, 0x0069, 0x00000049, 0x00, 0x00, 0x0000 }, - { 23, 0x0049, 0x00000049, 0x01, 0x00, 0x0000 }, - { 23, 0x0069, 0x00000049, 0x02, 0x00, 0x0000 }, - { 23, 0x0049, 0x00000049, 0x03, 0x00, 0x0000 }, - { 23, 0x0069, 0x04000049, 0x04, 0x00, 0x0000 }, - { 23, 0x0069, 0x04000049, 0x05, 0x00, 0x0000 }, - { 23, 0x0069, 0x04000049, 0x06, 0x00, 0x0000 }, - { 23, 0x0069, 0x04000049, 0x07, 0x00, 0x0000 }, - { 23, 0x0069, 0x08000049, 0x08, 0x00, 0x0000 }, - { 23, 0x0069, 0x08000049, 0x09, 0x00, 0x0000 }, - { 23, 0x0069, 0x08000049, 0x0a, 0x00, 0x0000 }, - { 23, 0x0069, 0x08000049, 0x0b, 0x00, 0x0000 }, - { 23, 0x0069, 0x0c000049, 0x0c, 0x00, 0x0000 }, - { 23, 0x0069, 0x0c000049, 0x0d, 0x00, 0x0000 }, - { 23, 0x0069, 0x0c000049, 0x0e, 0x00, 0x0000 }, - { 23, 0x0069, 0x0c000049, 0x0f, 0x00, 0x0000 }, - { 24, 0x006f, 0x0000004f, 0x00, 0x00, 0x0000 }, - { 24, 0x004f, 0x0000004f, 0x01, 0x00, 0x0000 }, - { 24, 0x006f, 0x0000004f, 0x02, 0x00, 0x0000 }, - { 24, 0x004f, 0x0000004f, 0x03, 0x00, 0x0000 }, - { 24, 0x006f, 0x0400004f, 0x04, 0x00, 0x0000 }, - { 24, 0x006f, 0x0400004f, 0x05, 0x00, 0x0000 }, - { 24, 0x006f, 0x0400004f, 0x06, 0x00, 0x0000 }, - { 24, 0x006f, 0x0400004f, 0x07, 0x00, 0x0000 }, - { 24, 0x006f, 0x0800004f, 0x08, 0x00, 0x0000 }, - { 24, 0x006f, 0x0800004f, 0x09, 0x00, 0x0000 }, - { 24, 0x006f, 0x0800004f, 0x0a, 0x00, 0x0000 }, - { 24, 0x006f, 0x0800004f, 0x0b, 0x00, 0x0000 }, - { 24, 0x006f, 0x0c00004f, 0x0c, 0x00, 0x0000 }, - { 24, 0x006f, 0x0c00004f, 0x0d, 0x00, 0x0000 }, - { 24, 0x006f, 0x0c00004f, 0x0e, 0x00, 0x0000 }, - { 24, 0x006f, 0x0c00004f, 0x0f, 0x00, 0x0000 }, - { 25, 0x0070, 0x00000050, 0x00, 0x00, 0x0000 }, - { 25, 0x0050, 0x00000050, 0x01, 0x00, 0x0000 }, - { 25, 0x0070, 0x00000050, 0x02, 0x00, 0x0000 }, - { 25, 0x0050, 0x00000050, 0x03, 0x00, 0x0000 }, - { 25, 0x0070, 0x04000050, 0x04, 0x00, 0x0000 }, - { 25, 0x0070, 0x04000050, 0x05, 0x00, 0x0000 }, - { 25, 0x0070, 0x04000050, 0x06, 0x00, 0x0000 }, - { 25, 0x0070, 0x04000050, 0x07, 0x00, 0x0000 }, - { 25, 0x0070, 0x08000050, 0x08, 0x00, 0x0000 }, - { 25, 0x0070, 0x08000050, 0x09, 0x00, 0x0000 }, - { 25, 0x0070, 0x08000050, 0x0a, 0x00, 0x0000 }, - { 25, 0x0070, 0x08000050, 0x0b, 0x00, 0x0000 }, - { 25, 0x0070, 0x0c000050, 0x0c, 0x00, 0x0000 }, - { 25, 0x0070, 0x0c000050, 0x0d, 0x00, 0x0000 }, - { 25, 0x0070, 0x0c000050, 0x0e, 0x00, 0x0000 }, - { 25, 0x0070, 0x0c000050, 0x0f, 0x00, 0x0000 }, + { 16, 0x0071, 0x00000051, 0x00, 0x02, 0x0000 }, + { 16, 0x0051, 0x00000051, 0x01, 0x02, 0x0000 }, + { 16, 0x0071, 0x00000051, 0x02, 0x02, 0x0000 }, + { 16, 0x0051, 0x00000051, 0x03, 0x02, 0x0000 }, + { 16, 0x0071, 0x04000051, 0x04, 0x02, 0x0000 }, + { 16, 0x0071, 0x04000051, 0x05, 0x02, 0x0000 }, + { 16, 0x0071, 0x04000051, 0x06, 0x02, 0x0000 }, + { 16, 0x0071, 0x04000051, 0x07, 0x02, 0x0000 }, + { 16, 0x0071, 0x08000051, 0x08, 0x02, 0x0000 }, + { 16, 0x0071, 0x08000051, 0x09, 0x02, 0x0000 }, + { 16, 0x0071, 0x08000051, 0x0a, 0x02, 0x0000 }, + { 16, 0x0071, 0x08000051, 0x0b, 0x02, 0x0000 }, + { 16, 0x0071, 0x0c000051, 0x0c, 0x02, 0x0000 }, + { 16, 0x0071, 0x0c000051, 0x0d, 0x02, 0x0000 }, + { 16, 0x0071, 0x0c000051, 0x0e, 0x02, 0x0000 }, + { 16, 0x0071, 0x0c000051, 0x0f, 0x02, 0x0000 }, + { 17, 0x0077, 0x00000057, 0x00, 0x02, 0x0000 }, + { 17, 0x0057, 0x00000057, 0x01, 0x02, 0x0000 }, + { 17, 0x0077, 0x00000057, 0x02, 0x02, 0x0000 }, + { 17, 0x0057, 0x00000057, 0x03, 0x02, 0x0000 }, + { 17, 0x0077, 0x04000057, 0x04, 0x02, 0x0000 }, + { 17, 0x0077, 0x04000057, 0x05, 0x02, 0x0000 }, + { 17, 0x0077, 0x04000057, 0x06, 0x02, 0x0000 }, + { 17, 0x0077, 0x04000057, 0x07, 0x02, 0x0000 }, + { 17, 0x0077, 0x08000057, 0x08, 0x02, 0x0000 }, + { 17, 0x0077, 0x08000057, 0x09, 0x02, 0x0000 }, + { 17, 0x0077, 0x08000057, 0x0a, 0x02, 0x0000 }, + { 17, 0x0077, 0x08000057, 0x0b, 0x02, 0x0000 }, + { 17, 0x0077, 0x0c000057, 0x0c, 0x02, 0x0000 }, + { 17, 0x0077, 0x0c000057, 0x0d, 0x02, 0x0000 }, + { 17, 0x0077, 0x0c000057, 0x0e, 0x02, 0x0000 }, + { 17, 0x0077, 0x0c000057, 0x0f, 0x02, 0x0000 }, + { 18, 0x0065, 0x00000045, 0x00, 0x02, 0x0000 }, + { 18, 0x0045, 0x00000045, 0x01, 0x02, 0x0000 }, + { 18, 0x0065, 0x00000045, 0x02, 0x02, 0x0000 }, + { 18, 0x0045, 0x00000045, 0x03, 0x02, 0x0000 }, + { 18, 0x0065, 0x04000045, 0x04, 0x02, 0x0000 }, + { 18, 0x0065, 0x04000045, 0x05, 0x02, 0x0000 }, + { 18, 0x0065, 0x04000045, 0x06, 0x02, 0x0000 }, + { 18, 0x0065, 0x04000045, 0x07, 0x02, 0x0000 }, + { 18, 0x0065, 0x08000045, 0x08, 0x02, 0x0000 }, + { 18, 0x0065, 0x08000045, 0x09, 0x02, 0x0000 }, + { 18, 0x0065, 0x08000045, 0x0a, 0x02, 0x0000 }, + { 18, 0x0065, 0x08000045, 0x0b, 0x02, 0x0000 }, + { 18, 0x0065, 0x0c000045, 0x0c, 0x02, 0x0000 }, + { 18, 0x0065, 0x0c000045, 0x0d, 0x02, 0x0000 }, + { 18, 0x0065, 0x0c000045, 0x0e, 0x02, 0x0000 }, + { 18, 0x0065, 0x0c000045, 0x0f, 0x02, 0x0000 }, + { 19, 0x0072, 0x00000052, 0x00, 0x02, 0x0000 }, + { 19, 0x0052, 0x00000052, 0x01, 0x02, 0x0000 }, + { 19, 0x0072, 0x00000052, 0x02, 0x02, 0x0000 }, + { 19, 0x0052, 0x00000052, 0x03, 0x02, 0x0000 }, + { 19, 0x0072, 0x04000052, 0x04, 0x02, 0x0000 }, + { 19, 0x0072, 0x04000052, 0x05, 0x02, 0x0000 }, + { 19, 0x0072, 0x04000052, 0x06, 0x02, 0x0000 }, + { 19, 0x0072, 0x04000052, 0x07, 0x02, 0x0000 }, + { 19, 0x0072, 0x08000052, 0x08, 0x02, 0x0000 }, + { 19, 0x0072, 0x08000052, 0x09, 0x02, 0x0000 }, + { 19, 0x0072, 0x08000052, 0x0a, 0x02, 0x0000 }, + { 19, 0x0072, 0x08000052, 0x0b, 0x02, 0x0000 }, + { 19, 0x0072, 0x0c000052, 0x0c, 0x02, 0x0000 }, + { 19, 0x0072, 0x0c000052, 0x0d, 0x02, 0x0000 }, + { 19, 0x0072, 0x0c000052, 0x0e, 0x02, 0x0000 }, + { 19, 0x0072, 0x0c000052, 0x0f, 0x02, 0x0000 }, + { 20, 0x0074, 0x00000054, 0x00, 0x02, 0x0000 }, + { 20, 0x0054, 0x00000054, 0x01, 0x02, 0x0000 }, + { 20, 0x0074, 0x00000054, 0x02, 0x02, 0x0000 }, + { 20, 0x0054, 0x00000054, 0x03, 0x02, 0x0000 }, + { 20, 0x0074, 0x04000054, 0x04, 0x02, 0x0000 }, + { 20, 0x0074, 0x04000054, 0x05, 0x02, 0x0000 }, + { 20, 0x0074, 0x04000054, 0x06, 0x02, 0x0000 }, + { 20, 0x0074, 0x04000054, 0x07, 0x02, 0x0000 }, + { 20, 0x0074, 0x08000054, 0x08, 0x02, 0x0000 }, + { 20, 0x0074, 0x08000054, 0x09, 0x02, 0x0000 }, + { 20, 0x0074, 0x08000054, 0x0a, 0x02, 0x0000 }, + { 20, 0x0074, 0x08000054, 0x0b, 0x02, 0x0000 }, + { 20, 0x0074, 0x0c000054, 0x0c, 0x02, 0x0000 }, + { 20, 0x0074, 0x0c000054, 0x0d, 0x02, 0x0000 }, + { 20, 0x0074, 0x0c000054, 0x0e, 0x02, 0x0000 }, + { 20, 0x0074, 0x0c000054, 0x0f, 0x02, 0x0000 }, + { 21, 0x0079, 0x00000059, 0x00, 0x02, 0x0000 }, + { 21, 0x0059, 0x00000059, 0x01, 0x02, 0x0000 }, + { 21, 0x0079, 0x00000059, 0x02, 0x02, 0x0000 }, + { 21, 0x0059, 0x00000059, 0x03, 0x02, 0x0000 }, + { 21, 0x0079, 0x04000059, 0x04, 0x02, 0x0000 }, + { 21, 0x0079, 0x04000059, 0x05, 0x02, 0x0000 }, + { 21, 0x0079, 0x04000059, 0x06, 0x02, 0x0000 }, + { 21, 0x0079, 0x04000059, 0x07, 0x02, 0x0000 }, + { 21, 0x0079, 0x08000059, 0x08, 0x02, 0x0000 }, + { 21, 0x0079, 0x08000059, 0x09, 0x02, 0x0000 }, + { 21, 0x0079, 0x08000059, 0x0a, 0x02, 0x0000 }, + { 21, 0x0079, 0x08000059, 0x0b, 0x02, 0x0000 }, + { 21, 0x0079, 0x0c000059, 0x0c, 0x02, 0x0000 }, + { 21, 0x0079, 0x0c000059, 0x0d, 0x02, 0x0000 }, + { 21, 0x0079, 0x0c000059, 0x0e, 0x02, 0x0000 }, + { 21, 0x0079, 0x0c000059, 0x0f, 0x02, 0x0000 }, + { 22, 0x0075, 0x00000055, 0x00, 0x02, 0x0000 }, + { 22, 0x0055, 0x00000055, 0x01, 0x02, 0x0000 }, + { 22, 0x0075, 0x00000055, 0x02, 0x02, 0x0000 }, + { 22, 0x0055, 0x00000055, 0x03, 0x02, 0x0000 }, + { 22, 0x0075, 0x04000055, 0x04, 0x02, 0x0000 }, + { 22, 0x0075, 0x04000055, 0x05, 0x02, 0x0000 }, + { 22, 0x0075, 0x04000055, 0x06, 0x02, 0x0000 }, + { 22, 0x0075, 0x04000055, 0x07, 0x02, 0x0000 }, + { 22, 0x0075, 0x08000055, 0x08, 0x02, 0x0000 }, + { 22, 0x0075, 0x08000055, 0x09, 0x02, 0x0000 }, + { 22, 0x0075, 0x08000055, 0x0a, 0x02, 0x0000 }, + { 22, 0x0075, 0x08000055, 0x0b, 0x02, 0x0000 }, + { 22, 0x0075, 0x0c000055, 0x0c, 0x02, 0x0000 }, + { 22, 0x0075, 0x0c000055, 0x0d, 0x02, 0x0000 }, + { 22, 0x0075, 0x0c000055, 0x0e, 0x02, 0x0000 }, + { 22, 0x0075, 0x0c000055, 0x0f, 0x02, 0x0000 }, + { 23, 0x0069, 0x00000049, 0x00, 0x02, 0x0000 }, + { 23, 0x0049, 0x00000049, 0x01, 0x02, 0x0000 }, + { 23, 0x0069, 0x00000049, 0x02, 0x02, 0x0000 }, + { 23, 0x0049, 0x00000049, 0x03, 0x02, 0x0000 }, + { 23, 0x0069, 0x04000049, 0x04, 0x02, 0x0000 }, + { 23, 0x0069, 0x04000049, 0x05, 0x02, 0x0000 }, + { 23, 0x0069, 0x04000049, 0x06, 0x02, 0x0000 }, + { 23, 0x0069, 0x04000049, 0x07, 0x02, 0x0000 }, + { 23, 0x0069, 0x08000049, 0x08, 0x02, 0x0000 }, + { 23, 0x0069, 0x08000049, 0x09, 0x02, 0x0000 }, + { 23, 0x0069, 0x08000049, 0x0a, 0x02, 0x0000 }, + { 23, 0x0069, 0x08000049, 0x0b, 0x02, 0x0000 }, + { 23, 0x0069, 0x0c000049, 0x0c, 0x02, 0x0000 }, + { 23, 0x0069, 0x0c000049, 0x0d, 0x02, 0x0000 }, + { 23, 0x0069, 0x0c000049, 0x0e, 0x02, 0x0000 }, + { 23, 0x0069, 0x0c000049, 0x0f, 0x02, 0x0000 }, + { 24, 0x006f, 0x0000004f, 0x00, 0x02, 0x0000 }, + { 24, 0x004f, 0x0000004f, 0x01, 0x02, 0x0000 }, + { 24, 0x006f, 0x0000004f, 0x02, 0x02, 0x0000 }, + { 24, 0x004f, 0x0000004f, 0x03, 0x02, 0x0000 }, + { 24, 0x006f, 0x0400004f, 0x04, 0x02, 0x0000 }, + { 24, 0x006f, 0x0400004f, 0x05, 0x02, 0x0000 }, + { 24, 0x006f, 0x0400004f, 0x06, 0x02, 0x0000 }, + { 24, 0x006f, 0x0400004f, 0x07, 0x02, 0x0000 }, + { 24, 0x006f, 0x0800004f, 0x08, 0x02, 0x0000 }, + { 24, 0x006f, 0x0800004f, 0x09, 0x02, 0x0000 }, + { 24, 0x006f, 0x0800004f, 0x0a, 0x02, 0x0000 }, + { 24, 0x006f, 0x0800004f, 0x0b, 0x02, 0x0000 }, + { 24, 0x006f, 0x0c00004f, 0x0c, 0x02, 0x0000 }, + { 24, 0x006f, 0x0c00004f, 0x0d, 0x02, 0x0000 }, + { 24, 0x006f, 0x0c00004f, 0x0e, 0x02, 0x0000 }, + { 24, 0x006f, 0x0c00004f, 0x0f, 0x02, 0x0000 }, + { 25, 0x0070, 0x00000050, 0x00, 0x02, 0x0000 }, + { 25, 0x0050, 0x00000050, 0x01, 0x02, 0x0000 }, + { 25, 0x0070, 0x00000050, 0x02, 0x02, 0x0000 }, + { 25, 0x0050, 0x00000050, 0x03, 0x02, 0x0000 }, + { 25, 0x0070, 0x04000050, 0x04, 0x02, 0x0000 }, + { 25, 0x0070, 0x04000050, 0x05, 0x02, 0x0000 }, + { 25, 0x0070, 0x04000050, 0x06, 0x02, 0x0000 }, + { 25, 0x0070, 0x04000050, 0x07, 0x02, 0x0000 }, + { 25, 0x0070, 0x08000050, 0x08, 0x02, 0x0000 }, + { 25, 0x0070, 0x08000050, 0x09, 0x02, 0x0000 }, + { 25, 0x0070, 0x08000050, 0x0a, 0x02, 0x0000 }, + { 25, 0x0070, 0x08000050, 0x0b, 0x02, 0x0000 }, + { 25, 0x0070, 0x0c000050, 0x0c, 0x02, 0x0000 }, + { 25, 0x0070, 0x0c000050, 0x0d, 0x02, 0x0000 }, + { 25, 0x0070, 0x0c000050, 0x0e, 0x02, 0x0000 }, + { 25, 0x0070, 0x0c000050, 0x0f, 0x02, 0x0000 }, { 26, 0x005b, 0x0000005b, 0x00, 0x00, 0x0000 }, { 26, 0x007b, 0x0000007b, 0x01, 0x00, 0x0000 }, { 26, 0xffff, 0x01000000, 0x04, 0x00, 0x0000 }, @@ -259,150 +259,150 @@ const QEvdevKeyboardMap::Mapping QEvdevKeyboardHandler::s_keymap_default[] = { { 28, 0xffff, 0x01000004, 0x00, 0x00, 0x0000 }, { 28, 0x006d, 0x0c00004d, 0x08, 0x00, 0x0000 }, { 29, 0xffff, 0x01000021, 0x00, 0x04, 0x0004 }, - { 30, 0x0061, 0x00000041, 0x00, 0x00, 0x0000 }, - { 30, 0x0041, 0x00000041, 0x01, 0x00, 0x0000 }, - { 30, 0x0061, 0x00000041, 0x02, 0x00, 0x0000 }, - { 30, 0x0041, 0x00000041, 0x03, 0x00, 0x0000 }, - { 30, 0x0061, 0x04000041, 0x04, 0x00, 0x0000 }, - { 30, 0x0061, 0x04000041, 0x05, 0x00, 0x0000 }, - { 30, 0x0061, 0x04000041, 0x06, 0x00, 0x0000 }, - { 30, 0x0061, 0x04000041, 0x07, 0x00, 0x0000 }, - { 30, 0x0061, 0x08000041, 0x08, 0x00, 0x0000 }, - { 30, 0x0061, 0x08000041, 0x09, 0x00, 0x0000 }, - { 30, 0x0061, 0x08000041, 0x0a, 0x00, 0x0000 }, - { 30, 0x0061, 0x08000041, 0x0b, 0x00, 0x0000 }, - { 30, 0x0061, 0x0c000041, 0x0c, 0x00, 0x0000 }, - { 30, 0x0061, 0x0c000041, 0x0d, 0x00, 0x0000 }, - { 30, 0x0061, 0x0c000041, 0x0e, 0x00, 0x0000 }, - { 30, 0x0061, 0x0c000041, 0x0f, 0x00, 0x0000 }, - { 31, 0x0073, 0x00000053, 0x00, 0x00, 0x0000 }, - { 31, 0x0053, 0x00000053, 0x01, 0x00, 0x0000 }, - { 31, 0x0073, 0x00000053, 0x02, 0x00, 0x0000 }, - { 31, 0x0053, 0x00000053, 0x03, 0x00, 0x0000 }, - { 31, 0x0073, 0x04000053, 0x04, 0x00, 0x0000 }, - { 31, 0x0073, 0x04000053, 0x05, 0x00, 0x0000 }, - { 31, 0x0073, 0x04000053, 0x06, 0x00, 0x0000 }, - { 31, 0x0073, 0x04000053, 0x07, 0x00, 0x0000 }, - { 31, 0x0073, 0x08000053, 0x08, 0x00, 0x0000 }, - { 31, 0x0073, 0x08000053, 0x09, 0x00, 0x0000 }, - { 31, 0x0073, 0x08000053, 0x0a, 0x00, 0x0000 }, - { 31, 0x0073, 0x08000053, 0x0b, 0x00, 0x0000 }, - { 31, 0x0073, 0x0c000053, 0x0c, 0x00, 0x0000 }, - { 31, 0x0073, 0x0c000053, 0x0d, 0x00, 0x0000 }, - { 31, 0x0073, 0x0c000053, 0x0e, 0x00, 0x0000 }, - { 31, 0x0073, 0x0c000053, 0x0f, 0x00, 0x0000 }, - { 32, 0x0064, 0x00000044, 0x00, 0x00, 0x0000 }, - { 32, 0x0044, 0x00000044, 0x01, 0x00, 0x0000 }, - { 32, 0x0064, 0x00000044, 0x02, 0x00, 0x0000 }, - { 32, 0x0044, 0x00000044, 0x03, 0x00, 0x0000 }, - { 32, 0x0064, 0x04000044, 0x04, 0x00, 0x0000 }, - { 32, 0x0064, 0x04000044, 0x05, 0x00, 0x0000 }, - { 32, 0x0064, 0x04000044, 0x06, 0x00, 0x0000 }, - { 32, 0x0064, 0x04000044, 0x07, 0x00, 0x0000 }, - { 32, 0x0064, 0x08000044, 0x08, 0x00, 0x0000 }, - { 32, 0x0064, 0x08000044, 0x09, 0x00, 0x0000 }, - { 32, 0x0064, 0x08000044, 0x0a, 0x00, 0x0000 }, - { 32, 0x0064, 0x08000044, 0x0b, 0x00, 0x0000 }, - { 32, 0x0064, 0x0c000044, 0x0c, 0x00, 0x0000 }, - { 32, 0x0064, 0x0c000044, 0x0d, 0x00, 0x0000 }, - { 32, 0x0064, 0x0c000044, 0x0e, 0x00, 0x0000 }, - { 32, 0x0064, 0x0c000044, 0x0f, 0x00, 0x0000 }, - { 33, 0x0066, 0x00000046, 0x00, 0x00, 0x0000 }, - { 33, 0x0046, 0x00000046, 0x01, 0x00, 0x0000 }, - { 33, 0x0066, 0x00000046, 0x02, 0x00, 0x0000 }, - { 33, 0x0046, 0x00000046, 0x03, 0x00, 0x0000 }, - { 33, 0x0066, 0x04000046, 0x04, 0x00, 0x0000 }, - { 33, 0x0066, 0x04000046, 0x05, 0x00, 0x0000 }, - { 33, 0x0066, 0x04000046, 0x06, 0x00, 0x0000 }, - { 33, 0x0066, 0x04000046, 0x07, 0x00, 0x0000 }, - { 33, 0x0066, 0x08000046, 0x08, 0x00, 0x0000 }, - { 33, 0x0066, 0x08000046, 0x09, 0x00, 0x0000 }, - { 33, 0x0066, 0x08000046, 0x0a, 0x00, 0x0000 }, - { 33, 0x0066, 0x08000046, 0x0b, 0x00, 0x0000 }, - { 33, 0x0066, 0x0c000046, 0x0c, 0x00, 0x0000 }, - { 33, 0x0066, 0x0c000046, 0x0d, 0x00, 0x0000 }, - { 33, 0x0066, 0x0c000046, 0x0e, 0x00, 0x0000 }, - { 33, 0x0066, 0x0c000046, 0x0f, 0x00, 0x0000 }, - { 34, 0x0067, 0x00000047, 0x00, 0x00, 0x0000 }, - { 34, 0x0047, 0x00000047, 0x01, 0x00, 0x0000 }, - { 34, 0x0067, 0x00000047, 0x02, 0x00, 0x0000 }, - { 34, 0x0047, 0x00000047, 0x03, 0x00, 0x0000 }, - { 34, 0x0067, 0x04000047, 0x04, 0x00, 0x0000 }, - { 34, 0x0067, 0x04000047, 0x05, 0x00, 0x0000 }, - { 34, 0x0067, 0x04000047, 0x06, 0x00, 0x0000 }, - { 34, 0x0067, 0x04000047, 0x07, 0x00, 0x0000 }, - { 34, 0x0067, 0x08000047, 0x08, 0x00, 0x0000 }, - { 34, 0x0067, 0x08000047, 0x09, 0x00, 0x0000 }, - { 34, 0x0067, 0x08000047, 0x0a, 0x00, 0x0000 }, - { 34, 0x0067, 0x08000047, 0x0b, 0x00, 0x0000 }, - { 34, 0x0067, 0x0c000047, 0x0c, 0x00, 0x0000 }, - { 34, 0x0067, 0x0c000047, 0x0d, 0x00, 0x0000 }, - { 34, 0x0067, 0x0c000047, 0x0e, 0x00, 0x0000 }, - { 34, 0x0067, 0x0c000047, 0x0f, 0x00, 0x0000 }, - { 35, 0x0068, 0x00000048, 0x00, 0x00, 0x0000 }, - { 35, 0x0048, 0x00000048, 0x01, 0x00, 0x0000 }, - { 35, 0x0068, 0x00000048, 0x02, 0x00, 0x0000 }, - { 35, 0x0048, 0x00000048, 0x03, 0x00, 0x0000 }, - { 35, 0x0068, 0x04000048, 0x04, 0x00, 0x0000 }, - { 35, 0x0068, 0x04000048, 0x05, 0x00, 0x0000 }, - { 35, 0x0068, 0x04000048, 0x06, 0x00, 0x0000 }, - { 35, 0x0068, 0x04000048, 0x07, 0x00, 0x0000 }, - { 35, 0x0068, 0x08000048, 0x08, 0x00, 0x0000 }, - { 35, 0x0068, 0x08000048, 0x09, 0x00, 0x0000 }, - { 35, 0x0068, 0x08000048, 0x0a, 0x00, 0x0000 }, - { 35, 0x0068, 0x08000048, 0x0b, 0x00, 0x0000 }, - { 35, 0x0068, 0x0c000048, 0x0c, 0x00, 0x0000 }, - { 35, 0x0068, 0x0c000048, 0x0d, 0x00, 0x0000 }, - { 35, 0x0068, 0x0c000048, 0x0e, 0x00, 0x0000 }, - { 35, 0x0068, 0x0c000048, 0x0f, 0x00, 0x0000 }, - { 36, 0x006a, 0x0000004a, 0x00, 0x00, 0x0000 }, - { 36, 0x004a, 0x0000004a, 0x01, 0x00, 0x0000 }, - { 36, 0x006a, 0x0000004a, 0x02, 0x00, 0x0000 }, - { 36, 0x004a, 0x0000004a, 0x03, 0x00, 0x0000 }, - { 36, 0x006a, 0x0400004a, 0x04, 0x00, 0x0000 }, - { 36, 0x006a, 0x0400004a, 0x05, 0x00, 0x0000 }, - { 36, 0x006a, 0x0400004a, 0x06, 0x00, 0x0000 }, - { 36, 0x006a, 0x0400004a, 0x07, 0x00, 0x0000 }, - { 36, 0x006a, 0x0800004a, 0x08, 0x00, 0x0000 }, - { 36, 0x006a, 0x0800004a, 0x09, 0x00, 0x0000 }, - { 36, 0x006a, 0x0800004a, 0x0a, 0x00, 0x0000 }, - { 36, 0x006a, 0x0800004a, 0x0b, 0x00, 0x0000 }, - { 36, 0x006a, 0x0c00004a, 0x0c, 0x00, 0x0000 }, - { 36, 0x006a, 0x0c00004a, 0x0d, 0x00, 0x0000 }, - { 36, 0x006a, 0x0c00004a, 0x0e, 0x00, 0x0000 }, - { 36, 0x006a, 0x0c00004a, 0x0f, 0x00, 0x0000 }, - { 37, 0x006b, 0x0000004b, 0x00, 0x00, 0x0000 }, - { 37, 0x004b, 0x0000004b, 0x01, 0x00, 0x0000 }, - { 37, 0x006b, 0x0000004b, 0x02, 0x00, 0x0000 }, - { 37, 0x004b, 0x0000004b, 0x03, 0x00, 0x0000 }, - { 37, 0x006b, 0x0400004b, 0x04, 0x00, 0x0000 }, - { 37, 0x006b, 0x0400004b, 0x05, 0x00, 0x0000 }, - { 37, 0x006b, 0x0400004b, 0x06, 0x00, 0x0000 }, - { 37, 0x006b, 0x0400004b, 0x07, 0x00, 0x0000 }, - { 37, 0x006b, 0x0800004b, 0x08, 0x00, 0x0000 }, - { 37, 0x006b, 0x0800004b, 0x09, 0x00, 0x0000 }, - { 37, 0x006b, 0x0800004b, 0x0a, 0x00, 0x0000 }, - { 37, 0x006b, 0x0800004b, 0x0b, 0x00, 0x0000 }, - { 37, 0x006b, 0x0c00004b, 0x0c, 0x00, 0x0000 }, - { 37, 0x006b, 0x0c00004b, 0x0d, 0x00, 0x0000 }, - { 37, 0x006b, 0x0c00004b, 0x0e, 0x00, 0x0000 }, - { 37, 0x006b, 0x0c00004b, 0x0f, 0x00, 0x0000 }, - { 38, 0x006c, 0x0000004c, 0x00, 0x00, 0x0000 }, - { 38, 0x004c, 0x0000004c, 0x01, 0x00, 0x0000 }, - { 38, 0x006c, 0x0000004c, 0x02, 0x00, 0x0000 }, - { 38, 0x004c, 0x0000004c, 0x03, 0x00, 0x0000 }, - { 38, 0x006c, 0x0400004c, 0x04, 0x00, 0x0000 }, - { 38, 0x006c, 0x0400004c, 0x05, 0x00, 0x0000 }, - { 38, 0x006c, 0x0400004c, 0x06, 0x00, 0x0000 }, - { 38, 0x006c, 0x0400004c, 0x07, 0x00, 0x0000 }, - { 38, 0x006c, 0x0800004c, 0x08, 0x00, 0x0000 }, - { 38, 0x006c, 0x0800004c, 0x09, 0x00, 0x0000 }, - { 38, 0x006c, 0x0800004c, 0x0a, 0x00, 0x0000 }, - { 38, 0x006c, 0x0800004c, 0x0b, 0x00, 0x0000 }, - { 38, 0x006c, 0x0c00004c, 0x0c, 0x00, 0x0000 }, - { 38, 0x006c, 0x0c00004c, 0x0d, 0x00, 0x0000 }, - { 38, 0x006c, 0x0c00004c, 0x0e, 0x00, 0x0000 }, - { 38, 0x006c, 0x0c00004c, 0x0f, 0x00, 0x0000 }, + { 30, 0x0061, 0x00000041, 0x00, 0x02, 0x0000 }, + { 30, 0x0041, 0x00000041, 0x01, 0x02, 0x0000 }, + { 30, 0x0061, 0x00000041, 0x02, 0x02, 0x0000 }, + { 30, 0x0041, 0x00000041, 0x03, 0x02, 0x0000 }, + { 30, 0x0061, 0x04000041, 0x04, 0x02, 0x0000 }, + { 30, 0x0061, 0x04000041, 0x05, 0x02, 0x0000 }, + { 30, 0x0061, 0x04000041, 0x06, 0x02, 0x0000 }, + { 30, 0x0061, 0x04000041, 0x07, 0x02, 0x0000 }, + { 30, 0x0061, 0x08000041, 0x08, 0x02, 0x0000 }, + { 30, 0x0061, 0x08000041, 0x09, 0x02, 0x0000 }, + { 30, 0x0061, 0x08000041, 0x0a, 0x02, 0x0000 }, + { 30, 0x0061, 0x08000041, 0x0b, 0x02, 0x0000 }, + { 30, 0x0061, 0x0c000041, 0x0c, 0x02, 0x0000 }, + { 30, 0x0061, 0x0c000041, 0x0d, 0x02, 0x0000 }, + { 30, 0x0061, 0x0c000041, 0x0e, 0x02, 0x0000 }, + { 30, 0x0061, 0x0c000041, 0x0f, 0x02, 0x0000 }, + { 31, 0x0073, 0x00000053, 0x00, 0x02, 0x0000 }, + { 31, 0x0053, 0x00000053, 0x01, 0x02, 0x0000 }, + { 31, 0x0073, 0x00000053, 0x02, 0x02, 0x0000 }, + { 31, 0x0053, 0x00000053, 0x03, 0x02, 0x0000 }, + { 31, 0x0073, 0x04000053, 0x04, 0x02, 0x0000 }, + { 31, 0x0073, 0x04000053, 0x05, 0x02, 0x0000 }, + { 31, 0x0073, 0x04000053, 0x06, 0x02, 0x0000 }, + { 31, 0x0073, 0x04000053, 0x07, 0x02, 0x0000 }, + { 31, 0x0073, 0x08000053, 0x08, 0x02, 0x0000 }, + { 31, 0x0073, 0x08000053, 0x09, 0x02, 0x0000 }, + { 31, 0x0073, 0x08000053, 0x0a, 0x02, 0x0000 }, + { 31, 0x0073, 0x08000053, 0x0b, 0x02, 0x0000 }, + { 31, 0x0073, 0x0c000053, 0x0c, 0x02, 0x0000 }, + { 31, 0x0073, 0x0c000053, 0x0d, 0x02, 0x0000 }, + { 31, 0x0073, 0x0c000053, 0x0e, 0x02, 0x0000 }, + { 31, 0x0073, 0x0c000053, 0x0f, 0x02, 0x0000 }, + { 32, 0x0064, 0x00000044, 0x00, 0x02, 0x0000 }, + { 32, 0x0044, 0x00000044, 0x01, 0x02, 0x0000 }, + { 32, 0x0064, 0x00000044, 0x02, 0x02, 0x0000 }, + { 32, 0x0044, 0x00000044, 0x03, 0x02, 0x0000 }, + { 32, 0x0064, 0x04000044, 0x04, 0x02, 0x0000 }, + { 32, 0x0064, 0x04000044, 0x05, 0x02, 0x0000 }, + { 32, 0x0064, 0x04000044, 0x06, 0x02, 0x0000 }, + { 32, 0x0064, 0x04000044, 0x07, 0x02, 0x0000 }, + { 32, 0x0064, 0x08000044, 0x08, 0x02, 0x0000 }, + { 32, 0x0064, 0x08000044, 0x09, 0x02, 0x0000 }, + { 32, 0x0064, 0x08000044, 0x0a, 0x02, 0x0000 }, + { 32, 0x0064, 0x08000044, 0x0b, 0x02, 0x0000 }, + { 32, 0x0064, 0x0c000044, 0x0c, 0x02, 0x0000 }, + { 32, 0x0064, 0x0c000044, 0x0d, 0x02, 0x0000 }, + { 32, 0x0064, 0x0c000044, 0x0e, 0x02, 0x0000 }, + { 32, 0x0064, 0x0c000044, 0x0f, 0x02, 0x0000 }, + { 33, 0x0066, 0x00000046, 0x00, 0x02, 0x0000 }, + { 33, 0x0046, 0x00000046, 0x01, 0x02, 0x0000 }, + { 33, 0x0066, 0x00000046, 0x02, 0x02, 0x0000 }, + { 33, 0x0046, 0x00000046, 0x03, 0x02, 0x0000 }, + { 33, 0x0066, 0x04000046, 0x04, 0x02, 0x0000 }, + { 33, 0x0066, 0x04000046, 0x05, 0x02, 0x0000 }, + { 33, 0x0066, 0x04000046, 0x06, 0x02, 0x0000 }, + { 33, 0x0066, 0x04000046, 0x07, 0x02, 0x0000 }, + { 33, 0x0066, 0x08000046, 0x08, 0x02, 0x0000 }, + { 33, 0x0066, 0x08000046, 0x09, 0x02, 0x0000 }, + { 33, 0x0066, 0x08000046, 0x0a, 0x02, 0x0000 }, + { 33, 0x0066, 0x08000046, 0x0b, 0x02, 0x0000 }, + { 33, 0x0066, 0x0c000046, 0x0c, 0x02, 0x0000 }, + { 33, 0x0066, 0x0c000046, 0x0d, 0x02, 0x0000 }, + { 33, 0x0066, 0x0c000046, 0x0e, 0x02, 0x0000 }, + { 33, 0x0066, 0x0c000046, 0x0f, 0x02, 0x0000 }, + { 34, 0x0067, 0x00000047, 0x00, 0x02, 0x0000 }, + { 34, 0x0047, 0x00000047, 0x01, 0x02, 0x0000 }, + { 34, 0x0067, 0x00000047, 0x02, 0x02, 0x0000 }, + { 34, 0x0047, 0x00000047, 0x03, 0x02, 0x0000 }, + { 34, 0x0067, 0x04000047, 0x04, 0x02, 0x0000 }, + { 34, 0x0067, 0x04000047, 0x05, 0x02, 0x0000 }, + { 34, 0x0067, 0x04000047, 0x06, 0x02, 0x0000 }, + { 34, 0x0067, 0x04000047, 0x07, 0x02, 0x0000 }, + { 34, 0x0067, 0x08000047, 0x08, 0x02, 0x0000 }, + { 34, 0x0067, 0x08000047, 0x09, 0x02, 0x0000 }, + { 34, 0x0067, 0x08000047, 0x0a, 0x02, 0x0000 }, + { 34, 0x0067, 0x08000047, 0x0b, 0x02, 0x0000 }, + { 34, 0x0067, 0x0c000047, 0x0c, 0x02, 0x0000 }, + { 34, 0x0067, 0x0c000047, 0x0d, 0x02, 0x0000 }, + { 34, 0x0067, 0x0c000047, 0x0e, 0x02, 0x0000 }, + { 34, 0x0067, 0x0c000047, 0x0f, 0x02, 0x0000 }, + { 35, 0x0068, 0x00000048, 0x00, 0x02, 0x0000 }, + { 35, 0x0048, 0x00000048, 0x01, 0x02, 0x0000 }, + { 35, 0x0068, 0x00000048, 0x02, 0x02, 0x0000 }, + { 35, 0x0048, 0x00000048, 0x03, 0x02, 0x0000 }, + { 35, 0x0068, 0x04000048, 0x04, 0x02, 0x0000 }, + { 35, 0x0068, 0x04000048, 0x05, 0x02, 0x0000 }, + { 35, 0x0068, 0x04000048, 0x06, 0x02, 0x0000 }, + { 35, 0x0068, 0x04000048, 0x07, 0x02, 0x0000 }, + { 35, 0x0068, 0x08000048, 0x08, 0x02, 0x0000 }, + { 35, 0x0068, 0x08000048, 0x09, 0x02, 0x0000 }, + { 35, 0x0068, 0x08000048, 0x0a, 0x02, 0x0000 }, + { 35, 0x0068, 0x08000048, 0x0b, 0x02, 0x0000 }, + { 35, 0x0068, 0x0c000048, 0x0c, 0x02, 0x0000 }, + { 35, 0x0068, 0x0c000048, 0x0d, 0x02, 0x0000 }, + { 35, 0x0068, 0x0c000048, 0x0e, 0x02, 0x0000 }, + { 35, 0x0068, 0x0c000048, 0x0f, 0x02, 0x0000 }, + { 36, 0x006a, 0x0000004a, 0x00, 0x02, 0x0000 }, + { 36, 0x004a, 0x0000004a, 0x01, 0x02, 0x0000 }, + { 36, 0x006a, 0x0000004a, 0x02, 0x02, 0x0000 }, + { 36, 0x004a, 0x0000004a, 0x03, 0x02, 0x0000 }, + { 36, 0x006a, 0x0400004a, 0x04, 0x02, 0x0000 }, + { 36, 0x006a, 0x0400004a, 0x05, 0x02, 0x0000 }, + { 36, 0x006a, 0x0400004a, 0x06, 0x02, 0x0000 }, + { 36, 0x006a, 0x0400004a, 0x07, 0x02, 0x0000 }, + { 36, 0x006a, 0x0800004a, 0x08, 0x02, 0x0000 }, + { 36, 0x006a, 0x0800004a, 0x09, 0x02, 0x0000 }, + { 36, 0x006a, 0x0800004a, 0x0a, 0x02, 0x0000 }, + { 36, 0x006a, 0x0800004a, 0x0b, 0x02, 0x0000 }, + { 36, 0x006a, 0x0c00004a, 0x0c, 0x02, 0x0000 }, + { 36, 0x006a, 0x0c00004a, 0x0d, 0x02, 0x0000 }, + { 36, 0x006a, 0x0c00004a, 0x0e, 0x02, 0x0000 }, + { 36, 0x006a, 0x0c00004a, 0x0f, 0x02, 0x0000 }, + { 37, 0x006b, 0x0000004b, 0x00, 0x02, 0x0000 }, + { 37, 0x004b, 0x0000004b, 0x01, 0x02, 0x0000 }, + { 37, 0x006b, 0x0000004b, 0x02, 0x02, 0x0000 }, + { 37, 0x004b, 0x0000004b, 0x03, 0x02, 0x0000 }, + { 37, 0x006b, 0x0400004b, 0x04, 0x02, 0x0000 }, + { 37, 0x006b, 0x0400004b, 0x05, 0x02, 0x0000 }, + { 37, 0x006b, 0x0400004b, 0x06, 0x02, 0x0000 }, + { 37, 0x006b, 0x0400004b, 0x07, 0x02, 0x0000 }, + { 37, 0x006b, 0x0800004b, 0x08, 0x02, 0x0000 }, + { 37, 0x006b, 0x0800004b, 0x09, 0x02, 0x0000 }, + { 37, 0x006b, 0x0800004b, 0x0a, 0x02, 0x0000 }, + { 37, 0x006b, 0x0800004b, 0x0b, 0x02, 0x0000 }, + { 37, 0x006b, 0x0c00004b, 0x0c, 0x02, 0x0000 }, + { 37, 0x006b, 0x0c00004b, 0x0d, 0x02, 0x0000 }, + { 37, 0x006b, 0x0c00004b, 0x0e, 0x02, 0x0000 }, + { 37, 0x006b, 0x0c00004b, 0x0f, 0x02, 0x0000 }, + { 38, 0x006c, 0x0000004c, 0x00, 0x02, 0x0000 }, + { 38, 0x004c, 0x0000004c, 0x01, 0x02, 0x0000 }, + { 38, 0x006c, 0x0000004c, 0x02, 0x02, 0x0000 }, + { 38, 0x004c, 0x0000004c, 0x03, 0x02, 0x0000 }, + { 38, 0x006c, 0x0400004c, 0x04, 0x02, 0x0000 }, + { 38, 0x006c, 0x0400004c, 0x05, 0x02, 0x0000 }, + { 38, 0x006c, 0x0400004c, 0x06, 0x02, 0x0000 }, + { 38, 0x006c, 0x0400004c, 0x07, 0x02, 0x0000 }, + { 38, 0x006c, 0x0800004c, 0x08, 0x02, 0x0000 }, + { 38, 0x006c, 0x0800004c, 0x09, 0x02, 0x0000 }, + { 38, 0x006c, 0x0800004c, 0x0a, 0x02, 0x0000 }, + { 38, 0x006c, 0x0800004c, 0x0b, 0x02, 0x0000 }, + { 38, 0x006c, 0x0c00004c, 0x0c, 0x02, 0x0000 }, + { 38, 0x006c, 0x0c00004c, 0x0d, 0x02, 0x0000 }, + { 38, 0x006c, 0x0c00004c, 0x0e, 0x02, 0x0000 }, + { 38, 0x006c, 0x0c00004c, 0x0f, 0x02, 0x0000 }, { 39, 0x003b, 0x0000003b, 0x00, 0x00, 0x0000 }, { 39, 0x003a, 0x0000003a, 0x01, 0x00, 0x0000 }, { 40, 0x0027, 0x00000027, 0x00, 0x00, 0x0000 }, @@ -418,118 +418,118 @@ const QEvdevKeyboardMap::Mapping QEvdevKeyboardHandler::s_keymap_default[] = { { 43, 0x005c, 0x0000005c, 0x00, 0x00, 0x0000 }, { 43, 0x007c, 0x0000007c, 0x01, 0x00, 0x0000 }, { 43, 0x005c, 0x0400005c, 0x04, 0x00, 0x0000 }, - { 44, 0x007a, 0x0000005a, 0x00, 0x00, 0x0000 }, - { 44, 0x005a, 0x0000005a, 0x01, 0x00, 0x0000 }, - { 44, 0x007a, 0x0000005a, 0x02, 0x00, 0x0000 }, - { 44, 0x005a, 0x0000005a, 0x03, 0x00, 0x0000 }, - { 44, 0x007a, 0x0400005a, 0x04, 0x00, 0x0000 }, - { 44, 0x007a, 0x0400005a, 0x05, 0x00, 0x0000 }, - { 44, 0x007a, 0x0400005a, 0x06, 0x00, 0x0000 }, - { 44, 0x007a, 0x0400005a, 0x07, 0x00, 0x0000 }, - { 44, 0x007a, 0x0800005a, 0x08, 0x00, 0x0000 }, - { 44, 0x007a, 0x0800005a, 0x09, 0x00, 0x0000 }, - { 44, 0x007a, 0x0800005a, 0x0a, 0x00, 0x0000 }, - { 44, 0x007a, 0x0800005a, 0x0b, 0x00, 0x0000 }, - { 44, 0x007a, 0x0c00005a, 0x0c, 0x00, 0x0000 }, - { 44, 0x007a, 0x0c00005a, 0x0d, 0x00, 0x0000 }, - { 44, 0x007a, 0x0c00005a, 0x0e, 0x00, 0x0000 }, - { 44, 0x007a, 0x0c00005a, 0x0f, 0x00, 0x0000 }, - { 45, 0x0078, 0x00000058, 0x00, 0x00, 0x0000 }, - { 45, 0x0058, 0x00000058, 0x01, 0x00, 0x0000 }, - { 45, 0x0078, 0x00000058, 0x02, 0x00, 0x0000 }, - { 45, 0x0058, 0x00000058, 0x03, 0x00, 0x0000 }, - { 45, 0x0078, 0x04000058, 0x04, 0x00, 0x0000 }, - { 45, 0x0078, 0x04000058, 0x05, 0x00, 0x0000 }, - { 45, 0x0078, 0x04000058, 0x06, 0x00, 0x0000 }, - { 45, 0x0078, 0x04000058, 0x07, 0x00, 0x0000 }, - { 45, 0x0078, 0x08000058, 0x08, 0x00, 0x0000 }, - { 45, 0x0078, 0x08000058, 0x09, 0x00, 0x0000 }, - { 45, 0x0078, 0x08000058, 0x0a, 0x00, 0x0000 }, - { 45, 0x0078, 0x08000058, 0x0b, 0x00, 0x0000 }, - { 45, 0x0078, 0x0c000058, 0x0c, 0x00, 0x0000 }, - { 45, 0x0078, 0x0c000058, 0x0d, 0x00, 0x0000 }, - { 45, 0x0078, 0x0c000058, 0x0e, 0x00, 0x0000 }, - { 45, 0x0078, 0x0c000058, 0x0f, 0x00, 0x0000 }, - { 46, 0x0063, 0x00000043, 0x00, 0x00, 0x0000 }, - { 46, 0x0043, 0x00000043, 0x01, 0x00, 0x0000 }, - { 46, 0x0063, 0x00000043, 0x02, 0x00, 0x0000 }, - { 46, 0x0043, 0x00000043, 0x03, 0x00, 0x0000 }, - { 46, 0x0063, 0x04000043, 0x04, 0x00, 0x0000 }, - { 46, 0x0063, 0x04000043, 0x05, 0x00, 0x0000 }, - { 46, 0x0063, 0x04000043, 0x06, 0x00, 0x0000 }, - { 46, 0x0063, 0x04000043, 0x07, 0x00, 0x0000 }, - { 46, 0x0063, 0x08000043, 0x08, 0x00, 0x0000 }, - { 46, 0x0063, 0x08000043, 0x09, 0x00, 0x0000 }, - { 46, 0x0063, 0x08000043, 0x0a, 0x00, 0x0000 }, - { 46, 0x0063, 0x08000043, 0x0b, 0x00, 0x0000 }, - { 46, 0x0063, 0x0c000043, 0x0c, 0x00, 0x0000 }, - { 46, 0x0063, 0x0c000043, 0x0d, 0x00, 0x0000 }, - { 46, 0x0063, 0x0c000043, 0x0e, 0x00, 0x0000 }, - { 46, 0x0063, 0x0c000043, 0x0f, 0x00, 0x0000 }, - { 47, 0x0076, 0x00000056, 0x00, 0x00, 0x0000 }, - { 47, 0x0056, 0x00000056, 0x01, 0x00, 0x0000 }, - { 47, 0x0076, 0x00000056, 0x02, 0x00, 0x0000 }, - { 47, 0x0056, 0x00000056, 0x03, 0x00, 0x0000 }, - { 47, 0x0076, 0x04000056, 0x04, 0x00, 0x0000 }, - { 47, 0x0076, 0x04000056, 0x05, 0x00, 0x0000 }, - { 47, 0x0076, 0x04000056, 0x06, 0x00, 0x0000 }, - { 47, 0x0076, 0x04000056, 0x07, 0x00, 0x0000 }, - { 47, 0x0076, 0x08000056, 0x08, 0x00, 0x0000 }, - { 47, 0x0076, 0x08000056, 0x09, 0x00, 0x0000 }, - { 47, 0x0076, 0x08000056, 0x0a, 0x00, 0x0000 }, - { 47, 0x0076, 0x08000056, 0x0b, 0x00, 0x0000 }, - { 47, 0x0076, 0x0c000056, 0x0c, 0x00, 0x0000 }, - { 47, 0x0076, 0x0c000056, 0x0d, 0x00, 0x0000 }, - { 47, 0x0076, 0x0c000056, 0x0e, 0x00, 0x0000 }, - { 47, 0x0076, 0x0c000056, 0x0f, 0x00, 0x0000 }, - { 48, 0x0062, 0x00000042, 0x00, 0x00, 0x0000 }, - { 48, 0x0042, 0x00000042, 0x01, 0x00, 0x0000 }, - { 48, 0x0062, 0x00000042, 0x02, 0x00, 0x0000 }, - { 48, 0x0042, 0x00000042, 0x03, 0x00, 0x0000 }, - { 48, 0x0062, 0x04000042, 0x04, 0x00, 0x0000 }, - { 48, 0x0062, 0x04000042, 0x05, 0x00, 0x0000 }, - { 48, 0x0062, 0x04000042, 0x06, 0x00, 0x0000 }, - { 48, 0x0062, 0x04000042, 0x07, 0x00, 0x0000 }, - { 48, 0x0062, 0x08000042, 0x08, 0x00, 0x0000 }, - { 48, 0x0062, 0x08000042, 0x09, 0x00, 0x0000 }, - { 48, 0x0062, 0x08000042, 0x0a, 0x00, 0x0000 }, - { 48, 0x0062, 0x08000042, 0x0b, 0x00, 0x0000 }, - { 48, 0x0062, 0x0c000042, 0x0c, 0x00, 0x0000 }, - { 48, 0x0062, 0x0c000042, 0x0d, 0x00, 0x0000 }, - { 48, 0x0062, 0x0c000042, 0x0e, 0x00, 0x0000 }, - { 48, 0x0062, 0x0c000042, 0x0f, 0x00, 0x0000 }, - { 49, 0x006e, 0x0000004e, 0x00, 0x00, 0x0000 }, - { 49, 0x004e, 0x0000004e, 0x01, 0x00, 0x0000 }, - { 49, 0x006e, 0x0000004e, 0x02, 0x00, 0x0000 }, - { 49, 0x004e, 0x0000004e, 0x03, 0x00, 0x0000 }, - { 49, 0x006e, 0x0400004e, 0x04, 0x00, 0x0000 }, - { 49, 0x006e, 0x0400004e, 0x05, 0x00, 0x0000 }, - { 49, 0x006e, 0x0400004e, 0x06, 0x00, 0x0000 }, - { 49, 0x006e, 0x0400004e, 0x07, 0x00, 0x0000 }, - { 49, 0x006e, 0x0800004e, 0x08, 0x00, 0x0000 }, - { 49, 0x006e, 0x0800004e, 0x09, 0x00, 0x0000 }, - { 49, 0x006e, 0x0800004e, 0x0a, 0x00, 0x0000 }, - { 49, 0x006e, 0x0800004e, 0x0b, 0x00, 0x0000 }, - { 49, 0x006e, 0x0c00004e, 0x0c, 0x00, 0x0000 }, - { 49, 0x006e, 0x0c00004e, 0x0d, 0x00, 0x0000 }, - { 49, 0x006e, 0x0c00004e, 0x0e, 0x00, 0x0000 }, - { 49, 0x006e, 0x0c00004e, 0x0f, 0x00, 0x0000 }, - { 50, 0x006d, 0x0000004d, 0x00, 0x00, 0x0000 }, - { 50, 0x004d, 0x0000004d, 0x01, 0x00, 0x0000 }, - { 50, 0x006d, 0x0000004d, 0x02, 0x00, 0x0000 }, - { 50, 0x004d, 0x0000004d, 0x03, 0x00, 0x0000 }, - { 50, 0x006d, 0x0400004d, 0x04, 0x00, 0x0000 }, - { 50, 0x006d, 0x0400004d, 0x05, 0x00, 0x0000 }, - { 50, 0x006d, 0x0400004d, 0x06, 0x00, 0x0000 }, - { 50, 0x006d, 0x0400004d, 0x07, 0x00, 0x0000 }, - { 50, 0x006d, 0x0800004d, 0x08, 0x00, 0x0000 }, - { 50, 0x006d, 0x0800004d, 0x09, 0x00, 0x0000 }, - { 50, 0x006d, 0x0800004d, 0x0a, 0x00, 0x0000 }, - { 50, 0x006d, 0x0800004d, 0x0b, 0x00, 0x0000 }, - { 50, 0x006d, 0x0c00004d, 0x0c, 0x00, 0x0000 }, - { 50, 0x006d, 0x0c00004d, 0x0d, 0x00, 0x0000 }, - { 50, 0x006d, 0x0c00004d, 0x0e, 0x00, 0x0000 }, - { 50, 0x006d, 0x0c00004d, 0x0f, 0x00, 0x0000 }, + { 44, 0x007a, 0x0000005a, 0x00, 0x02, 0x0000 }, + { 44, 0x005a, 0x0000005a, 0x01, 0x02, 0x0000 }, + { 44, 0x007a, 0x0000005a, 0x02, 0x02, 0x0000 }, + { 44, 0x005a, 0x0000005a, 0x03, 0x02, 0x0000 }, + { 44, 0x007a, 0x0400005a, 0x04, 0x02, 0x0000 }, + { 44, 0x007a, 0x0400005a, 0x05, 0x02, 0x0000 }, + { 44, 0x007a, 0x0400005a, 0x06, 0x02, 0x0000 }, + { 44, 0x007a, 0x0400005a, 0x07, 0x02, 0x0000 }, + { 44, 0x007a, 0x0800005a, 0x08, 0x02, 0x0000 }, + { 44, 0x007a, 0x0800005a, 0x09, 0x02, 0x0000 }, + { 44, 0x007a, 0x0800005a, 0x0a, 0x02, 0x0000 }, + { 44, 0x007a, 0x0800005a, 0x0b, 0x02, 0x0000 }, + { 44, 0x007a, 0x0c00005a, 0x0c, 0x02, 0x0000 }, + { 44, 0x007a, 0x0c00005a, 0x0d, 0x02, 0x0000 }, + { 44, 0x007a, 0x0c00005a, 0x0e, 0x02, 0x0000 }, + { 44, 0x007a, 0x0c00005a, 0x0f, 0x02, 0x0000 }, + { 45, 0x0078, 0x00000058, 0x00, 0x02, 0x0000 }, + { 45, 0x0058, 0x00000058, 0x01, 0x02, 0x0000 }, + { 45, 0x0078, 0x00000058, 0x02, 0x02, 0x0000 }, + { 45, 0x0058, 0x00000058, 0x03, 0x02, 0x0000 }, + { 45, 0x0078, 0x04000058, 0x04, 0x02, 0x0000 }, + { 45, 0x0078, 0x04000058, 0x05, 0x02, 0x0000 }, + { 45, 0x0078, 0x04000058, 0x06, 0x02, 0x0000 }, + { 45, 0x0078, 0x04000058, 0x07, 0x02, 0x0000 }, + { 45, 0x0078, 0x08000058, 0x08, 0x02, 0x0000 }, + { 45, 0x0078, 0x08000058, 0x09, 0x02, 0x0000 }, + { 45, 0x0078, 0x08000058, 0x0a, 0x02, 0x0000 }, + { 45, 0x0078, 0x08000058, 0x0b, 0x02, 0x0000 }, + { 45, 0x0078, 0x0c000058, 0x0c, 0x02, 0x0000 }, + { 45, 0x0078, 0x0c000058, 0x0d, 0x02, 0x0000 }, + { 45, 0x0078, 0x0c000058, 0x0e, 0x02, 0x0000 }, + { 45, 0x0078, 0x0c000058, 0x0f, 0x02, 0x0000 }, + { 46, 0x0063, 0x00000043, 0x00, 0x02, 0x0000 }, + { 46, 0x0043, 0x00000043, 0x01, 0x02, 0x0000 }, + { 46, 0x0063, 0x00000043, 0x02, 0x02, 0x0000 }, + { 46, 0x0043, 0x00000043, 0x03, 0x02, 0x0000 }, + { 46, 0x0063, 0x04000043, 0x04, 0x02, 0x0000 }, + { 46, 0x0063, 0x04000043, 0x05, 0x02, 0x0000 }, + { 46, 0x0063, 0x04000043, 0x06, 0x02, 0x0000 }, + { 46, 0x0063, 0x04000043, 0x07, 0x02, 0x0000 }, + { 46, 0x0063, 0x08000043, 0x08, 0x02, 0x0000 }, + { 46, 0x0063, 0x08000043, 0x09, 0x02, 0x0000 }, + { 46, 0x0063, 0x08000043, 0x0a, 0x02, 0x0000 }, + { 46, 0x0063, 0x08000043, 0x0b, 0x02, 0x0000 }, + { 46, 0x0063, 0x0c000043, 0x0c, 0x02, 0x0000 }, + { 46, 0x0063, 0x0c000043, 0x0d, 0x02, 0x0000 }, + { 46, 0x0063, 0x0c000043, 0x0e, 0x02, 0x0000 }, + { 46, 0x0063, 0x0c000043, 0x0f, 0x02, 0x0000 }, + { 47, 0x0076, 0x00000056, 0x00, 0x02, 0x0000 }, + { 47, 0x0056, 0x00000056, 0x01, 0x02, 0x0000 }, + { 47, 0x0076, 0x00000056, 0x02, 0x02, 0x0000 }, + { 47, 0x0056, 0x00000056, 0x03, 0x02, 0x0000 }, + { 47, 0x0076, 0x04000056, 0x04, 0x02, 0x0000 }, + { 47, 0x0076, 0x04000056, 0x05, 0x02, 0x0000 }, + { 47, 0x0076, 0x04000056, 0x06, 0x02, 0x0000 }, + { 47, 0x0076, 0x04000056, 0x07, 0x02, 0x0000 }, + { 47, 0x0076, 0x08000056, 0x08, 0x02, 0x0000 }, + { 47, 0x0076, 0x08000056, 0x09, 0x02, 0x0000 }, + { 47, 0x0076, 0x08000056, 0x0a, 0x02, 0x0000 }, + { 47, 0x0076, 0x08000056, 0x0b, 0x02, 0x0000 }, + { 47, 0x0076, 0x0c000056, 0x0c, 0x02, 0x0000 }, + { 47, 0x0076, 0x0c000056, 0x0d, 0x02, 0x0000 }, + { 47, 0x0076, 0x0c000056, 0x0e, 0x02, 0x0000 }, + { 47, 0x0076, 0x0c000056, 0x0f, 0x02, 0x0000 }, + { 48, 0x0062, 0x00000042, 0x00, 0x02, 0x0000 }, + { 48, 0x0042, 0x00000042, 0x01, 0x02, 0x0000 }, + { 48, 0x0062, 0x00000042, 0x02, 0x02, 0x0000 }, + { 48, 0x0042, 0x00000042, 0x03, 0x02, 0x0000 }, + { 48, 0x0062, 0x04000042, 0x04, 0x02, 0x0000 }, + { 48, 0x0062, 0x04000042, 0x05, 0x02, 0x0000 }, + { 48, 0x0062, 0x04000042, 0x06, 0x02, 0x0000 }, + { 48, 0x0062, 0x04000042, 0x07, 0x02, 0x0000 }, + { 48, 0x0062, 0x08000042, 0x08, 0x02, 0x0000 }, + { 48, 0x0062, 0x08000042, 0x09, 0x02, 0x0000 }, + { 48, 0x0062, 0x08000042, 0x0a, 0x02, 0x0000 }, + { 48, 0x0062, 0x08000042, 0x0b, 0x02, 0x0000 }, + { 48, 0x0062, 0x0c000042, 0x0c, 0x02, 0x0000 }, + { 48, 0x0062, 0x0c000042, 0x0d, 0x02, 0x0000 }, + { 48, 0x0062, 0x0c000042, 0x0e, 0x02, 0x0000 }, + { 48, 0x0062, 0x0c000042, 0x0f, 0x02, 0x0000 }, + { 49, 0x006e, 0x0000004e, 0x00, 0x02, 0x0000 }, + { 49, 0x004e, 0x0000004e, 0x01, 0x02, 0x0000 }, + { 49, 0x006e, 0x0000004e, 0x02, 0x02, 0x0000 }, + { 49, 0x004e, 0x0000004e, 0x03, 0x02, 0x0000 }, + { 49, 0x006e, 0x0400004e, 0x04, 0x02, 0x0000 }, + { 49, 0x006e, 0x0400004e, 0x05, 0x02, 0x0000 }, + { 49, 0x006e, 0x0400004e, 0x06, 0x02, 0x0000 }, + { 49, 0x006e, 0x0400004e, 0x07, 0x02, 0x0000 }, + { 49, 0x006e, 0x0800004e, 0x08, 0x02, 0x0000 }, + { 49, 0x006e, 0x0800004e, 0x09, 0x02, 0x0000 }, + { 49, 0x006e, 0x0800004e, 0x0a, 0x02, 0x0000 }, + { 49, 0x006e, 0x0800004e, 0x0b, 0x02, 0x0000 }, + { 49, 0x006e, 0x0c00004e, 0x0c, 0x02, 0x0000 }, + { 49, 0x006e, 0x0c00004e, 0x0d, 0x02, 0x0000 }, + { 49, 0x006e, 0x0c00004e, 0x0e, 0x02, 0x0000 }, + { 49, 0x006e, 0x0c00004e, 0x0f, 0x02, 0x0000 }, + { 50, 0x006d, 0x0000004d, 0x00, 0x02, 0x0000 }, + { 50, 0x004d, 0x0000004d, 0x01, 0x02, 0x0000 }, + { 50, 0x006d, 0x0000004d, 0x02, 0x02, 0x0000 }, + { 50, 0x004d, 0x0000004d, 0x03, 0x02, 0x0000 }, + { 50, 0x006d, 0x0400004d, 0x04, 0x02, 0x0000 }, + { 50, 0x006d, 0x0400004d, 0x05, 0x02, 0x0000 }, + { 50, 0x006d, 0x0400004d, 0x06, 0x02, 0x0000 }, + { 50, 0x006d, 0x0400004d, 0x07, 0x02, 0x0000 }, + { 50, 0x006d, 0x0800004d, 0x08, 0x02, 0x0000 }, + { 50, 0x006d, 0x0800004d, 0x09, 0x02, 0x0000 }, + { 50, 0x006d, 0x0800004d, 0x0a, 0x02, 0x0000 }, + { 50, 0x006d, 0x0800004d, 0x0b, 0x02, 0x0000 }, + { 50, 0x006d, 0x0c00004d, 0x0c, 0x02, 0x0000 }, + { 50, 0x006d, 0x0c00004d, 0x0d, 0x02, 0x0000 }, + { 50, 0x006d, 0x0c00004d, 0x0e, 0x02, 0x0000 }, + { 50, 0x006d, 0x0c00004d, 0x0f, 0x02, 0x0000 }, { 51, 0x002c, 0x0000002c, 0x00, 0x00, 0x0000 }, { 51, 0x003c, 0x0000003c, 0x01, 0x00, 0x0000 }, { 51, 0x002c, 0x0100125b, 0x02, 0x01, 0x0000 }, diff --git a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp index 26dc116f91..b97923c4b6 100644 --- a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp +++ b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp @@ -235,6 +235,8 @@ QEvdevKeyboardHandler::KeycodeAction QEvdevKeyboardHandler::processKeycode(quint const QEvdevKeyboardMap::Mapping *map_plain = 0; const QEvdevKeyboardMap::Mapping *map_withmod = 0; + quint8 modifiers = m_modifiers; + // get a specific and plain mapping for the keycode and the current modifiers for (int i = 0; i < m_keymap_size && !(map_plain && map_withmod); ++i) { const QEvdevKeyboardMap::Mapping *m = m_keymap + i; @@ -250,9 +252,12 @@ QEvdevKeyboardHandler::KeycodeAction QEvdevKeyboardHandler::processKeycode(quint } } + if (m_locks[0] /*CapsLock*/ && map_withmod && (map_withmod->flags & QEvdevKeyboardMap::IsLetter)) + modifiers ^= QEvdevKeyboardMap::ModShift; + #ifdef QT_QPA_KEYMAP_DEBUG qWarning("Processing key event: keycode=%3d, modifiers=%02x pressed=%d, autorepeat=%d | plain=%d, withmod=%d, size=%d", \ - keycode, m_modifiers, pressed ? 1 : 0, autorepeat ? 1 : 0, \ + keycode, modifiers, pressed ? 1 : 0, autorepeat ? 1 : 0, \ map_plain ? map_plain - m_keymap : -1, \ map_withmod ? map_withmod - m_keymap : -1, \ m_keymap_size); @@ -263,7 +268,7 @@ QEvdevKeyboardHandler::KeycodeAction QEvdevKeyboardHandler::processKeycode(quint if (!it) { #ifdef QT_QPA_KEYMAP_DEBUG // we couldn't even find a plain mapping - qWarning("Could not find a suitable mapping for keycode: %3d, modifiers: %02x", keycode, m_modifiers); + qWarning("Could not find a suitable mapping for keycode: %3d, modifiers: %02x", keycode, modifiers); #endif return result; } @@ -285,7 +290,7 @@ QEvdevKeyboardHandler::KeycodeAction QEvdevKeyboardHandler::processKeycode(quint lock ^= 1; switch (qtcode) { - case Qt::Key_CapsLock : result = lock ? CapsLockOn : CapsLockOff; m_modifiers ^= QEvdevKeyboardMap::ModShift; break; + case Qt::Key_CapsLock : result = lock ? CapsLockOn : CapsLockOff; break; case Qt::Key_NumLock : result = lock ? NumLockOn : NumLockOff; break; case Qt::Key_ScrollLock: result = lock ? ScrollLockOn : ScrollLockOff; break; default : break; @@ -347,7 +352,7 @@ QEvdevKeyboardHandler::KeycodeAction QEvdevKeyboardHandler::processKeycode(quint // so just report the plain mapping with additional modifiers. if ((it == map_plain && it != map_withmod) || (map_withmod && !(map_withmod->qtcode & modmask))) { - qtcode |= QEvdevKeyboardHandler::toQtModifiers(m_modifiers); + qtcode |= QEvdevKeyboardHandler::toQtModifiers(modifiers); } if (m_composing == 2 && first_press && !(it->flags & QEvdevKeyboardMap::IsModifier)) { From 03285044a087c854e0c35f01dcc832e43894c44c Mon Sep 17 00:00:00 2001 From: Jorgen Lind Date: Fri, 14 Jun 2013 14:00:36 +0200 Subject: [PATCH 063/131] Add how to create a udev rule for the evdev plugins Change-Id: Icd7a192701958673fe216f40ddab710f5f63a8b8 Reviewed-by: Paul Olav Tvete Reviewed-by: Andy Nichols --- src/plugins/generic/evdevkeyboard/README | 7 +++++++ src/plugins/generic/evdevmouse/README | 8 ++++++++ 2 files changed, 15 insertions(+) create mode 100644 src/plugins/generic/evdevkeyboard/README diff --git a/src/plugins/generic/evdevkeyboard/README b/src/plugins/generic/evdevkeyboard/README new file mode 100644 index 0000000000..751cc99aa9 --- /dev/null +++ b/src/plugins/generic/evdevkeyboard/README @@ -0,0 +1,7 @@ +On development machines it might be useful to add the input devices +to a group that your development user i part of. Ie add: +KERNEL=="event*", SUBSYSTEM=="input", MODE="0640", GROUP="users" + +to a file such as: +/etc/udev/rules.d/10-local.rules + diff --git a/src/plugins/generic/evdevmouse/README b/src/plugins/generic/evdevmouse/README index 76ee76bc91..526106e338 100644 --- a/src/plugins/generic/evdevmouse/README +++ b/src/plugins/generic/evdevmouse/README @@ -12,3 +12,11 @@ initial position. Touchpads reporting absolute events will work too, the positions will be turned into relative. Touchscreens are however not supported. + +On development machines it might be useful to add the input devices +to a group that your development user i part of. Ie add: +KERNEL=="event*", SUBSYSTEM=="input", MODE="0640", GROUP="users" + +to a file such as: +/etc/udev/rules.d/10-local.rules + From be8974633c4f812227db256dae6fa249f60c61d1 Mon Sep 17 00:00:00 2001 From: David Faure Date: Thu, 11 Jul 2013 13:25:38 +0200 Subject: [PATCH 064/131] Doc: porting from QDesktopServices::DataLocation to QStandardPaths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ifd96db46cc8d0170b136a9e3154ed37ebe6ad830 Reviewed-by: Jerome Pasion Reviewed-by: Topi Reiniö Reviewed-by: Giuseppe D'Angelo --- src/gui/util/qdesktopservices.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/gui/util/qdesktopservices.cpp b/src/gui/util/qdesktopservices.cpp index 97847af8ea..f5895414a9 100644 --- a/src/gui/util/qdesktopservices.cpp +++ b/src/gui/util/qdesktopservices.cpp @@ -254,7 +254,7 @@ void QDesktopServices::unsetUrlHandler(const QString &scheme) \enum QDesktopServices::StandardLocation \since 4.4 \obsolete - Use QStandardPaths::StandardLocation + Use QStandardPaths::StandardLocation (see storageLocation() for porting notes) This enum describes the different locations that can be queried by QDesktopServices::storageLocation and QDesktopServices::displayName. @@ -282,6 +282,26 @@ void QDesktopServices::unsetUrlHandler(const QString &scheme) \fn QString QDesktopServices::storageLocation(StandardLocation type) \obsolete Use QStandardPaths::writableLocation() + + \note when porting QDesktopServices::DataLocation to QStandardPaths::DataLocation, + a different path will be returned. + + \c{QDesktopServices::DataLocation} was \c{GenericDataLocation + "/data/organization/application"}, + while QStandardPaths::DataLocation is \c{GenericDataLocation + "/organization/application"}. + + Also note that \c{application} could be empty in Qt 4, if QCoreApplication::setApplicationName() + wasn't called, while in Qt 5 it defaults to the name of the executable. + + Therefore, if you still need to access the Qt 4 path (for example for data migration to Qt 5), replace + \code + QDesktopServices::storageLocation(QDesktopServices::DataLocation) + \endcode + with + \code + QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + + "/data/organization/application" + \endcode + (assuming an organization name and an application name were set). */ /*! From 672fcbe9c6586e909513c91f5b36ad9a83a0ef1c Mon Sep 17 00:00:00 2001 From: David Faure Date: Sun, 28 Jul 2013 20:03:57 +0200 Subject: [PATCH 065/131] QMimeDatabase: Fix handling of duplicate mimetype definitions (2/2). 7721c3d27c6a fixed the case where two similar definitions are in the same directory. This commit fixes the case where two similar definitions are in different directories, both in the search path (GenericDataLocation). If the file extension gives us the same mimetype twice, there's no conflict, i.e. no reason to fallback to determination from contents. Change-Id: I72c56004b6d5e88964159e53ec160ce8b06c2264 Reviewed-by: Thiago Macieira --- src/corelib/mimetypes/qmimeglobpattern.cpp | 8 +++++--- .../mimetypes/qmimedatabase/tst_qmimedatabase.cpp | 14 +++++++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/corelib/mimetypes/qmimeglobpattern.cpp b/src/corelib/mimetypes/qmimeglobpattern.cpp index 96798cabcd..530d3de4a2 100644 --- a/src/corelib/mimetypes/qmimeglobpattern.cpp +++ b/src/corelib/mimetypes/qmimeglobpattern.cpp @@ -77,9 +77,11 @@ void QMimeGlobMatchResult::addMatch(const QString &mimeType, int weight, const Q m_matchingPatternLength = pattern.length(); m_weight = weight; } - m_matchingMimeTypes.append(mimeType); - if (pattern.startsWith(QLatin1String("*."))) - m_foundSuffix = pattern.mid(2); + if (!m_matchingMimeTypes.contains(mimeType)) { + m_matchingMimeTypes.append(mimeType); + if (pattern.startsWith(QLatin1String("*."))) + m_foundSuffix = pattern.mid(2); + } } /*! diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp index a90bfadd73..07d3c5c7b8 100644 --- a/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp +++ b/tests/auto/corelib/mimetypes/qmimedatabase/tst_qmimedatabase.cpp @@ -876,7 +876,10 @@ void tst_QMimeDatabase::installNewLocalMimeType() QDir().mkpath(destDir); const QString destFile = destDir + QLatin1String(yastFileName); QFile::remove(destFile); + const QString destQmlFile = destDir + QLatin1String(qmlAgainFileName); + QFile::remove(destQmlFile); QVERIFY(QFile::copy(m_yastMimeTypes, destFile)); + QVERIFY(QFile::copy(m_qmlAgainFileName, destQmlFile)); if (!runUpdateMimeDatabase(mimeDir)) { const QString skipWarning = QStringLiteral("shared-mime-info not found, skipping mime.cache test (") + QDir::toNativeSeparators(mimeDir) + QLatin1Char(')'); @@ -888,8 +891,17 @@ void tst_QMimeDatabase::installNewLocalMimeType() QVERIFY(db.mimeTypeForName(QLatin1String("text/x-suse-ymp")).isValid()); checkHasMimeType("text/x-suse-ymp"); - // Now test removing it again (note, this leaves a mostly-empty mime.cache file) + // Test that a double-definition of a mimetype doesn't lead to sniffing ("conflicting globs"). + const QString qmlTestFile = QFINDTESTDATA("test.qml"); + QVERIFY2(!qmlTestFile.isEmpty(), + qPrintable(QString::fromLatin1("Cannot find '%1' starting from '%2'"). + arg("test.qml", QDir::currentPath()))); + QCOMPARE(db.mimeTypeForFile(qmlTestFile).name(), + QString::fromLatin1("text/x-qml")); + + // Now test removing the local mimetypes again (note, this leaves a mostly-empty mime.cache file) QFile::remove(destFile); + QFile::remove(destQmlFile); if (!waitAndRunUpdateMimeDatabase(mimeDir)) QSKIP("shared-mime-info not found, skipping mime.cache test"); QCOMPARE(db.mimeTypeForFile(QLatin1String("foo.ymu"), QMimeDatabase::MatchExtension).name(), From bbf19fb29572785ef9b7fcccd2d2027f5c7603a6 Mon Sep 17 00:00:00 2001 From: Daiwei Li Date: Thu, 1 Aug 2013 17:24:47 -0700 Subject: [PATCH 066/131] Fix ignoring closeEvents on OSX for QtQuick. The QCloseEvent's accepted state should not be inverted for the QWindowSystemInterfacePrivate::CloseEvent. To make Widgets work with this change, pass whether the close was accepted from close_helper to the QCloseEvent generated by QGuiApplication. Task-number: QTBUG-28965 Change-Id: If384b0355776b93df02dff2ab78b5647903200e7 Reviewed-by: Gabriel de Dietrich Reviewed-by: Josh Faust --- src/gui/kernel/qguiapplication.cpp | 2 +- src/widgets/kernel/qwidgetwindow.cpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index bf8440cccf..7d2c710c52 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1778,7 +1778,7 @@ void QGuiApplicationPrivate::processCloseEvent(QWindowSystemInterfacePrivate::Cl QCloseEvent event; QGuiApplication::sendSpontaneousEvent(e->window.data(), &event); if (e->accepted) { - *(e->accepted) = !event.isAccepted(); + *(e->accepted) = event.isAccepted(); } } diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 18dd3156c6..675ea77b30 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -538,9 +538,10 @@ void QWidgetWindow::handleResizeEvent(QResizeEvent *event) } } -void QWidgetWindow::handleCloseEvent(QCloseEvent *) +void QWidgetWindow::handleCloseEvent(QCloseEvent *event) { - m_widget->d_func()->close_helper(QWidgetPrivate::CloseWithSpontaneousEvent); + bool is_closing = m_widget->d_func()->close_helper(QWidgetPrivate::CloseWithSpontaneousEvent); + event->setAccepted(is_closing); } #ifndef QT_NO_WHEELEVENT From c0f51fb1d09c4edb00748ff90d9e5ea9ba5773b2 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Mon, 5 Aug 2013 09:06:38 +0200 Subject: [PATCH 067/131] Fix typo in Model/View Programming documentation. Change-Id: I88f49a894a8c1e88a4cdb559fdc426f01e113f80 Reviewed-by: Jerome Pasion --- src/widgets/doc/src/model-view-programming.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/doc/src/model-view-programming.qdoc b/src/widgets/doc/src/model-view-programming.qdoc index 6bcd0943a1..377ecf204e 100644 --- a/src/widgets/doc/src/model-view-programming.qdoc +++ b/src/widgets/doc/src/model-view-programming.qdoc @@ -189,7 +189,7 @@ to the QTableView::sortByColumn() slot or the QTreeView::sortByColumn() slot, respectively. - The alternative approach, if your model do not have the required + The alternative approach, if your model does not have the required interface or if you want to use a list view to present your data, is to use a proxy model to transform the structure of your model before presenting the data in the view. This is covered in detail From 13d7823ef722f753b962315c285ba0941586a060 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Sat, 3 Aug 2013 15:00:10 +0200 Subject: [PATCH 068/131] tests: Enable some itemmodels tests that don't depend on Qt Widgets Make qabstractproxymodel and qidentityproxymodel build and run even if -no-widgets is used since they don't depend on Qt Widgets. Change-Id: I48bc2f6a78812b1bf0083f76c6a4e106f4e38650 Reviewed-by: Stephen Kelly --- tests/auto/corelib/itemmodels/itemmodels.pro | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/auto/corelib/itemmodels/itemmodels.pro b/tests/auto/corelib/itemmodels/itemmodels.pro index 2f681c3330..e0bc2a8a4b 100644 --- a/tests/auto/corelib/itemmodels/itemmodels.pro +++ b/tests/auto/corelib/itemmodels/itemmodels.pro @@ -1,11 +1,11 @@ TEMPLATE=subdirs SUBDIRS = qabstractitemmodel \ - qstringlistmodel - -qtHaveModule(widgets): SUBDIRS += \ qabstractproxymodel \ qidentityproxymodel \ + qstringlistmodel \ + +qtHaveModule(widgets): SUBDIRS += \ qitemmodel \ qitemselectionmodel \ qsortfilterproxymodel \ From 8c35db5c72ba7f960590653ca246cec48361978a Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Sat, 3 Aug 2013 17:00:19 +0200 Subject: [PATCH 069/131] configure: Fix xkbcommon summary output On systems where xkbcommon >= 0.2.0 the output should be xkbcommon .............. yes (system library) instead of xkbcommon .............. yes Change-Id: I5807946e61814d414a68a15ad96c91f25c9482ee Reviewed-by: Gatis Paeglis Reviewed-by: Oswald Buddenhagen --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 6c4abeb9ce..834b35cdbd 100755 --- a/configure +++ b/configure @@ -5354,7 +5354,7 @@ if [ "$CFG_XKBCOMMON" != "qt" ]; then QMakeVar set QMAKE_CFLAGS_XKBCOMMON "$QMAKE_CFLAGS_XKBCOMMON" QMakeVar set QMAKE_LIBS_XKBCOMMON "$QMAKE_LIBS_XKBCOMMON" QMakeVar set QMAKE_VERSION_XKBCOMMON "$QMAKE_VERSION_XKBCOMMON" - CFG_XKBCOMMON=yes + CFG_XKBCOMMON=system else CFG_XKBCOMMON=no fi From d66d912c530d53ae19a36df63db15d33a984bce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 5 Aug 2013 16:48:46 +0200 Subject: [PATCH 070/131] Fix tst_QCompleter::directoryModel() on OS X By not assuming that we have the '/Developer' directory at the root of the file system. 'Users' is less likely to be removed/deprecated. Change-Id: I659bdb67cfb1ed2f73bc643ba4afe1f1f89d5bc5 Reviewed-by: Gabriel de Dietrich --- tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp index d7050033f3..0f7993540c 100644 --- a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp +++ b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp @@ -608,7 +608,7 @@ void tst_QCompleter::directoryModel_data() #elif defined (Q_OS_MAC) QTest::newRow("()") << "" << "" << "/" << "/"; QTest::newRow("(/a)") << "/a" << "" << "Applications" << "/Applications"; - QTest::newRow("(/d)") << "/d" << "" << "Developer" << "/Developer"; + QTest::newRow("(/u)") << "/u" << "" << "Users" << "/Users"; #else QTest::newRow("()") << "" << "" << "/" << "/"; #if !defined(Q_OS_IRIX) && !defined(Q_OS_AIX) && !defined(Q_OS_HPUX) From 9370f50f2ce809647862f0b65ea0aa82e96556bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 29 Jul 2013 14:32:36 +0200 Subject: [PATCH 071/131] Add Info.plist templates for the macx-icc makespec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTBUG-31355 Change-Id: Iea2ac2a072bbd2c0104f0704a86503c0982fb886 Reviewed-by: Oswald Buddenhagen Reviewed-by: Jake Petroules Reviewed-by: Tor Arne Vestbø --- mkspecs/macx-icc/Info.plist.app | 22 ++++++++++++++++++++++ mkspecs/macx-icc/Info.plist.lib | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 mkspecs/macx-icc/Info.plist.app create mode 100644 mkspecs/macx-icc/Info.plist.lib diff --git a/mkspecs/macx-icc/Info.plist.app b/mkspecs/macx-icc/Info.plist.app new file mode 100644 index 0000000000..187a8e0aa4 --- /dev/null +++ b/mkspecs/macx-icc/Info.plist.app @@ -0,0 +1,22 @@ + + + + + NSPrincipalClass + NSApplication + CFBundleIconFile + @ICON@ + CFBundlePackageType + APPL + CFBundleGetInfoString + Created by Qt/QMake + CFBundleSignature + @TYPEINFO@ + CFBundleExecutable + @EXECUTABLE@ + CFBundleIdentifier + com.yourcompany.@EXECUTABLE@ + NOTE + This file was generated by Qt/QMake. + + diff --git a/mkspecs/macx-icc/Info.plist.lib b/mkspecs/macx-icc/Info.plist.lib new file mode 100644 index 0000000000..63f1a945c2 --- /dev/null +++ b/mkspecs/macx-icc/Info.plist.lib @@ -0,0 +1,18 @@ + + + + + CFBundlePackageType + FMWK + CFBundleShortVersionString + @SHORT_VERSION@ + CFBundleGetInfoString + Created by Qt/QMake + CFBundleSignature + @TYPEINFO@ + CFBundleExecutable + @LIBRARY@ + NOTE + Please, do NOT change this file -- It was generated by Qt/QMake. + + From 12571cc095ce1d789f27f94bfc530efb32d9d1b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 5 Aug 2013 17:09:10 +0200 Subject: [PATCH 072/131] Fix tst_QFile::caseSensitivity on OS X By not assuming that the file system is case insensitive. OSX supports both. Change-Id: I11a4ac4cdff97b97b183dd319757a42ae14bb52d Reviewed-by: Gabriel de Dietrich --- tests/auto/corelib/io/qfile/tst_qfile.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp index 42dca7fc66..2b029203e9 100644 --- a/tests/auto/corelib/io/qfile/tst_qfile.cpp +++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp @@ -3255,11 +3255,14 @@ void tst_QFile::objectConstructors() void tst_QFile::caseSensitivity() { -#if defined(Q_OS_WIN) || defined(Q_OS_MAC) +#if defined(Q_OS_WIN) const bool caseSensitive = false; +#elif defined(Q_OS_MAC) + const bool caseSensitive = pathconf(QDir::currentPath().toLatin1().constData(), _PC_CASE_SENSITIVE); #else const bool caseSensitive = true; #endif + QByteArray testData("a little test"); QString filename("File.txt"); { From 8fce4e97ba8479a24bff167ce72ed43223076905 Mon Sep 17 00:00:00 2001 From: Andreas Aardal Hanssen Date: Tue, 30 Jul 2013 18:08:10 +0200 Subject: [PATCH 073/131] Fix double transform for items ignoring parent transformations. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, the topmost untransformable's scene transform, which includes the item's position and local transformation, was used to determine the item's anchoring position. This position was then passed on to be multiplied by the item's transform again. This works fine for toplevel untransformable items that don't have any transform set at all, but those who do would have their transforms applied twice - one to determine the anchoring position, and again to transform the item itself. Since only translation transformations can affect the first operation (the anchoring pos), this bug only applies to items that set ItemIgnoresTransformations and use a local transform that includes translation. Task-number: QTBUG-21618 Change-Id: I772d52d59dfd9f242d0140632a87e9c68dfe0ea1 Reviewed-by: Jan Arve Sæther --- src/widgets/graphicsview/qgraphicsitem.cpp | 11 +++- .../qgraphicsitem/tst_qgraphicsitem.cpp | 61 +++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp index 1c15905ff0..db2b71f508 100644 --- a/src/widgets/graphicsview/qgraphicsitem.cpp +++ b/src/widgets/graphicsview/qgraphicsitem.cpp @@ -4199,9 +4199,14 @@ QTransform QGraphicsItem::deviceTransform(const QTransform &viewportTransform) c return QTransform(); } - // First translate the base untransformable item. - untransformedAncestor->d_ptr->ensureSceneTransform(); - QPointF mappedPoint = (untransformedAncestor->d_ptr->sceneTransform * viewportTransform).map(QPointF(0, 0)); + // Determine the inherited origin. Find the parent of the topmost untransformable. + // Use its scene transform to map the position of the untransformable. Then use + // that viewport position as the anchoring point for the untransformable subtree. + QGraphicsItem *parentOfUntransformedAncestor = untransformedAncestor->parentItem(); + QTransform inheritedMatrix; + if (parentOfUntransformedAncestor) + inheritedMatrix = parentOfUntransformedAncestor->sceneTransform(); + QPointF mappedPoint = (inheritedMatrix * viewportTransform).map(untransformedAncestor->pos()); // COMBINE QTransform matrix = QTransform::fromTranslate(mappedPoint.x(), mappedPoint.y()); diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 3e24257736..9353aa0eba 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -471,6 +471,7 @@ private slots: void QTBUG_16374_crashInDestructor(); void QTBUG_20699_focusScopeCrash(); void QTBUG_30990_rightClickSelection(); + void QTBUG_21618_untransformable_sceneTransform(); private: QList paintedItems; @@ -11496,5 +11497,65 @@ void tst_QGraphicsItem::QTBUG_30990_rightClickSelection() QVERIFY(!item2->isSelected()); } +void tst_QGraphicsItem::QTBUG_21618_untransformable_sceneTransform() +{ + QGraphicsScene scene(0, 0, 150, 150); + scene.addRect(-2, -2, 4, 4); + + QGraphicsItem *item1 = scene.addRect(0, 0, 100, 100, QPen(), Qt::red); + item1->setPos(50, 50); + item1->translate(50, 50); + item1->rotate(90); + QGraphicsItem *item2 = scene.addRect(0, 0, 100, 100, QPen(), Qt::green); + item2->setPos(50, 50); + item2->translate(50, 50); + item2->rotate(90); + item2->setFlags(QGraphicsItem::ItemIgnoresTransformations); + + QGraphicsRectItem *item1_topleft = new QGraphicsRectItem(QRectF(-2, -2, 4, 4)); + item1_topleft->setParentItem(item1); + item1_topleft->setBrush(Qt::black); + QGraphicsRectItem *item1_bottomright = new QGraphicsRectItem(QRectF(-2, -2, 4, 4)); + item1_bottomright->setParentItem(item1); + item1_bottomright->setPos(100, 100); + item1_bottomright->setBrush(Qt::yellow); + + QGraphicsRectItem *item2_topleft = new QGraphicsRectItem(QRectF(-2, -2, 4, 4)); + item2_topleft->setParentItem(item2); + item2_topleft->setBrush(Qt::black); + QGraphicsRectItem *item2_bottomright = new QGraphicsRectItem(QRectF(-2, -2, 4, 4)); + item2_bottomright->setParentItem(item2); + item2_bottomright->setPos(100, 100); + item2_bottomright->setBrush(Qt::yellow); + + QCOMPARE(item1->sceneTransform(), item2->sceneTransform()); + QCOMPARE(item1_topleft->sceneTransform(), item2_topleft->sceneTransform()); + QCOMPARE(item1_bottomright->sceneTransform(), item2_bottomright->sceneTransform()); + QCOMPARE(item1->deviceTransform(QTransform()), item2->deviceTransform(QTransform())); + QCOMPARE(item1->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 100)); + QCOMPARE(item2->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 100)); + QCOMPARE(item1->deviceTransform(QTransform()).map(QPointF(100, 100)), QPointF(0, 200)); + QCOMPARE(item2->deviceTransform(QTransform()).map(QPointF(100, 100)), QPointF(0, 200)); + QCOMPARE(item1_topleft->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 100)); + QCOMPARE(item2_topleft->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 100)); + QCOMPARE(item1_bottomright->deviceTransform(QTransform()).map(QPointF()), QPointF(0, 200)); + QCOMPARE(item2_bottomright->deviceTransform(QTransform()).map(QPointF()), QPointF(0, 200)); + + item2->setParentItem(item1); + + QCOMPARE(item2->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 200)); + QCOMPARE(item2->deviceTransform(QTransform()).map(QPointF(100, 100)), QPointF(0, 300)); + QCOMPARE(item2_topleft->deviceTransform(QTransform()).map(QPointF()), QPointF(100, 200)); + QCOMPARE(item2_bottomright->deviceTransform(QTransform()).map(QPointF()), QPointF(0, 300)); + + QTransform tx = QTransform::fromTranslate(100, 0); + QCOMPARE(item1->deviceTransform(tx).map(QPointF()), QPointF(200, 100)); + QCOMPARE(item1->deviceTransform(tx).map(QPointF(100, 100)), QPointF(100, 200)); + QCOMPARE(item2->deviceTransform(tx).map(QPointF()), QPointF(200, 200)); + QCOMPARE(item2->deviceTransform(tx).map(QPointF(100, 100)), QPointF(100, 300)); + QCOMPARE(item2_topleft->deviceTransform(tx).map(QPointF()), QPointF(200, 200)); + QCOMPARE(item2_bottomright->deviceTransform(tx).map(QPointF()), QPointF(100, 300)); +} + QTEST_MAIN(tst_QGraphicsItem) #include "tst_qgraphicsitem.moc" From 6901d21c1dca04228460c8520266ad2a16d5d523 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 22 Jul 2013 20:33:15 +0200 Subject: [PATCH 074/131] reject unrecognized -no-l* options the -l* fallback is for adding libraries. it obviously makes no sense in its negated form. Task-number: QTBUG-32550 Change-Id: I9f3af9a2fc059ba39987d4b197ed4778cc7f35b6 Reviewed-by: Thiago Macieira Reviewed-by: Joerg Bornemann --- configure | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/configure b/configure index 834b35cdbd..9cbb6ff7fb 100755 --- a/configure +++ b/configure @@ -2342,11 +2342,19 @@ while [ "$#" -gt 0 ]; do CFG_DEFAULT_ANDROID_NDK_TOOLCHAIN_VERSION="$VAL" ;; l*) # -lfoo - L_FLAGS="$L_FLAGS -l\"${VAR#l}\"" + if [ "$VAL" = "yes" ]; then + L_FLAGS="$L_FLAGS -l\"${VAR#l}\"" + else + UNKNOWN_OPT=yes + fi ;; fw*) # -fwfoo - if [ "$BUILD_ON_MAC" = "yes" ]; then - L_FLAGS="$L_FLAGS -framework \"${VAR#fw}\"" + if [ "$VAL" = "yes" ]; then + if [ "$BUILD_ON_MAC" = "yes" ]; then + L_FLAGS="$L_FLAGS -framework \"${VAR#fw}\"" + else + UNKNOWN_OPT=yes + fi else UNKNOWN_OPT=yes fi From 586ab8edb557202baf73091335efdead1a713f43 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Mon, 5 Aug 2013 16:29:00 -0700 Subject: [PATCH 075/131] Fix clang detection of thread_local variables The "0" must have been added because there was no __has_feature for the feature back in the day. Now it exists. Change-Id: I50f0544ae82a8be54a8d26da400e31c1906dad9e Reviewed-by: Olivier Goffart --- src/corelib/global/qcompilerdetection.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h index b685c1fe0d..f899d63a4d 100644 --- a/src/corelib/global/qcompilerdetection.h +++ b/src/corelib/global/qcompilerdetection.h @@ -584,7 +584,7 @@ # if __has_feature(cxx_alias_templates) # define Q_COMPILER_TEMPLATE_ALIAS # endif -# if 0 /* not implemented in clang yet */ +# if __has_feature(cxx_thread_local) # define Q_COMPILER_THREAD_LOCAL # endif # if __has_feature(cxx_user_literals) From 79d7fd924ee68ead7cdf5ac0e9784e54ccb7f57c Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Mon, 5 Aug 2013 14:59:51 +0200 Subject: [PATCH 076/131] tst_qfilesystemmodel: increased test's permitted runtime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This test has recently timed out a few times on OS X test runs, with no relevant changes to account for the timeout. Task-number: QTBUG-27890 Change-Id: Ia24f7812ed2a0b3eac51847a7dacbc9f225b48b8 Reviewed-by: Simo Fält Reviewed-by: Sergio Ahumada --- .../auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro b/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro index fc9ec46e11..d180054ca8 100644 --- a/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro +++ b/tests/auto/widgets/dialogs/qfilesystemmodel/qfilesystemmodel.pro @@ -1,6 +1,7 @@ CONFIG += testcase -# This testcase can be slow on Windows and may interfere with other file system tests. +# This testcase can be slow on Windows and OS X, and may interfere with other file system tests. win32:testcase.timeout = 900 +macx:testcase.timeout = 900 QT += widgets widgets-private QT += core-private gui testlib From c84114acee48a05e2445e7b487ef43e9861ddd95 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Fri, 2 Aug 2013 10:14:01 +0200 Subject: [PATCH 077/131] Android: Fix crash when compiling release mode for armv5 When building in thumb mode for armv5 applications will crash with SIGILL on startup. This has been observed on armv7 devices and emulators. It could be a bug in the gcc 4.4.3 toolchain, but since the other toolchains in the NDK have other bugs that make it impossible to use them for building, we need to disable thumb until the cross-compiler has been fixed. Task-number: QTBUG-31338 Change-Id: I22dd228158ef8c43b0b1d6e549d5725c1930536b Reviewed-by: Thiago Macieira Reviewed-by: Paul Olav Tvete --- mkspecs/android-g++/qmake.conf | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mkspecs/android-g++/qmake.conf b/mkspecs/android-g++/qmake.conf index 48b8e2119a..bcdfe06897 100644 --- a/mkspecs/android-g++/qmake.conf +++ b/mkspecs/android-g++/qmake.conf @@ -109,8 +109,12 @@ equals(ANDROID_TARGET_ARCH, x86) { QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -O2 QMAKE_CFLAGS_DEBUG = -g -fno-omit-frame-pointer } else { # arm - QMAKE_CFLAGS_RELEASE = -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 - QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 + QMAKE_CFLAGS_RELEASE = -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 + QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO = -g -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 + equals(ANDROID_TARGET_ARCH, armeabi-v7a) { + QMAKE_CFLAGS_RELEASE += -mthumb + QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -mthumb + } QMAKE_CFLAGS_DEBUG = -g -marm -O0 -fno-omit-frame-pointer } From 521f2163b16148361d3dfa052a00c597c171d8a4 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Sat, 3 Aug 2013 13:28:06 +0200 Subject: [PATCH 078/131] Fix typos Change-Id: I27cbcd8c59bdc34493931f341341cc25b4aba9e7 Reviewed-by: Kurt Pattyn Reviewed-by: Paul Olav Tvete --- src/plugins/generic/evdevkeyboard/README | 2 +- src/plugins/generic/evdevmouse/README | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/generic/evdevkeyboard/README b/src/plugins/generic/evdevkeyboard/README index 751cc99aa9..0d7b52bd24 100644 --- a/src/plugins/generic/evdevkeyboard/README +++ b/src/plugins/generic/evdevkeyboard/README @@ -1,5 +1,5 @@ On development machines it might be useful to add the input devices -to a group that your development user i part of. Ie add: +to a group that your development user is part of. I.e. add: KERNEL=="event*", SUBSYSTEM=="input", MODE="0640", GROUP="users" to a file such as: diff --git a/src/plugins/generic/evdevmouse/README b/src/plugins/generic/evdevmouse/README index 526106e338..c0dd3db8b3 100644 --- a/src/plugins/generic/evdevmouse/README +++ b/src/plugins/generic/evdevmouse/README @@ -14,7 +14,7 @@ Touchpads reporting absolute events will work too, the positions will be turned into relative. Touchscreens are however not supported. On development machines it might be useful to add the input devices -to a group that your development user i part of. Ie add: +to a group that your development user is part of. I.e. add: KERNEL=="event*", SUBSYSTEM=="input", MODE="0640", GROUP="users" to a file such as: From 608a9c12ae342d7093e949f0153c407f5817e2d8 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Fri, 2 Aug 2013 16:12:40 +0200 Subject: [PATCH 079/131] Enable qsrand() on builds without thread-safe posix The #ifdef clause in qsrand() needs to be the same as in qrand(). Otherwise, we will store the seed in thread-local storage in qsrand(), never passing it into srand(), and then we'll use regular rand() because the rand_r() function is missing, thus always using a random seed of 1 in all applications. Task-number: QTBUG-32781 Change-Id: I00240a1954ae746b87b031f3a0470a6cbe747571 Reviewed-by: Thiago Macieira --- src/corelib/global/qglobal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index bcd0d06777..85cb698afc 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -2322,7 +2322,7 @@ Q_GLOBAL_STATIC(SeedStorage, randTLS) // Thread Local Storage for seed value */ void qsrand(uint seed) { -#if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD) +#if defined(Q_OS_UNIX) && !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && (_POSIX_THREAD_SAFE_FUNCTIONS - 0 > 0) SeedStorage *seedStorage = randTLS(); if (seedStorage) { SeedStorageType *pseed = seedStorage->localData(); From 7a3653887cc6e551bb9fc645fb32c3b682479f42 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 9 Jul 2013 00:12:58 -0700 Subject: [PATCH 080/131] Remove unused socket from QNetworkInterface Unix code This must be a relic from old code, before I split out the code that uses getifaddrs from the code that doesn't. Change-Id: Ia1265da6921c7c7a3dc97315d98fed50b3d2fe1c Reviewed-by: Richard J. Moore Reviewed-by: Peter Hartmann Reviewed-by: Jonas Gastal --- src/network/kernel/qnetworkinterface_unix.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp index 0ec9554c82..80cc5db700 100644 --- a/src/network/kernel/qnetworkinterface_unix.cpp +++ b/src/network/kernel/qnetworkinterface_unix.cpp @@ -410,14 +410,9 @@ static QList interfaceListing() { QList interfaces; - int socket; - if ((socket = qt_safe_socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) == -1) - return interfaces; // error - ifaddrs *interfaceListing; if (getifaddrs(&interfaceListing) == -1) { // error - ::close(socket); return interfaces; } @@ -452,7 +447,6 @@ static QList interfaceListing() } freeifaddrs(interfaceListing); - ::close(socket); return interfaces; } #endif From dae087b30f4b88b24ffb233624f1b3f44285a123 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Sat, 13 Jul 2013 12:02:57 +0200 Subject: [PATCH 081/131] Avoid one extra if_indextoname per address in QNetworkInterface Given an IPv6 address associated with a network interface, there's a fairly high chance (of 100%) that any scope ID found is that of the interface. Change-Id: Id7315473f39b68ee4c169207168dc2e60fd7d570 Reviewed-by: Richard J. Moore Reviewed-by: Peter Hartmann Reviewed-by: Jonas Gastal --- src/network/kernel/qnetworkinterface_unix.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp index 80cc5db700..b090213861 100644 --- a/src/network/kernel/qnetworkinterface_unix.cpp +++ b/src/network/kernel/qnetworkinterface_unix.cpp @@ -81,7 +81,7 @@ QT_BEGIN_NAMESPACE -static QHostAddress addressFromSockaddr(sockaddr *sa) +static QHostAddress addressFromSockaddr(sockaddr *sa, int ifindex = 0, const QString &ifname = QString()) { QHostAddress address; if (!sa) @@ -92,7 +92,11 @@ static QHostAddress addressFromSockaddr(sockaddr *sa) else if (sa->sa_family == AF_INET6) { address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr); int scope = ((sockaddr_in6 *)sa)->sin6_scope_id; - if (scope) { + if (scope && scope == ifindex) { + // this is the most likely scenario: + // a scope ID in a socket is that of the interface this address came from + address.setScopeId(ifname); + } else if (scope) { #ifndef QT_NO_IPV6IFNAME char scopeid[IFNAMSIZ]; if (::if_indextoname(scope, scopeid)) { @@ -434,14 +438,14 @@ static QList interfaceListing() } QNetworkAddressEntry entry; - entry.setIp(addressFromSockaddr(ptr->ifa_addr)); + entry.setIp(addressFromSockaddr(ptr->ifa_addr, iface->index, iface->name)); if (entry.ip().isNull()) // could not parse the address continue; - entry.setNetmask(addressFromSockaddr(ptr->ifa_netmask)); + entry.setNetmask(addressFromSockaddr(ptr->ifa_netmask, iface->index, iface->name)); if (iface->flags & QNetworkInterface::CanBroadcast) - entry.setBroadcast(addressFromSockaddr(ptr->ifa_broadaddr)); + entry.setBroadcast(addressFromSockaddr(ptr->ifa_broadaddr, iface->index, iface->name)); iface->addressEntries << entry; } From 08d3b0165ae49a9ca019b7074423606492856b70 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Tue, 6 Aug 2013 10:49:23 +0200 Subject: [PATCH 082/131] test: Mark tst_QRawFont::fromFont() as XFAIL Mark some tests as expected failures on OS X 10.8 - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=0, writingSystem=0) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=0, writingSystem=5) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=0, writingSystem=1) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=1, writingSystem=0) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=1, writingSystem=5) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=1, writingSystem=1) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=2, writingSystem=0) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=2, writingSystem=5) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=2, writingSystem=1) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=3, writingSystem=0) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=3, writingSystem=5) - tst_QRawFont::fromFont(testfont.ttf, hintingPreference=3, writingSystem=1) Task-number: QTBUG-32654 Change-Id: I46d64852ccb751824a2eff68513389baa52c1baf Reviewed-by: Frederik Gladhorn --- tests/auto/gui/text/qrawfont/tst_qrawfont.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp index ae6e450301..19f60baa29 100644 --- a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp +++ b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp @@ -675,6 +675,10 @@ void tst_QRawFont::fromFont() QFontDatabase fontDatabase; int id = fontDatabase.addApplicationFont(fileName); +#ifdef Q_OS_MACX + if (QSysInfo::MacintoshVersion == QSysInfo::MV_10_8) + QEXPECT_FAIL("", "See QTBUG-32654", Abort); +#endif QVERIFY(id >= 0); QFont font(familyName); From 9a061a0a2c6dcf2248653396f3c5ec867a2f8aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 17 Jul 2013 21:55:18 +0200 Subject: [PATCH 083/131] Remove unused member in QEventLoop auto-test Change-Id: Icd6a09402c3cf14286f4ba1f8f4c99ac483ec1a3 Reviewed-by: Gabriel de Dietrich Reviewed-by: Frederik Gladhorn --- tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp b/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp index 25e5f03566..c696c6e21a 100644 --- a/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp +++ b/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp @@ -580,7 +580,7 @@ class JobObject : public QObject public: explicit JobObject(QEventLoop *loop, QObject *parent = 0) - : QObject(parent), loop(loop), locker(loop) + : QObject(parent), locker(loop) { } @@ -606,7 +606,6 @@ signals: void done(); private: - QEventLoop *loop; QEventLoopLocker locker; }; From 4ca4fb93f666820ab10fc0e17f54b2b777540779 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Tue, 6 Aug 2013 11:56:03 +0200 Subject: [PATCH 084/131] Expect fail broken font family from QFontDatabase on OS X 10.8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I682d58350427975a692b523095c1c38e1891663f Reviewed-by: Tor Arne Vestbø --- tests/auto/gui/text/qfont/tst_qfont.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/auto/gui/text/qfont/tst_qfont.cpp b/tests/auto/gui/text/qfont/tst_qfont.cpp index b8cce2671f..082bb94b60 100644 --- a/tests/auto/gui/text/qfont/tst_qfont.cpp +++ b/tests/auto/gui/text/qfont/tst_qfont.cpp @@ -667,6 +667,15 @@ void tst_QFont::defaultFamily_data() void tst_QFont::defaultFamily() { +#if defined(Q_OS_MAC) + if (QSysInfo::MacintoshVersion == QSysInfo::MV_10_8) { + QEXPECT_FAIL("serif", "See QTBUG-32834", Continue); + QEXPECT_FAIL("monospace", "See QTBUG-32834", Continue); + QEXPECT_FAIL("cursive", "See QTBUG-32834", Continue); + QEXPECT_FAIL("fantasy", "See QTBUG-32834", Continue); + } +#endif + QFETCH(QFont::StyleHint, styleHint); QFETCH(QStringList, acceptableFamilies); From bf7129af979412102e0dd4c23d9152dfb26fe7b1 Mon Sep 17 00:00:00 2001 From: Bernd Weimer Date: Mon, 5 Aug 2013 17:46:55 +0200 Subject: [PATCH 085/131] Fixed tst_qgl for fullscreen platforms Replaced show() with showNormal(). Change-Id: Ia6e7f34587090de5019f9ca9cb82a44e7cf495e5 Reviewed-by: Rafael Roquetto --- tests/auto/opengl/qgl/tst_qgl.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/auto/opengl/qgl/tst_qgl.cpp b/tests/auto/opengl/qgl/tst_qgl.cpp index 3fc89acb67..38c92c7610 100644 --- a/tests/auto/opengl/qgl/tst_qgl.cpp +++ b/tests/auto/opengl/qgl/tst_qgl.cpp @@ -1288,7 +1288,7 @@ void tst_QGL::glFBOUseInGLWidget() FBOUseInGLWidget w; w.resize(100, 100); - w.show(); + w.showNormal(); QVERIFY(QTest::qWaitForWindowExposed(&w)); @@ -1774,7 +1774,7 @@ void tst_QGL::clipTest() { ClipTestGLWidget glw; glw.resize(220, 220); - glw.show(); + glw.showNormal(); QVERIFY(QTest::qWaitForWindowExposed(&glw)); From 488f7a31ffbe86730d7dc885a3e71e8cc56b506f Mon Sep 17 00:00:00 2001 From: Shawn Rutledge Date: Tue, 6 Aug 2013 17:18:46 +0200 Subject: [PATCH 086/131] Don't crash if the QWindow's screen is temporarily invalid It can happen during the transition between screens when one screen is disconnected that the window doesn't have a screen. Task-number: QTBUG-32681 Change-Id: I066855a2ffe80f0680a3044e73f4f491c2c0eb5c Reviewed-by: Thiago Macieira Reviewed-by: Gunnar Sletta --- src/gui/kernel/qplatformscreen.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gui/kernel/qplatformscreen.cpp b/src/gui/kernel/qplatformscreen.cpp index 43db0e5f8e..05d04ae4ee 100644 --- a/src/gui/kernel/qplatformscreen.cpp +++ b/src/gui/kernel/qplatformscreen.cpp @@ -232,6 +232,10 @@ void QPlatformScreen::setOrientationUpdateMask(Qt::ScreenOrientations mask) QPlatformScreen * QPlatformScreen::platformScreenForWindow(const QWindow *window) { + // QTBUG 32681: It can happen during the transition between screens + // when one screen is disconnected that the window doesn't have a screen. + if (!window->screen()) + return 0; return window->screen()->handle(); } From 4881f9db7cf338f8dc5233591bd5c11ecd2f8ca9 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Mon, 5 Aug 2013 14:38:36 +0200 Subject: [PATCH 087/131] Mac Style: Fix 1-pixel text offset in combo box Change-Id: Ie1bb2b300d6897659f4652c22884f1bd611cd3c4 Reviewed-by: Jens Bache-Wiig --- src/widgets/styles/qmacstyle_mac.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index 9119e2cfba..0b860450d1 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -3741,6 +3741,8 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter comboCopy.direction = Qt::LeftToRight; if ((opt->state & QStyle::State_Small) && QSysInfo::macVersion() > QSysInfo::MV_10_6) comboCopy.rect.translate(0, w ? -1 : -2); // Supports Qt Quick Controls + else if (QSysInfo::macVersion() > QSysInfo::MV_10_8) + comboCopy.rect.translate(0, 1); QCommonStyle::drawControl(CE_ComboBoxLabel, &comboCopy, p, w); } break; From 5885b8f775998c30d53f40b7f368c5f6364e6df4 Mon Sep 17 00:00:00 2001 From: Dario Freddi Date: Wed, 7 Aug 2013 11:17:25 +0200 Subject: [PATCH 088/131] qobject: Do not destroy slot objects inside a lock This prevents deadlocks in case the destructor re-enters. (Example: a functor containing a QSharedPointer of a QObject) This also fixes a leaked slot object in disconnectHelper. Change-Id: Ia939790e3b54e64067b99540974306b4808a77f2 Reviewed-by: Olivier Goffart --- src/corelib/kernel/qobject.cpp | 34 ++++++++--- .../corelib/kernel/qobject/tst_qobject.cpp | 58 ++++++++++++++++--- 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 02794e9fe3..33e2adf5ba 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -816,6 +816,14 @@ QObject::~QObject() m->unlock(); connectionList.first = c->nextConnectionList; + + // The destroy operation must happen outside the lock + if (c->isSlotObject) { + locker.unlock(); + c->slotObj->destroyIfLastRef(); + c->isSlotObject = false; + locker.relock(); + } c->deref(); } } @@ -3135,6 +3143,13 @@ bool QMetaObjectPrivate::disconnectHelper(QObjectPrivate::Connection *c, c->receiver = 0; + if (c->isSlotObject) { + senderMutex->unlock(); + c->slotObj->destroyIfLastRef(); + c->isSlotObject = false; + senderMutex->lock(); + } + success = true; if (disconnectType == DisconnectOne) @@ -4363,16 +4378,19 @@ bool QObject::disconnect(const QMetaObject::Connection &connection) QMutex *senderMutex = signalSlotLock(c->sender); QMutex *receiverMutex = signalSlotLock(c->receiver); - QOrderedMutexLocker locker(senderMutex, receiverMutex); - QObjectConnectionListVector *connectionLists = QObjectPrivate::get(c->sender)->connectionLists; - Q_ASSERT(connectionLists); - connectionLists->dirty = true; + { + QOrderedMutexLocker locker(senderMutex, receiverMutex); - *c->prev = c->next; - if (c->next) - c->next->prev = c->prev; - c->receiver = 0; + QObjectConnectionListVector *connectionLists = QObjectPrivate::get(c->sender)->connectionLists; + Q_ASSERT(connectionLists); + connectionLists->dirty = true; + + *c->prev = c->next; + if (c->next) + c->next->prev = c->prev; + c->receiver = 0; + } // destroy the QSlotObject, if possible if (c->isSlotObject) { diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index d16369de02..1cdf39018b 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -5726,27 +5726,44 @@ void tst_QObject::connectFunctorOverloads() #endif } +class GetSenderObject : public QObject +{ + Q_OBJECT +public: + QObject *accessSender() { return sender(); } + +public Q_SLOTS: + void triggerSignal() { Q_EMIT aSignal(); } + +Q_SIGNALS: + void aSignal(); +}; + static int countedStructObjectsCount = 0; struct CountedStruct { - CountedStruct() { ++countedStructObjectsCount; } - CountedStruct(const CountedStruct &) { ++countedStructObjectsCount; } + CountedStruct() : sender(Q_NULLPTR) { ++countedStructObjectsCount; } + CountedStruct(GetSenderObject *sender) : sender(sender) { ++countedStructObjectsCount; } + CountedStruct(const CountedStruct &o) : sender(o.sender) { ++countedStructObjectsCount; } CountedStruct &operator=(const CountedStruct &) { return *this; } - ~CountedStruct() { --countedStructObjectsCount; } - void operator()() const {} + // accessSender here allows us to check if there's a deadlock + ~CountedStruct() { --countedStructObjectsCount; if (sender != Q_NULLPTR) (void)sender->accessSender(); } + void operator()() const { } + + GetSenderObject *sender; }; void tst_QObject::disconnectDoesNotLeakFunctor() { QCOMPARE(countedStructObjectsCount, 0); { + GetSenderObject obj; QMetaObject::Connection c; { - CountedStruct s; + CountedStruct s(&obj); QCOMPARE(countedStructObjectsCount, 1); - QTimer timer; - c = connect(&timer, &QTimer::timeout, s); + c = connect(&obj, &GetSenderObject::aSignal, s); QVERIFY(c); QCOMPARE(countedStructObjectsCount, 2); QVERIFY(QObject::disconnect(c)); @@ -5796,6 +5813,33 @@ void tst_QObject::disconnectDoesNotLeakFunctor() QCOMPARE(countedStructObjectsCount, 0); // functor being destroyed } QCOMPARE(countedStructObjectsCount, 0); + { + QTimer *timer = new QTimer; + QEventLoop e; + + connect(timer, &QTimer::timeout, CountedStruct()); + QCOMPARE(countedStructObjectsCount, 1); // only one instance, in Qt internals + timer->deleteLater(); + connect(timer, &QObject::destroyed, &e, &QEventLoop::quit, Qt::QueuedConnection); + e.exec(); + QCOMPARE(countedStructObjectsCount, 0); // functor being destroyed + } + QCOMPARE(countedStructObjectsCount, 0); + { + GetSenderObject obj; + + connect(&obj, &GetSenderObject::aSignal, CountedStruct(&obj)); + QCOMPARE(countedStructObjectsCount, 1); + } + QCOMPARE(countedStructObjectsCount, 0); + { + GetSenderObject obj; + + connect(&obj, &GetSenderObject::aSignal, CountedStruct(&obj)); + QCOMPARE(countedStructObjectsCount, 1); + QObject::disconnect(&obj, &GetSenderObject::aSignal, 0, 0); + } + QCOMPARE(countedStructObjectsCount, 0); { #if defined(Q_COMPILER_LAMBDA) CountedStruct s; From e6218ecfb55d67397331213663043e9fb71fcdb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Tue, 6 Aug 2013 15:00:07 +0200 Subject: [PATCH 089/131] Improve tst_QFileInfo::compare() test, but mark as QEXPECT_FAIL on Mac As Qt still thinks that all UNIX filesystems are case sensitive, which is not the case for eg Mac, where they might be both, as well as for mounts of other filesystems. Change-Id: I07b8550685bfa17ac407c20ac991dc54df040942 Reviewed-by: Gabriel de Dietrich --- .../auto/corelib/io/qfileinfo/tst_qfileinfo.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp index bcc971bf4b..af2578ac37 100644 --- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp +++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp @@ -916,16 +916,6 @@ void tst_QFileInfo::compare_data() QTest::addColumn("file2"); QTest::addColumn("same"); -#if defined(Q_OS_MAC) - // Since 10.6 we use realpath() in qfsfileengine, and it properly handles - // file system case sensitivity. However here in the autotest we don't - // check if the file system is case sensitive, so to make it pass in the - // default OS X installation we assume we are running on a case insensitive - // file system if on 10.6 and on a case sensitive file system if on 10.5 - bool caseSensitiveOnMac = true; - if (QSysInfo::MacintoshVersion >= QSysInfo::MV_10_6) - caseSensitiveOnMac = false; -#endif QString caseChangedSource = m_sourceFile; caseChangedSource.replace("info", "Info"); @@ -947,7 +937,7 @@ void tst_QFileInfo::compare_data() #if defined(Q_OS_WIN) << true; #elif defined(Q_OS_MAC) - << !caseSensitiveOnMac; + << !pathconf(QDir::currentPath().toLatin1().constData(), _PC_CASE_SENSITIVE); #else << false; #endif @@ -955,6 +945,11 @@ void tst_QFileInfo::compare_data() void tst_QFileInfo::compare() { +#if defined(Q_OS_MAC) + if (qstrcmp(QTest::currentDataTag(), "casesense1") == 0) + QSKIP("Qt thinks all UNIX filesystems are case sensitive, see QTBUG-28246"); +#endif + QFETCH(QString, file1); QFETCH(QString, file2); QFETCH(bool, same); From feacbdb746681d8c51c78a6082d456c498b843b4 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Thu, 25 Jul 2013 14:40:06 +0200 Subject: [PATCH 090/131] Android: Get SSL root certificates from TrustManager On Android, when not using Ministro, we cannot read certificates from the file system, so we have to get them through Java APIs instead. Reviewed-by: Eskil Abrahamsen Blomfeldt (cherry picked from commit 591584d9a940d374e20a62573d71054e0081c6ac) Task-Number: QTBUG-32508 Change-Id: Ia157e28bc3b2c141e3444d628e7a7c59eca39db0 Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../org/qtproject/qt5/android/QtNative.java | 33 ++++ src/network/ssl/qsslsocket_openssl.cpp | 69 ++++--- .../ssl/qsslsocket_openssl_android.cpp | 179 ++++++++++++++++++ src/network/ssl/qsslsocket_p.h | 3 + src/network/ssl/ssl.pri | 2 + 5 files changed, 255 insertions(+), 31 deletions(-) create mode 100644 src/network/ssl/qsslsocket_openssl_android.cpp diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 4586ae2002..22e3701e47 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -57,6 +57,12 @@ import android.view.ContextMenu; import android.view.Menu; import android.view.MotionEvent; +import java.security.KeyStore; +import java.security.cert.X509Certificate; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + public class QtNative { private static Activity m_activity = null; @@ -534,6 +540,33 @@ public class QtNative }); } + private static byte[][] getSSLCertificates() + { + ArrayList certificateList = new ArrayList(); + + try { + TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + factory.init((KeyStore) null); + + for (TrustManager manager : factory.getTrustManagers()) { + if (manager instanceof X509TrustManager) { + X509TrustManager trustManager = (X509TrustManager) manager; + + for (X509Certificate certificate : trustManager.getAcceptedIssuers()) { + byte buffer[] = certificate.getEncoded(); + certificateList.add(buffer); + } + } + } + } catch (Exception e) { + Log.e(QtTAG, "Failed to get certificates", e); + } + + byte[][] certificateArray = new byte[certificateList.size()][]; + certificateArray = certificateList.toArray(certificateArray); + return certificateArray; + } + // screen methods public static native void setDisplayMetrics(int screenWidthPixels, int screenHeightPixels, diff --git a/src/network/ssl/qsslsocket_openssl.cpp b/src/network/ssl/qsslsocket_openssl.cpp index 675bd7d9f7..4e6275f306 100644 --- a/src/network/ssl/qsslsocket_openssl.cpp +++ b/src/network/ssl/qsslsocket_openssl.cpp @@ -686,41 +686,48 @@ QList QSslSocketPrivate::systemCaCertificates() } #elif defined(Q_OS_UNIX) QSet certFiles; -# ifdef Q_OS_ANDROID - QList directories; - directories << qgetenv("MINISTRO_SSL_CERTS_PATH"); // Set by Ministro -# else - QList directories = unixRootCertDirectories(); -# endif QDir currentDir; QStringList nameFilters; -# ifdef Q_OS_ANDROID - nameFilters << QLatin1String("*.der"); -#else - nameFilters << QLatin1String("*.pem") << QLatin1String("*.crt"); -# endif - currentDir.setNameFilters(nameFilters); - for (int a = 0; a < directories.count(); a++) { - currentDir.setPath(QLatin1String(directories.at(a))); - QDirIterator it(currentDir); - while(it.hasNext()) { - it.next(); - // use canonical path here to not load the same certificate twice if symlinked - certFiles.insert(it.fileInfo().canonicalFilePath()); - } - } - QSetIterator it(certFiles); - while(it.hasNext()) { -# ifdef Q_OS_ANDROID - systemCerts.append(QSslCertificate::fromPath(it.next(), QSsl::Der)); -# else - systemCerts.append(QSslCertificate::fromPath(it.next(), QSsl::Pem)); -# endif - } + QList directories; + QSsl::EncodingFormat platformEncodingFormat; # ifndef Q_OS_ANDROID - systemCerts.append(QSslCertificate::fromPath(QLatin1String("/etc/pki/tls/certs/ca-bundle.crt"), QSsl::Pem)); // Fedora, Mandriva - systemCerts.append(QSslCertificate::fromPath(QLatin1String("/usr/local/share/certs/ca-root-nss.crt"), QSsl::Pem)); // FreeBSD's ca_root_nss + directories = unixRootCertDirectories(); + nameFilters << QLatin1String("*.pem") << QLatin1String("*.crt"); + platformEncodingFormat = QSsl::Pem; +# else + // Q_OS_ANDROID + QByteArray ministroPath = qgetenv("MINISTRO_SSL_CERTS_PATH"); // Set by Ministro + directories << ministroPath; + nameFilters << QLatin1String("*.der"); + platformEncodingFormat = QSsl::Der; +# ifndef Q_OS_ANDROID_NO_SDK + if (ministroPath.isEmpty()) { + QList certificateData = fetchSslCertificateData(); + for (int i = 0; i < certificateData.size(); ++i) { + systemCerts.append(QSslCertificate::fromData(certificateData.at(i), QSsl::Der)); + } + } else +# endif //Q_OS_ANDROID_NO_SDK +# endif //Q_OS_ANDROID + { + currentDir.setNameFilters(nameFilters); + for (int a = 0; a < directories.count(); a++) { + currentDir.setPath(QLatin1String(directories.at(a))); + QDirIterator it(currentDir); + while (it.hasNext()) { + it.next(); + // use canonical path here to not load the same certificate twice if symlinked + certFiles.insert(it.fileInfo().canonicalFilePath()); + } + } + QSetIterator it(certFiles); + while (it.hasNext()) + systemCerts.append(QSslCertificate::fromPath(it.next(), platformEncodingFormat)); +# ifndef Q_OS_ANDROID + systemCerts.append(QSslCertificate::fromPath(QLatin1String("/etc/pki/tls/certs/ca-bundle.crt"), QSsl::Pem)); // Fedora, Mandriva + systemCerts.append(QSslCertificate::fromPath(QLatin1String("/usr/local/share/certs/ca-root-nss.crt"), QSsl::Pem)); // FreeBSD's ca_root_nss # endif + } #endif #ifdef QSSLSOCKET_DEBUG qDebug() << "systemCaCertificates retrieval time " << timer.elapsed() << "ms"; diff --git a/src/network/ssl/qsslsocket_openssl_android.cpp b/src/network/ssl/qsslsocket_openssl_android.cpp new file mode 100644 index 0000000000..fa612a75a6 --- /dev/null +++ b/src/network/ssl/qsslsocket_openssl_android.cpp @@ -0,0 +1,179 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtNetwork module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/**************************************************************************** +** +** In addition, as a special exception, the copyright holders listed above give +** permission to link the code of its release of Qt with the OpenSSL project's +** "OpenSSL" library (or modified versions of the "OpenSSL" library that use the +** same license as the original version), and distribute the linked executables. +** +** You must comply with the GNU General Public License version 2 in all +** respects for all of the code used other than the "OpenSSL" code. If you +** modify this file, you may extend this exception to your version of the file, +** but you are not obligated to do so. If you do not wish to do so, delete +** this exception statement from your version of this file. +** +****************************************************************************/ + +#include "qsslsocket_openssl_p.h" + + + +#include +#include + +static JavaVM *javaVM = 0; +static jclass appClass; + +static jmethodID getSslCertificatesMethodID; + +struct AttachedJNIEnv +{ + AttachedJNIEnv() + { + attached = false; + if (javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) < 0) { + if (javaVM->AttachCurrentThread(&jniEnv, NULL) < 0) { + __android_log_print(ANDROID_LOG_ERROR, "Qt", "AttachCurrentThread failed"); + jniEnv = 0; + return; + } + attached = true; + } + } + + ~AttachedJNIEnv() + { + if (attached) + javaVM->DetachCurrentThread(); + } + bool attached; + JNIEnv *jniEnv; +}; + +static const char logTag[] = "Qt"; +static const char classErrorMsg[] = "Can't find class \"%s\""; +static const char methodErrorMsg[] = "Can't find method \"%s%s\""; + + +#define FIND_AND_CHECK_CLASS(CLASS_NAME) \ +clazz = env->FindClass(CLASS_NAME); \ +if (!clazz) { \ + __android_log_print(ANDROID_LOG_FATAL, logTag, classErrorMsg, CLASS_NAME); \ + return JNI_FALSE; \ +} + +#define GET_AND_CHECK_STATIC_METHOD(VAR, CLASS, METHOD_NAME, METHOD_SIGNATURE) \ +VAR = env->GetStaticMethodID(CLASS, METHOD_NAME, METHOD_SIGNATURE); \ +if (!VAR) { \ + __android_log_print(ANDROID_LOG_FATAL, logTag, methodErrorMsg, METHOD_NAME, METHOD_SIGNATURE); \ + return JNI_FALSE; \ +} + +static bool registerNatives(JNIEnv *env) +{ + jclass clazz; + FIND_AND_CHECK_CLASS("org/qtproject/qt5/android/QtNative"); + appClass = static_cast(env->NewGlobalRef(clazz)); + +#if 0 //we don't call C++ functions from Java at this time + if (env->RegisterNatives(appClass, methods, sizeof(methods) / sizeof(methods[0])) < 0) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "RegisterNatives failed"); + return JNI_FALSE; + } +#endif + + GET_AND_CHECK_STATIC_METHOD(getSslCertificatesMethodID, appClass, "getSSLCertificates", "()[[B"); + + return true; +} + +Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/) +{ + typedef union { + JNIEnv *nativeEnvironment; + void *venv; + } UnionJNIEnvToVoid; + + __android_log_print(ANDROID_LOG_INFO, logTag, "Network start"); + UnionJNIEnvToVoid uenv; + uenv.venv = NULL; + javaVM = 0; + + if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "GetEnv failed"); + return -1; + } + JNIEnv *env = uenv.nativeEnvironment; + if (!registerNatives(env)) { + __android_log_print(ANDROID_LOG_FATAL, logTag, "registerNatives failed"); + return -1; + } + + javaVM = vm; + return JNI_VERSION_1_4; +} + +QList QSslSocketPrivate::fetchSslCertificateData() +{ + QList certificateData; + AttachedJNIEnv env; + + if (env.jniEnv) { + jobjectArray jcertificates = + static_cast(env.jniEnv->CallStaticObjectMethod(appClass, getSslCertificatesMethodID)); + jint nCertificates = env.jniEnv->GetArrayLength(jcertificates); + + for (int i = 0; i < nCertificates; ++i) { + jbyteArray jCert = static_cast(env.jniEnv->GetObjectArrayElement(jcertificates, i)); + + const uint sz = env.jniEnv->GetArrayLength(jCert); + jbyte *buffer = env.jniEnv->GetByteArrayElements(jCert, 0); + certificateData.append(QByteArray(reinterpret_cast(buffer), sz)); + + env.jniEnv->ReleaseByteArrayElements(jCert, buffer, JNI_ABORT); // don't copy back the elements + env.jniEnv->DeleteLocalRef(jCert); + } + } + + return certificateData; +} diff --git a/src/network/ssl/qsslsocket_p.h b/src/network/ssl/qsslsocket_p.h index 9369dab8e7..6ce34ba06f 100644 --- a/src/network/ssl/qsslsocket_p.h +++ b/src/network/ssl/qsslsocket_p.h @@ -197,6 +197,9 @@ public: private: static bool ensureLibraryLoaded(); static void ensureCiphersAndCertsLoaded(); +#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_NO_SDK) + static QList fetchSslCertificateData(); +#endif static bool s_libraryLoaded; static bool s_loadedCiphersAndCerts; diff --git a/src/network/ssl/ssl.pri b/src/network/ssl/ssl.pri index 1d8c8e1ab7..0fe231357b 100644 --- a/src/network/ssl/ssl.pri +++ b/src/network/ssl/ssl.pri @@ -28,6 +28,8 @@ contains(QT_CONFIG, openssl) | contains(QT_CONFIG, openssl-linked) { ssl/qsslcertificateextension.cpp \ ssl/qsslcontext.cpp +android:!android-no-sdk: SOURCES += ssl/qsslsocket_openssl_android.cpp + # Add optional SSL libs # Static linking of OpenSSL with msvc: # - Binaries http://slproweb.com/products/Win32OpenSSL.html From cffd1633b267d0034627756296e61abcc0ef50be Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 7 Aug 2013 14:23:18 +0200 Subject: [PATCH 091/131] Fix QCompleter::activated(QModelIndex) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When falling back to the completion prefix, make sure to also pass an invalid index to activated(). Change-Id: I6b282a01c95492466890632b77837bcc96eb038a Reviewed-by: Stephen Kelly Reviewed-by: Thorbjørn Lund Martsum --- src/widgets/util/qcompleter.cpp | 1 + tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/widgets/util/qcompleter.cpp b/src/widgets/util/qcompleter.cpp index 64b7b12e90..18c8ed2bd2 100644 --- a/src/widgets/util/qcompleter.cpp +++ b/src/widgets/util/qcompleter.cpp @@ -829,6 +829,7 @@ void QCompleterPrivate::_q_complete(QModelIndex index, bool highlighted) if (!index.isValid() || (!proxy->showAll && (index.row() >= proxy->engine->matchCount()))) { completion = prefix; + index = QModelIndex(); } else { if (!(index.flags() & Qt::ItemIsEnabled)) return; diff --git a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp index 0f7993540c..3a6fca7146 100644 --- a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp +++ b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp @@ -1305,10 +1305,15 @@ void tst_QCompleter::task246056_setCompletionPrefix() comboBox.show(); QApplication::setActiveWindow(&comboBox); QVERIFY(QTest::qWaitForWindowActive(&comboBox)); + QSignalSpy spy(comboBox.completer(), SIGNAL(activated(QModelIndex))); QTest::keyPress(&comboBox, 'a'); QTest::keyPress(comboBox.completer()->popup(), Qt::Key_Down); QTest::keyPress(comboBox.completer()->popup(), Qt::Key_Down); QTest::keyPress(comboBox.completer()->popup(), Qt::Key_Enter); // don't crash! + QCOMPARE(spy.count(), 1); + QList arguments = spy.at(0); + QModelIndex index = arguments.at(0).value(); + QVERIFY(!index.isValid()); } class task250064_TextEdit : public QTextEdit From 0b62a5d3c931aa4d91b986ec518567e9463a6360 Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Tue, 6 Aug 2013 21:39:25 +0200 Subject: [PATCH 092/131] Add offset reading support in pnghandler This patch adds the offset reading that matches the offset writing in writeImage Task-number: QTBUG-32674 Change-Id: I264ba41163e59638d7219e0a8913f9d455830883 Reviewed-by: aavit --- src/gui/image/qpnghandler.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/gui/image/qpnghandler.cpp b/src/gui/image/qpnghandler.cpp index 1e906e0d92..e43ac666c7 100644 --- a/src/gui/image/qpnghandler.cpp +++ b/src/gui/image/qpnghandler.cpp @@ -408,9 +408,14 @@ static void read_image_scaled(QImage *outImage, png_structp png_ptr, png_infop i png_uint_32 width; png_uint_32 height; + png_int_32 offset_x; + png_int_32 offset_y; + int bit_depth; int color_type; + int unit_type; png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, 0, 0, 0); + png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, &unit_type); uchar *data = outImage->bits(); int bpl = outImage->bytesPerLine(); @@ -470,6 +475,10 @@ static void read_image_scaled(QImage *outImage, png_structp png_ptr, png_infop i outImage->setDotsPerMeterX((png_get_x_pixels_per_meter(png_ptr,info_ptr)*oxsz)/ixsz); outImage->setDotsPerMeterY((png_get_y_pixels_per_meter(png_ptr,info_ptr)*oysz)/iysz); + + if (unit_type == PNG_OFFSET_PIXEL) + outImage->setOffset(QPoint(offset_x*oxsz/ixsz, offset_y*oysz/iysz)); + } #if defined(Q_C_CALLBACKS) @@ -550,7 +559,6 @@ bool Q_INTERNAL_WIN_NO_THROW QPngHandlerPrivate::readPngHeader() return true; } - bool Q_INTERNAL_WIN_NO_THROW QPngHandlerPrivate::readPngImage(QImage *outImage) { if (state == Error) @@ -585,9 +593,14 @@ bool Q_INTERNAL_WIN_NO_THROW QPngHandlerPrivate::readPngImage(QImage *outImage) } else { png_uint_32 width; png_uint_32 height; + png_int_32 offset_x; + png_int_32 offset_y; + int bit_depth; int color_type; + int unit_type; png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, 0, 0, 0); + png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, &unit_type); uchar *data = outImage->bits(); int bpl = outImage->bytesPerLine(); amp.row_pointers = new png_bytep[height]; @@ -601,6 +614,9 @@ bool Q_INTERNAL_WIN_NO_THROW QPngHandlerPrivate::readPngImage(QImage *outImage) outImage->setDotsPerMeterX(png_get_x_pixels_per_meter(png_ptr,info_ptr)); outImage->setDotsPerMeterY(png_get_y_pixels_per_meter(png_ptr,info_ptr)); + if (unit_type == PNG_OFFSET_PIXEL) + outImage->setOffset(QPoint(offset_x, offset_y)); + // sanity check palette entries if (color_type == PNG_COLOR_TYPE_PALETTE && outImage->format() == QImage::Format_Indexed8) { int color_table_size = outImage->colorCount(); From f8ce891d22ebf8e053c0772ce66f3bbad1849a3c Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Tue, 6 Aug 2013 10:34:19 +0200 Subject: [PATCH 093/131] test: Mark tst_QSettings::ctor() and tst_QSettings::rainersSyncBugOnMac(native) as XFAIL Mark some tests as expected failures on OS X 10.8 - tst_QSettings::ctor(native) - tst_QSettings::ctor(ini) - tst_QSettings::ctor(custom1) - tst_QSettings::ctor(custom2) - tst_QSettings::rainersSyncBugOnMac(native) Task-number: QTBUG-32655 Change-Id: I54928d991a8ccf300b40747feaa6fda9d124781b Reviewed-by: Gabriel de Dietrich --- tests/auto/corelib/io/qsettings/tst_qsettings.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp index c2909cf7c5..aec8d1b241 100644 --- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp +++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp @@ -513,12 +513,20 @@ void tst_QSettings::ctor() QSettings settings5(format, QSettings::UserScope, "SoftWare.ORG", "killerApp"); if (format == QSettings::NativeFormat) { #if defined(Q_OS_WIN) || defined(Q_OS_DARWIN) +# ifdef Q_OS_MACX + if (QSysInfo::MacintoshVersion == QSysInfo::MV_10_8) + QEXPECT_FAIL("native", "See QTBUG-32655", Continue); +# endif // Q_OS_MACX QCOMPARE(settings5.value("key 1").toString(), QString("gurgle")); #else QVERIFY(!settings5.contains("key 1")); #endif } else { #if defined(Q_OS_WIN) || defined(Q_OS_DARWIN) +# ifdef Q_OS_MACX + if (QSysInfo::MacintoshVersion == QSysInfo::MV_10_8) + QEXPECT_FAIL("", "See QTBUG-32655", Continue); +# endif // Q_OS_MACX QCOMPARE(settings5.value("key 1").toString(), QString("gurgle")); #else QVERIFY(!settings5.contains("key 1")); @@ -3162,6 +3170,10 @@ void tst_QSettings::rainersSyncBugOnMac() { QSettings s3(format, QSettings::UserScope, "software.org", "KillerAPP"); +#ifdef Q_OS_MACX + if (QSysInfo::MacintoshVersion == QSysInfo::MV_10_8) + QEXPECT_FAIL("native", "See QTBUG-32655", Continue); +#endif QCOMPARE(s3.value("key1", 30).toInt(), 25); } } From d0c8fc3b2831de809bdb562db0924673c1abcc84 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 6 Aug 2013 16:04:50 -0700 Subject: [PATCH 094/131] Replace the Intel Haswell and Ivy Bridge codenames with actual names Change-Id: I2a31e96d324dd704e6f96b35ec68c79fd64a090e Reviewed-by: Oswald Buddenhagen Reviewed-by: Olivier Goffart --- config.tests/arch/arch.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/config.tests/arch/arch.cpp b/config.tests/arch/arch.cpp index e6f142ade5..b9c244e29e 100644 --- a/config.tests/arch/arch.cpp +++ b/config.tests/arch/arch.cpp @@ -103,15 +103,15 @@ const char msg2[] = "==Qt=magic=Qt== Sub-architecture:" " avx" #endif #ifdef __AVX2__ -// AVX 2, Intel codename "Haswell" +// AVX 2, Intel Core 4th Generation ("Haswell") " avx2" #endif #ifdef __BMI__ -// Bit Manipulation Instructions 1, Intel codename "Haswell", AMD "Bulldozer 2" +// Bit Manipulation Instructions 1, Intel Core 4th Generation ("Haswell"), AMD "Bulldozer 2" " bmi" #endif #ifdef __BMI2__ -// Bit Manipulation Instructions 2, Intel codename "Haswell" +// Bit Manipulation Instructions 2, Intel Core 4th Generation ("Haswell") " bmi2" #endif #ifdef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_16 @@ -120,11 +120,11 @@ const char msg2[] = "==Qt=magic=Qt== Sub-architecture:" " cx16" #endif #ifdef __F16C__ -// 16-bit floating point conversion, Intel codename "Ivy Bridge" +// 16-bit floating point conversion, Intel Core 3rd Generation ("Ivy Bridge") " f16c" #endif #ifdef __FMA__ -// Fused Multiply-Add with 3 arguments, Intel codename "Haswell", AMD "Bulldozer 2" +// Fused Multiply-Add with 3 arguments, Intel Core 4th Generation ("Haswell"), AMD "Bulldozer 2" // a.k.a. "FMA3" " fma" #endif @@ -133,7 +133,7 @@ const char msg2[] = "==Qt=magic=Qt== Sub-architecture:" " fma4" #endif #ifdef __FSGSBASE__ -// rdfsgsbase, wrfsgsbase, Intel codename "Ivy Bridge" +// rdfsgsbase, wrfsgsbase, Intel Core 3rd Generation ("Ivy Bridge") " fsgsbase" #endif #ifdef __LWP__ @@ -141,7 +141,7 @@ const char msg2[] = "==Qt=magic=Qt== Sub-architecture:" " lwp" #endif #ifdef __LZCNT__ -// Leading-Zero bit count, Intel codename "Haswell" +// Leading-Zero bit count, Intel Core 4th Generation ("Haswell") " lzcnt" #endif #ifdef __MMX__ @@ -166,7 +166,7 @@ const char msg2[] = "==Qt=magic=Qt== Sub-architecture:" " popcnt" #endif #ifdef __RDRND__ -// Random number generator, Intel codename "Ivy Bridge" +// Random number generator, Intel Core 3rd Generation ("Ivy Bridge") " rdrnd" #endif #if defined(__SSE__) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1) || defined(_M_X64) From 737abb8a5e51d75c0f2f93d5f7b42b05400034a9 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 2 Jul 2013 15:49:50 +0200 Subject: [PATCH 095/131] QComboBox: fix item activation via completer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTBUG-31146 Change-Id: I64291f397d80bf934152f63e629810540abf466e Reviewed-by: Friedemann Kleint Reviewed-by: Stephen Kelly Reviewed-by: Thorbjørn Lund Martsum --- src/widgets/widgets/qcombobox.cpp | 31 +++++++++++++--- src/widgets/widgets/qcombobox.h | 4 +-- src/widgets/widgets/qcombobox_p.h | 4 +-- .../widgets/qcombobox/tst_qcombobox.cpp | 35 +++++++++++++++++++ 4 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp index c59edf295c..afe8f1c3f4 100644 --- a/src/widgets/widgets/qcombobox.cpp +++ b/src/widgets/widgets/qcombobox.cpp @@ -59,6 +59,7 @@ #include #include #include +#include #include #include #include @@ -173,18 +174,28 @@ QStyleOptionMenuItem QComboMenuDelegate::getStyleOption(const QStyleOptionViewIt return menuOption; } -#ifdef QT_KEYPAD_NAVIGATION -void QComboBoxPrivate::_q_completerActivated() +#ifndef QT_NO_COMPLETER +void QComboBoxPrivate::_q_completerActivated(const QModelIndex &index) { Q_Q(QComboBox); + if (index.isValid() && q->completer()) { + QAbstractProxyModel *proxy = qobject_cast(q->completer()->completionModel()); + if (proxy) { + q->setCurrentIndex(proxy->mapToSource(index).row()); + emitActivated(currentIndex); + } + } + +# ifdef QT_KEYPAD_NAVIGATION if ( QApplication::keypadNavigationEnabled() && q->isEditable() && q->completer() && q->completer()->completionMode() == QCompleter::UnfilteredPopupCompletion ) { q->setEditFocus(false); } +# endif // QT_KEYPAD_NAVIGATION } -#endif +#endif // !QT_NO_COMPLETER void QComboBoxPrivate::updateArrow(QStyle::StateFlag state) { @@ -1149,6 +1160,14 @@ void QComboBoxPrivate::_q_editingFinished() void QComboBoxPrivate::_q_returnPressed() { Q_Q(QComboBox); + + // The insertion code below does not apply when the policy is QComboBox::NoInsert. + // In case a completer is installed, item activation via the completer is handled + // in _q_completerActivated(). Otherwise _q_editingFinished() updates the current + // index as appropriate. + if (insertPolicy == QComboBox::NoInsert) + return; + if (lineEdit && !lineEdit->text().isEmpty()) { if (q->count() >= maxCount && !(this->insertPolicy == QComboBox::InsertAtCurrent)) return; @@ -1191,7 +1210,6 @@ void QComboBoxPrivate::_q_returnPressed() break; } break; - case QComboBox::NoInsert: default: break; } @@ -1393,6 +1411,7 @@ void QComboBox::setAutoCompletion(bool enable) if (d->lineEdit->completer()) return; d->completer = new QCompleter(d->model, d->lineEdit); + connect(d->completer, SIGNAL(activated(QModelIndex)), this, SLOT(_q_completerActivated(QModelIndex))); d->completer->setCaseSensitivity(d->autoCompletionCaseSensitivity); d->completer->setCompletionMode(QCompleter::InlineCompletion); d->completer->setCompletionColumn(d->modelColumn); @@ -1805,8 +1824,10 @@ void QComboBox::setCompleter(QCompleter *c) if (!d->lineEdit) return; d->lineEdit->setCompleter(c); - if (c) + if (c) { + connect(c, SIGNAL(activated(QModelIndex)), this, SLOT(_q_completerActivated(QModelIndex))); c->setWidget(this); + } } /*! diff --git a/src/widgets/widgets/qcombobox.h b/src/widgets/widgets/qcombobox.h index d167ac7d11..2fafe79f7a 100644 --- a/src/widgets/widgets/qcombobox.h +++ b/src/widgets/widgets/qcombobox.h @@ -259,8 +259,8 @@ private: Q_PRIVATE_SLOT(d_func(), void _q_rowsRemoved(const QModelIndex & parent, int start, int end)) Q_PRIVATE_SLOT(d_func(), void _q_modelDestroyed()) Q_PRIVATE_SLOT(d_func(), void _q_modelReset()) -#ifdef QT_KEYPAD_NAVIGATION - Q_PRIVATE_SLOT(d_func(), void _q_completerActivated()) +#ifndef QT_NO_COMPLETER + Q_PRIVATE_SLOT(d_func(), void _q_completerActivated(const QModelIndex &index)) #endif }; diff --git a/src/widgets/widgets/qcombobox_p.h b/src/widgets/widgets/qcombobox_p.h index 14cf9e7925..07ba9b0925 100644 --- a/src/widgets/widgets/qcombobox_p.h +++ b/src/widgets/widgets/qcombobox_p.h @@ -348,8 +348,8 @@ public: void _q_emitCurrentIndexChanged(const QModelIndex &index); void _q_modelDestroyed(); void _q_modelReset(); -#ifdef QT_KEYPAD_NAVIGATION - void _q_completerActivated(); +#ifndef QT_NO_COMPLETER + void _q_completerActivated(const QModelIndex &index); #endif void _q_resetButton(); void _q_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp index 0bfd4baa0c..82d3fae0fa 100644 --- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp +++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp @@ -160,6 +160,7 @@ private slots: void maxVisibleItems(); void task_QTBUG_10491_currentIndexAndModelColumn(); void highlightedSignal(); + void task_QTBUG_31146_popupCompletion(); }; class MyAbstractItemDelegate : public QAbstractItemDelegate @@ -2755,5 +2756,39 @@ void tst_QComboBox::highlightedSignal() QCOMPARE(spy.size(), 1); } +void tst_QComboBox::task_QTBUG_31146_popupCompletion() +{ + QComboBox comboBox; + comboBox.setEditable(true); + comboBox.setAutoCompletion(true); + comboBox.setInsertPolicy(QComboBox::NoInsert); + comboBox.completer()->setCaseSensitivity(Qt::CaseInsensitive); + comboBox.completer()->setCompletionMode(QCompleter::PopupCompletion); + + comboBox.addItems(QStringList() << QStringLiteral("item") << QStringLiteral("item")); + + comboBox.show(); + comboBox.activateWindow(); + QVERIFY(QTest::qWaitForWindowActive(&comboBox)); + + QCOMPARE(comboBox.currentIndex(), 0); + + comboBox.lineEdit()->selectAll(); + QTest::keyClicks(comboBox.lineEdit(), "item"); + + QTest::keyClick(comboBox.completer()->popup(), Qt::Key_Down); + QTest::keyClick(comboBox.completer()->popup(), Qt::Key_Down); + QTest::keyClick(comboBox.completer()->popup(), Qt::Key_Enter); + QCOMPARE(comboBox.currentIndex(), 1); + + comboBox.lineEdit()->selectAll(); + QTest::keyClicks(comboBox.lineEdit(), "item"); + + QTest::keyClick(comboBox.completer()->popup(), Qt::Key_Up); + QTest::keyClick(comboBox.completer()->popup(), Qt::Key_Up); + QTest::keyClick(comboBox.completer()->popup(), Qt::Key_Enter); + QCOMPARE(comboBox.currentIndex(), 0); +} + QTEST_MAIN(tst_QComboBox) #include "tst_qcombobox.moc" From 23214c815ec267e999015a971768dbf8f6ea0957 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 7 Aug 2013 20:19:09 +0200 Subject: [PATCH 096/131] Revert c3f485c5250a503832e767e1fe5e40595126f6c5 It has been discovered it changes the behavior of qdbuscpp2xml resulting in builds of some apps breaking. Even if the behavior is more correct, such behavior change in a stable branch is not acceptable Change-Id: I1d79104ebf11c3f48c84f109be2926af96cddae7 Reviewed-by: Thiago Macieira --- src/dbus/qdbusxmlgenerator.cpp | 5 +- tests/auto/dbus/dbus.pro | 1 - .../qdbusxmlgenerator/qdbusxmlgenerator.pro | 5 - .../tst_qdbusxmlgenerator.cpp | 125 ------------------ 4 files changed, 2 insertions(+), 134 deletions(-) delete mode 100644 tests/auto/dbus/qdbusxmlgenerator/qdbusxmlgenerator.pro delete mode 100644 tests/auto/dbus/qdbusxmlgenerator/tst_qdbusxmlgenerator.cpp diff --git a/src/dbus/qdbusxmlgenerator.cpp b/src/dbus/qdbusxmlgenerator.cpp index bf5e24cd5f..8c822162e4 100644 --- a/src/dbus/qdbusxmlgenerator.cpp +++ b/src/dbus/qdbusxmlgenerator.cpp @@ -209,13 +209,12 @@ static QString generateInterfaceXml(const QMetaObject *mo, int flags, int method } int wantedMask; - const bool isSlot = mm.methodType() == QMetaMethod::Slot; if (isScriptable) wantedMask = isSignal ? QDBusConnection::ExportScriptableSignals - : isSlot ? QDBusConnection::ExportScriptableSlots : QDBusConnection::ExportScriptableInvokables; + : QDBusConnection::ExportScriptableSlots; else wantedMask = isSignal ? QDBusConnection::ExportNonScriptableSignals - : isSlot ? QDBusConnection::ExportNonScriptableSlots : QDBusConnection::ExportNonScriptableInvokables; + : QDBusConnection::ExportNonScriptableSlots; if ((flags & wantedMask) != wantedMask) continue; diff --git a/tests/auto/dbus/dbus.pro b/tests/auto/dbus/dbus.pro index 52ee154008..cd845d7043 100644 --- a/tests/auto/dbus/dbus.pro +++ b/tests/auto/dbus/dbus.pro @@ -17,7 +17,6 @@ SUBDIRS=\ qdbustype \ qdbusthreading \ qdbusxmlparser \ - qdbusxmlgenerator \ !contains(QT_CONFIG,private_tests): SUBDIRS -= \ qdbusmarshall \ diff --git a/tests/auto/dbus/qdbusxmlgenerator/qdbusxmlgenerator.pro b/tests/auto/dbus/qdbusxmlgenerator/qdbusxmlgenerator.pro deleted file mode 100644 index 5bf8523c42..0000000000 --- a/tests/auto/dbus/qdbusxmlgenerator/qdbusxmlgenerator.pro +++ /dev/null @@ -1,5 +0,0 @@ -CONFIG += testcase -TARGET = tst_qdbusxmlgenerator -QT = core dbus testlib xml -SOURCES += tst_qdbusxmlgenerator.cpp -DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/dbus/qdbusxmlgenerator/tst_qdbusxmlgenerator.cpp b/tests/auto/dbus/qdbusxmlgenerator/tst_qdbusxmlgenerator.cpp deleted file mode 100644 index 1ff613b5ca..0000000000 --- a/tests/auto/dbus/qdbusxmlgenerator/tst_qdbusxmlgenerator.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Canonical Limited -** Contact: http://www.qt-project.org/legal -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include - -#include -#include -#include - -static const QString serviceName = "org.example.qdbus"; -static const QString interfaceName = serviceName; - -Q_DECLARE_METATYPE(QDBusConnection::RegisterOption); - -class DBusXmlGenetarorObject : public QObject -{ - Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "org.example.qdbus") -public: - Q_INVOKABLE void nonScriptableInvokable() {} - Q_SCRIPTABLE Q_INVOKABLE void scriptableInvokable() {} -}; - -class tst_QDBusXmlGenerator : public QObject -{ - Q_OBJECT - -private slots: - void initTestCase(); - void introspect_data(); - void introspect(); -}; - -void tst_QDBusXmlGenerator::initTestCase() -{ - QDBusConnection::sessionBus().registerService(serviceName); -} - -void tst_QDBusXmlGenerator::introspect_data() -{ - QTest::addColumn("methodName"); - QTest::addColumn("flags"); - - QTest::newRow("scriptableInvokable") << "scriptableInvokable" << QDBusConnection::ExportScriptableInvokables; - QTest::newRow("nonScriptableInvokable") << "nonScriptableInvokable" << QDBusConnection::ExportNonScriptableInvokables; -} - -void tst_QDBusXmlGenerator::introspect() -{ - QFETCH(QString, methodName); - QFETCH(QDBusConnection::RegisterOption, flags); - DBusXmlGenetarorObject obj; - - QDBusConnection::sessionBus().registerObject("/" + methodName, &obj, flags ); - - QDBusInterface dif(serviceName, "/" + methodName, "", QDBusConnection::sessionBus()); - QDBusReply reply = dif.call("Introspect"); - - bool found = false; - QDomDocument d; - d.setContent(reply.value(), false); - QDomNode n = d.documentElement().firstChild(); - while (!found && !n.isNull()) { - QDomElement e = n.toElement(); // try to convert the node to an element. - if (!e.isNull()) { - if (e.tagName() == "interface" && e.attribute("name") == interfaceName ) { - QDomNode n2 = e.firstChild(); - while (!n2.isNull()) { - QDomElement e2 = n2.toElement(); // try to convert the node to an element. - if (!e2.isNull()) { - if (e2.tagName() == "method") { - found = e2.attribute("name") == methodName; - } - } - n2 = n2.nextSibling(); - } - } - } - n = n.nextSibling(); - } - - QVERIFY(found); -} - -QTEST_MAIN(tst_QDBusXmlGenerator) - -#include "tst_qdbusxmlgenerator.moc" - From 58a4bf2c9906797ca281c4f6f8d9568f8445e97a Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Fri, 24 May 2013 15:20:56 +0200 Subject: [PATCH 097/131] [Mac] Fix modifier reporting issue in the key events This issue was introduced when porting key handling code from Qt4 to Qt5. To conform to the implementation of QKeyEvent::modifiers() we have to invert modifier state logic before sending them as QKeyEvents. Task-number: QTBUG-31332 Change-Id: I3bb41169f8ab2a4b0a13a224bb461d2792d3a65f Reviewed-by: Frederik Gladhorn Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/cocoa/qnsview.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 66a1b95ad8..aff93dd133 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -1036,7 +1036,7 @@ static QTouchDevice *touchDevice = 0; timestamp, (lastKnownModifiers & mac_mask) ? QEvent::KeyRelease : QEvent::KeyPress, modifier_key_symbols[i].qt_code, - qmodifiers); + qmodifiers ^ [QNSView convertKeyModifiers:mac_mask]); } } From c54aafad368384cb0ae945565592d2985a6fe527 Mon Sep 17 00:00:00 2001 From: Nico Vertriest Date: Tue, 18 Jun 2013 14:09:55 +0200 Subject: [PATCH 098/131] Doc: preliminary review of qdoc-manual.qdoc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - syntax - grammar - writing guidelines - spelling - added contents for \\note Task-number: QTBUG-31801 Change-Id: I9df1af270acd7fbad39048a47b883f3002e168e4 Reviewed-by: Martin Smith Reviewed-by: Topi Reiniö --- src/tools/qdoc/doc/qdoc-manual.qdoc | 621 +++++++++++++--------------- 1 file changed, 298 insertions(+), 323 deletions(-) diff --git a/src/tools/qdoc/doc/qdoc-manual.qdoc b/src/tools/qdoc/doc/qdoc-manual.qdoc index 4a4b1db6ff..010b2f79ec 100644 --- a/src/tools/qdoc/doc/qdoc-manual.qdoc +++ b/src/tools/qdoc/doc/qdoc-manual.qdoc @@ -83,12 +83,12 @@ \title Introduction to QDoc QDoc is a tool used by Qt Developers to generate documentation for - software projects. It works by extracting \e {qdoc comments} from + software projects. It works by extracting \e {QDoc comments} from project source files and then formatting these comments as HTML - pages or DITA XML documents, etc. QDoc finds qdoc comments in \c - {.cpp} files and in \c {.qdoc} files. QDoc does not look for qdoc - comments in \c {.h} files. A qdoc comment always begins with an - exclamation mark \b{!} e.g.: + pages or DITA XML documents. QDoc finds QDoc comments in \c + {.cpp} files and in \c {.qdoc} files. QDoc does not look for QDoc + comments in \c {.h} files. A QDoc comment always begins with an + exclamation mark (\b{!})). For example: \code / *! @@ -112,27 +112,27 @@ QObjects organize themselves in \l {Object Trees & Ownership} {object trees}. When you create a QObject with another object as parent, the object will automatically - add itself to the parent's children() list. The parent - takes ownership of the object; i.e., it will automatically + add itself to the parent's \c children() list. The parent + takes ownership of the object. It will automatically delete its children in its destructor. You can look for an object by name and optionally type using findChild() or findChildren(). Every object has an objectName() and its class name can be found via the corresponding metaObject() (see - QMetaObject::className()). You can determine whether the + QMetaObject::className()). You can determine whether the object's class inherits another class in the QObject - inheritance hierarchy by using the inherits() function. + inheritance hierarchy by using the \c inherits() function. .... * / \endcode - From the qdoc comment above, QDoc generates the now famous HTML - page \l {http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#details} + From the QDoc comment above, QDoc generates the HTML page + \l {http://qt-project.org/doc/qt-5.0/qtcore/qobject.html#details} {QObject Class Reference}. - This manual explains how to use the QDoc commands in qdoc comments + This manual explains how to use the QDoc commands in QDoc comments to embed good documentation in your source files. It also explains how to make a \l {The QDoc Configuration File} {QDoc configuration file}, which you will pass to QDoc on the command line. @@ -154,10 +154,10 @@ and where to put the generated documentation. The configuration file also contains other information for QDoc. - See \l{The QDoc Configuration File} for a instructions on how to - build a QDoc configuration file. + See \l{The QDoc Configuration File} for instructions on how to + set up a QDoc configuration file. - \section1 How QDoc Works + \section1 How QDoc works QDoc begins by reading the configuration file you specified on the command line. It stores all the variables from the configuration @@ -168,15 +168,15 @@ HTML output. That's usually what you will want anyway, but you can also specify \e {DITAXML} to get DITA XML output instead. - Next, QDoc uses the values of the \l - {22-qdoc-configuration-generalvariables.html#headerdirs-variable} + Next, QDoc uses the values of the + \l {22-qdoc-configuration-generalvariables.html#headerdirs-variable} {headerdirs} variable and/or the \l {22-qdoc-configuration-generalvariables.html#headers-variable} {headers} variable to find and parse all the header files for your - project. QDoc does \e not scan header files for qdoc comments. It + project. QDoc does \e not scan header files for QDoc comments. It parses the header files to build a master tree of all the items - that should be documented (i.e. the items that QDoc should find - qdoc comments for). + that should be documented, in other words, the items that QDoc should find + QDoc comments for. After parsing all the header files and building the master tree of items to be documented, QDoc uses the value of the \l @@ -185,11 +185,11 @@ {22-qdoc-configuration-generalvariables.html#sources-variable} {sources} variable to find and parse all the \c {.cpp} and \c {.qdoc} files for your project. These are the files QDoc scans for - \e {qdoc comments}. Remember that a qdoc comment begins with - an exclamation mark, i.e. \b {/*!} . + \e {QDoc comments}. Remember that a QDoc comment begins with + an exclamation mark: \b {/*!} . - For each qdoc comment it finds, it searches the master tree for - the item where the documentation belongs. The it interprets the + For each QDoc comment it finds, it searches the master tree for + the item where the documentation belongs. Then it interprets the qdoc commands in the comment and stores the interpreted commands and the comment text in the tree node for the item. @@ -211,17 +211,17 @@ \li \l {Markup Commands} \endlist - Topic commands identify the element you are documenting, e.g. a C++ - class, function, or type, an example, or an extra page of text + Topic commands identify the element you are documenting, for example + a C++ class, function, type, or an extra page of text that doesn't map to an underlying C++ element. Context commands tell QDoc how the element being documented - relates to other documented elements, e.g. next and previous page - links or inclusion in page groups or library modules. Context + relates to other documented elements, for example, next and previous page + links, inclusion in page groups, or library modules. Context commands can also provide information about the documented element - that QDoc can't get from the source files, e.g. whether the - element is thread-safe, an overloaded or reimplemented function, - or that it has been deprecated. + that QDoc can't get from the source files, for example, whether the + element is thread-safe, whether it is an overloaded or reimplemented function, + or whether it has been deprecated. Markup commands tell QDoc how text and image elements in the document should be rendered, or about the document's outline @@ -273,6 +273,7 @@ \li \l {12-0-qdoc-commands-miscellaneous.html#meta-command} {\\meta} \li \l {06-qdoc-commands-includecodeinline.html#newcode-command} {\\newcode} \li \l {10-qdoc-commands-tablesandlists.html#li-command} {\\o} \span {class="newStuff"} {(deprecated, use \\li)} + \li \l {11-qdoc-commands-specialcontent.html#note-command} {\\note} \li \l {06-qdoc-commands-includecodeinline.html#oldcode-command} {\\oldcode} \li \l {12-0-qdoc-commands-miscellaneous.html#omit-command} {\\omit} \li \l {05-qdoc-commands-documentstructure.html#part-command} {\\part} @@ -353,17 +354,17 @@ The \a parent parameter is sent to the QWidget constructor. \endquotation - You can enclose the formal parameter name in curly brackets, if - you want to, but it isn't necessary. + The formal parameter name may be enclosed between curly brackets, + but that isn't required. \target c-command \section1 \\c (code font) The \\c command is used for rendering variable names, user-defined - class names, and C++ keywords (e.g. \c int and \c for) in the code + class names, and C++ keywords (for example, \c int and \c for) in the code font. - The command renders its argument using a typewriter font. For + The command renders its argument using a monospace font. For example: \code @@ -378,7 +379,7 @@ \quotation The \c AnalogClock class provides a clock widget with hour - and minute hands that is automatically updated every + and minute hands, which are automatically updated every few seconds. \endquotation @@ -396,7 +397,7 @@ \endquotation The \\c command accepts the special character \c \ within its - argument, i.e. it renders it as a normal character. So if you want + argument, which renders it as a normal character. So if you want to use nested commands, you must use the \l {tt-command} {teletype (\\tt)} command instead. @@ -411,7 +412,7 @@ An argument must be provided in curly braces, as in the qdoc comment shown below. The argument is not interpreted but is used - as attribute(s) of the tag that is ultimately output by qdoc. + as attribute(s) of the tag that is output by qdoc. For example, we might want to render an inline image so that it floats to the right of the current block of text: @@ -432,7 +433,7 @@ \endcode For HTML, the attribute value \e {float-right} then will refer to - a clause in the style.css file. which in this case could be: + a clause in the style.css file, which in this case could be: \code div.float-right @@ -456,9 +457,9 @@ Your DITA XML publishing program must then recognize the \e {outputclass} attribute value. - \note The \b {\\div} command can be nested. + \note Note that the \b {\\div} command can be nested. - Below is an example taken from the index.qdoc file used to + Below you can find an example taken from the index.qdoc file used to generate index.html for Qt 4.7: \code @@ -491,7 +492,7 @@ \endcode When all the class attribute values are defined as they are in the - style.css file that is used for rendering the Qt 4.7 documentation, + style.css file that is used for rendering the Qt documentation, the above example is rendered as: \div {class="indexbox guide"} @@ -573,14 +574,13 @@ \target span -command \section1 \\span - The \\span command is for applying special formatting - attributes to a small block of text. + The \\span command applies special formatting to a small block of text. Two arguments must be provided, each argument in curly braces, as - shown in the qdoc comment below. The first argument is not - interpreted but is used as the formatting attribute(s) of the tag - that is ultimately output by qdoc. The second argument is the text - to be rendered with the special formatting attributes. + shown in the QDoc comment below. The first argument is not + interpreted, but specifies the formatting attribute(s) of the tag + output by QDoc. The second argument is the text to be rendered with + the special formatting attributes. For example, we might want to render the first word of each element in a numeric list in blue. @@ -633,8 +633,8 @@ \code / *! - After \c setupUi() populates the main container with - child widgets it scans the main container's list of + After having populated the main container with + child widgets, \c setupUi() scans the main container's list of slots for names with the form \tt{on_\e{objectName}_\e{signalName}().} * / @@ -643,10 +643,10 @@ QDoc renders this as: \quotation - After \c setupUi() populates the main container with - child widgets it scans the main container's list of - slots for names with the form - \tt{on_\e{objectName}_\e{signalName}().} + After having populated the main container with + child widgets, \c setupUi() scans the main container's list of + slots for names with the form + \tt{on_\e{objectName}_\e{signalName}().} \endquotation If the text to be rendered in the code font contains spaces, enclose the @@ -695,14 +695,14 @@ \code / *! - Here, we render \e {a few words} in italic. + Here, we render \e {a few words} in italics. * / \endcode QDoc renders this as: \quotation - Here, we render \e {a few words} in italic. + Here, we render \e {a few words} in italics. \endquotation If you want to use other QDoc commands within an argument that @@ -725,7 +725,7 @@ \endquotation Finally, trailing punctuation is not included in an argument [4], - nor is 's [5] + nor is "'s" [5] \raw HTML
- This header cell spans three columns but only one row + This header cell spans three columns, but only one row.
- This table cell spans two columns but only one row + This table cell spans two columns, but only one row. This table cell spans only one column, but two rows. @@ -2759,7 +2760,7 @@ \endraw See also \l {table-command} {\\table}, \l {header-command} - {\\header} and \l {li-command} {\\li}. + {\\header}, and \l {li-command} {\\li}. \target value-command \section1 \\value @@ -2935,10 +2936,10 @@ is only used in \l{table-command} {tables} and \l{list-command} {lists}. - It considers everything until the next \\li command, or until the - next \l {table-command} {\\endtable} or \l {list-command} {\\endlist} - command, as its argument. See \l {table-command} {\\table} and \l - {list-command} {\\list} for examples. + It considers everything as its argument until the next \\li command, until the + next \l {table-command} {\\endtable}, or \l {list-command} {\\endlist} + command. See \l {table-command} {\\table} and \l {list-command} {\\list} + for examples. If the command is used within a table, you can also specify how many rows or columns the item should span. @@ -2969,13 +2970,13 @@
- This header cell spans three columns but only one row + This header cell spans three columns, but only one row.
- This table item spans two columns but only one row + This table item spans two columns, but only one row. This table item spans only one column, but two rows. @@ -3006,7 +3007,7 @@ \title Special Content The document contents commands identify parts of the documentation, - i.e. parts with a special rendering, conceptual meaning or + parts with a special rendering, conceptual meaning or function. \target abstract-command @@ -3033,7 +3034,7 @@ \code / *! - While the prospect of a significantly broader market is + Although the prospect of a significantly broader market is good news for Firstlogic, the notion also posed some challenges. Dave Dobson, director of technology for the La Crosse, Wisconsin-based company, said: @@ -3081,6 +3082,12 @@ have not been implemented. The footnote is rendered as a regular HTML paragraph. + \target note-command + \section1 \\note + + The \\note command defines a new paragraph preceded by "Note:" + in bold. + \target tableofcontents-command \section1 \\tableofcontents @@ -3094,7 +3101,7 @@ \section1 \\brief The \\brief command introduces a one-sentence description of a - class, namespace, header file, property or variable. + class, namespace, header file, property, or variable. The brief text is used to introduce the documentation of the associated object, and in lists generated using the \l @@ -3117,13 +3124,13 @@ \code / *! \property QWidget::isActiveWindow - \brief whether this widget's window is the active window + \brief Whether this widget's window is the active window The active window is the window that contains the widget that has keyboard focus. When popup windows are visible, this property is true - for both the active window \e and for the popup. + for both the active window \e and the popup. \sa activateWindow(), QApplication::activeWindow() * / @@ -3134,7 +3141,7 @@ \code / *! \property QWidget::geometry - \brief the geometry of the widget relative to its parent and + \brief The geometry of the widget relative to its parent and excluding the window frame When changing the geometry, the widget, if visible, @@ -3342,7 +3349,7 @@ In the generated HTML, the delimited text is surrounded by a \b {
} and \b {
} tags. - For example, here is a license agreement enclosed in \\legalese + An example of a license agreement enclosed in \\legalese and \\endlegalese: \code @@ -3521,7 +3528,7 @@ The \c classes argument provides a complete alphabetical list of the classes. Each class name is a link to the class's reference - documentation. This command is uded to generate the \l + documentation. This command is used to generate the \l {classes.html} {All Classes} page this way: \code @@ -3530,7 +3537,7 @@ \title All Classes \ingroup classlists - \brief If you know the name of the class you want, find it here. + \brief Alphabetical list of classes. This is a list of all Qt classes. For a list of the classes provided for compatibility with Qt3, see \l{Qt3 Support @@ -3561,7 +3568,7 @@ \title Phonon Module \ingroup modules - \brief The Phonon module contains namespaces and classes for multimedia functionality. + \brief Contains namespaces and classes for multimedia functionality. \generatelist{classesbymodule Phonon} @@ -3577,7 +3584,7 @@ \section2 \c compatclasses The \c compatclasses argument generates a list in alphabetical - order of the support classes. It is normally used only to + order of the support classes. It is normally used only to generate the \l {compatclasses.html} {Qt3 Support Classes} page this way: @@ -3587,7 +3594,7 @@ \title Qt3 Support Classes \ingroup classlists - \brief These classes ease the porting of code from Qt 3 to Qt 4. + \brief Enable porting of code from Qt 3 to Qt 4. These are the classes that Qt provides for compatibility with Qt 3. Most of these are provided by the Qt3Support module. @@ -3616,7 +3623,7 @@ link to where each one is declared. This is the list of all documented member functions and global - functions in the Qt API. Each function has a link to the + functions in the Qt API. Each function has a link to the class or header file where it is declared and documented. \generatelist functionindex @@ -3813,7 +3820,7 @@ QT3_SUPPORT symbol, turning on compatibility function support). - You can also define the symbol manually (e.g., + You can also define the symbol manually (for example, if you don't want to link against the \c Qt3Support library), or you can define \c QT3_SUPPORT_WARNINGS instead, telling the @@ -3886,8 +3893,8 @@ The \\include command sends all or part of the file specified by its first argument to the QDoc input stream to be processed as a - qdoc comment snippet. This command is often assigned the alias, - \e {input}, in the QDoc configuration file, e.g. \e {alias.include + QDoc comment snippet. This command is often assigned the alias, + \e {input}, in the QDoc configuration file, for example \e {alias.include = input}. The command is useful when some snippet of commands and text is to @@ -3900,8 +3907,8 @@ The command can have either one or two arguments. The first argument is always a file name. The contents of the file must be - QDoc input, i.e. a sequence of QDoc commands and text, but without - the enclosing qdoc comment \c{/}\c{*!} ... \c{*}\c{/} delimeters. + QDoc input, in other words, a sequence of QDoc commands and text, but + without the enclosing QDoc comment \c{/}\c{*!} ... \c{*}\c{/} delimiters. If you want to include the entire named file, don't use the second argument. If you want to include only part of the file, see the \l{2-argument-form}{two argument form} below. Here is an example @@ -3926,11 +3933,11 @@ \target 2-argument-form} \section2 \\include filename snippet-identifier - It is kind of a pain to make a separate \c .qdocinc file for every + It is a waste of time to make a separate \c .qdocinc file for every QDoc include snippet you want to use in multiple places in the documentation, especially given that you probably have to put the copyright/license notice in every one of these files. So if you - have lots of these include snippets, you can put them all in a + have a large number of snippets to be included, you can put them all in a single file if you want, and surround each one with: \code //! [snippet-id1] @@ -3965,8 +3972,8 @@ XML files. It is also used when generating HTML output for specifying the \e maintainer(s) of a C++ class. - The command has two arguments: The first argument is the name of the - metadata attribute you wish to set, and the second argument is the + The command has two arguments: the first argument is the name of the + metadata attribute, and the second argument is the value for the attribute. Each argument should be enclosed in curly brackets, as shown in this example: @@ -4026,14 +4033,14 @@ \endcode - In the example output, several values have been set using defualt + In the example output, several values have been set using default values obtained from the QDoc configuration file. See \l {Generating DITA XML Output} for details. \target omit-command \section1 \\omit - The \\omit command and the correspondning \\endomit command + The \\omit command and the corresponding \\endomit command delimit parts of the documentation that you want QDoc to skip. For example: @@ -4091,8 +4098,8 @@ commands in your \l {table-command} {\\table} or \l {list-command} {\\list}. - The command takes an argument specifying the code's format; - currently the only supported format is HTML. + The command takes an argument specifying the code's format. + Currently, the only supported format is HTML. The \\raw command is useful if you want some special HTML effects in your documentation. @@ -4147,7 +4154,7 @@ \tt {\span {id="color-cyan"} {cyan(#00ffff)}}. \endcode - ...which is rendered again as: + ...which is rendered as: \tt {\span {id="color-blue"} {Blue(#0000ff)}}, \tt {\span {id="color-darkBlue"} {dark blue(#000080)}} and @@ -4254,10 +4261,10 @@ \endcode A topic command can appear anywhere in a comment but must stand - alone on its own line. Best practice is to let the topic commend + alone on its own line. It is good practice is to let the topic command be the first line of the comment. If the argument spans several lines, make sure that each line (except the last one) is ended - with a backslash. In addition QDoc counts parentheses, which means + with a backslash. Moreover, QDoc counts parentheses, which means that if it encounters a '(' it considers everything until the closing ')' as its argument. @@ -4304,7 +4311,7 @@ The HTML documentation for the named class is written to a \c{.html} file named from the class name, in lower case, and with - the double colon qulifier(s) replaced with '-'. For example, the + the double colon qualifier(s) replaced with '-'. For example, the documentation for the \c QMap::Iterator class is written to \c qmap-iterator.html. @@ -4312,7 +4319,7 @@ The file contains the class description from the \\class comment, plus the documentation generated from QDoc comments for all the - class members, i.e. a list of the class's types, properties, + class members: a list of the class's types, properties, functions, signals, and slots. In addition to the detailed description of the class, the \\class @@ -4323,7 +4330,7 @@ \code / *! \class PreviewWindow - \brief The PreviewWindow class is a custom widget + \brief The PreviewWindow class is a custom widget. displaying the names of its currently set window flags in a read-only text editor. @@ -4626,7 +4633,7 @@ \endquotation To achieve the same result without using the \\externalpage - command, you would have to hard code the address into your + command, you would have to hard-code the address into your documentation: \code @@ -4649,7 +4656,7 @@ and list of formal arguments with types. If the named function doesn't exist, QDoc emits a warning. - \note The \\fn command is QDoc's default command, i.e. when no + \note The \\fn command is QDoc's default command: when no topic command can be found in a QDoc comment, QDoc tries to tie the documentation to the following code as if it is the documentation for a function. Hence, it is normally not necessary @@ -4695,7 +4702,7 @@ {\\generatelist} command (see example below). The \\group command is typically followed by a \l {title-command} - {\\title} command and a short introduction to the group. The + {\\title} command and a short introduction to the group. The HTML page for the group is written to a \c {.html} file put in \e{group}.html. @@ -4710,7 +4717,7 @@ \title Input/Output and Networking These classes are used to handle input and output to - and from external devices, processes, files etc. as + and from external devices, processes, files etc., as well as manipulating files and directories. * / \endcode @@ -4724,7 +4731,7 @@

Input/Output and Networking

These classes are used to handle input and output - to and from external devices, processes, files etc. as + to and from external devices, processes, files etc., as well as manipulating files and directories.

@@ -4781,13 +4788,13 @@ \section1 \\headerfile The \\headerfile command is for documenting the global functions, - types and macros that are declared in a header file but not in a - namespace. The argument is the name of the header file. The HTML + types and macros that are declared in a header file, but not in a + namespace. The argument is the name of the header file. The HTML page is written to a \c {.html} file constructed from the header file argument. The documentation for a function, type, or macro that is declared - in the header file being documented is included in the header file + in the header file being documented, is included in the header file page using the \l {relates-command} {\\relates} command. If the argument doesn't exist as a header file, the \\headerfile @@ -4919,7 +4926,7 @@ The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and - slots or that uses other services provided by Qt's + slots, or that uses other services provided by Qt's meta-object system. ... @@ -4949,7 +4956,7 @@ \section1 \\module The \\module creates a page that lists the classes belonging to - the module specified by the command's argument. A class included + the module specified by the command's argument. A class included in the module by including the \l {inmodule-command} {\\inmodule} command in the \\class comment. @@ -4965,8 +4972,7 @@ \title Qt Network Module - \brief The Qt Network module offers classes that allow - you to write TCP/IP clients and servers. + \brief Contains classes for writing TCP/IP clients and servers. The network module provides classes to make network programming easier and portable. It offers both @@ -5054,8 +5060,7 @@ / *! \namespace Qt - \brief The Qt namespace contains miscellaneous - identifiers used throughout the Qt library. + \brief Contains miscellaneous identifiers used throughout the Qt library. * / \endcode @@ -5089,7 +5094,7 @@ \raw HTML

Detailed Description

-

The Qt namespace contains miscellaneous identifiers +

Contains miscellaneous identifiers used throughout the Qt library.

\endraw @@ -5100,7 +5105,7 @@ \section1 \\page The \\page command is for creating a stand-alone documentation - page. The argument can consist of two parts separated by a + page. The argument can consist of two parts separated by a space. The first part is the name of the file where QDoc should store the page. The second part, if present, is a word that specifies the page type. Currently, the second part can be one of @@ -5110,7 +5115,7 @@ \li faq - A frequently asked question. - \li howto - A user guide for how to use some component of the + \li howto - A user guide on how to use some components of the software. \li example - A page that describes a working example. @@ -5120,9 +5125,9 @@ \li tutorial - For text pages that are part of a tutorial. - \li api - This is the type of page used for C++ class references - and QML type references, etc. You should never use this one for - the pages you write, because this one is reserved for qdoc. + \li api - This is the type of page used for C++ class references and + QML type references. You should never use this one for the pages + you write, because this one is reserved for qdoc. \endlist @@ -5183,7 +5188,7 @@ \code / *! \property QPushButton::flat - \brief whether the border is disabled + \brief Whether the border is disabled. This property's default is false. * / @@ -5212,7 +5217,7 @@ \code / *! \property QWidget::width - \brief the width of the widget excluding any window frame + \brief The width of the widget excluding any window frame. See the \l {Window Geometry} documentation for an overview of window geometry. @@ -5344,7 +5349,7 @@ \qmlbasictype int \ingroup qmlbasictypes - \brief An integer is a whole number, e.g. 0, 10, or -20. + \brief An integer is a whole number, for example 0, 10, or -20. An integer is a whole number, e.g. 0, 10, or -20. The possible \c int values range from around -2000000000 to around @@ -5379,11 +5384,10 @@ \qmlclass Transform QGraphicsTransform \ingroup qml-transform-elements \since 4.7 - \brief The Transform elements provide a way of building - advanced transformations on Items. + \brief Provides a way of building advanced transformations on Items. The Transform element is a base type which cannot be - instantiated directly. The following concrete Transform types + instantiated directly. The following concrete Transform types are available: \list @@ -5407,7 +5411,7 @@ page. The \\qmlclass comment should include the \l {since-command} {\\since} command, because all QML types are new. It should also include the \l{brief-command} {\\brief} - command. And if a type is a member of a group of QML + command. If a type is a member of a group of QML types, it should also include one or more \l{ingroup-command} {\\ingroup} commands. @@ -5426,9 +5430,8 @@ If either start or end is out of range, the selection is not changed. - After calling this, selectionStart will become the lesser and - selectionEnd will become the greater (regardless of the order - passed to this method). + After having called this, selectionStart will become the lesser, and + selectionEnd the greater (regardless of the order passed to this method). \sa selectionStart, selectionEnd * / @@ -5458,7 +5461,7 @@ advanced transformations on Items. The Transform element is a base type which cannot be - instantiated directly. The concrete Transform types are: + instantiated directly. The concrete Transform types are: \list \li \l Rotation @@ -5483,9 +5486,9 @@ the C++ class QGraphicsTransform. A \\qmltype comment should always include a \l {since-command} {\\since} command, because all QML types are new. It should also include a \l{brief-command} - {\\brief} description. And if a QML type is a member of a group of - QML types, the \\qmltype comment should include one or more - \l{ingroup-command} {\\ingroup} commands. + {\\brief} description. If a QML type is a member of a QML type group, + the \\qmltype comment should include one or more \l{ingroup-command} + {\\ingroup} commands. \target qmlmethod-command \section1 \\qmlmethod @@ -5502,9 +5505,8 @@ If either start or end is out of range, the selection is not changed. - After calling this, selectionStart will become the lesser and - selectionEnd will become the greater (regardless of the order - passed to this method). + After having called this, selectionStart will become the lesser and + selectionEnd the greater (regardless of the order passed to this method). \sa selectionStart, selectionEnd * / @@ -5624,7 +5626,7 @@ \instantiates QGraphicsTransform \ingroup qml-transform-elements \since 4.7 - \brief The Transform elements provide a way to build + \brief Provides elements provide a way to build advanced transformations on Items. The Transform element is a base type which cannot be @@ -5645,7 +5647,7 @@ argument is the name of the typedef. The documentation for the typedef will be included in the reference documentation for the class, namespace, or header file in which the typedef - is declared. To relat the \\typedef to a class, namespace, or + is declared. To relate the \\typedef to a class, namespace, or header file, the \\typedef comment must contain a \l {relates-command} {\\relates} command. @@ -5736,14 +5738,14 @@ \\brief command. The documentation will be located in the in the associated class, - header file or namespace documentation. + header file, or namespace documentation. In case of a member variable: \code / *! \variable QStyleOption::palette - \brief the palette that should be used when painting + \brief The palette that should be used when painting the control * / \endcode @@ -5764,7 +5766,7 @@ when painting the control. \endquotation - You can also document constants with the \\variable command. For + You can also document constants with the \\variable command. For example, suppose you have the \c Type and \c UserType constants in the QTreeWidgetItem class: @@ -5772,7 +5774,7 @@ enum { Type = 0, UserType = 1000 }; \endcode - For these, the \\vaqriable command can be used this way: + For these, the \\variable command can be used this way: \code / *! @@ -5832,9 +5834,14 @@ \title Context Commands The context commands provide information about the element being - documented that QDoc can't deduce on its own. e.g. Is a class - thread-safe? Is a function reentrant? Which module is the class a - member of? Context commands can appear anywhere in a QDoc comment, + documented that QDoc can't deduce on its own. For example: + \list + \li Is this class thread-safe? + \li Is this function reentrant? + \li Of which module is this class a member ? + \endlist + + Context commands can appear anywhere in a QDoc comment, but they are normally placed near the top of the comment, just below the \l {Topic Commands} {topic} command. @@ -5948,7 +5955,7 @@ * / \endcode - QDoc renders the "Getting Started" page in \c{creatingdialogs.html}: + QDoc renders the "Getting Started" page in \c{creatingdialogs.html}: \quotation \raw HTML @@ -5992,7 +5999,7 @@ titles and topics, while the start page is the page considered by the author to be the starting point of a multipage document. - The links are included in the generated HTML source code but have + The links are included in the generated HTML source code, but have no visual effect on the documentation: \code @@ -6011,8 +6018,8 @@ The \\previouspage command links the current page to the previous page in a sequence.a The command has two arguments, each enclosed - by curly braces: The first is the link target, i.e. the title of - the previous page, the second is the link text. If the page's + by curly braces: the first is the link target (the title of + the previous page), the second is the link text. If the page's title is equivalent to the link text, the second argument can be omitted. @@ -6164,7 +6171,7 @@ \code / *! \qmlproperty list State::changes - This property holds the changes to apply for this state + This property holds the changes to apply for this state. \default By default these changes are applied against the default state. If the state @@ -6188,7 +6195,7 @@ When generating the reference documentation for a class, QDoc will create and link to a separate page documenting its obsolete - functions. Usually an equivalent function is provided as an + functions. Usually an equivalent function is provided as an alternative. \code @@ -6382,8 +6389,8 @@ \c Reentrant means that all the functions in the referenced class can be called simultaneously by multiple threads, provided that - each invocation of the functions reference unique data. While \c - threadsafe means that all the functions in the referenced class + each invocation of the functions reference unique data. \c + thread-safe means that all the functions in the referenced class can be called simultaneously by multiple threads even when each invocation references shared data. @@ -6485,7 +6492,7 @@ declared reentrant, and lists the exceptions (the declared nonreentrant functions). A link to the general documentation on \l {threads.html#reentrant} {reentrancy and thread-safety} is - included. In addition a warning, "\b Warning: This function is + included. In addition a warning, "\b Warning: This function is not reentrant.", is generated in the nonreentrant functions' documentation. @@ -6501,14 +6508,14 @@ \section2 \\threadsafe The \\threadsafe command includes a line in the documentation to - indicate that the associated class or function is \e threadsafe + indicate that the associated class or function is \e threadsafe, and can be called simultaneously by multiple threads, even when separate invocations reference shared data. The command must stand on its own line. The documentation generated from this command will be similar to - the what is generated for the \l {reentrant-command} {\\reentrant} + the documentation generated for the \l {reentrant-command} {\\reentrant} command. See the example above in the \l {reentrant-example} {introduction}. @@ -6555,12 +6562,15 @@ \title Relating Things The relating commands are for specifying how one documented - element relates to another documented element. e.g., This function - is an overload of another function, or this function is a - reimplementation of another function, or this typedef is \e - related to some class or header file. There is also a command - for documenting that a QML type inherits some other QML - type. + element relates to another documented element. Some examples: + \list + \li This function is an overload of another function. + \li This function is a reimplementation of another function. + \li This typedef is \e related to some class or header file. + \endlist + + There is also a command for documenting that a QML type inherits + some other QML type. \section1 Commands @@ -6614,7 +6624,7 @@ For a function name that is overloaded (except constructors), QDoc expects one primary version of the function, and all the others - marked with the \b {\\overload command}. The primary version + marked with the \b {\\overload command}. The primary version should be fully documented. Each overload can have whatever extra documentation you want to add for just that overloaded version. @@ -6820,7 +6830,7 @@ the command's argument. For the basic classes in Qt, a class's module is determined by its - location, i.e. its directory. However, for extensions, like + location, namely its directory. However, for extensions like ActiveQt and Qt Designer, a class must be related to a module explicitly. @@ -6854,7 +6864,7 @@ \title Naming Things In general, a title command considers everything that follows it - until the first line break as its argument. If the title is so + until the first line break as its argument. If the title is so long it must span multiple lines, end each line (except the last one) with a backslash. @@ -6874,7 +6884,7 @@ Signals and slots are used for communication between objects. The signals and slots mechanism is a central - feature of Qt and probably the part that differs most + feature of Qt, and probably the part that differs most from the features provided by other frameworks. ... @@ -7003,7 +7013,7 @@ The \\mapref command is for creating a mapref in the ditamap. A mapref refers to another ditamap, which you want to include in - your ditamap. Like the \\topicref command, the \\mapref command + your ditamap. Like the \\topicref command, the \\mapref command has two arguments, but for the \\mapref command, both arguments are required. The arguments are essentially the same as described for \\topicref, but for \\mapref, the second command must be the @@ -7021,7 +7031,7 @@ \code \ditamap creator.ditamap - \title The DITA Map For Creator + \title The DITA Map for Creator \topicref {QML Module QtQuick 1} \topicref {QML Mouse Events} \endtopicref @@ -7051,7 +7061,7 @@ - The DITA Map For Creator + The DITA Map for Creator @@ -7107,12 +7117,12 @@ while '+=' adds a new value to the current one. Some configuration variables accept a list of strings as their - value, e.g. + value, for example: \l {22-qdoc-configuration-generalvariables.html#sourcedirs-variable} {\c{sourcedirs}}, while others accept only a single string. Double quotes around a value string are optional, but including them allows - you to use special characters like '=' and ' \" ' within the valuem - string, e.g.: + you to use special characters like '=' and ' \" ' within the value + string, for example: \code HTML.postheader = "Home" @@ -7215,7 +7225,7 @@ QDoc can generate \l {http://dita.xml.org} {DITA XML output}. - In your confifiguration file, set your \c {outputformats} variable + In your configuration file, set your \c {outputformats} variable to \c {DITAXML}, and send the output to an appropriate directory: \code @@ -7290,7 +7300,7 @@ alias.e = i \endcode - This renames the built-in command \\e (italics) to be \\i. The \c + This renames the built-in command \\e (italics) to be \\i. The \c alias variable is often used for compatibility reasons. See also \l {macro-variable} {macro}. @@ -7353,12 +7363,12 @@ line using the -D option. For example: \code - currentdirectory$ qdoc -Dconsoleedition qt.qdocconf + currentdirectory$ qdoc -Dconsoleedition qtgui.qdocconf \endcode In this case the -D option ensures that the \c consoleedition preprocessor symbol is defined when QDoc processes the source - files defined in the qt.qdocconf file. + files defined in the qtgui.qdocconf file. See also \l {falsehoods-variable} {falsehoods} and \l {if-command} {\\if}. @@ -7402,7 +7412,7 @@ The \l {examples-variable} {examples} {examples} and \l {exampledirs-variable} {exampledirs} variables are used by the \l {quotefromfile-command} {\\quotefromfile}, \l {quotefile-command} - {\\quotefile} and \l {example-command} {\\example} commands. If + {\\quotefile} and \l {example-command} {\\example} commands. If both the \l {examples-variable} {examples} and \l {exampledirs-variable} {exampledirs} variables are defined, QDoc will search in both, first in \l {examples-variable} {examples} @@ -7427,9 +7437,9 @@ \quotefromfile widgets/calculator/calculator.cpp \endcode - QDoc will then see if there exists a file called \c calculator.cpp + QDoc will see if there is a file called \c calculator.cpp listed as a value in the \l {examples} {\c examples} variable. If - it doesn't, it will search in the \c exampledirs variable, and + there isn't, it will search in the \c exampledirs variable, and first see if there exists a file called \code @@ -7485,7 +7495,7 @@ The default extensions are *.cpp, *.h, *.js, *.xq, *.svg, *.xml and *.ui. - The extensions are given as standard wildcard expressions. You + The extensions are given as standard wildcard expressions. You can add a file extension to the filter using '+='. For example: \code @@ -7502,7 +7512,7 @@ \l {sourcedirs-variable} {sourcedirs} or \l {headerdirs-variable} {headerdirs} variables. - For example, + For example: \code sourcedirs = src/corelib @@ -7548,9 +7558,10 @@ The general syntax is \tt {extraimages.\e{format} = \e image}. The file extension is optional. - For example, if additional images are used within the HTML.postheader - value, then these images must also be specified using the \c - extraimages variable: + For example, in \l qtgui.qdocconf we use a couple of images within + the HTML.postheader variable which value is pure HTML. For that + reason, these images are specified using the \c extraimages + variable: \code extraimages.HTML = qt-logo @@ -7646,11 +7657,11 @@ \c headerdirs. In the specified directories, QDoc will only read the files with - the fileextensions specified in the \l {headers.fileextensions} + the \c fileextensions specified in the \l {headers.fileextensions} {\c headers.fileextensions} variable. The default extensions are - *.ch, *.h, *.h++, *.hh, *.hpp and *.hxx". The files specified by - \l {headers} {\c headers} will be read independent of their - fileextensions. + *.ch, *.h, *.h++, *.hh, *.hpp, and *.hxx". The files specified by + \l {headers} {\c headers} will be read without taking into account + their fileextensions. See also \l headers and \l headers.fileextensions. @@ -7682,13 +7693,13 @@ When processing the header files specified in the \l {headerdirs} {\c headerdirs} variable, QDoc will only read the files with the fileextensions specified in the \c headers.fileextensions - variable. In this way QDoc avoid spending time reading irrelevant + variable. In this way QDoc avoids spending time reading irrelevant files. - The default extensions are *.ch, *.h, *.h++, *.hh, *.hpp and + The default extensions are *.ch, *.h, *.h++, *.hh, *.hpp, and *.hxx. - The extensions are given as standard wildcard expressions. You + The extensions are given as standard wildcard expressions. You can add a file extension to the filter using '+='. For example: \code @@ -7707,9 +7718,9 @@ The \l {images} {\c images} and \c imagedirs variables are used by the \l {image-command} {\\image} and \l {inlineimage-command} - {\\inlineimage} commands. If both the \l {images} {\c images} and - \c imagedirs variables are defined, QDoc will search in both, - first in \l {images} {\c images} then in \c imagedirs. + {\\inlineimage} commands. If both the \l {images} {\c images} and + \c imagedirs variables are defined, QDoc will search in both. First + in \l {images} {\c images}, then in \c imagedirs. QDoc will search through the directories in the specified order, and accept the first matching file it finds. It will only search @@ -7728,29 +7739,29 @@ \image calculator-example.png \endcode - QDoc will then see if there exists a file called + QDoc will then see if there is a file called calculator-example.png listed as a value in the \c images - variable. If it doesn't, it will search in the \c imagedirs - variable, and first see if there exists a file called + variable. If there isn't, it will search in the \c imagedirs + variable for: \code $QTDIR/doc/src/images/calculator-example.png \endcode - If it doesn't, QDoc will look for a file called + If the file doesn't exist, QDoc will look for a file called \code $QTDIR/examples/calculator-example.png \endcode You can filter the images in an image directory using the \l - {images.fileextensions} {\c images.fileextensions} variable. The + {images.fileextensions} {\c images.fileextensions} variable. The general idea behind the \l {images.fileextensions} {\c images.fileextensions} variable is to enable different image format for different output format. \warning The \l {images.fileextensions} {\c images.fileextensions} - variable's functionality is preliminay since QDoc at this point - only support HTML. + variable's functionality is preliminary since QDoc at this point + only supports HTML. See also \l images and \l images.fileextensions. @@ -7779,7 +7790,7 @@ image directory. The variable's values (the extensions) are given as standard - wildcard expressions. The general syntax is: \tt + wildcard expressions. The general syntax is: \tt {images.fileextensions.\e{format} = *.\e{extension}}. The idea is to enable different image format for different output @@ -7792,13 +7803,13 @@ Then, when processing the \l {image-command} {\\image} and \l {inlineimage-command} {\\inlineimage} commands, QDoc will only - search for files with extensions specified in the output format's - associated image extension variable. + search for files with extensions specified in the variable + containing the list of output formats. - \warning This is preliminary functionality since QDoc at this - point only support HTML. + \warning This is only a preliminary functionality since QDoc at this + point only supports HTML. - The default extensions for HTML are *.png, *.jpg, *.jpeg and + The default extensions for HTML are *.png, *.jpg, *.jpeg, and *.gif. You can add a file extension to the filter using '+='. For @@ -7818,13 +7829,14 @@ Currently, C++ is the only language that QDoc understands. It is also the default language, and doesn't really need to be - specified. + specified. However, a possible example of a language variable + statement: \code language = Cpp \endcode - identifies the language of the Qt source code as C++. + This identifies C++ as the language of the Qt source code. \target macro-variable \section1 macro @@ -7888,8 +7900,6 @@ The \c outputdir variable specifies the directory where QDoc will put the generated documentation. - For example: - \code outputdir = $QTDIR/doc/html \endcode @@ -7972,13 +7982,8 @@ the \c .cpp or \c .qdoc files used in the documentation. \code - sourcedirs = $QTDIR/src \ - $QTDIR/doc/src \ - $QTDIR/extensions/activeqt \ - $QTDIR/extensions/motif \ - $QTDIR/tools/designer/src/lib/extension \ - $QTDIR/tools/designer/src/lib/sdk \ - $QTDIR/tools/designer/src/lib/uilib + sourcedirs += .. \ + ../../../examples/gui/doc/src \endcode When executed, the first thing QDoc will do is to read through the @@ -7989,7 +7994,7 @@ Then it will read through the sources specified in the \l {sources} {\c sources}, and the ones located in the directories - specified in the \l {sourcedirs} {\c sourcedirs} varible + specified in the \l {sourcedirs} {\c sourcedirs} variable (including all subdirectories), merging the documentation with the structure it retrieved from the header files. @@ -7998,7 +8003,7 @@ \c sourcedirs. In the specified directories, QDoc will only read the files with - the fileextensions specified in the \l {sources.fileextensions} + the \c fileextensions specified in the \l {sources.fileextensions} {\c sources.fileextensions} variable. The default extensions are *.c++, *.cc, *.cpp and *.cxx. The files specified by \l {sources} {\c sources} will be read independent of their fileextensions. @@ -8023,7 +8028,7 @@ Although qdoc will use the encoding to read source and documentation files, limitations of C++ compilers may prevent you - from using non-ASCII characters in source code comments. In cases + from using non-ASCII characters in source code comments. In cases like these, it is possible to write API documentation completely in documentation files. @@ -8063,7 +8068,7 @@ The default extensions are *.c++, *.cc, *.cpp and *.cxx. - The extensions are given as standard wildcard expressions. You + The extensions are given as standard wildcard expressions. You can add a file extension to the filter using '+='. For example: \code @@ -8080,7 +8085,7 @@ \section1 spurious The \c spurious variable excludes specified QDoc warnings from the - output. The warnings are specified using standard wildcard + output. The warnings are specified using standard wildcard expressions. \code @@ -8119,7 +8124,7 @@ tabsize = 4 \endcode - will give the tab character the size of 4 spaces. The default + will give the tab character the size of 4 spaces. The default value of the variable is 8, and doesn't need to be specified. \target tagfile-variable @@ -8154,8 +8159,6 @@ The \c versionsym variable specifies a C++ preprocessor symbol that defines the version number of the documented software. - For example: - \code versionsym = QT_VERSION_STR \endcode @@ -8172,7 +8175,7 @@ the documentation. \warning The \\version command's functionality is not fully - implemented; currently it only works within raw HTML code. + implemented. Currently, it only works within raw HTML code. See also \l {version} {\\version}. */ @@ -8259,7 +8262,6 @@ \target Cpp.ignoredirectives-variable \section1 Cpp.ignoredirectives - The \c Cpp.ignoredirectives variable makes QDoc ignore the specified non-standard constructs, within C++ source code. @@ -8267,8 +8269,6 @@ Cpp.ignoredirectives} variables, non-standard constructs (typically macros) can result in erroneous documentation. - For example: - \code Cpp.ignoredirectives = Q_DECLARE_INTERFACE \ Q_DECLARE_OPERATORS_FOR_FLAGS \ @@ -8321,6 +8321,8 @@ Cpp.ignoredirectives} variables, non-standard constructs (typically macros) can result in erroneous documentation. + In \l qtgui.qdocconf: + \code Cpp.ignoretokens = QAXFACTORY_EXPORT \ QM_EXPORT_CANVAS \ @@ -8390,6 +8392,9 @@ "
" \endcode + The complete variable entry provides the standard footer of the + \l {http://doc.qt.digia.com/4.0/index.html} {Qt Reference Documentation}. + \target HTML.postheader-variable \section1 HTML.postheader @@ -8413,6 +8418,8 @@ "" \endcode + The complete variable entry in \l qtgui.qdocconf provides the + standard header of the \l {http://doc.qt.digia.com/} {Qt Reference Documentation}. \target HTML.style-variable @@ -8470,8 +8477,8 @@ \title Supporting Derived Projects Some configuration variables allow you to use QDoc to support - Qt-based projects; i.e allow your project to contain links to the - online Qt documentation. This means that QDoc will be able to + Qt-based projects. They allow your project to contain links to the + online Qt documentation, which means that QDoc will be able to create links to the class reference documentation, without any explicit linking command. @@ -8560,44 +8567,11 @@ \endcode The \l project variable name is used to form a file name for the - index file; in this case the \c qt.index file is created. The \l - url is stored in the index file. Later, when we use the index on - its own, QDoc will use this as the base URL when constructing - links to classes, functions, and other things listed in the index. + index file; in this case the \c qt.index file is created. The \l + url is stored in the index file. Afterwards, QDoc will use this + as the base URL when constructing links to classes, functions, + and other things listed in the index. - In a mini-project, you can use an index file by defining an \l - indexes configuration variable in your \c .qdocconf file. - - \code - project = QtCreator - description = Qt Creator Manual - url = http://qt-project.org/doc/qtcreator-2.6/ - - indexes = $QTDIR/doc/html/qt.index - - outputdir = html - - headerdirs = src - sourcedirs = src \ - examples - sources.fileextensions = "*.cpp *.qdoc *.doc" - - exampledirs = examples - \endcode - - The code above requires that you run QDoc from the directory that - contains this file. - - \b {To resolve the actual links to Qt classes, the - mini-project's \c .qdocconf file needs to assign a value to the \l - indexes variable; \c $QTDIR/doc/html/qt.index makes sure that you - always use the updated index file for the Qt documentation.} - - The only disadvantages with this approach are the extra file that - QDoc has to generate and the time it takes to do so. Reading the - index back again later isn't instantaneous either, but it's - quicker than processing all the Qt classes each time you need to - write a new document. */ /*! @@ -8751,6 +8725,7 @@ \li \l {15-qdoc-commands-navigation.html#nextpage-command} {\\nextpage} \li \l {06-qdoc-commands-includecodeinline.html#newcode-command} {\\newcode} \li \l {17-qdoc-commands-thread.html#nonreentrant-command} {\\nonreentrant} + \li \l {11-qdoc-commands-specialcontent.html#note-command} {\\note} \li \l {10-qdoc-commands-tablesandlists.html#li-command} {\\o} \span {class="newStuff"} {(deprecated, use \\li)} \li \l {16-qdoc-commands-status.html#obsolete-command} {\\obsolete} From 3e078cf36db538c95fd9b491a69196e882c24e0a Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Thu, 8 Aug 2013 11:05:26 +0200 Subject: [PATCH 099/131] Don't release the printer after using it to change a property The printer should not be released after changing a property on it as it is still needed by QPrinter elsewhere. It is released as appropriate automatically already. Task-number: QTBUG-32831 Change-Id: Idb2d98b25b62f343015a0a0fb3c9a0d506546132 Reviewed-by: Liang Qi Reviewed-by: Gabriel de Dietrich --- src/plugins/platforms/cocoa/qprintengine_mac.mm | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/plugins/platforms/cocoa/qprintengine_mac.mm b/src/plugins/platforms/cocoa/qprintengine_mac.mm index 2dedf99582..ee8d7ea157 100644 --- a/src/plugins/platforms/cocoa/qprintengine_mac.mm +++ b/src/plugins/platforms/cocoa/qprintengine_mac.mm @@ -187,10 +187,8 @@ void QMacPrintEnginePrivate::setPaperName(const QString &name) if (PMSessionGetCurrentPrinter(session(), &printer) == noErr) { CFArrayRef array; - if (PMPrinterGetPaperList(printer, &array) != noErr) { - PMRelease(printer); + if (PMPrinterGetPaperList(printer, &array) != noErr) return; - } int count = CFArrayGetCount(array); for (int i = 0; i < count; ++i) { PMPaper paper = static_cast(const_cast(CFArrayGetValueAtIndex(array, i))); @@ -208,7 +206,6 @@ void QMacPrintEnginePrivate::setPaperName(const QString &name) } } } - PMRelease(printer); } } From 1142dde83e888f8d8ea15099c3634a59faf8fe33 Mon Sep 17 00:00:00 2001 From: Eskil Abrahamsen Blomfeldt Date: Wed, 7 Aug 2013 13:59:27 +0200 Subject: [PATCH 100/131] Android: Fix QCoreApplication::applicationDirPath() Disable the code path which queries /proc//exe for the current executable path, as from a Q_OS_ANDROID perspective, this executable will be the Dalvik binary. Instead we get the application directory via the fallback, by looking in argv[0], since this is set to the location of the application binary. Task-number: QTBUG-32852 Change-Id: Ib93050f41cbd47aaf71284e8bfa6a3247131d978 Reviewed-by: Paul Olav Tvete --- src/corelib/kernel/qcoreapplication.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index efb1289a5c..a7b14b22b5 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1973,7 +1973,7 @@ QString QCoreApplication::applicationFilePath() } #endif #if defined( Q_OS_UNIX ) -# ifdef Q_OS_LINUX +# if defined(Q_OS_LINUX) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK)) // Try looking for a /proc//exe symlink first which points to // the absolute path of the executable QFileInfo pfi(QString::fromLatin1("/proc/%1/exe").arg(getpid())); From 88083a81590c6ac9b9fad88725386e4629fc3d08 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Mon, 5 Aug 2013 17:10:01 +0200 Subject: [PATCH 101/131] Doc: fix links to documentation in other modules Add the depends variable with all modules as values, because the QT variable value documentation should list the import statements for all modules. This patch enables linking to other modules. Change-Id: I521ac22bac27d79537c14583f6592251288974a4 Reviewed-by: Jerome Pasion --- qmake/doc/qmake.qdocconf | 49 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/qmake/doc/qmake.qdocconf b/qmake/doc/qmake.qdocconf index 67e6e95650..cd8ac4d0ab 100644 --- a/qmake/doc/qmake.qdocconf +++ b/qmake/doc/qmake.qdocconf @@ -22,5 +22,54 @@ language = Cpp sources = src/qmake-manual.qdoc +depends += \ + activeqt \ + qt3d \ + qtassistant \ + qtbluetooth \ + qtconcurrent \ + qtcontacts \ + qtcore \ + qtdbus \ + qtdesigner \ + qtfeedback \ + qtgraphicaleffects \ + qtgui \ + qthelp \ + qtimageformats \ + qtlinguist \ + qtlocation \ + qtmultimedia \ + qtmultimediawidgets \ + qtnetwork \ + qtopengl \ + qtorganizer \ + qtprintsupport \ + qtpublishsubscribe \ + qtqml \ + qtquick \ + qtquickcontrols \ + qtquickcontrolsstyles \ + qtquickdialogs \ + qtquicklayouts \ + qtscript \ + qtscripttools \ + qtsensors \ + qtserialport \ + qtserviceframework \ + qtsql \ + qtsvg \ + qtsysteminfo \ + qttestlib \ + qttools \ + qtuitools \ + qtversit \ + qtwebkit \ + qtwebkitexamples \ + qtwidgets \ + qtx11extras \ + qtxml \ + qtxmlpatterns + imagedirs = src/images exampledirs = src From c98943b4cd1c2c2007a9be19a0cfbe8739ab8ccb Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Wed, 7 Aug 2013 13:14:32 +0200 Subject: [PATCH 102/131] Expect fail font family mismatch in the right place MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes 4ca4fb93f666820ab10fc0e17f54b2b777540779 where the fix was right, just in the wrong place. Change-Id: I3cde24624e3789870f1c16ccb92f78f7fc567fd5 Reviewed-by: Tor Arne Vestbø --- tests/auto/gui/text/qfont/tst_qfont.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/auto/gui/text/qfont/tst_qfont.cpp b/tests/auto/gui/text/qfont/tst_qfont.cpp index 082bb94b60..acb55c2d86 100644 --- a/tests/auto/gui/text/qfont/tst_qfont.cpp +++ b/tests/auto/gui/text/qfont/tst_qfont.cpp @@ -667,15 +667,6 @@ void tst_QFont::defaultFamily_data() void tst_QFont::defaultFamily() { -#if defined(Q_OS_MAC) - if (QSysInfo::MacintoshVersion == QSysInfo::MV_10_8) { - QEXPECT_FAIL("serif", "See QTBUG-32834", Continue); - QEXPECT_FAIL("monospace", "See QTBUG-32834", Continue); - QEXPECT_FAIL("cursive", "See QTBUG-32834", Continue); - QEXPECT_FAIL("fantasy", "See QTBUG-32834", Continue); - } -#endif - QFETCH(QFont::StyleHint, styleHint); QFETCH(QStringList, acceptableFamilies); @@ -694,6 +685,15 @@ void tst_QFont::defaultFamily() break; } } + +#if defined(Q_OS_MAC) + if (QSysInfo::MacintoshVersion == QSysInfo::MV_10_8) { + QEXPECT_FAIL("serif", "See QTBUG-32834", Continue); + QEXPECT_FAIL("monospace", "See QTBUG-32834", Continue); + QEXPECT_FAIL("cursive", "See QTBUG-32834", Continue); + QEXPECT_FAIL("fantasy", "See QTBUG-32834", Continue); + } +#endif QVERIFY2(isAcceptable, msgNotAcceptableFont(familyForHint, acceptableFamilies)); } From 071c48a5ff8842d43fcdc95db08b561d340a2bfd Mon Sep 17 00:00:00 2001 From: Alexey Chernov <4ernov@gmail.com> Date: Tue, 30 Jul 2013 00:06:24 +0400 Subject: [PATCH 103/131] Return EGLNativeWindowType instead of window number in winId() QEglFSWindow::winId() method was changed to return EGLNativeWindowType EGL window handle instead of static window number as it recommends in documentation. QPlatformWindow documentation reads: "The platform specific window handle can be retrieved by the winId function." and also for winId() method itself: "Reimplement in subclasses to return a handle to the native window". Task-number: QTBUG-32564 Change-Id: I634c5b4d966b6aebde72518a2c39717d1b39af08 Reviewed-by: Andrew Knight Reviewed-by: Gunnar Sletta --- src/plugins/platforms/eglfs/qeglfswindow.cpp | 6 ++---- src/plugins/platforms/eglfs/qeglfswindow.h | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/plugins/platforms/eglfs/qeglfswindow.cpp b/src/plugins/platforms/eglfs/qeglfswindow.cpp index 3b0c7de8e7..28ce8c8a33 100644 --- a/src/plugins/platforms/eglfs/qeglfswindow.cpp +++ b/src/plugins/platforms/eglfs/qeglfswindow.cpp @@ -55,10 +55,8 @@ QEglFSWindow::QEglFSWindow(QWindow *w) , m_window(0) , has_window(false) { - static int serialNo = 0; - m_winid = ++serialNo; #ifdef QEGL_EXTRA_DEBUG - qWarning("QEglWindow %p: %p 0x%x\n", this, w, uint(m_winid)); + qWarning("QEglWindow %p: %p 0x%x\n", this, w, uint(m_window)); #endif w->setSurfaceType(QSurface::OpenGLSurface); } @@ -144,7 +142,7 @@ void QEglFSWindow::setWindowState(Qt::WindowState) WId QEglFSWindow::winId() const { - return m_winid; + return WId(m_window); } QSurfaceFormat QEglFSWindow::format() const diff --git a/src/plugins/platforms/eglfs/qeglfswindow.h b/src/plugins/platforms/eglfs/qeglfswindow.h index a119c9f815..0997f80e74 100644 --- a/src/plugins/platforms/eglfs/qeglfswindow.h +++ b/src/plugins/platforms/eglfs/qeglfswindow.h @@ -73,7 +73,6 @@ protected: EGLNativeWindowType m_window; private: - WId m_winid; EGLConfig m_config; QSurfaceFormat m_format; bool has_window; From 0352c74755a0e593b8fe32fd4bedf8f73e2cc155 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Fri, 9 Aug 2013 12:18:26 +0200 Subject: [PATCH 104/131] test: Mark tst_QGlyphRun::drawMultiScriptText2() as XFAIL This is a flaky test on OS X 10.8, so marking it as XFAIL if it is expected to fail. Task-number: QTBUG-32690 Change-Id: I0665c7474bb62c4c0a70e4b93cc977e3dbf1e150 Reviewed-by: Frederik Gladhorn --- tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp b/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp index 6b06424ad7..3f6eaae89b 100644 --- a/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp +++ b/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp @@ -502,6 +502,10 @@ void tst_QGlyphRun::drawMultiScriptText2() drawGlyphs.save("drawMultiScriptText2_drawGlyphIndexes.png"); #endif +#ifdef Q_OS_MACX + if (drawGlyphs.toImage() != textLayoutDraw.toImage()) + QEXPECT_FAIL("", "See QTBUG-32690", Continue); +#endif // Q_OS_MACX QCOMPARE(drawGlyphs, textLayoutDraw); } From 7ae0dd75ab7f2ebbf692bf33df42587819b6579b Mon Sep 17 00:00:00 2001 From: Nico Vertriest Date: Thu, 8 Aug 2013 10:48:33 +0200 Subject: [PATCH 105/131] Doc: a minimal qdocconf file with comments Task-number: QTBUG-31801 Change-Id: I3aa91c961ba5b3d4e7c69560673757120a850d42 Reviewed-by: Martin Smith Reviewed-by: Mitch Curtis --- .../doc/qdoc-manual-qdocconf-minimal.qdoc | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/tools/qdoc/doc/qdoc-manual-qdocconf-minimal.qdoc diff --git a/src/tools/qdoc/doc/qdoc-manual-qdocconf-minimal.qdoc b/src/tools/qdoc/doc/qdoc-manual-qdocconf-minimal.qdoc new file mode 100644 index 0000000000..dd4becef17 --- /dev/null +++ b/src/tools/qdoc/doc/qdoc-manual-qdocconf-minimal.qdoc @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ +/*! +\page qdoc-manual-qdocconf-minimal +\title Minimal qdocconf file +\brief Describes a qdocconf file with a minimal number of statements + +The full contents of the minimal qdocconf file: + +\code + #include(compat.qdocconf) + headerdirs = . + sourcedirs = . + exampledirs = . + imagedirs = ./images + +\endcode + +\title Statements with Comments + +\code + #include(compat.qdocconf) +\endcode + +In order to avoid compatibility issues between different versions of QDoc, +it is advised to include compat.qdocconf. + +\code + headerdirs = . +\endcode + +The header files associated with the .cpp source files can be found in the +current directory. + +\code + #sourcedirs = . +\endcode + +The .cpp or .qdoc files can be found in the current directory. + +\code + exampledirs = . +\endcode + +The source code of the example files can be found in the current directory. + +\code + imagedirs = ./images +\endcode + +The images used in the documentation can be found in subdirectory \e images. + +\note Please take care with this minimal qdocconf file. Using it in the wrong directory could cause qdoc to include a large number of files. +*/ From dcd10c004f4d5d974e4a7f2c68f08c6ed1214702 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 9 Aug 2013 16:21:10 +0200 Subject: [PATCH 106/131] Forward the correct compilers to the actual cmake tests. This was missing from commit 87db2fdef (Use the compilers used by Qt for the CMake tests., 2013-07-19) Task-number: QTQAINFRA-609 Change-Id: Ief1f0ed11d9f6268c636dc739fbf7945c5dee2c8 Reviewed-by: Sergio Ahumada --- src/corelib/Qt5CTestMacros.cmake | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/corelib/Qt5CTestMacros.cmake b/src/corelib/Qt5CTestMacros.cmake index 71097aadbf..cea514ff52 100644 --- a/src/corelib/Qt5CTestMacros.cmake +++ b/src/corelib/Qt5CTestMacros.cmake @@ -19,6 +19,14 @@ endforeach() set(BUILD_OPTIONS_LIST) +if (CMAKE_C_COMPILER) + list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}") +endif() + +if (CMAKE_CXX_COMPILER) + list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}") +endif() + if (CMAKE_BUILD_TYPE) list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}") endif() From cd17b500a85b34c16ff8f4212cf2ff35715040ba Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Tue, 30 Jul 2013 20:02:58 -0400 Subject: [PATCH 107/131] Remove OS X unsupported warning. No other platform has such a warning and it really is not important. Change-Id: Ib85a536b6fcf9d7f15cd8b0779db7f6cfaec339a Reviewed-by: Gabriel de Dietrich --- src/corelib/global/qsystemdetection.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h index 22ee28baad..b638b4d509 100644 --- a/src/corelib/global/qsystemdetection.h +++ b/src/corelib/global/qsystemdetection.h @@ -249,10 +249,6 @@ # if !defined(__IPHONE_7_0) # define __IPHONE_7_0 70000 # endif -# -# if (__MAC_OS_X_VERSION_MAX_ALLOWED > __MAC_10_8) -# warning "This version of OS X is unsupported" -# endif #endif #ifdef __LSB_VERSION__ From d6522b70adaaa51ae3bbbe0b1ada8f8e4dc82e78 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Wed, 7 Aug 2013 19:32:08 +0200 Subject: [PATCH 108/131] test: Skip some flaky tests, but only if they are expected to fail Task-number: QTBUG-29941 Change-Id: Ieca736c26711fa292855b3281229282628dce608 Reviewed-by: Richard J. Moore --- .../network/ssl/qsslsocket/tst_qsslsocket.cpp | 110 ++++++++++++------ 1 file changed, 77 insertions(+), 33 deletions(-) diff --git a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp index f3adb2b52f..de421a82c2 100644 --- a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp +++ b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp @@ -608,7 +608,9 @@ void tst_QSslSocket::connectToHostEncrypted() // This should pass unconditionally when using fluke's CA certificate. // or use untrusted certificate workaround - QVERIFY2(socket->waitForEncrypted(10000), qPrintable(socket->errorString())); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && !socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); socket->disconnectFromHost(); QVERIFY(socket->waitForDisconnected()); @@ -640,7 +642,9 @@ void tst_QSslSocket::connectToHostEncryptedWithVerificationPeerName() socket->connectToHostEncrypted(QtNetworkSettings::serverLocalName(), 443, QtNetworkSettings::serverName()); // This should pass unconditionally when using fluke's CA certificate. - QVERIFY2(socket->waitForEncrypted(10000), qPrintable(socket->errorString())); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && !socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); socket->disconnectFromHost(); QVERIFY(socket->waitForDisconnected()); @@ -661,7 +665,8 @@ void tst_QSslSocket::sessionCipher() QVERIFY(socket->waitForConnected(10000)); QVERIFY(socket->sessionCipher().isNull()); socket->startClientEncryption(); - QVERIFY(socket->waitForEncrypted(5000)); + if (!socket->waitForEncrypted(5000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QVERIFY(!socket->sessionCipher().isNull()); QVERIFY(QSslSocket::supportedCiphers().contains(socket->sessionCipher())); socket->disconnectFromHost(); @@ -692,7 +697,9 @@ void tst_QSslSocket::localCertificate() socket->setPrivateKey(QLatin1String(SRCDIR "certs/fluke.key")); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY(socket->waitForEncrypted(10000)); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && !socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); } void tst_QSslSocket::mode() @@ -724,7 +731,9 @@ void tst_QSslSocket::peerCertificateChain() socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); QCOMPARE(socket->mode(), QSslSocket::UnencryptedMode); QVERIFY(socket->peerCertificateChain().isEmpty()); - QVERIFY2(socket->waitForEncrypted(10000), qPrintable(socket->errorString())); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && !socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QList certChain = socket->peerCertificateChain(); QVERIFY(certChain.count() > 0); @@ -738,7 +747,8 @@ void tst_QSslSocket::peerCertificateChain() socket->ignoreSslErrors(); QCOMPARE(socket->mode(), QSslSocket::UnencryptedMode); QVERIFY(socket->peerCertificateChain().isEmpty()); - QVERIFY2(socket->waitForEncrypted(10000), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->peerCertificateChain().first(), socket->peerCertificate()); QVERIFY(socket->peerCertificateChain() != certChain); @@ -753,7 +763,8 @@ void tst_QSslSocket::peerCertificateChain() QVERIFY2(socket->waitForConnected(10000), "Network timeout"); socket->startClientEncryption(); - QVERIFY2(socket->waitForEncrypted(10000), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->peerCertificateChain().first(), socket->peerCertificate()); QVERIFY(socket->peerCertificateChain() == certChain); @@ -791,7 +802,9 @@ void tst_QSslSocket::privateKeyOpaque() socket->setPeerVerifyMode(QSslSocket::QueryPeer); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY(socket->waitForEncrypted(10000)); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && !socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); } void tst_QSslSocket::protocol() @@ -810,19 +823,22 @@ void tst_QSslSocket::protocol() #endif QCOMPARE(socket->protocol(), QSsl::SecureProtocols); + QFETCH_GLOBAL(bool, setProxy); { // qt-test-server allows SSLv3. socket->setProtocol(QSsl::SslV3); QCOMPARE(socket->protocol(), QSsl::SslV3); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::SslV3); socket->abort(); QCOMPARE(socket->protocol(), QSsl::SslV3); socket->connectToHost(QtNetworkSettings::serverName(), 443); QVERIFY2(socket->waitForConnected(), qPrintable(socket->errorString())); socket->startClientEncryption(); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::SslV3); socket->abort(); } @@ -831,14 +847,16 @@ void tst_QSslSocket::protocol() socket->setProtocol(QSsl::TlsV1_0); QCOMPARE(socket->protocol(), QSsl::TlsV1_0); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::TlsV1_0); socket->abort(); QCOMPARE(socket->protocol(), QSsl::TlsV1_0); socket->connectToHost(QtNetworkSettings::serverName(), 443); QVERIFY2(socket->waitForConnected(), qPrintable(socket->errorString())); socket->startClientEncryption(); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::TlsV1_0); socket->abort(); } @@ -848,14 +866,16 @@ void tst_QSslSocket::protocol() socket->setProtocol(QSsl::TlsV1_1); QCOMPARE(socket->protocol(), QSsl::TlsV1_1); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::TlsV1_1); socket->abort(); QCOMPARE(socket->protocol(), QSsl::TlsV1_1); socket->connectToHost(QtNetworkSettings::serverName(), 443); QVERIFY2(socket->waitForConnected(), qPrintable(socket->errorString())); socket->startClientEncryption(); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::TlsV1_1); socket->abort(); } @@ -864,14 +884,16 @@ void tst_QSslSocket::protocol() socket->setProtocol(QSsl::TlsV1_2); QCOMPARE(socket->protocol(), QSsl::TlsV1_2); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::TlsV1_2); socket->abort(); QCOMPARE(socket->protocol(), QSsl::TlsV1_2); socket->connectToHost(QtNetworkSettings::serverName(), 443); QVERIFY2(socket->waitForConnected(), qPrintable(socket->errorString())); socket->startClientEncryption(); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::TlsV1_2); socket->abort(); } @@ -882,14 +904,16 @@ void tst_QSslSocket::protocol() socket->setProtocol(QSsl::SslV2); QCOMPARE(socket->protocol(), QSsl::SslV2); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY(socket->waitForEncrypted()); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::SslV2); socket->abort(); QCOMPARE(socket->protocol(), QSsl::SslV2); socket->connectToHost(QtNetworkSettings::serverName(), 443); QVERIFY2(socket->waitForConnected(), qPrintable(socket->errorString())); socket->startClientEncryption(); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); socket->abort(); } #endif @@ -898,14 +922,16 @@ void tst_QSslSocket::protocol() socket->setProtocol(QSsl::AnyProtocol); QCOMPARE(socket->protocol(), QSsl::AnyProtocol); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY(socket->waitForEncrypted()); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::AnyProtocol); socket->abort(); QCOMPARE(socket->protocol(), QSsl::AnyProtocol); socket->connectToHost(QtNetworkSettings::serverName(), 443); QVERIFY2(socket->waitForConnected(), qPrintable(socket->errorString())); socket->startClientEncryption(); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::AnyProtocol); socket->abort(); } @@ -914,14 +940,16 @@ void tst_QSslSocket::protocol() socket->setProtocol(QSsl::TlsV1SslV3); QCOMPARE(socket->protocol(), QSsl::TlsV1SslV3); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY(socket->waitForEncrypted()); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::TlsV1SslV3); socket->abort(); QCOMPARE(socket->protocol(), QSsl::TlsV1SslV3); socket->connectToHost(QtNetworkSettings::serverName(), 443); QVERIFY2(socket->waitForConnected(), qPrintable(socket->errorString())); socket->startClientEncryption(); - QVERIFY2(socket->waitForEncrypted(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->protocol(), QSsl::TlsV1SslV3); socket->abort(); } @@ -1252,7 +1280,9 @@ void tst_QSslSocket::waitForEncrypted() connect(this->socket, SIGNAL(sslErrors(QList)), this, SLOT(ignoreErrorSlot())); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY(socket->waitForEncrypted(10000)); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && !socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); } void tst_QSslSocket::waitForEncryptedMinusOne() @@ -1269,7 +1299,9 @@ void tst_QSslSocket::waitForEncryptedMinusOne() connect(this->socket, SIGNAL(sslErrors(QList)), this, SLOT(ignoreErrorSlot())); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY(socket->waitForEncrypted(-1)); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && !socket->waitForEncrypted(-1)) + QSKIP("Skipping flaky test - See QTBUG-29941"); } void tst_QSslSocket::waitForConnectedEncryptedReadyRead() @@ -1284,7 +1316,9 @@ void tst_QSslSocket::waitForConnectedEncryptedReadyRead() socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 993); QVERIFY(socket->waitForConnected(10000)); - QVERIFY(socket->waitForEncrypted(10000)); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && !socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QVERIFY(socket->waitForReadyRead(10000)); QVERIFY(!socket->peerCertificate().isNull()); QVERIFY(!socket->peerCertificateChain().isEmpty()); @@ -1422,7 +1456,9 @@ void tst_QSslSocket::wildcard() #endif socket->connectToHostEncrypted(QtNetworkSettings::wildcardServerName(), 4443); - QVERIFY2(socket->waitForEncrypted(3000), qPrintable(socket->errorString())); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && !socket->waitForEncrypted(3000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QSslCertificate certificate = socket->peerCertificate(); QVERIFY(certificate.subjectInfo(QSslCertificate::CommonName).contains(QString(QtNetworkSettings::serverLocalName() + ".*." + QtNetworkSettings::serverDomainName()))); @@ -1618,7 +1654,8 @@ void tst_QSslSocket::setReadBufferSize_task_250027() socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); socket->ignoreSslErrors(); QVERIFY(socket->waitForConnected(10*1000)); - QVERIFY(socket->waitForEncrypted(10*1000)); + if (setProxy && !socket->waitForEncrypted(10*1000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); // exit the event loop as soon as we receive a readyRead() SetReadBufferSize_task_250027_handler setReadBufferSize_task_250027_handler; @@ -1799,7 +1836,8 @@ void tst_QSslSocket::waitForMinusOne() socket.startClientEncryption(); // first verification: this waiting should take 200 ms - QVERIFY2(socket.waitForEncrypted(-1), qPrintable(socket.errorString())); + if (!socket.waitForEncrypted(-1)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QVERIFY(socket.isEncrypted()); QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); QCOMPARE(socket.bytesAvailable(), Q_INT64_C(0)); @@ -1861,7 +1899,8 @@ void tst_QSslSocket::verifyMode() QCOMPARE(socket.peerVerifyMode(), QSslSocket::VerifyPeer); socket.connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY(!socket.waitForEncrypted()); + if (socket.waitForEncrypted()) + QSKIP("Skipping flaky test - See QTBUG-29941"); QList expectedErrors = QList() << QSslError(QSslError::SelfSignedCertificate, socket.peerCertificate()); @@ -1905,7 +1944,8 @@ void tst_QSslSocket::peerVerifyError() QSignalSpy peerVerifyErrorSpy(socket.data(), SIGNAL(peerVerifyError(QSslError))); socket->connectToHostEncrypted(QHostInfo::fromName(QtNetworkSettings::serverName()).addresses().first().toString(), 443); - QVERIFY(!socket->waitForEncrypted(10000)); + if (socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QVERIFY(!peerVerifyErrorSpy.isEmpty()); QVERIFY(!sslErrorsSpy.isEmpty()); QCOMPARE(qvariant_cast(peerVerifyErrorSpy.last().at(0)).error(), QSslError::HostNameMismatch); @@ -1945,7 +1985,8 @@ void tst_QSslSocket::disconnectFromHostWhenConnected() QSslSocketPtr socket = newSocket(); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 993); socket->ignoreSslErrors(); - QVERIFY(socket->waitForEncrypted(5000)); + if (!socket->waitForEncrypted(5000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); socket->write("XXXX LOGOUT\r\n"); QCOMPARE(socket->state(), QAbstractSocket::ConnectedState); socket->disconnectFromHost(); @@ -2118,7 +2159,8 @@ void tst_QSslSocket::writeBigChunk() data.data()[i*sizeof(int)] = r; } - QVERIFY(socket->waitForEncrypted(10000)); + if (!socket->waitForEncrypted(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QString errorBefore = socket->errorString(); int ret = socket->write(data.constData(), data.size()); @@ -2590,7 +2632,9 @@ void tst_QSslSocket::setEmptyDefaultConfiguration() // this test should be last, QSslSocketPtr socket = newSocket(); connect(socket.data(), SIGNAL(sslErrors(QList)), this, SLOT(ignoreErrorSlot())); socket->connectToHostEncrypted(QtNetworkSettings::serverName(), 443); - QVERIFY2(!socket->waitForEncrypted(4000), qPrintable(socket->errorString())); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && socket->waitForEncrypted(4000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); } #endif // QT_NO_SSL From be5225cacea551da8138ab1ba1b9b48d30dbbfd5 Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Fri, 9 Aug 2013 21:23:48 +0200 Subject: [PATCH 109/131] test: Mark tst_QFileSystemWatcher::watchFileAndItsDirectory() as XFAIL This is a flaky test on Windows 8 64-bit, so marking it as XFAIL if it is expected to fail. Task-number: QTBUG-30943 Change-Id: Idd276f80b54fcd5cf295a7e1adebcf0020eaa8ca Reviewed-by: Robin Burchell --- .../io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp index 2756fcce50..4105a43735 100644 --- a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp +++ b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp @@ -468,7 +468,12 @@ void tst_QFileSystemWatcher::watchFileAndItsDirectory() timer.start(3000); eventLoop.exec(); - QCOMPARE(fileChangedSpy.count(), 0); + int fileChangedSpyCount = fileChangedSpy.count(); +#ifdef Q_OS_WIN64 + if (fileChangedSpyCount != 0) + QEXPECT_FAIL("", "See QTBUG-30943", Continue); +#endif + QCOMPARE(fileChangedSpyCount, 0); #ifdef Q_OS_WINCE QEXPECT_FAIL("poller", "Directory does not get updated on file removal(See #137910)", Abort); #endif From 4a195b020ef1175771be391f925c661f1758c5fd Mon Sep 17 00:00:00 2001 From: Jonathan Liu Date: Sat, 3 Aug 2013 22:42:57 +1000 Subject: [PATCH 110/131] Do not use QWindowsFileDialogHelper for Windows Server 2003 Windows Server 2003 is based on Windows XP and should use QWindowsXpFileDialogHelper as it does not support the CLSID-based IFileDialog interfaces that are available from Windows Vista onwards. Change-Id: Idd973f9ec4c98d1f2fb7e835de64532edeccfc72 Reviewed-by: Friedemann Kleint --- src/plugins/platforms/windows/qwindowsdialoghelpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp index 33bed61398..27a7044868 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp @@ -2103,7 +2103,7 @@ QPlatformDialogHelper *createHelper(QPlatformTheme::DialogType type) || QSysInfo::windowsVersion() <= QSysInfo::WV_2003) { return new QWindowsXpFileDialogHelper(); } - if (QSysInfo::windowsVersion() > QSysInfo::WV_XP) + if (QSysInfo::windowsVersion() > QSysInfo::WV_2003) return new QWindowsFileDialogHelper(); #else return new QWindowsFileDialogHelper(); From 79ccb4fcb5b36e694b84477cdde3a179015061be Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Tue, 9 Jul 2013 18:43:32 +0200 Subject: [PATCH 111/131] Make QCoreWlan plugin compile on 10.9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We take the path of least resistence and keep the old API code for 10.6 while updating the code for 10.7 and newer. This means we have some code duplication. It also means that we only compile the 10.6 code for QCoreWlanEngine when the deploymen target is 10.6. The 10.6 version file should be removed once we drop support for Snow Leopard. Change-Id: If4702b155bcdb7522800bf99a4dd37d4efed803a Reviewed-by: Gabriel de Dietrich Reviewed-by: Tor Arne Vestbø Reviewed-by: Peter Hartmann Reviewed-by: Lorn Potter --- .../bearer/corewlan/qcorewlanengine.mm | 226 ++--- .../bearer/corewlan/qcorewlanengine_10_6.mm | 916 ++++++++++++++++++ 2 files changed, 988 insertions(+), 154 deletions(-) create mode 100644 src/plugins/bearer/corewlan/qcorewlanengine_10_6.mm diff --git a/src/plugins/bearer/corewlan/qcorewlanengine.mm b/src/plugins/bearer/corewlan/qcorewlanengine.mm index 7549b4a9f7..b0ed4076da 100644 --- a/src/plugins/bearer/corewlan/qcorewlanengine.mm +++ b/src/plugins/bearer/corewlan/qcorewlanengine.mm @@ -52,23 +52,18 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include +extern "C" { // Otherwise it won't find CWKeychain* symbols at link time +#import +} -#include #include "private/qcore_mac_p.h" #include #include +#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_7, __IPHONE_NA) + @interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject { NSNotificationCenter *notificationCenter; @@ -94,7 +89,7 @@ NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; notificationCenter = [NSNotificationCenter defaultCenter]; currentInterface = [CWInterface interfaceWithName:nil]; - [notificationCenter addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(notificationHandler:) name:CWPowerDidChangeNotification object:nil]; [locker unlock]; [autoreleasepool release]; return self; @@ -131,7 +126,7 @@ } @end -QT_MANGLE_NAMESPACE(QNSListener) *listener = 0; +static QT_MANGLE_NAMESPACE(QNSListener) *listener = 0; QT_BEGIN_NAMESPACE @@ -171,33 +166,25 @@ void QScanThread::run() CWInterface *currentInterface = [CWInterface interfaceWithName: QCFString::toNSString(interfaceName)]; mutex.unlock(); - if([currentInterface power]) { + if (currentInterface.powerOn) { NSError *err = nil; - NSDictionary *parametersDict = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithBool:YES], kCWScanKeyMerge, - [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType, - [NSNumber numberWithInteger:100], kCWScanKeyRestTime, nil]; - NSArray* apArray = [currentInterface scanForNetworksWithParameters:parametersDict error:&err]; - CWNetwork *apNetwork; + NSSet* apSet = [currentInterface scanForNetworksWithName:nil error:&err]; if (!err) { - - for(uint row=0; row < [apArray count]; row++ ) { - apNetwork = [apArray objectAtIndex:row]; - + for (CWNetwork *apNetwork in apSet) { const QString networkSsid = QCFString::toQString([apNetwork ssid]); const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid)); found.append(id); QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined; bool known = isKnownSsid(networkSsid); - if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) { + if (currentInterface.serviceActive) { if( networkSsid == QCFString::toQString( [currentInterface ssid])) { state = QNetworkConfiguration::Active; } } - if(state == QNetworkConfiguration::Undefined) { + if (state == QNetworkConfiguration::Undefined) { if(known) { state = QNetworkConfiguration::Discovered; } else { @@ -205,7 +192,7 @@ void QScanThread::run() } } QNetworkConfiguration::Purpose purpose = QNetworkConfiguration::UnknownPurpose; - if([[apNetwork securityMode] intValue] == kCWSecurityModeOpen) { + if ([apNetwork supportsSecurity:kCWSecurityNone]) { purpose = QNetworkConfiguration::PublicPurpose; } else { purpose = QNetworkConfiguration::PrivatePurpose; @@ -235,7 +222,7 @@ void QScanThread::run() interfaceName = ij.value(); } - if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) { + if (currentInterface.serviceActive) { if( networkSsid == QCFString::toQString([currentInterface ssid])) { state = QNetworkConfiguration::Active; } @@ -298,14 +285,14 @@ void QScanThread::getUserConfigurations() NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; userProfiles.clear(); - NSArray *wifiInterfaces = [CWInterface supportedInterfaces]; - for(uint row=0; row < [wifiInterfaces count]; row++ ) { + NSSet *wifiInterfaces = [CWInterface interfaceNames]; + for (NSString *ifName in wifiInterfaces) { - CWInterface *wifiInterface = [CWInterface interfaceWithName: [wifiInterfaces objectAtIndex:row]]; - if ( ![wifiInterface power] ) + CWInterface *wifiInterface = [CWInterface interfaceWithName: ifName]; + if (!wifiInterface.powerOn) continue; - NSString *nsInterfaceName = [wifiInterface name]; + NSString *nsInterfaceName = wifiInterface.ssid; // add user configured system networks SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, (CFStringRef)@"Qt corewlan", nil, nil); NSDictionary * airportPlist = (NSDictionary *)SCDynamicStoreCopyValue(dynRef, (CFStringRef)[NSString stringWithFormat:@"Setup:/Network/Interface/%@/AirPort", nsInterfaceName]); @@ -314,7 +301,7 @@ void QScanThread::getUserConfigurations() NSDictionary *prefNetDict = [airportPlist objectForKey:@"PreferredNetworks"]; NSArray *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"]; - for(NSString *ssidkey in thisSsidarray) { + for (NSString *ssidkey in thisSsidarray) { QString thisSsid = QCFString::toQString(ssidkey); if(!userProfiles.contains(thisSsid)) { QMap map; @@ -442,7 +429,7 @@ void QCoreWlanEngine::initialize() QMutexLocker locker(&mutex); NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; - if([[CWInterface supportedInterfaces] count] > 0 && !listener) { + if ([[CWInterface interfaceNames] count] > 0 && !listener) { listener = [[QT_MANGLE_NAMESPACE(QNSListener) alloc] init]; listener.engine = this; hasWifi = true; @@ -479,135 +466,62 @@ void QCoreWlanEngine::connectToId(const QString &id) CWInterface *wifiInterface = [CWInterface interfaceWithName: QCFString::toNSString(interfaceString)]; - if ([wifiInterface power]) { + if (wifiInterface.powerOn) { NSError *err = nil; - NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:0]; - QString wantedSsid; - QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id); const QString idHash = QString::number(qHash(QLatin1String("corewlan:") + ptr->name)); const QString idHash2 = QString::number(qHash(QLatin1String("corewlan:") + scanThread->getNetworkNameFromSsid(ptr->name))); - bool using8021X = false; - if (idHash2 != id) { - NSArray *array = [CW8021XProfile allUser8021XProfiles]; - - for (NSUInteger i = 0; i < [array count]; ++i) { - const QString networkNameHashCheck = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString([[array objectAtIndex:i] userDefinedName]))); - - const QString ssidHash = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString([[array objectAtIndex:i] ssid]))); - - if (id == networkNameHashCheck || id == ssidHash) { - const QString thisName = scanThread->getSsidFromNetworkName(id); - if (thisName.isEmpty()) - wantedSsid = id; - else - wantedSsid = thisName; - - [params setValue: [array objectAtIndex:i] forKey:kCWAssocKey8021XProfile]; - using8021X = true; - break; - } + QString wantedNetwork; + QMapIterator > i(scanThread->userProfiles); + while (i.hasNext()) { + i.next(); + wantedNetwork = i.key(); + const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") + wantedNetwork)); + if (id == networkNameHash) { + wantedSsid = scanThread->getSsidFromNetworkName(wantedNetwork); + break; } } - if (!using8021X) { - QString wantedNetwork; - QMapIterator > i(scanThread->userProfiles); - while (i.hasNext()) { - i.next(); - wantedNetwork = i.key(); - const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") + wantedNetwork)); - if (id == networkNameHash) { - wantedSsid = scanThread->getSsidFromNetworkName(wantedNetwork); - break; - } - } - } - NSDictionary *scanParameters = [NSDictionary dictionaryWithObjectsAndKeys: - [NSNumber numberWithBool:YES], kCWScanKeyMerge, - [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType, - [NSNumber numberWithInteger:100], kCWScanKeyRestTime, - QCFString::toNSString(wantedSsid), kCWScanKeySSID, - nil]; - - NSArray *scanArray = [wifiInterface scanForNetworksWithParameters:scanParameters error:&err]; + NSSet *scanSet = [wifiInterface scanForNetworksWithName:QCFString::toNSString(wantedSsid) error:&err]; if(!err) { - for(uint row=0; row < [scanArray count]; row++ ) { - CWNetwork *apNetwork = [scanArray objectAtIndex:row]; + for (CWNetwork *apNetwork in scanSet) { + CFDataRef ssidData = (CFDataRef)[apNetwork ssidData]; + bool result = false; - if(wantedSsid == QCFString::toQString([apNetwork ssid])) { - - if(!using8021X) { - SecKeychainAttribute attributes[3]; - - NSString *account = [apNetwork ssid]; - NSString *keyKind = @"AirPort network password"; - NSString *keyName = account; - - attributes[0].tag = kSecAccountItemAttr; - attributes[0].data = (void *)[account UTF8String]; - attributes[0].length = [account length]; - - attributes[1].tag = kSecDescriptionItemAttr; - attributes[1].data = (void *)[keyKind UTF8String]; - attributes[1].length = [keyKind length]; - - attributes[2].tag = kSecLabelItemAttr; - attributes[2].data = (void *)[keyName UTF8String]; - attributes[2].length = [keyName length]; - - SecKeychainAttributeList attributeList = {3,attributes}; - - SecKeychainSearchRef searchRef; - SecKeychainSearchCreateFromAttributes(NULL, kSecGenericPasswordItemClass, &attributeList, &searchRef); - - NSString *password = @""; - SecKeychainItemRef searchItem; - - if (SecKeychainSearchCopyNext(searchRef, &searchItem) == noErr) { - UInt32 realPasswordLength; - SecKeychainAttribute attributesW[8]; - attributesW[0].tag = kSecAccountItemAttr; - SecKeychainAttributeList listW = {1,attributesW}; - char *realPassword; - OSStatus status = SecKeychainItemCopyContent(searchItem, NULL, &listW, &realPasswordLength,(void **)&realPassword); - - if (status == noErr) { - if (realPassword != NULL) { - - QByteArray pBuf; - pBuf.resize(realPasswordLength); - pBuf.prepend(realPassword); - pBuf.insert(realPasswordLength,'\0'); - - password = [NSString stringWithUTF8String:pBuf]; - } - SecKeychainItemFreeContent(&listW, realPassword); - } - - CFRelease(searchItem); - } else { - qDebug() << "SecKeychainSearchCopyNext error"; - } - [params setValue: password forKey: kCWAssocKeyPassphrase]; - } // end using8021X - - - bool result = [wifiInterface associateToNetwork: apNetwork parameters:[NSDictionary dictionaryWithDictionary:params] error:&err]; - - if(!err) { - if(!result) { - emit connectionError(id, ConnectError); - } else { - return; - } - } else { - qDebug() <<"associate ERROR"<< QCFString::toQString([err localizedDescription ]); + SecIdentityRef identity = 0; + // Check first whether we require IEEE 802.1X authentication for the wanted SSID + if (CWKeychainCopyEAPIdentity(ssidData, &identity) == errSecSuccess) { + CFStringRef username = 0; + CFStringRef password = 0; + if (CWKeychainCopyEAPUsernameAndPassword(ssidData, &username, &password) == errSecSuccess) { + result = [wifiInterface associateToEnterpriseNetwork:apNetwork + identity:identity username:(NSString *)username password:(NSString *)password + error:&err]; + CFRelease(username); + CFRelease(password); } + CFRelease(identity); + } else { + CFStringRef password = 0; + if (CWKeychainCopyPassword(ssidData, &password) == errSecSuccess) { + result = [wifiInterface associateToNetwork:apNetwork password:(NSString *)password error:&err]; + CFRelease(password); + } + } + + if (!err) { + if (!result) { + emit connectionError(id, ConnectError); + } else { + return; + } + } else { + qDebug() <<"associate ERROR"<< QCFString::toQString([err localizedDescription ]); } } //end scan network } else { @@ -632,7 +546,7 @@ void QCoreWlanEngine::disconnectFromId(const QString &id) [CWInterface interfaceWithName: QCFString::toNSString(interfaceString)]; [wifiInterface disassociate]; - if ([[wifiInterface interfaceState]intValue] != kCWInterfaceStateInactive) { + if (wifiInterface.serviceActive) { locker.unlock(); emit connectionError(id, DisconnectionError); locker.relock(); @@ -652,9 +566,9 @@ void QCoreWlanEngine::doRequestUpdate() NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; - NSArray *wifiInterfaces = [CWInterface supportedInterfaces]; - for (uint row = 0; row < [wifiInterfaces count]; ++row) { - scanThread->interfaceName = QCFString::toQString([wifiInterfaces objectAtIndex:row]); + NSSet *wifiInterfaces = [CWInterface interfaceNames]; + for (NSString *ifName in wifiInterfaces) { + scanThread->interfaceName = QCFString::toQString(ifName); scanThread->start(); } locker.unlock(); @@ -668,7 +582,7 @@ bool QCoreWlanEngine::isWifiReady(const QString &wifiDeviceName) if(hasWifi) { NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; CWInterface *defaultInterface = [CWInterface interfaceWithName: QCFString::toNSString(wifiDeviceName)]; - if([defaultInterface power]) { + if (defaultInterface.powerOn) { haswifi = true; } [autoreleasepool release]; @@ -942,3 +856,7 @@ quint64 QCoreWlanEngine::getBytes(const QString &interfaceName, bool b) } QT_END_NAMESPACE + +#else // QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE +#include "qcorewlanengine_10_6.mm" +#endif diff --git a/src/plugins/bearer/corewlan/qcorewlanengine_10_6.mm b/src/plugins/bearer/corewlan/qcorewlanengine_10_6.mm new file mode 100644 index 0000000000..1b95ae29ad --- /dev/null +++ b/src/plugins/bearer/corewlan/qcorewlanengine_10_6.mm @@ -0,0 +1,916 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the plugins of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +@interface QT_MANGLE_NAMESPACE(QNSListener) : NSObject +{ + NSNotificationCenter *notificationCenter; + CWInterface *currentInterface; + QCoreWlanEngine *engine; + NSLock *locker; +} +- (void)notificationHandler;//:(NSNotification *)notification; +- (void)remove; +- (void)setEngine:(QCoreWlanEngine *)coreEngine; +- (QCoreWlanEngine *)engine; +- (void)dealloc; + +@property (assign) QCoreWlanEngine* engine; + +@end + +@implementation QT_MANGLE_NAMESPACE(QNSListener) + +- (id) init +{ + [locker lock]; + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + notificationCenter = [NSNotificationCenter defaultCenter]; + currentInterface = [CWInterface interfaceWithName:nil]; + [notificationCenter addObserver:self selector:@selector(notificationHandler:) name:kCWPowerDidChangeNotification object:nil]; + [locker unlock]; + [autoreleasepool release]; + return self; +} + +-(void)dealloc +{ + [super dealloc]; +} + +-(void)setEngine:(QCoreWlanEngine *)coreEngine +{ + [locker lock]; + if(!engine) + engine = coreEngine; + [locker unlock]; +} + +-(QCoreWlanEngine *)engine +{ + return engine; +} + +-(void)remove +{ + [locker lock]; + [notificationCenter removeObserver:self]; + [locker unlock]; +} + +- (void)notificationHandler//:(NSNotification *)notification +{ + engine->requestUpdate(); +} +@end + +static QT_MANGLE_NAMESPACE(QNSListener) *listener = 0; + +QT_BEGIN_NAMESPACE + +void networkChangeCallback(SCDynamicStoreRef/* store*/, CFArrayRef changedKeys, void *info) +{ + for ( long i = 0; i < CFArrayGetCount(changedKeys); i++) { + + QString changed = QCFString::toQString((CFStringRef)CFArrayGetValueAtIndex(changedKeys, i)); + if( changed.contains("/Network/Global/IPv4")) { + QCoreWlanEngine* wlanEngine = static_cast(info); + wlanEngine->requestUpdate(); + } + } + return; +} + + +QScanThread::QScanThread(QObject *parent) + :QThread(parent) +{ +} + +QScanThread::~QScanThread() +{ +} + +void QScanThread::quit() +{ + wait(); +} + +void QScanThread::run() +{ + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + QStringList found; + mutex.lock(); + CWInterface *currentInterface = [CWInterface interfaceWithName: QCFString::toNSString(interfaceName)]; + mutex.unlock(); + + if([currentInterface power]) { + NSError *err = nil; + NSDictionary *parametersDict = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:YES], kCWScanKeyMerge, + [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType, + [NSNumber numberWithInteger:100], kCWScanKeyRestTime, nil]; + + NSArray* apArray = [currentInterface scanForNetworksWithParameters:parametersDict error:&err]; + CWNetwork *apNetwork; + + if (!err) { + + for(uint row=0; row < [apArray count]; row++ ) { + apNetwork = [apArray objectAtIndex:row]; + + const QString networkSsid = QCFString::toQString([apNetwork ssid]); + const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkSsid)); + found.append(id); + + QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined; + bool known = isKnownSsid(networkSsid); + if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) { + if( networkSsid == QCFString::toQString( [currentInterface ssid])) { + state = QNetworkConfiguration::Active; + } + } + if(state == QNetworkConfiguration::Undefined) { + if(known) { + state = QNetworkConfiguration::Discovered; + } else { + state = QNetworkConfiguration::Undefined; + } + } + QNetworkConfiguration::Purpose purpose = QNetworkConfiguration::UnknownPurpose; + if([[apNetwork securityMode] intValue] == kCWSecurityModeOpen) { + purpose = QNetworkConfiguration::PublicPurpose; + } else { + purpose = QNetworkConfiguration::PrivatePurpose; + } + + found.append(foundNetwork(id, networkSsid, state, interfaceName, purpose)); + + } + } + } + // add known configurations that are not around. + QMapIterator > i(userProfiles); + while (i.hasNext()) { + i.next(); + + QString networkName = i.key(); + const QString id = QString::number(qHash(QLatin1String("corewlan:") + networkName)); + + if(!found.contains(id)) { + QString networkSsid = getSsidFromNetworkName(networkName); + const QString ssidId = QString::number(qHash(QLatin1String("corewlan:") + networkSsid)); + QNetworkConfiguration::StateFlags state = QNetworkConfiguration::Undefined; + QString interfaceName; + QMapIterator ij(i.value()); + while (ij.hasNext()) { + ij.next(); + interfaceName = ij.value(); + } + + if( [currentInterface.interfaceState intValue] == kCWInterfaceStateRunning) { + if( networkSsid == QCFString::toQString([currentInterface ssid])) { + state = QNetworkConfiguration::Active; + } + } + if(state == QNetworkConfiguration::Undefined) { + if( userProfiles.contains(networkName) + && found.contains(ssidId)) { + state = QNetworkConfiguration::Discovered; + } + } + + if(state == QNetworkConfiguration::Undefined) { + state = QNetworkConfiguration::Defined; + } + + found.append(foundNetwork(id, networkName, state, interfaceName, QNetworkConfiguration::UnknownPurpose)); + } + } + emit networksChanged(); + [autoreleasepool release]; +} + +QStringList QScanThread::foundNetwork(const QString &id, const QString &name, const QNetworkConfiguration::StateFlags state, const QString &interfaceName, const QNetworkConfiguration::Purpose purpose) +{ + QStringList found; + QMutexLocker locker(&mutex); + QNetworkConfigurationPrivate *ptr = new QNetworkConfigurationPrivate; + + ptr->name = name; + ptr->isValid = true; + ptr->id = id; + ptr->state = state; + ptr->type = QNetworkConfiguration::InternetAccessPoint; + ptr->bearerType = QNetworkConfiguration::BearerWLAN; + ptr->purpose = purpose; + + fetchedConfigurations.append( ptr); + configurationInterface.insert(ptr->id, interfaceName); + + locker.unlock(); + locker.relock(); + found.append(id); + return found; +} + +QList QScanThread::getConfigurations() +{ + QMutexLocker locker(&mutex); + + QList foundConfigurations = fetchedConfigurations; + fetchedConfigurations.clear(); + + return foundConfigurations; +} + +void QScanThread::getUserConfigurations() +{ + QMutexLocker locker(&mutex); + + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + userProfiles.clear(); + + NSArray *wifiInterfaces = [CWInterface supportedInterfaces]; + for(uint row=0; row < [wifiInterfaces count]; row++ ) { + + CWInterface *wifiInterface = [CWInterface interfaceWithName: [wifiInterfaces objectAtIndex:row]]; + if ( ![wifiInterface power] ) + continue; + + NSString *nsInterfaceName = [wifiInterface name]; +// add user configured system networks + SCDynamicStoreRef dynRef = SCDynamicStoreCreate(kCFAllocatorSystemDefault, (CFStringRef)@"Qt corewlan", nil, nil); + NSDictionary * airportPlist = (NSDictionary *)SCDynamicStoreCopyValue(dynRef, (CFStringRef)[NSString stringWithFormat:@"Setup:/Network/Interface/%@/AirPort", nsInterfaceName]); + CFRelease(dynRef); + if(airportPlist != nil) { + NSDictionary *prefNetDict = [airportPlist objectForKey:@"PreferredNetworks"]; + + NSArray *thisSsidarray = [prefNetDict valueForKey:@"SSID_STR"]; + for(NSString *ssidkey in thisSsidarray) { + QString thisSsid = QCFString::toQString(ssidkey); + if(!userProfiles.contains(thisSsid)) { + QMap map; + map.insert(thisSsid, QCFString::toQString(nsInterfaceName)); + userProfiles.insert(thisSsid, map); + } + } + CFRelease(airportPlist); + } + + // 802.1X user profiles + QString userProfilePath = QDir::homePath() + "/Library/Preferences/com.apple.eap.profiles.plist"; + NSDictionary* eapDict = [[[NSDictionary alloc] initWithContentsOfFile: QCFString::toNSString(userProfilePath)] autorelease]; + if(eapDict != nil) { + NSString *profileStr= @"Profiles"; + NSString *nameStr = @"UserDefinedName"; + NSString *networkSsidStr = @"Wireless Network"; + for (id profileKey in eapDict) { + if ([profileStr isEqualToString:profileKey]) { + NSDictionary *itemDict = [eapDict objectForKey:profileKey]; + for (id itemKey in itemDict) { + + NSInteger dictSize = [itemKey count]; + id objects[dictSize]; + id keys[dictSize]; + + [itemKey getObjects:objects andKeys:keys]; + QString networkName; + QString ssid; + for(int i = 0; i < dictSize; i++) { + if([nameStr isEqualToString:keys[i]]) { + networkName = QCFString::toQString(objects[i]); + } + if([networkSsidStr isEqualToString:keys[i]]) { + ssid = QCFString::toQString(objects[i]); + } + if(!userProfiles.contains(networkName) + && !ssid.isEmpty()) { + QMap map; + map.insert(ssid, QCFString::toQString(nsInterfaceName)); + userProfiles.insert(networkName, map); + } + } + } + } + } + } + } + [autoreleasepool release]; +} + +QString QScanThread::getSsidFromNetworkName(const QString &name) +{ + QMutexLocker locker(&mutex); + + QMapIterator > i(userProfiles); + while (i.hasNext()) { + i.next(); + QMap map = i.value(); + QMapIterator ij(i.value()); + while (ij.hasNext()) { + ij.next(); + const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") +i.key())); + if(name == i.key() || name == networkNameHash) { + return ij.key(); + } + } + } + return QString(); +} + +QString QScanThread::getNetworkNameFromSsid(const QString &ssid) +{ + QMutexLocker locker(&mutex); + + QMapIterator > i(userProfiles); + while (i.hasNext()) { + i.next(); + QMap map = i.value(); + QMapIterator ij(i.value()); + while (ij.hasNext()) { + ij.next(); + if(ij.key() == ssid) { + return i.key(); + } + } + } + return QString(); +} + +bool QScanThread::isKnownSsid(const QString &ssid) +{ + QMutexLocker locker(&mutex); + + QMapIterator > i(userProfiles); + while (i.hasNext()) { + i.next(); + QMap map = i.value(); + if(map.keys().contains(ssid)) { + return true; + } + } + return false; +} + + +QCoreWlanEngine::QCoreWlanEngine(QObject *parent) +: QBearerEngineImpl(parent), scanThread(0) +{ + scanThread = new QScanThread(this); + connect(scanThread, SIGNAL(networksChanged()), + this, SLOT(networksChanged())); +} + +QCoreWlanEngine::~QCoreWlanEngine() +{ + while (!foundConfigurations.isEmpty()) + delete foundConfigurations.takeFirst(); + [listener remove]; + [listener release]; +} + +void QCoreWlanEngine::initialize() +{ + QMutexLocker locker(&mutex); + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + + if([[CWInterface supportedInterfaces] count] > 0 && !listener) { + listener = [[QT_MANGLE_NAMESPACE(QNSListener) alloc] init]; + listener.engine = this; + hasWifi = true; + } else { + hasWifi = false; + } + storeSession = NULL; + + startNetworkChangeLoop(); + [autoreleasepool release]; +} + + +QString QCoreWlanEngine::getInterfaceFromId(const QString &id) +{ + QMutexLocker locker(&mutex); + + return scanThread->configurationInterface.value(id); +} + +bool QCoreWlanEngine::hasIdentifier(const QString &id) +{ + QMutexLocker locker(&mutex); + + return scanThread->configurationInterface.contains(id); +} + +void QCoreWlanEngine::connectToId(const QString &id) +{ + QMutexLocker locker(&mutex); + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + QString interfaceString = getInterfaceFromId(id); + + CWInterface *wifiInterface = + [CWInterface interfaceWithName: QCFString::toNSString(interfaceString)]; + + if ([wifiInterface power]) { + NSError *err = nil; + NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:0]; + + QString wantedSsid; + + QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id); + + const QString idHash = QString::number(qHash(QLatin1String("corewlan:") + ptr->name)); + const QString idHash2 = QString::number(qHash(QLatin1String("corewlan:") + scanThread->getNetworkNameFromSsid(ptr->name))); + + bool using8021X = false; + if (idHash2 != id) { + NSArray *array = [CW8021XProfile allUser8021XProfiles]; + + for (NSUInteger i = 0; i < [array count]; ++i) { + const QString networkNameHashCheck = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString([[array objectAtIndex:i] userDefinedName]))); + + const QString ssidHash = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString([[array objectAtIndex:i] ssid]))); + + if (id == networkNameHashCheck || id == ssidHash) { + const QString thisName = scanThread->getSsidFromNetworkName(id); + if (thisName.isEmpty()) + wantedSsid = id; + else + wantedSsid = thisName; + + [params setValue: [array objectAtIndex:i] forKey:kCWAssocKey8021XProfile]; + using8021X = true; + break; + } + } + } + + if (!using8021X) { + QString wantedNetwork; + QMapIterator > i(scanThread->userProfiles); + while (i.hasNext()) { + i.next(); + wantedNetwork = i.key(); + const QString networkNameHash = QString::number(qHash(QLatin1String("corewlan:") + wantedNetwork)); + if (id == networkNameHash) { + wantedSsid = scanThread->getSsidFromNetworkName(wantedNetwork); + break; + } + } + } + NSDictionary *scanParameters = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:YES], kCWScanKeyMerge, + [NSNumber numberWithInt:kCWScanTypeFast], kCWScanKeyScanType, + [NSNumber numberWithInteger:100], kCWScanKeyRestTime, + QCFString::toNSString(wantedSsid), kCWScanKeySSID, + nil]; + + NSArray *scanArray = [wifiInterface scanForNetworksWithParameters:scanParameters error:&err]; + + if(!err) { + for(uint row=0; row < [scanArray count]; row++ ) { + CWNetwork *apNetwork = [scanArray objectAtIndex:row]; + + if(wantedSsid == QCFString::toQString([apNetwork ssid])) { + + if(!using8021X) { + SecKeychainAttribute attributes[3]; + + NSString *account = [apNetwork ssid]; + NSString *keyKind = @"AirPort network password"; + NSString *keyName = account; + + attributes[0].tag = kSecAccountItemAttr; + attributes[0].data = (void *)[account UTF8String]; + attributes[0].length = [account length]; + + attributes[1].tag = kSecDescriptionItemAttr; + attributes[1].data = (void *)[keyKind UTF8String]; + attributes[1].length = [keyKind length]; + + attributes[2].tag = kSecLabelItemAttr; + attributes[2].data = (void *)[keyName UTF8String]; + attributes[2].length = [keyName length]; + + SecKeychainAttributeList attributeList = {3,attributes}; + + SecKeychainSearchRef searchRef; + SecKeychainSearchCreateFromAttributes(NULL, kSecGenericPasswordItemClass, &attributeList, &searchRef); + + NSString *password = @""; + SecKeychainItemRef searchItem; + + if (SecKeychainSearchCopyNext(searchRef, &searchItem) == noErr) { + UInt32 realPasswordLength; + SecKeychainAttribute attributesW[8]; + attributesW[0].tag = kSecAccountItemAttr; + SecKeychainAttributeList listW = {1,attributesW}; + char *realPassword; + OSStatus status = SecKeychainItemCopyContent(searchItem, NULL, &listW, &realPasswordLength,(void **)&realPassword); + + if (status == noErr) { + if (realPassword != NULL) { + + QByteArray pBuf; + pBuf.resize(realPasswordLength); + pBuf.prepend(realPassword); + pBuf.insert(realPasswordLength,'\0'); + + password = [NSString stringWithUTF8String:pBuf]; + } + SecKeychainItemFreeContent(&listW, realPassword); + } + + CFRelease(searchItem); + } else { + qDebug() << "SecKeychainSearchCopyNext error"; + } + [params setValue: password forKey: kCWAssocKeyPassphrase]; + } // end using8021X + + + bool result = [wifiInterface associateToNetwork: apNetwork parameters:[NSDictionary dictionaryWithDictionary:params] error:&err]; + + if(!err) { + if(!result) { + emit connectionError(id, ConnectError); + } else { + return; + } + } else { + qDebug() <<"associate ERROR"<< QCFString::toQString([err localizedDescription ]); + } + } + } //end scan network + } else { + qDebug() <<"scan ERROR"<< QCFString::toQString([err localizedDescription ]); + } + emit connectionError(id, InterfaceLookupError); + } + + locker.unlock(); + emit connectionError(id, InterfaceLookupError); + [autoreleasepool release]; +} + +void QCoreWlanEngine::disconnectFromId(const QString &id) +{ + QMutexLocker locker(&mutex); + + QString interfaceString = getInterfaceFromId(id); + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + + CWInterface *wifiInterface = + [CWInterface interfaceWithName: QCFString::toNSString(interfaceString)]; + + [wifiInterface disassociate]; + if ([[wifiInterface interfaceState]intValue] != kCWInterfaceStateInactive) { + locker.unlock(); + emit connectionError(id, DisconnectionError); + locker.relock(); + } + [autoreleasepool release]; +} + +void QCoreWlanEngine::requestUpdate() +{ + scanThread->getUserConfigurations(); + doRequestUpdate(); +} + +void QCoreWlanEngine::doRequestUpdate() +{ + QMutexLocker locker(&mutex); + + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + + NSArray *wifiInterfaces = [CWInterface supportedInterfaces]; + for (uint row = 0; row < [wifiInterfaces count]; ++row) { + scanThread->interfaceName = QCFString::toQString([wifiInterfaces objectAtIndex:row]); + scanThread->start(); + } + locker.unlock(); + [autoreleasepool release]; +} + +bool QCoreWlanEngine::isWifiReady(const QString &wifiDeviceName) +{ + QMutexLocker locker(&mutex); + bool haswifi = false; + if(hasWifi) { + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + CWInterface *defaultInterface = [CWInterface interfaceWithName: QCFString::toNSString(wifiDeviceName)]; + if([defaultInterface power]) { + haswifi = true; + } + [autoreleasepool release]; + } + return haswifi; +} + + +QNetworkSession::State QCoreWlanEngine::sessionStateForId(const QString &id) +{ + QMutexLocker locker(&mutex); + QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(id); + + if (!ptr) + return QNetworkSession::Invalid; + + if (!ptr->isValid) { + return QNetworkSession::Invalid; + } else if ((ptr->state & QNetworkConfiguration::Active) == QNetworkConfiguration::Active) { + return QNetworkSession::Connected; + } else if ((ptr->state & QNetworkConfiguration::Discovered) == + QNetworkConfiguration::Discovered) { + return QNetworkSession::Disconnected; + } else if ((ptr->state & QNetworkConfiguration::Defined) == QNetworkConfiguration::Defined) { + return QNetworkSession::NotAvailable; + } else if ((ptr->state & QNetworkConfiguration::Undefined) == + QNetworkConfiguration::Undefined) { + return QNetworkSession::NotAvailable; + } + + return QNetworkSession::Invalid; +} + +QNetworkConfigurationManager::Capabilities QCoreWlanEngine::capabilities() const +{ + return QNetworkConfigurationManager::ForcedRoaming; +} + +void QCoreWlanEngine::startNetworkChangeLoop() +{ + + SCDynamicStoreContext dynStoreContext = { 0, this/*(void *)storeSession*/, NULL, NULL, NULL }; + storeSession = SCDynamicStoreCreate(NULL, + CFSTR("networkChangeCallback"), + networkChangeCallback, + &dynStoreContext); + if (!storeSession ) { + qWarning() << "could not open dynamic store: error:" << SCErrorString(SCError()); + return; + } + + CFMutableArrayRef notificationKeys; + notificationKeys = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); + CFMutableArrayRef patternsArray; + patternsArray = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); + + CFStringRef storeKey; + storeKey = SCDynamicStoreKeyCreateNetworkGlobalEntity(NULL, + kSCDynamicStoreDomainState, + kSCEntNetIPv4); + CFArrayAppendValue(notificationKeys, storeKey); + CFRelease(storeKey); + + storeKey = SCDynamicStoreKeyCreateNetworkServiceEntity(NULL, + kSCDynamicStoreDomainState, + kSCCompAnyRegex, + kSCEntNetIPv4); + CFArrayAppendValue(patternsArray, storeKey); + CFRelease(storeKey); + + if (!SCDynamicStoreSetNotificationKeys(storeSession , notificationKeys, patternsArray)) { + qWarning() << "register notification error:"<< SCErrorString(SCError()); + CFRelease(storeSession ); + CFRelease(notificationKeys); + CFRelease(patternsArray); + return; + } + CFRelease(notificationKeys); + CFRelease(patternsArray); + + runloopSource = SCDynamicStoreCreateRunLoopSource(NULL, storeSession , 0); + if (!runloopSource) { + qWarning() << "runloop source error:"<< SCErrorString(SCError()); + CFRelease(storeSession ); + return; + } + + CFRunLoopAddSource(CFRunLoopGetCurrent(), runloopSource, kCFRunLoopDefaultMode); + return; +} + +QNetworkSessionPrivate *QCoreWlanEngine::createSessionBackend() +{ + return new QNetworkSessionPrivateImpl; +} + +QNetworkConfigurationPrivatePointer QCoreWlanEngine::defaultConfiguration() +{ + return QNetworkConfigurationPrivatePointer(); +} + +bool QCoreWlanEngine::requiresPolling() const +{ + return true; +} + +void QCoreWlanEngine::networksChanged() +{ + QMutexLocker locker(&mutex); + + QStringList previous = accessPointConfigurations.keys(); + + QList foundConfigurations = scanThread->getConfigurations(); + while (!foundConfigurations.isEmpty()) { + QNetworkConfigurationPrivate *cpPriv = foundConfigurations.takeFirst(); + + previous.removeAll(cpPriv->id); + + if (accessPointConfigurations.contains(cpPriv->id)) { + QNetworkConfigurationPrivatePointer ptr = accessPointConfigurations.value(cpPriv->id); + + bool changed = false; + + ptr->mutex.lock(); + + if (ptr->isValid != cpPriv->isValid) { + ptr->isValid = cpPriv->isValid; + changed = true; + } + + if (ptr->name != cpPriv->name) { + ptr->name = cpPriv->name; + changed = true; + } + + if (ptr->bearerType != cpPriv->bearerType) { + ptr->bearerType = cpPriv->bearerType; + changed = true; + } + + if (ptr->state != cpPriv->state) { + ptr->state = cpPriv->state; + changed = true; + } + + ptr->mutex.unlock(); + + if (changed) { + locker.unlock(); + emit configurationChanged(ptr); + locker.relock(); + } + + delete cpPriv; + } else { + QNetworkConfigurationPrivatePointer ptr(cpPriv); + + accessPointConfigurations.insert(ptr->id, ptr); + + locker.unlock(); + emit configurationAdded(ptr); + locker.relock(); + } + } + + while (!previous.isEmpty()) { + QNetworkConfigurationPrivatePointer ptr = + accessPointConfigurations.take(previous.takeFirst()); + + locker.unlock(); + emit configurationRemoved(ptr); + locker.relock(); + } + + locker.unlock(); + emit updateCompleted(); + +} + +quint64 QCoreWlanEngine::bytesWritten(const QString &id) +{ + QMutexLocker locker(&mutex); + const QString interfaceStr = getInterfaceFromId(id); + return getBytes(interfaceStr,false); +} + +quint64 QCoreWlanEngine::bytesReceived(const QString &id) +{ + QMutexLocker locker(&mutex); + const QString interfaceStr = getInterfaceFromId(id); + return getBytes(interfaceStr,true); +} + +quint64 QCoreWlanEngine::startTime(const QString &identifier) +{ + QMutexLocker locker(&mutex); + NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init]; + quint64 timestamp = 0; + + NSString *filePath = @"/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist"; + NSDictionary* plistDict = [[[NSDictionary alloc] initWithContentsOfFile:filePath] autorelease]; + if(plistDict == nil) + return timestamp; + NSString *input = @"KnownNetworks"; + NSString *timeStampStr = @"_timeStamp"; + + NSString *ssidStr = @"SSID_STR"; + + for (id key in plistDict) { + if ([input isEqualToString:key]) { + + NSDictionary *knownNetworksDict = [plistDict objectForKey:key]; + if(knownNetworksDict == nil) + return timestamp; + for (id networkKey in knownNetworksDict) { + bool isFound = false; + NSDictionary *itemDict = [knownNetworksDict objectForKey:networkKey]; + if(itemDict == nil) + return timestamp; + NSInteger dictSize = [itemDict count]; + id objects[dictSize]; + id keys[dictSize]; + + [itemDict getObjects:objects andKeys:keys]; + bool ok = false; + for(int i = 0; i < dictSize; i++) { + if([ssidStr isEqualToString:keys[i]]) { + const QString ident = QString::number(qHash(QLatin1String("corewlan:") + QCFString::toQString(objects[i]))); + if(ident == identifier) { + ok = true; + } + } + if(ok && [timeStampStr isEqualToString:keys[i]]) { + timestamp = (quint64)[objects[i] timeIntervalSince1970]; + isFound = true; + break; + } + } + if(isFound) + break; + } + } + } + [autoreleasepool release]; + return timestamp; +} + +quint64 QCoreWlanEngine::getBytes(const QString &interfaceName, bool b) +{ + struct ifaddrs *ifAddressList, *ifAddress; + struct if_data *if_data; + + quint64 bytes = 0; + ifAddressList = nil; + if(getifaddrs(&ifAddressList) == 0) { + for(ifAddress = ifAddressList; ifAddress; ifAddress = ifAddress->ifa_next) { + if(interfaceName == ifAddress->ifa_name) { + if_data = (struct if_data*)ifAddress->ifa_data; + if(b) { + bytes = if_data->ifi_ibytes; + break; + } else { + bytes = if_data->ifi_obytes; + break; + } + } + } + freeifaddrs(ifAddressList); + } + return bytes; +} + +QT_END_NAMESPACE From efc43ae83dd74d6b1cac4d74e7c5767e9a25ff4f Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 12 Aug 2013 13:16:13 +0200 Subject: [PATCH 112/131] Add some debugging information to diagnose bug. Task-number: QTBUG-32927 Change-Id: I7d0a1ad9eeb63ac0ec28483106f42109ed1a834c Reviewed-by: Sergio Ahumada --- .../itemviews/qcolumnview/tst_qcolumnview.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp index 3fa3fbe0ee..c17e2523f9 100644 --- a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp +++ b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp @@ -440,6 +440,10 @@ void tst_QColumnView::scrollTo() if (level >= 2) { if (!reverse) { QTRY_VERIFY(view.HorizontalOffset() < 0); + if (last <= view.HorizontalOffset()) { + qDebug() << "Test failure. last=" << last + << " ; HorizontalOffset= " << view.HorizontalOffset(); + } QTRY_VERIFY(last > view.HorizontalOffset()); } else { QTRY_VERIFY(view.HorizontalOffset() > 0); @@ -457,10 +461,15 @@ void tst_QColumnView::scrollTo() view.scrollTo(index, QAbstractItemView::EnsureVisible); index = index.parent(); if (start != level) { - if (!reverse) + if (!reverse) { QTRY_VERIFY(last < view.HorizontalOffset()); - else + } else { + if (last <= view.HorizontalOffset()) { + qDebug() << "Test failure. last=" << last + << " ; HorizontalOffset= " << view.HorizontalOffset(); + } QTRY_VERIFY(last > view.HorizontalOffset()); + } } level--; last = view.HorizontalOffset(); From 126c1b4b410c1d7eaf8ed5ae26594f39e29f5296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 17 Jul 2013 22:25:11 +0200 Subject: [PATCH 113/131] Don't assume Q_OS_UNIX means we support QEventLoop::X11ExcludeTimers A QCoreApplication may run a different event dispatcher, such as the QEventDispatcherBlackberry, and QGuiApplications will have the GUI dispatcher provided by the QPA plugin, such as QCocoaEventDispatcher. Neither support X11ExcludeTimers. Change-Id: Id5ea1c7dd74a127e13fa4d2eaa9a1bd2715a9dbb Reviewed-by: Gabriel de Dietrich --- .../corelib/kernel/qeventloop/qeventloop.pro | 2 ++ .../kernel/qeventloop/tst_qeventloop.cpp | 20 ++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro index c510052298..50329e239d 100644 --- a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro +++ b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro @@ -6,3 +6,5 @@ SOURCES = tst_qeventloop.cpp win32:!wince*:LIBS += -luser32 DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 + +contains(QT_CONFIG, glib): DEFINES += HAVE_GLIB diff --git a/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp b/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp index c696c6e21a..baa32e2ed5 100644 --- a/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp +++ b/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp @@ -46,6 +46,12 @@ #include #include #include +#if defined(Q_OS_UNIX) + #include + #if defined(HAVE_GLIB) + #include + #endif +#endif #include #include #include @@ -491,11 +497,19 @@ void tst_QEventLoop::processEventsExcludeTimers() QCOMPARE(timerReceiver.gotTimerEvent, timerId); timerReceiver.gotTimerEvent = -1; - // normal process events will send timers + // but not if we exclude timers eventLoop.processEvents(QEventLoop::X11ExcludeTimers); -#if !defined(Q_OS_UNIX) - QEXPECT_FAIL("", "X11ExcludeTimers only works on UN*X", Continue); + + QAbstractEventDispatcher *eventDispatcher = QCoreApplication::eventDispatcher(); +#if defined(Q_OS_UNIX) + if (!qobject_cast(eventDispatcher) + #if defined(HAVE_GLIB) + && !qobject_cast(eventDispatcher) + #endif + ) #endif + QEXPECT_FAIL("", "X11ExcludeTimers only supported in the UNIX/Glib dispatchers", Continue); + QCOMPARE(timerReceiver.gotTimerEvent, -1); timerReceiver.gotTimerEvent = -1; From 3ca9c396105212af5b84b5740fd9c09b92ab8d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Wed, 17 Jul 2013 21:50:56 +0200 Subject: [PATCH 114/131] Add auto-test for running the QEventLoop test with the GUI dispatcher Follows a similar include-pattern as the qguieventdispatcher test. Change-Id: Ie8669a5bc155abd6687e81526f2b95d0d19b009e Reviewed-by: Gabriel de Dietrich --- tests/auto/corelib/kernel/qeventloop/qeventloop.pro | 2 +- tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp | 4 ++++ tests/auto/gui/kernel/kernel.pro | 1 + tests/auto/gui/kernel/qguieventloop/qguieventloop.pro | 3 +++ 4 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 tests/auto/gui/kernel/qguieventloop/qguieventloop.pro diff --git a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro index 50329e239d..e5bcc31e6a 100644 --- a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro +++ b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro @@ -2,7 +2,7 @@ CONFIG += testcase CONFIG += parallel_test TARGET = tst_qeventloop QT = core network testlib core-private -SOURCES = tst_qeventloop.cpp +SOURCES = $$PWD/tst_qeventloop.cpp win32:!wince*:LIBS += -luser32 DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp b/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp index baa32e2ed5..df374ffc23 100644 --- a/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp +++ b/tests/auto/corelib/kernel/qeventloop/tst_qeventloop.cpp @@ -165,6 +165,10 @@ public slots: } }; +#ifdef QT_GUI_LIB + #define tst_QEventLoop tst_QGuiEventLoop +#endif + class tst_QEventLoop : public QObject { Q_OBJECT diff --git a/tests/auto/gui/kernel/kernel.pro b/tests/auto/gui/kernel/kernel.pro index 85a81de632..0d0a300eac 100644 --- a/tests/auto/gui/kernel/kernel.pro +++ b/tests/auto/gui/kernel/kernel.pro @@ -6,6 +6,7 @@ SUBDIRS=\ qevent \ qfileopenevent \ qguieventdispatcher \ + qguieventloop \ qguimetatype \ qguitimer \ qguivariant \ diff --git a/tests/auto/gui/kernel/qguieventloop/qguieventloop.pro b/tests/auto/gui/kernel/qguieventloop/qguieventloop.pro new file mode 100644 index 0000000000..633386fa75 --- /dev/null +++ b/tests/auto/gui/kernel/qguieventloop/qguieventloop.pro @@ -0,0 +1,3 @@ +include(../../../corelib/kernel/qeventloop/qeventloop.pro) +TARGET = tst_qguieventloop +QT += gui From 629bf43f16059dc2e5e7aa8e6a05b17e01c420a3 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 8 Aug 2013 16:32:02 +0200 Subject: [PATCH 115/131] un-confuse lupdate: make #ifdef'd braces symmetrical as a side effect, this also de-duplicates the code, which is good in its own right. Change-Id: I504cb518276fdf610639c3337e3842570b97815f Reviewed-by: Thiago Macieira Reviewed-by: John Layt --- src/corelib/tools/qlocale_tools.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/corelib/tools/qlocale_tools.cpp b/src/corelib/tools/qlocale_tools.cpp index 6b716b356f..e695ac0f4d 100644 --- a/src/corelib/tools/qlocale_tools.cpp +++ b/src/corelib/tools/qlocale_tools.cpp @@ -2370,10 +2370,9 @@ static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt, } b = d2b(d, &be, &bbits); -#ifdef Sudden_Underflow i = (int)(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); -#else - if ((i = int(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) != 0) { +#ifndef Sudden_Underflow + if (i != 0) { #endif d2 = d; setWord0(&d2, getWord0(d2) & Frac_mask1); From 3b0e6df642e08b4c0a209a793fc911988b72c02e Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 8 Aug 2013 16:33:16 +0200 Subject: [PATCH 116/131] un-confuse lupdate: remove excess brace in dead code Change-Id: I7b81121b559f18446c4e546ad4f00cb4a592ca7f Reviewed-by: Oswald Buddenhagen --- src/widgets/graphicsview/qgraphicsitem.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp index db2b71f508..bb6033ba6c 100644 --- a/src/widgets/graphicsview/qgraphicsitem.cpp +++ b/src/widgets/graphicsview/qgraphicsitem.cpp @@ -7360,7 +7360,6 @@ void QGraphicsItem::updateMicroFocus() if (qApp) qApp->inputMethod()->update(Qt::ImQueryAll); break; - } } } } From f6a067e0bad24bc7cd8d191f70e77eb92669bc1e Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 8 Aug 2013 16:32:58 +0200 Subject: [PATCH 117/131] un-confuse lupdate: use #if 0 consistently it's no good idea to #if 0 the opening brace but comment out the closing one. Change-Id: I6f9ca8f14f0dc82fb22df85de547564336ed0476 Reviewed-by: Sean Harmer Reviewed-by: Gunnar Sletta --- src/gui/opengl/qopengltextureglyphcache.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/opengl/qopengltextureglyphcache.cpp b/src/gui/opengl/qopengltextureglyphcache.cpp index 66ca5c601f..506aec0f43 100644 --- a/src/gui/opengl/qopengltextureglyphcache.cpp +++ b/src/gui/opengl/qopengltextureglyphcache.cpp @@ -372,7 +372,9 @@ void QOpenGLTextureGlyphCache::fillTexture(const Coord &c, glyph_t glyph, QFixed } else { #endif glTexSubImage2D(GL_TEXTURE_2D, 0, c.x, c.y, maskWidth, maskHeight, GL_ALPHA, GL_UNSIGNED_BYTE, mask.bits()); -// } +#if 0 + } +#endif } } From 684028a64075030b42ce5f3d78d5cb35b936d5b1 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 9 Aug 2013 15:21:15 +0200 Subject: [PATCH 118/131] don't put QLibraryInfo and QSettings into bootstrap lib it's not necessary. it was an artifact of a misguided approach to making qdoc aware of the qt installation dirs. Change-Id: I5ff363c8400d17698bf715e70b904aa69f71f0d8 Reviewed-by: Thiago Macieira --- src/tools/bootstrap/bootstrap.pro | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro index bf19828634..697c8f5574 100644 --- a/src/tools/bootstrap/bootstrap.pro +++ b/src/tools/bootstrap/bootstrap.pro @@ -50,14 +50,11 @@ QMAKE_SYNCQT_OPTIONS += -version $$QT_VERSION load(qt_module) -INCLUDEPATH += $$QT_BUILD_TREE/src/corelib/global - SOURCES += \ ../../corelib/codecs/qlatincodec.cpp \ ../../corelib/codecs/qtextcodec.cpp \ ../../corelib/codecs/qutfcodec.cpp \ ../../corelib/global/qglobal.cpp \ - ../../corelib/global/qlibraryinfo.cpp \ ../../corelib/global/qlogging.cpp \ ../../corelib/global/qmalloc.cpp \ ../../corelib/global/qnumeric.cpp \ @@ -74,7 +71,6 @@ SOURCES += \ ../../corelib/io/qfsfileengine_iterator.cpp \ ../../corelib/io/qiodevice.cpp \ ../../corelib/io/qfiledevice.cpp \ - ../../corelib/io/qsettings.cpp \ ../../corelib/io/qtemporaryfile.cpp \ ../../corelib/io/qtextstream.cpp \ ../../corelib/io/qstandardpaths.cpp \ @@ -124,13 +120,11 @@ unix:SOURCES += ../../corelib/io/qfilesystemengine_unix.cpp \ win32:SOURCES += ../../corelib/io/qfilesystemengine_win.cpp \ ../../corelib/io/qfilesystemiterator_win.cpp \ ../../corelib/io/qfsfileengine_win.cpp \ - ../../corelib/io/qsettings_win.cpp \ ../../corelib/kernel/qcoreapplication_win.cpp \ ../../corelib/plugin/qsystemlibrary.cpp \ mac { - SOURCES += ../../corelib/io/qsettings_mac.cpp \ - ../../corelib/kernel/qcoreapplication_mac.cpp \ + SOURCES += ../../corelib/kernel/qcoreapplication_mac.cpp \ ../../corelib/kernel/qcore_mac.cpp LIBS += -framework CoreServices } From ae95f289975636ba6cacc147f6723615b6d36cfa Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 24 Jul 2013 13:38:22 +0200 Subject: [PATCH 119/131] bye-bye .qmake.cache well, not really - qt_parts.prf will still create one, but it will be empty. apart from being cleaner, this now finally makes it possible to load an unconfigured qt source tree into qtcreator without random parts of the tree being missing from the project explorer. Change-Id: Ida7ee77ecb450af05bfa66106caf2067b02f1a7f Reviewed-by: Thiago Macieira Reviewed-by: Joerg Bornemann --- .qmake.conf | 3 +++ configure | 18 ------------------ tools/configure/configureapp.cpp | 11 ----------- 3 files changed, 3 insertions(+), 29 deletions(-) diff --git a/.qmake.conf b/.qmake.conf index 17dbc553bb..b6433664d8 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,5 +1,8 @@ load(qt_build_config) CONFIG += qt_example_installs +QT_SOURCE_TREE = $$PWD +QT_BUILD_TREE = $$shadowed($$PWD) + # In qtbase, all modules follow qglobal.h MODULE_VERSION = $$QT_VERSION diff --git a/configure b/configure index 9cbb6ff7fb..ba6248eba8 100755 --- a/configure +++ b/configure @@ -6668,24 +6668,6 @@ else mv -f "$QTMODULE.tmp" "$QTMODULE" fi -#------------------------------------------------------------------------------- -# save configuration into .qmake.cache -#------------------------------------------------------------------------------- - -CACHEFILE="$outpath/.qmake.cache" -[ -f "$CACHEFILE.tmp" ] && rm -f "$CACHEFILE.tmp" -cat >>"$CACHEFILE.tmp" < Date: Wed, 24 Jul 2013 13:48:36 +0200 Subject: [PATCH 120/131] purge QT_{SOURCE,BUILD}_TREE from dictionary both variables are available class-wide anyway. Change-Id: I97c13de9ead44638e9310b62f02d8cd1c910df94 Reviewed-by: Joerg Bornemann --- tools/configure/configureapp.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 7a14043d75..c7477abe99 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -157,8 +157,6 @@ Configure::Configure(int& argc, char** argv) defaultBuildParts << QStringLiteral("libs") << QStringLiteral("tools") << QStringLiteral("examples"); allBuildParts = defaultBuildParts; allBuildParts << QStringLiteral("tests"); - dictionary[ "QT_SOURCE_TREE" ] = sourcePath; - dictionary[ "QT_BUILD_TREE" ] = buildPath; dictionary[ "QT_INSTALL_PREFIX" ] = installPath; dictionary[ "QMAKESPEC" ] = getenv("QMAKESPEC"); @@ -1141,7 +1139,7 @@ void Configure::parseCmdLine() else if (configCmdLine.at(i) == "-hostprefix") { ++i; if (i == argCount || configCmdLine.at(i).startsWith('-')) - dictionary[ "QT_HOST_PREFIX" ] = dictionary[ "QT_BUILD_TREE" ]; + dictionary[ "QT_HOST_PREFIX" ] = buildPath; else dictionary[ "QT_HOST_PREFIX" ] = configCmdLine.at(i); } @@ -2814,7 +2812,7 @@ void Configure::generateCachefile() { // Generate qmodule.pri { - FileWriter moduleStream(dictionary[ "QT_BUILD_TREE" ] + "/mkspecs/qmodule.pri"); + FileWriter moduleStream(buildPath + "/mkspecs/qmodule.pri"); moduleStream << "QT_BUILD_PARTS += " << buildParts.join(' ') << endl; if (!skipModules.isEmpty()) @@ -3074,7 +3072,7 @@ void Configure::generateQConfigPri() { // Generate qconfig.pri { - FileWriter configStream(dictionary[ "QT_BUILD_TREE" ] + "/mkspecs/qconfig.pri"); + FileWriter configStream(buildPath + "/mkspecs/qconfig.pri"); configStream << "CONFIG+= "; configStream << dictionary[ "BUILD" ]; @@ -3357,7 +3355,7 @@ void Configure::generateConfigfiles() } { - FileWriter tmpStream(dictionary["QT_BUILD_TREE"] + "/mkspecs/qdevice.pri"); + FileWriter tmpStream(buildPath + "/mkspecs/qdevice.pri"); QString android_platform(dictionary.contains("ANDROID_PLATFORM") ? dictionary["ANDROID_PLATFORM"] @@ -3501,8 +3499,8 @@ void Configure::displayConfig() sout << " SQLite2................." << dictionary[ "SQL_SQLITE2" ] << endl; sout << " InterBase..............." << dictionary[ "SQL_IBASE" ] << endl << endl; - sout << "Sources are in.............." << QDir::toNativeSeparators(dictionary["QT_SOURCE_TREE"]) << endl; - sout << "Build is done in............" << QDir::toNativeSeparators(dictionary["QT_BUILD_TREE"]) << endl; + sout << "Sources are in.............." << QDir::toNativeSeparators(sourcePath) << endl; + sout << "Build is done in............" << QDir::toNativeSeparators(buildPath) << endl; sout << "Install prefix.............." << QDir::toNativeSeparators(dictionary["QT_INSTALL_PREFIX"]) << endl; sout << "Headers installed to........" << QDir::toNativeSeparators(dictionary["QT_INSTALL_HEADERS"]) << endl; sout << "Libraries installed to......" << QDir::toNativeSeparators(dictionary["QT_INSTALL_LIBS"]) << endl; From faea8d1056e4b034404febd0ef44a00e7784018d Mon Sep 17 00:00:00 2001 From: Raphael Kubo da Costa Date: Sun, 11 Aug 2013 15:08:48 +0300 Subject: [PATCH 121/131] gdb_dwarf_index: Use a sed call that's more POSIX-compliant. sed versions other than the GNU one often default to being POSIX-compliant, in which case "+" (with and without escaping) is always an ordinary character. Achieve the same functionality in a way that works with both GNU and BSD seds by using "xx*" insted of "x\+". Change-Id: I1d2576a8c0e17b31f01a44d9632c57991e53780d Reviewed-by: Oswald Buddenhagen --- mkspecs/features/unix/gdb_dwarf_index.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/unix/gdb_dwarf_index.prf b/mkspecs/features/unix/gdb_dwarf_index.prf index 0a5ee507ff..2b3dee6cc4 100644 --- a/mkspecs/features/unix/gdb_dwarf_index.prf +++ b/mkspecs/features/unix/gdb_dwarf_index.prf @@ -9,7 +9,7 @@ } QMAKE_GDB_INDEX += \ - test \$\$(gdb --version | sed -e \'s,[^0-9]\\+\\([0-9]\\)\\.\\([0-9]\\).*,\\1\\2,;q\') -gt 72 && \ + test \$\$(gdb --version | sed -e \'s,[^0-9][^0-9]*\\([0-9]\\)\\.\\([0-9]\\).*,\\1\\2,;q\') -gt 72 && \ gdb --nx --batch --quiet -ex \'set confirm off\' -ex \"save gdb-index $$QMAKE_GDB_DIR\" -ex quit \'$(TARGET)\' && \ test -f $(TARGET).gdb-index && \ $$QMAKE_OBJCOPY --add-section \'.gdb_index=$(TARGET).gdb-index\' --set-section-flags \'.gdb_index=readonly\' \'$(TARGET)\' \'$(TARGET)\' && \ From 45e5a6ff7c6165aa8dfa0cb4f0e8f54cbef45f6e Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 12 Aug 2013 16:19:20 +0200 Subject: [PATCH 122/131] Reset the QItemSelectionModel when its model is reset. Change-Id: I12af41adb18a2ecf8825b23d5715766dcae55436 Reviewed-by: Olivier Goffart --- src/corelib/itemmodels/qitemselectionmodel.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp index a4d73ea480..ea4d9b44c3 100644 --- a/src/corelib/itemmodels/qitemselectionmodel.cpp +++ b/src/corelib/itemmodels/qitemselectionmodel.cpp @@ -622,6 +622,8 @@ void QItemSelectionModelPrivate::initModel(QAbstractItemModel *model) q, SLOT(_q_layoutAboutToBeChanged(QList,QAbstractItemModel::LayoutChangeHint))); QObject::connect(model, SIGNAL(layoutChanged(QList,QAbstractItemModel::LayoutChangeHint)), q, SLOT(_q_layoutChanged(QList,QAbstractItemModel::LayoutChangeHint))); + QObject::connect(model, SIGNAL(modelReset()), + q, SLOT(reset())); } } From dfde98db52452a8c4711b80793c679974aefeb94 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 10 Feb 2013 16:06:05 +0100 Subject: [PATCH 123/131] Make the QItemSelectionModel test widgets-independent. Change-Id: I695afe535ff291bc98f43185469a434cd9178926 Reviewed-by: Olivier Goffart --- tests/auto/corelib/itemmodels/itemmodels.pro | 2 +- .../qitemselectionmodel.pro | 2 +- .../tst_qitemselectionmodel.cpp | 93 +++++++++---------- 3 files changed, 47 insertions(+), 50 deletions(-) diff --git a/tests/auto/corelib/itemmodels/itemmodels.pro b/tests/auto/corelib/itemmodels/itemmodels.pro index e0bc2a8a4b..3f726692ff 100644 --- a/tests/auto/corelib/itemmodels/itemmodels.pro +++ b/tests/auto/corelib/itemmodels/itemmodels.pro @@ -3,9 +3,9 @@ TEMPLATE=subdirs SUBDIRS = qabstractitemmodel \ qabstractproxymodel \ qidentityproxymodel \ + qitemselectionmodel \ qstringlistmodel \ qtHaveModule(widgets): SUBDIRS += \ qitemmodel \ - qitemselectionmodel \ qsortfilterproxymodel \ diff --git a/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro b/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro index 9241676076..1b6279ba1b 100644 --- a/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro +++ b/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro @@ -1,6 +1,6 @@ CONFIG += testcase CONFIG += parallel_test TARGET = tst_qitemselectionmodel -QT += widgets testlib +QT += testlib SOURCES += tst_qitemselectionmodel.cpp DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp index 8fac2c19eb..9788b78771 100644 --- a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp +++ b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp @@ -42,7 +42,6 @@ #include #include -#include class tst_QItemSelectionModel : public QObject { @@ -1526,22 +1525,21 @@ public: void tst_QItemSelectionModel::resetModel() { MyStandardItemModel model(20, 20); - QTreeView view; - view.setModel(&model); + QItemSelectionModel *selectionModel = new QItemSelectionModel(&model); - QSignalSpy spy(view.selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection))); + QSignalSpy spy(selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection))); QVERIFY(spy.isValid()); - view.selectionModel()->select(QItemSelection(model.index(0, 0), model.index(5, 5)), QItemSelectionModel::Select); + selectionModel->select(QItemSelection(model.index(0, 0), model.index(5, 5)), QItemSelectionModel::Select); QCOMPARE(spy.count(), 1); model.reset(); - QVERIFY(view.selectionModel()->selection().isEmpty()); - QVERIFY(view.selectionModel()->hasSelection() == false); + QVERIFY(selectionModel->selection().isEmpty()); + QVERIFY(selectionModel->hasSelection() == false); - view.selectionModel()->select(QItemSelection(model.index(0, 0), model.index(5, 5)), QItemSelectionModel::Select); + selectionModel->select(QItemSelection(model.index(0, 0), model.index(5, 5)), QItemSelectionModel::Select); QCOMPARE(spy.count(), 2); QCOMPARE(spy.at(1).count(), 2); @@ -1905,22 +1903,20 @@ void tst_QItemSelectionModel::selectedColumns() void tst_QItemSelectionModel::setCurrentIndex() { // Build up a simple tree - QStandardItemModel *treemodel = new QStandardItemModel(0, 1); + QScopedPointer treemodel(new QStandardItemModel(0, 1)); treemodel->insertRow(0, new QStandardItem(1)); treemodel->insertRow(1, new QStandardItem(2)); - QTreeView treeView; - treeView.setModel(treemodel); - QItemSelectionModel *selectionModel = treeView.selectionModel(); - selectionModel->setCurrentIndex( + QItemSelectionModel selectionModel(treemodel.data()); + selectionModel.setCurrentIndex( treemodel->index(0, 0, treemodel->index(0, 0)), QItemSelectionModel::SelectCurrent); - QSignalSpy currentSpy(selectionModel, + QSignalSpy currentSpy(&selectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex))); - QSignalSpy rowSpy(selectionModel, + QSignalSpy rowSpy(&selectionModel, SIGNAL(currentRowChanged(QModelIndex,QModelIndex))); - QSignalSpy columnSpy(selectionModel, + QSignalSpy columnSpy(&selectionModel, SIGNAL(currentColumnChanged(QModelIndex,QModelIndex))); QVERIFY(currentSpy.isValid()); @@ -1928,7 +1924,7 @@ void tst_QItemSelectionModel::setCurrentIndex() QVERIFY(columnSpy.isValid()); // Select the same row and column indexes, but with a different parent - selectionModel->setCurrentIndex( + selectionModel.setCurrentIndex( treemodel->index(0, 0, treemodel->index(1, 0)), QItemSelectionModel::SelectCurrent); @@ -1937,15 +1933,13 @@ void tst_QItemSelectionModel::setCurrentIndex() QCOMPARE(columnSpy.count(), 1); // Select another row in the same parent - selectionModel->setCurrentIndex( + selectionModel.setCurrentIndex( treemodel->index(1, 0, treemodel->index(1, 0)), QItemSelectionModel::SelectCurrent); QCOMPARE(currentSpy.count(), 2); QCOMPARE(rowSpy.count(), 2); QCOMPARE(columnSpy.count(), 1); - - delete treemodel; } void tst_QItemSelectionModel::splitOnInsert() @@ -1960,29 +1954,27 @@ void tst_QItemSelectionModel::splitOnInsert() void tst_QItemSelectionModel::rowIntersectsSelection1() { - QTableWidget table; - table.setColumnCount(1); - table.setRowCount(1); - table.setItem(0, 0, new QTableWidgetItem("foo")); - QAbstractItemModel *model = table.model(); - QItemSelectionModel *selectionModel = table.selectionModel(); - QModelIndex index = model->index(0, 0, QModelIndex()); + QStandardItemModel model; + model.setItem(0, 0, new QStandardItem("foo")); + QItemSelectionModel selectionModel(&model); - selectionModel->select(index, QItemSelectionModel::Select); - QVERIFY(selectionModel->rowIntersectsSelection(0, QModelIndex())); - QVERIFY(selectionModel->columnIntersectsSelection(0, QModelIndex())); + QModelIndex index = model.index(0, 0, QModelIndex()); - selectionModel->select(index, QItemSelectionModel::Deselect); - QVERIFY(!selectionModel->rowIntersectsSelection(0, QModelIndex())); - QVERIFY(!selectionModel->columnIntersectsSelection(0, QModelIndex())); + selectionModel.select(index, QItemSelectionModel::Select); + QVERIFY(selectionModel.rowIntersectsSelection(0, QModelIndex())); + QVERIFY(selectionModel.columnIntersectsSelection(0, QModelIndex())); - selectionModel->select(index, QItemSelectionModel::Toggle); - QVERIFY(selectionModel->rowIntersectsSelection(0, QModelIndex())); - QVERIFY(selectionModel->columnIntersectsSelection(0, QModelIndex())); + selectionModel.select(index, QItemSelectionModel::Deselect); + QVERIFY(!selectionModel.rowIntersectsSelection(0, QModelIndex())); + QVERIFY(!selectionModel.columnIntersectsSelection(0, QModelIndex())); - selectionModel->select(index, QItemSelectionModel::Toggle); - QVERIFY(!selectionModel->rowIntersectsSelection(0, QModelIndex())); - QVERIFY(!selectionModel->columnIntersectsSelection(0, QModelIndex())); + selectionModel.select(index, QItemSelectionModel::Toggle); + QVERIFY(selectionModel.rowIntersectsSelection(0, QModelIndex())); + QVERIFY(selectionModel.columnIntersectsSelection(0, QModelIndex())); + + selectionModel.select(index, QItemSelectionModel::Toggle); + QVERIFY(!selectionModel.rowIntersectsSelection(0, QModelIndex())); + QVERIFY(!selectionModel.columnIntersectsSelection(0, QModelIndex())); } void tst_QItemSelectionModel::rowIntersectsSelection2() @@ -2057,16 +2049,21 @@ void tst_QItemSelectionModel::rowIntersectsSelection3() void tst_QItemSelectionModel::unselectable() { - QTreeWidget w; - for (int i = 0; i < 10; ++i) - w.setItemSelected(new QTreeWidgetItem(&w), true); - QCOMPARE(w.topLevelItemCount(), 10); - QCOMPARE(w.selectionModel()->selectedIndexes().count(), 10); - QCOMPARE(w.selectionModel()->selectedRows().count(), 10); + QStandardItemModel model; + QStandardItem *parentItem = model.invisibleRootItem(); + + for (int i = 0; i < 10; ++i) { + QStandardItem *item = new QStandardItem(QString("item %0").arg(i)); + parentItem->appendRow(item); + } + QItemSelectionModel selectionModel(&model); + selectionModel.select(QItemSelection(model.index(0, 0), model.index(9, 0)), QItemSelectionModel::Select); + QCOMPARE(selectionModel.selectedIndexes().count(), 10); + QCOMPARE(selectionModel.selectedRows().count(), 10); for (int j = 0; j < 10; ++j) - w.topLevelItem(j)->setFlags(0); - QCOMPARE(w.selectionModel()->selectedIndexes().count(), 0); - QCOMPARE(w.selectionModel()->selectedRows().count(), 0); + model.item(j)->setFlags(0); + QCOMPARE(selectionModel.selectedIndexes().count(), 0); + QCOMPARE(selectionModel.selectedRows().count(), 0); } void tst_QItemSelectionModel::selectedIndexes() From 0819c48e1bba1dd447f100d2f4a80ce5a3351ea8 Mon Sep 17 00:00:00 2001 From: Balazs Domjan Date: Wed, 7 Aug 2013 17:24:38 +0200 Subject: [PATCH 124/131] Fix QDialog position shift bug after resize. On Linux (XCB), resizing a dialog shifts its position. The fix corrigates the geometry of the dialog to the right values. Task-number: QTBUG-32473 Change-Id: I6d38539a3ebc3b95eacc7f13a76f83fc9e4d821c Reviewed-by: Uli Schlachter Reviewed-by: Shawn Rutledge --- src/plugins/platforms/xcb/qxcbwindow.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/platforms/xcb/qxcbwindow.cpp b/src/plugins/platforms/xcb/qxcbwindow.cpp index 5006aab35b..028cd9ab72 100644 --- a/src/plugins/platforms/xcb/qxcbwindow.cpp +++ b/src/plugins/platforms/xcb/qxcbwindow.cpp @@ -1302,6 +1302,9 @@ QRect QXcbWindow::windowToWmGeometry(QRect r) const r.translate(m_frameMargins.left(), m_frameMargins.top()); } else if (!frameInclusive && m_gravity == XCB_GRAVITY_NORTH_WEST) { r.translate(-m_frameMargins.left(), -m_frameMargins.top()); + } else if (!frameInclusive && m_gravity == XCB_GRAVITY_CENTER) { + r.translate(-(m_frameMargins.left() - m_frameMargins.right())/2, + -(m_frameMargins.top() - m_frameMargins.bottom())/2); } return r; } From 0e3ede3d176e062cec5680ca60978af2872b16a3 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Mon, 12 Aug 2013 20:25:42 +0200 Subject: [PATCH 125/131] Fix ShortcutOverrid for Qt Quick The tryShortcutOverride function needs to be called with the focus object. The same logic is in QGuiApplication::notify. Applications with QGuiApplication would therefore handle ShortcutOverride correctly where QApplication would not allow the override. ChangeLog: Fixed ShortcutOverrid for QtQuickControls. Now it is possible to assign a shortcut such as "b" and still type "b" in text inputs. Task-number: QTBUG-32928 Change-Id: I4f4ab82fd11f45174a4483a01bbbe8143dfe0724 Reviewed-by: Shawn Rutledge Reviewed-by: Gabriel de Dietrich --- src/widgets/kernel/qapplication.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 777342d7ae..b918bdb9e9 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2858,7 +2858,14 @@ bool QApplication::notify(QObject *receiver, QEvent *e) QKeyEvent* key = static_cast(e); #ifndef QT_NO_SHORTCUT // Try looking for a Shortcut before sending key events - if (qApp->d_func()->shortcutMap.tryShortcutEvent(receiver, key)) + QObject *shortcutReceiver = receiver; + if (!isWidget && isWindow) { + QWindow *w = qobject_cast(receiver); + QObject *focus = w ? w->focusObject() : 0; + if (focus) + shortcutReceiver = focus; + } + if (qApp->d_func()->shortcutMap.tryShortcutEvent(shortcutReceiver, key)) return true; #endif qt_in_tab_key_event = (key->key() == Qt::Key_Backtab From 983fa9b5cb8494717acc2903000f85d53848da9a Mon Sep 17 00:00:00 2001 From: Sergio Ahumada Date: Tue, 13 Aug 2013 15:17:42 +0200 Subject: [PATCH 126/131] test: Skip some more qsslsocket flaky tests Task-number: QTBUG-29941 Change-Id: Iaf1c4834ef36db284464184639a1ab00928510cf Reviewed-by: Peter Hartmann --- .../auto/network/ssl/qsslsocket/tst_qsslsocket.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp index de421a82c2..85b60686d6 100644 --- a/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp +++ b/tests/auto/network/ssl/qsslsocket/tst_qsslsocket.cpp @@ -910,7 +910,8 @@ void tst_QSslSocket::protocol() socket->abort(); QCOMPARE(socket->protocol(), QSsl::SslV2); socket->connectToHost(QtNetworkSettings::serverName(), 443); - QVERIFY2(socket->waitForConnected(), qPrintable(socket->errorString())); + if (setProxy && !socket->waitForConnected()) + QSKIP("Skipping flaky test - See QTBUG-29941"); socket->startClientEncryption(); if (setProxy && !socket->waitForEncrypted()) QSKIP("Skipping flaky test - See QTBUG-29941"); @@ -1969,7 +1970,8 @@ void tst_QSslSocket::disconnectFromHostWhenConnecting() QCOMPARE(state, socket->state()); QVERIFY(socket->state() == QAbstractSocket::HostLookupState || socket->state() == QAbstractSocket::ConnectingState); - QVERIFY(socket->waitForDisconnected(10000)); + if (!socket->waitForDisconnected(10000)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(socket->state(), QAbstractSocket::UnconnectedState); // we did not call close, so the socket must be still open QVERIFY(socket->isOpen()); @@ -2080,7 +2082,8 @@ void tst_QSslSocket::ignoreSslErrorsList() socket.connectToHostEncrypted(QtNetworkSettings::serverName(), 443); bool expectEncryptionSuccess = (expectedSslErrorSignalCount == 0); - QCOMPARE(socket.waitForEncrypted(10000), expectEncryptionSuccess); + if (socket.waitForEncrypted(10000) != expectEncryptionSuccess) + QSKIP("Skipping flaky test - See QTBUG-29941"); QCOMPARE(sslErrorsSpy.count(), expectedSslErrorSignalCount); } @@ -2132,7 +2135,9 @@ void tst_QSslSocket::readFromClosedSocket() socket->write("\n"); socket->waitForBytesWritten(); socket->waitForReadyRead(); - QVERIFY(socket->state() == QAbstractSocket::ConnectedState); + QFETCH_GLOBAL(bool, setProxy); + if (setProxy && (socket->state() != QAbstractSocket::ConnectedState)) + QSKIP("Skipping flaky test - See QTBUG-29941"); QVERIFY(socket->bytesAvailable()); socket->close(); QVERIFY(!socket->bytesAvailable()); From 90cdac061783eb2ffd68615016c883ea958c497c Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 13 Aug 2013 10:51:22 +0200 Subject: [PATCH 127/131] RCC: Mention -list command line option in -help output Change-Id: I98066aba55f5ac699efc210360a60871042f4083 Reviewed-by: Oswald Buddenhagen Reviewed-by: hjk --- src/tools/rcc/main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/rcc/main.cpp b/src/tools/rcc/main.cpp index c0ed7401bc..6b311a8e55 100644 --- a/src/tools/rcc/main.cpp +++ b/src/tools/rcc/main.cpp @@ -69,6 +69,7 @@ void showHelp(const QString &argv0, const QString &error) " -namespace turn off namespace macros\n" " -project Output a resource file containing all\n" " files from the current directory\n" + " -list lists .qrc file entries\n" " -version display version\n" " -help display this information\n", qPrintable(argv0)); From 3c2c9649eb7b966cfc2727fd309cf6d928c43f8c Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 13 Aug 2013 15:26:48 +0200 Subject: [PATCH 128/131] RCC: Make auto-test pick up the right binary Change-Id: I30f42d40c69789eb1e292ab6bd1cf2c09d81b11b Reviewed-by: Oswald Buddenhagen Reviewed-by: hjk --- tests/auto/tools/rcc/tst_rcc.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tests/auto/tools/rcc/tst_rcc.cpp b/tests/auto/tools/rcc/tst_rcc.cpp index d9ceb6ff6f..4089d53f3d 100644 --- a/tests/auto/tools/rcc/tst_rcc.cpp +++ b/tests/auto/tools/rcc/tst_rcc.cpp @@ -70,6 +70,9 @@ private slots: void binary(); void cleanupTestCase(); + +private: + QString m_rcc; }; void tst_rcc::initTestCase() @@ -77,6 +80,7 @@ void tst_rcc::initTestCase() // rcc uses a QHash to store files in the resource system. // we must force a certain hash order when testing or tst_rcc will fail, see QTBUG-25078 QVERIFY(qputenv("QT_RCC_TEST", "1")); + m_rcc = QLibraryInfo::location(QLibraryInfo::BinariesPath) + QLatin1String("/rcc"); } QString findExpectedFile(const QString &base) @@ -145,13 +149,12 @@ void tst_rcc::rcc() } // Launch - const QString command = QLatin1String("rcc"); QProcess process; - process.start(command, QStringList(qrcfile)); + process.start(m_rcc, QStringList(qrcfile)); if (!process.waitForFinished()) { const QString path = QString::fromLocal8Bit(qgetenv("PATH")); QString message = QString::fromLatin1("'%1' could not be found when run from '%2'. Path: '%3' "). - arg(command, QDir::currentPath(), path); + arg(m_rcc, QDir::currentPath(), path); QFAIL(qPrintable(message)); } const QChar cr = QLatin1Char('\r'); @@ -176,13 +179,14 @@ void tst_rcc::rcc() -static void createRccBinaryData(const QString &baseDir, const QString &qrcFileName, const QString &rccFileName) +static void createRccBinaryData(const QString &rcc, const QString &baseDir, + const QString &qrcFileName, const QString &rccFileName) { QString currentDir = QDir::currentPath(); QDir::setCurrent(baseDir); QProcess rccProcess; - rccProcess.start("rcc", QStringList() << "-binary" << "-o" << rccFileName << qrcFileName); + rccProcess.start(rcc, QStringList() << "-binary" << "-o" << rccFileName << qrcFileName); bool ok = rccProcess.waitForFinished(); if (!ok) { QString errorString = QString::fromLatin1("Could not start rcc (is it in PATH?): %1").arg(rccProcess.errorString()); @@ -262,7 +266,7 @@ void tst_rcc::binary_data() QFileInfo qrcFileInfo = iter.fileInfo(); QString absoluteBaseName = QFileInfo(qrcFileInfo.absolutePath(), qrcFileInfo.baseName()).absoluteFilePath(); QString rccFileName = absoluteBaseName + QLatin1String(".rcc"); - createRccBinaryData(dataPath, qrcFileInfo.absoluteFilePath(), rccFileName); + createRccBinaryData(m_rcc, dataPath, qrcFileInfo.absoluteFilePath(), rccFileName); QString localeFileName = absoluteBaseName + QLatin1String(".locale"); QFile localeFile(localeFileName); From 1dcdc506f34bfa0d9adc6d07587a4a71dbda455b Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 22 Jul 2013 13:09:21 +0200 Subject: [PATCH 129/131] Fix SONAME handling on android Set the SONAME to the library name without the major version number appended, as android does not have the versioned symlinks. Change-Id: I41c504869019a393a3f112b2f7fc81c7ad5afa1c Reviewed-by: Oswald Buddenhagen Reviewed-by: BogDan Vatra --- mkspecs/android-g++/qmake.conf | 3 +-- qmake/generators/unix/unixmake2.cpp | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mkspecs/android-g++/qmake.conf b/mkspecs/android-g++/qmake.conf index bcdfe06897..0afea12e60 100644 --- a/mkspecs/android-g++/qmake.conf +++ b/mkspecs/android-g++/qmake.conf @@ -3,7 +3,7 @@ MAKEFILE_GENERATOR = UNIX QMAKE_PLATFORM = android QMAKE_COMPILER = gcc -CONFIG += android_install +CONFIG += android_install unversioned_soname DEFINES += QT_NO_PRINTER QT_NO_PRINTDIALOG include(../common/linux.conf) @@ -177,7 +177,6 @@ contains(NDK_ROOT, ".*r6")|contains(NDK_ROOT, ".*r5.*") { } QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB -QMAKE_LFLAGS_SONAME = QMAKE_LFLAGS_NOUNDEF = -Wl,--no-undefined QMAKE_LFLAGS_RPATH = -Wl,-rpath= QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link= diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp index e4d33e2d4e..cd6f441472 100644 --- a/qmake/generators/unix/unixmake2.cpp +++ b/qmake/generators/unix/unixmake2.cpp @@ -1178,6 +1178,9 @@ void UnixMakefileGenerator::init2() soname += project->first("TARGET"); } else if(!project->isEmpty("QMAKE_BUNDLE")) { soname += project->first("TARGET_x.y"); + } else if(project->isActiveConfig("unversioned_soname")) { + soname = "lib" + project->first("QMAKE_ORIG_TARGET") + + "." + project->first("QMAKE_EXTENSION_SHLIB"); } else if(!project->values("TARGET_x").isEmpty()) { soname += project->first("TARGET_x"); } From 8c3b31182cbf53aad8d1979f612eefb93a548940 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Fri, 9 Aug 2013 14:09:06 +0200 Subject: [PATCH 130/131] Cocoa: Allow to hide menu items in menubar Task-number: QTBUG-32899 Change-Id: I423ac2d636306303d39e973f19032c9004957095 Reviewed-by: Jens Bache-Wiig --- src/plugins/platforms/cocoa/qcocoamenu.h | 3 +++ src/plugins/platforms/cocoa/qcocoamenu.mm | 2 ++ src/plugins/platforms/cocoa/qcocoamenubar.mm | 18 ++++++++++-------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoamenu.h b/src/plugins/platforms/cocoa/qcocoamenu.h index 7224ee2ff8..59fda96dff 100644 --- a/src/plugins/platforms/cocoa/qcocoamenu.h +++ b/src/plugins/platforms/cocoa/qcocoamenu.h @@ -84,6 +84,8 @@ public: inline NSMenuItem *nsMenuItem() const { return m_nativeItem; } + inline bool isVisible() const { return m_visible; } + virtual QPlatformMenuItem *menuItemAt(int position) const; virtual QPlatformMenuItem *menuItemForTag(quintptr tag) const; @@ -100,6 +102,7 @@ private: NSMenuItem *m_nativeItem; NSObject *m_delegate; bool m_enabled; + bool m_visible; quintptr m_tag; QCocoaMenuBar *m_menuBar; }; diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm index bd406ee176..f9e033d21b 100644 --- a/src/plugins/platforms/cocoa/qcocoamenu.mm +++ b/src/plugins/platforms/cocoa/qcocoamenu.mm @@ -216,6 +216,7 @@ QT_BEGIN_NAMESPACE QCocoaMenu::QCocoaMenu() : m_enabled(true), + m_visible(true), m_tag(0), m_menuBar(0) { @@ -421,6 +422,7 @@ void QCocoaMenu::setEnabled(bool enabled) void QCocoaMenu::setVisible(bool visible) { [m_nativeItem setSubmenu:(visible ? m_nativeMenu : nil)]; + m_visible = visible; } void QCocoaMenu::showPopup(const QWindow *parentWindow, QPoint pos, const QPlatformMenuItem *item) diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm index 8d1ca88b8e..ddfa9fff96 100644 --- a/src/plugins/platforms/cocoa/qcocoamenubar.mm +++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm @@ -149,15 +149,17 @@ void QCocoaMenuBar::syncMenu(QPlatformMenu *menu) Q_FOREACH (QCocoaMenuItem *item, cocoaMenu->items()) cocoaMenu->syncMenuItem(item); - // If the NSMenu has no visble items, or only separators, we should hide it - // on the menubar. This can happen after syncing the menu items since they - // can be moved to other menus. BOOL shouldHide = YES; - for (NSMenuItem *item in [cocoaMenu->nsMenu() itemArray]) - if (![item isSeparatorItem] && ![item isHidden]) { - shouldHide = NO; - break; - } + if (cocoaMenu->isVisible()) { + // If the NSMenu has no visble items, or only separators, we should hide it + // on the menubar. This can happen after syncing the menu items since they + // can be moved to other menus. + for (NSMenuItem *item in [cocoaMenu->nsMenu() itemArray]) + if (![item isSeparatorItem] && ![item isHidden]) { + shouldHide = NO; + break; + } + } [cocoaMenu->nsMenuItem() setHidden:shouldHide]; } From c8d9b17367cfdcb034d11f8a168ca4ae3993e7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Str=C3=B8mme?= Date: Tue, 13 Aug 2013 13:20:05 +0200 Subject: [PATCH 131/131] Fix crash in QProcess::waitForStarted() on Unix. Invoking waitForStarted() on a QProcess before or after an unsuccessful call to start() (e.g., with an empty command), would execute FD_SET with an invalid file descriptor and cause the process to abort. The bug can be reliably reproduced on OSX. Task-number: QTBUG-32958 Change-Id: Id25b7781168489281645e21571361ca1a71d43e3 Reviewed-by: Oswald Buddenhagen Reviewed-by: Thiago Macieira --- src/corelib/io/qprocess.cpp | 6 +++--- tests/auto/corelib/io/qprocess/tst_qprocess.cpp | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp index 1be108d0a7..96cec568df 100644 --- a/src/corelib/io/qprocess.cpp +++ b/src/corelib/io/qprocess.cpp @@ -1691,10 +1691,10 @@ QProcessEnvironment QProcess::processEnvironment() const bool QProcess::waitForStarted(int msecs) { Q_D(QProcess); - if (d->processState == QProcess::Running) - return true; + if (d->processState == QProcess::Starting) + return d->waitForStarted(msecs); - return d->waitForStarted(msecs); + return d->processState == QProcess::Running; } /*! \reimp diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp index f2759dfd6e..7a3f6837f8 100644 --- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp +++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp @@ -154,6 +154,7 @@ private slots: void invalidProgramString(); void onlyOneStartedSignal(); void finishProcessBeforeReadingDone(); + void waitForStartedWithoutStart(); // keep these at the end, since they use lots of processes and sometimes // caused obscure failures to occur in tests that followed them (esp. on the Mac) @@ -2214,6 +2215,12 @@ void tst_QProcess::finishProcessBeforeReadingDone() QCOMPARE(lines.last(), QStringLiteral("10239 -this is a number")); } +void tst_QProcess::waitForStartedWithoutStart() +{ + QProcess process; + QVERIFY(!process.waitForStarted(5000)); +} + #endif //QT_NO_PROCESS QTEST_MAIN(tst_QProcess)