Merge remote-tracking branch 'origin/5.5' into HEAD

Conflicts:
	src/plugins/platforms/windows/qwindowsopengltester.cpp

Change-Id: Ia7abeba9395ccf84e2fa81b91a5725a86dedb9fe
This commit is contained in:
Simon Hausmann 2015-07-17 15:06:22 +02:00
commit b2603b7665
76 changed files with 757 additions and 355 deletions

9
configure vendored
View File

@ -682,6 +682,9 @@ CFG_XCB=auto
CFG_XCB_XLIB=auto CFG_XCB_XLIB=auto
CFG_XCB_GLX=no CFG_XCB_GLX=no
CFG_EGLFS=auto CFG_EGLFS=auto
CFG_EGLFS_BRCM=no
CFG_EGLFS_MALI=no
CFG_EGLFS_VIV=no
CFG_DIRECTFB=auto CFG_DIRECTFB=auto
CFG_LINUXFB=auto CFG_LINUXFB=auto
CFG_KMS=auto CFG_KMS=auto
@ -2697,7 +2700,7 @@ MacOS/iOS options:
link tools against those frameworks. link tools against those frameworks.
-no-framework ...... Do not build Qt as a series of frameworks. -no-framework ...... Do not build Qt as a series of frameworks.
-secure-transport .. Use SecureTransport instead of OpenSSL (requires -no-openssl) -securetransport ... Use SecureTransport instead of OpenSSL (requires -no-openssl)
-sdk <sdk> ......... Build Qt using Apple provided SDK <sdk>. The argument should be -sdk <sdk> ......... Build Qt using Apple provided SDK <sdk>. The argument should be
one of the available SDKs as listed by 'xcodebuild -showsdks'. one of the available SDKs as listed by 'xcodebuild -showsdks'.
@ -2842,7 +2845,7 @@ if [ -z "$PLATFORM" ]; then
Linux:*) Linux:*)
PLATFORM=linux-g++ PLATFORM=linux-g++
PLATFORM_NOTES=" PLATFORM_NOTES="
- Also available for Linux: linux-kcc linux-icc linux-cxx - Also available for Linux: linux-clang linux-kcc linux-icc linux-cxx
" "
;; ;;
SunOS:5*) SunOS:5*)
@ -4236,7 +4239,7 @@ compileTestWithPkgConfig()
libdir_mod=`echo $libdir_raw | sed -e 's,^-L,,g' -e 's, -L, ,g'` libdir_mod=`echo $libdir_raw | sed -e 's,^-L,,g' -e 's, -L, ,g'`
has_used_pkg_config="yes" has_used_pkg_config="yes"
fi fi
if compileTest $configtest $configtest_name $libdir_raw $incdir_raw $libs $cflags "$@"; then if compileTest $configtest "$configtest_name" $libdir_raw $incdir_raw $libs $cflags "$@"; then
if [ "$has_used_pkg_config" = "yes" ] && [ -n "$qmake_postfix" ]; then if [ "$has_used_pkg_config" = "yes" ] && [ -n "$qmake_postfix" ]; then
QMakeVar set QMAKE_INCDIR_$qmake_postfix "`shellArgumentListToQMakeList $incdir_mod`" QMakeVar set QMAKE_INCDIR_$qmake_postfix "`shellArgumentListToQMakeList $incdir_mod`"
QMakeVar set QMAKE_LIBDIR_$qmake_postfix "`shellArgumentListToQMakeList $libdir_mod`" QMakeVar set QMAKE_LIBDIR_$qmake_postfix "`shellArgumentListToQMakeList $libdir_mod`"

View File

@ -60,16 +60,16 @@ if errorlevel 1 goto exit
echo #### Generated by configure.bat - DO NOT EDIT! ####> Makefile echo #### Generated by configure.bat - DO NOT EDIT! ####> Makefile
echo/>> Makefile echo/>> Makefile
for /f "tokens=3 usebackq" %%V in (`findstr QT_VERSION_STR %QTSRC%src\corelib\global\qglobal.h`) do @echo QTVERSION = %%~V>> Makefile for /f "tokens=3 usebackq" %%V in (`findstr QT_VERSION_STR %QTSRC%src\corelib\global\qglobal.h`) do @echo QTVERSION = %%~V>> Makefile
if not "%cl.exe%" == "" ( if not "%icl.exe%" == "" (
echo CXX = cl>>Makefile echo CXX = icl>>Makefile
echo EXTRA_CXXFLAGS =>>Makefile echo EXTRA_CXXFLAGS = /Zc:forScope>>Makefile
rem This must have a trailing space. rem This must have a trailing space.
echo QTSRC = %QTSRC% >> Makefile echo QTSRC = %QTSRC% >> Makefile
set tmpl=win32 set tmpl=win32
set make=nmake set make=nmake
) else if not "%icl.exe%" == "" ( ) else if not "%cl.exe%" == "" (
echo CXX = icl>>Makefile echo CXX = cl>>Makefile
echo EXTRA_CXXFLAGS = /Zc:forScope>>Makefile echo EXTRA_CXXFLAGS =>>Makefile
rem This must have a trailing space. rem This must have a trailing space.
echo QTSRC = %QTSRC% >> Makefile echo QTSRC = %QTSRC% >> Makefile
set tmpl=win32 set tmpl=win32

View File

@ -11,61 +11,61 @@ HTML.footer += \
" <div class=\"footer-main\">\n" \ " <div class=\"footer-main\">\n" \
" <div class=\"container clearfix\">\n" \ " <div class=\"container clearfix\">\n" \
" <nav class=\"footer-nav clearfix\">\n" \ " <nav class=\"footer-nav clearfix\">\n" \
" <div class=\"menu-footer-menu-container\"><ul id=\"menu-footer-menu\" class=\"menu\"><li id=\"menu-item-1350\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1350\"><a href=\"http://qt.io/about-us/\">About us</a>\n" \ " <div class=\"menu-footer-menu-container\"><ul id=\"menu-footer-menu\" class=\"menu\"><li id=\"menu-item-1403\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1403\"><a href=\"http://qt.io/download/\">Download</a>\n" \
"<ul class=\"sub-menu\">\n" \ "<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-1353\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1353\"><a href=\"http://qt.io/events/\">Training &amp; Events</a></li>\n" \ " <li id=\"menu-item-11677\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-11677\"><a href=\"http://qt.io/download/\">Start for Free</a></li>\n" \
" <li id=\"menu-item-1596\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1596\"><a href=\"http://qt.io/news/\">News</a></li>\n" \ " <li id=\"menu-item-15840\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-15840\"><a href=\"http://qt.io/download-eval-for-applications-step-2/\">Qt for Application Development</a></li>\n" \
" <li id=\"menu-item-1354\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1354\"><a href=\"http://qt.io/resource-center/\">Resource Center</a></li>\n" \ " <li id=\"menu-item-15841\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-15841\"><a href=\"http://qt.io/request-eval-for-devices-step-2/\">Qt for Device Creation</a></li>\n" \
" <li id=\"menu-item-1352\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1352\"><a href=\"http://qt.io/partners/\">Partners</a></li>\n" \ " <li id=\"menu-item-15838\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-15838\"><a href=\"http://qt.io/download-open-source/\">Qt Open Source</a></li>\n" \
" <li id=\"menu-item-1349\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1349\"><a href=\"http://qt.io/careers/\">Careers</a></li>\n" \ " <li id=\"menu-item-1415\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1415\"><a href=\"http://qt.io/terms-conditions/\">Terms &amp; Conditions</a></li>\n" \
" <li id=\"menu-item-11676\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-11676\"><a href=\"http://qt.io/locations/\">Locations</a></li>\n" \ " <li id=\"menu-item-14184\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-14184\"><a href=\"http://qt.io/FAQ/\">Licensing FAQ</a></li>\n" \
"</ul>\n" \ "</ul>\n" \
"</li>\n" \ "</li>\n" \
"<li id=\"menu-item-1355\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1355\"><a href=\"http://qt.io/product/\">Product</a>\n" \ "<li id=\"menu-item-1355\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1355\"><a href=\"http://qt.io/product/\">Product</a>\n" \
"<ul class=\"sub-menu\">\n" \ "<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-1358\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1358\"><a href=\"http://qt.io/qt-framework/\">Qt Framework</a></li>\n" \ " <li id=\"menu-item-12576\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-12576\"><a href=\"http://qt.io/product/\">Qt in Use</a></li>\n" \
" <li id=\"menu-item-1356\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1356\"><a href=\"http://qt.io/qt-features/\">Qt Features</a></li>\n" \ " <li id=\"menu-item-15848\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-15848\"><a href=\"http://qt.io/application-development/\">Qt for Application Development</a></li>\n" \
" <li id=\"menu-item-1359\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1359\"><a href=\"http://qt.io/qt-quick/\">Qt Quick</a></li>\n" \
" <li id=\"menu-item-1357\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1357\"><a href=\"http://qt.io/qt-for-device-creation/\">Qt for Device Creation</a></li>\n" \ " <li id=\"menu-item-1357\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1357\"><a href=\"http://qt.io/qt-for-device-creation/\">Qt for Device Creation</a></li>\n" \
" <li id=\"menu-item-10159\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-10159\"><a href=\"http://qt.io/mobile-app-development/\">Qt for Mobile Apps</a></li>\n" \ " <li id=\"menu-item-1356\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1356\"><a href=\"http://qt.io/qt-features/\">Commercial Features</a></li>\n" \
" <li id=\"menu-item-12576\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-12576\"><a href=\"http://qt.io/qt-in-use/\">Qt in Use</a></li>\n" \ " <li id=\"menu-item-15850\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-15850\"><a href=\"http://qt.io/ide/\">Qt Creator IDE</a></li>\n" \
" <li id=\"menu-item-1359\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1359\"><a href=\"http://qt.io/qt-quick/\">Qt Quick</a></li>\n" \
"</ul>\n" \
"</li>\n" \
"<li id=\"menu-item-1347\" class=\"menu-item menu-item-type-post_type menu-item-object-page current-menu-ancestor current-menu-parent current_page_parent current_page_ancestor menu-item-has-children menu-item-1347\"><a href=\"http://qt.io/services/\">Services</a>\n" \
"<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-4028\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4028\"><a href=\"http://qt.io/services-technology-evaluation/\">Technology Evaluation</a></li>\n" \
" <li id=\"menu-item-4027\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4027\"><a href=\"http://qt.io/services-proof-of-concept/\">Proof of Concept</a></li>\n" \
" <li id=\"menu-item-4026\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4026\"><a href=\"http://qt.io/services-design-implementation/\">Design &amp; Implementation</a></li>\n" \
" <li id=\"menu-item-4025\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4025\"><a href=\"http://qt.io/services-productization/\">Productization</a></li>\n" \
" <li id=\"menu-item-15863\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-15863\"><a href=\"http://qt.io/qt-training/\">Qt Training</a></li>\n" \
" <li id=\"menu-item-4779\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-4779\"><a href=\"https://qt.io/partners/\">Partner Network</a></li>\n" \
"</ul>\n" \ "</ul>\n" \
"</li>\n" \ "</li>\n" \
"<li id=\"menu-item-33\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-33\"><a href=\"http://qt.io/developers/\">Developers</a>\n" \ "<li id=\"menu-item-33\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-33\"><a href=\"http://qt.io/developers/\">Developers</a>\n" \
"<ul class=\"sub-menu\">\n" \ "<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-1365\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1365\"><a href=\"http://doc.qt.io/\">Documentation</a></li>\n" \ " <li id=\"menu-item-1365\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1365\"><a href=\"http://doc.qt.io/\">Documentation</a></li>\n" \
" <li id=\"menu-item-1364\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1364\"><a href=\"http://doc.qt.io/qt-5/qtexamplesandtutorials.html\">Examples &amp; Tutorials</a></li>\n" \ " <li id=\"menu-item-1364\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1364\"><a href=\"http://doc.qt.io/qt-5/qtexamplesandtutorials.html\">Examples &amp; Tutorials</a></li>\n" \
" <li id=\"menu-item-1363\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1363\"><a href=\"http://doc.qt.io/qt-5/topics-app-development.html\">Tools</a></li>\n" \ " <li id=\"menu-item-1363\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1363\"><a href=\"http://doc.qt.io/qt-5/topics-app-development.html\">Development Tools</a></li>\n" \
" <li id=\"menu-item-1361\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1361\"><a href=\"http://wiki.qt.io/\">Wiki</a></li>\n" \ " <li id=\"menu-item-1361\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1361\"><a href=\"http://wiki.qt.io/\">Wiki</a></li>\n" \
" <li id=\"menu-item-1360\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1360\"><a href=\"http://forum.qt.io/\">Forums</a></li>\n" \ " <li id=\"menu-item-1360\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1360\"><a href=\"http://forum.qt.io/\">Forums</a></li>\n" \
" <li id=\"menu-item-1362\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1362\"><a href=\"http://wiki.qt.io/Qt_Contribution_Guidelines\">Contribute to Qt</a></li>\n" \ " <li id=\"menu-item-15922\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-15922\"><a href=\"http://wiki.qt.io/contribute\">Contribute to Qt</a></li>\n" \
"</ul>\n" \ "</ul>\n" \
"</li>\n" \ "</li>\n" \
"<li id=\"menu-item-1347\" class=\"menu-item menu-item-type-post_type menu-item-object-page current-menu-ancestor current-menu-parent current_page_parent current_page_ancestor menu-item-has-children menu-item-1347\"><a href=\"http://qt.io/services/\">Services</a>\n" \ "<li id=\"menu-item-1350\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1350\"><a href=\"http://qt.io/about-us/\">About us</a>\n" \
"<ul class=\"sub-menu\">\n" \ "<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-32\" class=\"menu-item menu-item-type-post_type menu-item-object-page page_item page-item-14 menu-item-32\"><a href=\"http://qt.io/support/\">Support</a></li>\n" \ " <li id=\"menu-item-1353\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1353\"><a href=\"http://qt.io/events/\">Training &amp; Events</a></li>\n" \
" <li id=\"menu-item-4028\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4028\"><a href=\"http://qt.io/services-technology-evaluation/\">Technology Evaluation</a></li>\n" \ " <li id=\"menu-item-1354\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1354\"><a href=\"http://qt.io/resource-center/\">Resource Center</a></li>\n" \
" <li id=\"menu-item-4027\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4027\"><a href=\"http://qt.io/services-proof-of-concept/\">Proof of Concept</a></li>\n" \ " <li id=\"menu-item-12285\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-12285\"><a href=\"http://qt.io/news/\">News</a></li>\n" \
" <li id=\"menu-item-4026\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4026\"><a href=\"http://qt.io/services-design-implementation/\">Design &amp; Implementation</a></li>\n" \ " <li id=\"menu-item-1349\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1349\"><a href=\"http://qt.io/careers/\">Careers</a></li>\n" \
" <li id=\"menu-item-4025\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-4025\"><a href=\"http://qt.io/services-productization/\">Productization</a></li>\n" \ " <li id=\"menu-item-11676\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-11676\"><a href=\"http://qt.io/locations/\">Locations</a></li>\n" \
" <li id=\"menu-item-5124\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-5124\"><a href=\"https://qtcloudservices.com/\">Qt Cloud Services</a></li>\n" \ " <li id=\"menu-item-15911\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-15911\"><a href=\"http://qt.io/contact-us\">Contact Us</a></li>\n" \
"</ul>\n" \
"</li>\n" \
"<li id=\"menu-item-1403\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-1403\"><a href=\"http://qt.io/download/\">Download</a>\n" \
"<ul class=\"sub-menu\">\n" \
" <li id=\"menu-item-11677\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-11677\"><a href=\"http://qt.io/download/\">Free 30-Day Trial</a></li>\n" \
" <li id=\"menu-item-1982\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1982\"><a href=\"http://qt.io/buy-enterprise-step-2/\">Enterprise</a></li>\n" \
" <li id=\"menu-item-1985\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1985\"><a href=\"http://qt.io/buy-professional-step-2/\">Professional</a></li>\n" \
" <li id=\"menu-item-3346\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3346\"><a href=\"http://qt.io/buy-indiemobile-step-2/\">Indie Mobile</a></li>\n" \
" <li id=\"menu-item-3343\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-3343\"><a href=\"http://qt.io/download-open-source/\">Community</a></li>\n" \
" <li id=\"menu-item-1415\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1415\"><a href=\"http://qt.io/terms-conditions/\">Legal | Terms &amp; Conditions</a></li>\n" \
"</ul>\n" \ "</ul>\n" \
"</li>\n" \ "</li>\n" \
"</ul></div></nav>\n" \ "</ul></div></nav>\n" \
"<a href=\"http://qt.io/about-us/\" target=\"_blank\" class=\"theqtcompany\"></a>\n" \ "<a href=\"http://qt.io/about-us/\" target=\"_blank\" class=\"theqtcompany\"></a>\n" \
" <div class=\"footer-social clearfix\">\n" \ " <div class=\"footer-social clearfix\">\n" \
" <div class=\"facebook\">\n" \ " <div class=\"facebook\">\n" \
" <iframe scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" src=\"//www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2Fqt&amp;width&amp;layout=button_count&amp;action=like&amp;show_faces=true&amp;share=false&amp;height=21\" style=\"border:none;overflow:hidden;height:21px;\"></iframe>\n" \ " <iframe scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" src=\"http://www.facebook.com/plugins/like.php?href=https%3A%2F%2Fwww.facebook.com%2Fqt&amp;width&amp;layout=button_count&amp;action=like&amp;show_faces=true&amp;share=false&amp;height=21\" style=\"border:none;overflow:hidden;height:21px;\"></iframe>\n" \
" </div>\n" \ " </div>\n" \
" <div class=\"twitter\">\n" \ " <div class=\"twitter\">\n" \
" <iframe id=\"twitter-widget-0\" scrolling=\"no\" frameborder=\"0\" allowtransparency=\"true\" src=\"http://platform.twitter.com/widgets/follow_button.33b190ea0cba008796487b65df7f6d8e.en.html#_=1414403615717&amp;id=twitter-widget-0&amp;lang=en&amp;screen_name=qtproject&amp;show_count=true&amp;show_screen_name=false&amp;size=m\" class=\"twitter-follow-button twitter-follow-button\" title=\"Twitter Follow Button\" data-twttr-rendered=\"true\" style=\"width: 160px; height: 20px;\"></iframe>\n" \ " <iframe id=\"twitter-widget-0\" scrolling=\"no\" frameborder=\"0\" allowtransparency=\"true\" src=\"http://platform.twitter.com/widgets/follow_button.33b190ea0cba008796487b65df7f6d8e.en.html#_=1414403615717&amp;id=twitter-widget-0&amp;lang=en&amp;screen_name=qtproject&amp;show_count=true&amp;show_screen_name=false&amp;size=m\" class=\"twitter-follow-button twitter-follow-button\" title=\"Twitter Follow Button\" data-twttr-rendered=\"true\" style=\"width: 160px; height: 20px;\"></iframe>\n" \

View File

@ -770,7 +770,7 @@ body.qt-account #navbar .navbar-oneQt h2 {
#footerbar .theqtcompany { #footerbar .theqtcompany {
background:url("theqtcompany.png") no-repeat; background:url("theqtcompany.png") no-repeat;
background-size:100%; background-size:100%;
width:150px; width:215px;
height:68px; height:68px;
display:inline; display:inline;
float:right; float:right;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -124,10 +124,16 @@
\snippet widgets/imageviewer/imageviewer.cpp 2 \snippet widgets/imageviewer/imageviewer.cpp 2
In the \c loadFile() function, we check if the file's In the \c loadFile() function, we instantiate a QImageReader
format is an image format by constructing a QImage which tries to and enable automatic transformations by calling
load the image from the file. If the constructor returns a null QImageReader::setAutoTransform(). For files in JPEG format,
image, we use a QMessageBox to alert the user. this ensures that portrait mode images of digital cameras are shown
correctly by applying the appropriate orientation read from the
EXIF meta data stored in the image file.
We then load the image using QImageReader::read(). If this returns
a null image, indicating that the file is not an image file,
we use a QMessageBox to alert the user.
The QMessageBox class provides a modal dialog with a short The QMessageBox class provides a modal dialog with a short
message, an icon, and some buttons. As with QFileDialog the message, an icon, and some buttons. As with QFileDialog the

View File

@ -202,6 +202,7 @@ QImage ImageWidget::loadImage(const QString &fileName)
{ {
qDebug() << position << files << fileName; qDebug() << position << files << fileName;
QImageReader reader(fileName); QImageReader reader(fileName);
reader.setAutoTransform(true);
qCDebug(lcExample) << "loading" << QDir::toNativeSeparators(fileName) << position << '/' << files.size(); qCDebug(lcExample) << "loading" << QDir::toNativeSeparators(fileName) << position << '/' << files.size();
if (!reader.canRead()) { if (!reader.canRead()) {
qCWarning(lcExample) << QDir::toNativeSeparators(fileName) << ": can't load image"; qCWarning(lcExample) << QDir::toNativeSeparators(fileName) << ": can't load image";

View File

@ -69,7 +69,9 @@ ImageViewer::ImageViewer()
bool ImageViewer::loadFile(const QString &fileName) bool ImageViewer::loadFile(const QString &fileName)
{ {
QImage image(fileName); QImageReader reader(fileName);
reader.setAutoTransform(true);
const QImage image = reader.read();
if (image.isNull()) { if (image.isNull()) {
QMessageBox::information(this, QGuiApplication::applicationDisplayName(), QMessageBox::information(this, QGuiApplication::applicationDisplayName(),
tr("Cannot load %1.").arg(QDir::toNativeSeparators(fileName))); tr("Cannot load %1.").arg(QDir::toNativeSeparators(fileName)));

View File

@ -48,10 +48,10 @@ warnings_are_errors:warning_clean {
# compiler. # compiler.
clang { clang {
# Apple clang 4.0-4.2,5.0-5.1 # Apple clang 4.0-4.2,5.0-5.1
# Regular clang 3.3 & 3.4 # Regular clang 3.3-3.6
apple_ver = $${QT_APPLE_CLANG_MAJOR_VERSION}.$${QT_APPLE_CLANG_MINOR_VERSION} apple_ver = $${QT_APPLE_CLANG_MAJOR_VERSION}.$${QT_APPLE_CLANG_MINOR_VERSION}
reg_ver = $${QT_CLANG_MAJOR_VERSION}.$${QT_CLANG_MINOR_VERSION} reg_ver = $${QT_CLANG_MAJOR_VERSION}.$${QT_CLANG_MINOR_VERSION}
contains(apple_ver, "4\\.[012]|5\\.[01]")|contains(reg_ver, "3\\.[34]") { contains(apple_ver, "4\\.[012]|5\\.[01]")|contains(reg_ver, "3\\.[3-6]") {
QMAKE_CXXFLAGS_WARN_ON += -Werror -Wno-error=\\$${LITERAL_HASH}warnings -Wno-error=deprecated-declarations $$WERROR QMAKE_CXXFLAGS_WARN_ON += -Werror -Wno-error=\\$${LITERAL_HASH}warnings -Wno-error=deprecated-declarations $$WERROR
} }
} else:intel_icc:linux { } else:intel_icc:linux {
@ -67,9 +67,9 @@ warnings_are_errors:warning_clean {
QMAKE_CXXFLAGS_WARN_ON += -Werror -ww177,1224,1478,1881 $$WERROR QMAKE_CXXFLAGS_WARN_ON += -Werror -ww177,1224,1478,1881 $$WERROR
} }
} else:gcc:!clang:!intel_icc { } else:gcc:!clang:!intel_icc {
# GCC 4.6-4.9 # GCC 4.6-4.9, 5.x
ver = $${QT_GCC_MAJOR_VERSION}.$${QT_GCC_MINOR_VERSION} ver = $${QT_GCC_MAJOR_VERSION}.$${QT_GCC_MINOR_VERSION}
contains(ver, "4\\.[6789]") { contains(ver, "(4\\.[6789]|5\\..)") {
QMAKE_CXXFLAGS_WARN_ON += -Werror -Wno-error=cpp -Wno-error=deprecated-declarations $$WERROR QMAKE_CXXFLAGS_WARN_ON += -Werror -Wno-error=cpp -Wno-error=deprecated-declarations $$WERROR
# GCC prints this bogus warning, after it has inlined a lot of code # GCC prints this bogus warning, after it has inlined a lot of code

View File

@ -55,7 +55,7 @@ win32 {
equals(TEMPLATE, lib) { equals(TEMPLATE, lib) {
static { static {
QMAKE_RESOLVED_TARGET = $${QMAKE_RESOLVED_TARGET}$${LIBPREFIX}$${TARGET}.a QMAKE_RESOLVED_TARGET = $${QMAKE_RESOLVED_TARGET}$${LIBPREFIX}$${TARGET}.a
} else:plugin { } else: plugin|unversioned_libname {
QMAKE_RESOLVED_TARGET = $${QMAKE_RESOLVED_TARGET}$${LIBPREFIX}$${TARGET}.so QMAKE_RESOLVED_TARGET = $${QMAKE_RESOLVED_TARGET}$${LIBPREFIX}$${TARGET}.so
} else { } else {
TEMP_VERSION = $$VERSION TEMP_VERSION = $$VERSION

View File

@ -0,0 +1,47 @@
# qmake configuration for Windows Embedded Compact 2013 with VS2012 on ARM targets
#
# This is just a template for creating WEC2013 mkspecs for ARM targets
# Replace the SDK name with actual SDK name.
include(../common/wince/qmake.conf)
CE_SDK = Toradex_CE8_SDK # replace with actual SDK name
CE_ARCH = ARMV7
QT_CONFIG -= accessibility
DEFINES += QT_NO_CLIPBOARD QT_NO_ACCESSIBILITY QT_NO_NATIVE_GESTURES QT_NOSTANDARDSHELL_UI_MODEL _CRT_SECURE_NO_DEPRECATE _WIN32_WCE=0x800 $$CE_ARCH _AMRV7_ armv7 _ARM_ UNDER_CE WINCE ARM
#QMAKE_CXXFLAGS += /P
QMAKE_CFLAGS_RELEASE += -O2 -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
QMAKE_CFLAGS_DEBUG += -Zi -MTd
QMAKE_CFLAGS_RELEASE -= -MD
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO -= -MD
QMAKE_CFLAGS_DEBUG -= -MDd
QMAKE_CXXFLAGS_RELEASE -= -MD
QMAKE_CXXFLAGS_RELEASE += -MT
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += -MT
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO -= -MD
QMAKE_CXXFLAGS_DEBUG -= -MDd
QMAKE_CXXFLAGS_DEBUG += -MTd
QMAKE_INCDIR_OPENGL_ES2 += $$(NV_WINCE_T2_PLAT)/include
QMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:WINDOWSCE,8.00 /MACHINE:ARM /ENTRY:mainCRTStartup
QMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:WINDOWSCE,8.00 /MACHINE:ARM
QMAKE_LFLAGS_DLL = /SUBSYSTEM:WINDOWSCE,8.00 /MACHINE:ARM /DLL /SAFESEH:NO
QMAKE_LIBFLAGS_RELEASE = /LTCG
QMAKE_LIBS = coredll.lib
QMAKE_LIBS_CORE = ole32.lib oleaut32.lib uuid.lib commctrl.lib coredll.lib winsock.lib
QMAKE_LIBS_GUI = ole32.lib $$QMAKE_LIBS_CORE
QMAKE_LIBS_NETWORK = ws2.lib $$QMAKE_LIBS_GUI
QMAKE_LIBS_OPENGL =
QMAKE_LIBS_COMPAT =
QMAKE_LIBS_OPENVG =
QMAKE_LIBS_OPENGL_ES2 = libEGL.lib libGLESv2.lib
QMAKE_LIBDIR_OPENGL_ES2 = $$(NV_WINCE_T2_PLAT)/lib/Test
QMAKE_INCDIR_EGL = $$(NV_WINCE_T2_PLAT)/include
QMAKE_LIBDIR_EGL = $$(NV_WINCE_T2_PLAT)/lib/Test
QMAKE_RC = rc
QMAKE_COMPILER_DEFINES -= _MSC_VER=1400
QMAKE_COMPILER_DEFINES += _MSC_VER=1700

View File

@ -0,0 +1,35 @@
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the qmake spec of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** 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 The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/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 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "../common/wince/qplatformdefs.h"

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2014 Intel Corporation ** Copyright (C) 2015 Intel Corporation
** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com ** Copyright (C) 2015 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
** **
** Permission is hereby granted, free of charge, to any person obtaining a copy ** Permission is hereby granted, free of charge, to any person obtaining a copy
@ -31,6 +31,8 @@
#include "forkfd.h" #include "forkfd.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
@ -38,6 +40,7 @@
#include <signal.h> #include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h>
#include <unistd.h> #include <unistd.h>
#ifdef __linux__ #ifdef __linux__
@ -79,6 +82,12 @@
ret = call; \ ret = call; \
} while (ret == -1 && errno == EINTR) } while (ret == -1 && errno == EINTR)
struct pipe_payload
{
struct forkfd_info info;
struct rusage rusage;
};
typedef struct process_info typedef struct process_info
{ {
ffd_atomic_int pid; ffd_atomic_int pid;
@ -179,33 +188,43 @@ static int isChildReady(pid_t pid, siginfo_t *info)
} }
#endif #endif
static int tryReaping(pid_t pid, siginfo_t *info) static int tryReaping(pid_t pid, struct pipe_payload *payload)
{ {
/* reap the child */ /* reap the child */
#ifdef HAVE_WAITID #ifdef HAVE_WAITID
if (waitid_works) { if (waitid_works) {
// we have waitid(2), which fills in siginfo_t for us // we have waitid(2), which fills in siginfo_t for us
info->si_pid = 0; siginfo_t info;
return waitid(P_PID, pid, info, WEXITED | WNOHANG) == 0 && info->si_pid == pid; info.si_pid = 0;
int ret = waitid(P_PID, pid, &info, WEXITED | WNOHANG) == 0 && info.si_pid == pid;
if (!ret)
return ret;
payload->info.code = info.si_code;
payload->info.status = info.si_status;
# ifdef __linux__
payload->rusage.ru_utime.tv_sec = info.si_utime / CLOCKS_PER_SEC;
payload->rusage.ru_utime.tv_usec = info.si_utime % CLOCKS_PER_SEC;
payload->rusage.ru_stime.tv_sec = info.si_stime / CLOCKS_PER_SEC;
payload->rusage.ru_stime.tv_usec = info.si_stime % CLOCKS_PER_SEC;
# endif
return 1;
} }
#endif #endif
int status; int status;
if (waitpid(pid, &status, WNOHANG) <= 0) if (waitpid(pid, &status, WNOHANG) <= 0)
return 0; // child did not change state return 0; // child did not change state
info->si_signo = SIGCHLD;
info->si_pid = pid;
if (WIFEXITED(status)) { if (WIFEXITED(status)) {
info->si_code = CLD_EXITED; payload->info.code = CLD_EXITED;
info->si_status = WEXITSTATUS(status); payload->info.status = WEXITSTATUS(status);
} else if (WIFSIGNALED(status)) { } else if (WIFSIGNALED(status)) {
info->si_code = CLD_KILLED; payload->info.code = CLD_KILLED;
# ifdef WCOREDUMP # ifdef WCOREDUMP
if (WCOREDUMP(status)) if (WCOREDUMP(status))
info->si_code = CLD_DUMPED; payload->info.code = CLD_DUMPED;
# endif # endif
info->si_status = WTERMSIG(status); payload->info.status = WTERMSIG(status);
} }
return 1; return 1;
@ -220,10 +239,11 @@ static void freeInfo(Header *header, ProcessInfo *entry)
assert(header->busyCount >= 0); assert(header->busyCount >= 0);
} }
static void notifyAndFreeInfo(Header *header, ProcessInfo *entry, siginfo_t *info) static void notifyAndFreeInfo(Header *header, ProcessInfo *entry,
const struct pipe_payload *payload)
{ {
ssize_t ret; ssize_t ret;
EINTR_LOOP(ret, write(entry->deathPipe, info, sizeof(*info))); EINTR_LOOP(ret, write(entry->deathPipe, payload, sizeof(*payload)));
EINTR_LOOP(ret, close(entry->deathPipe)); EINTR_LOOP(ret, close(entry->deathPipe));
freeInfo(header, entry); freeInfo(header, entry);
@ -243,9 +263,11 @@ static void sigchld_handler(int signum)
/* is this one of our children? */ /* is this one of our children? */
BigArray *array; BigArray *array;
siginfo_t info; siginfo_t info;
struct pipe_payload payload;
int i; int i;
memset(&info, 0, sizeof info); memset(&info, 0, sizeof info);
memset(&payload, 0, sizeof payload);
#ifdef HAVE_WAITID #ifdef HAVE_WAITID
if (!waitid_works) if (!waitid_works)
@ -275,8 +297,8 @@ search_next_child:
FFD_ATOMIC_ACQUIRE, FFD_ATOMIC_RELAXED)) { FFD_ATOMIC_ACQUIRE, FFD_ATOMIC_RELAXED)) {
/* this is our child, send notification and free up this entry */ /* this is our child, send notification and free up this entry */
/* ### FIXME: what if tryReaping returns false? */ /* ### FIXME: what if tryReaping returns false? */
if (tryReaping(pid, &info)) if (tryReaping(pid, &payload))
notifyAndFreeInfo(&children.header, &children.entries[i], &info); notifyAndFreeInfo(&children.header, &children.entries[i], &payload);
goto search_next_child; goto search_next_child;
} }
} }
@ -290,8 +312,8 @@ search_next_child:
FFD_ATOMIC_ACQUIRE, FFD_ATOMIC_RELAXED)) { FFD_ATOMIC_ACQUIRE, FFD_ATOMIC_RELAXED)) {
/* this is our child, send notification and free up this entry */ /* this is our child, send notification and free up this entry */
/* ### FIXME: what if tryReaping returns false? */ /* ### FIXME: what if tryReaping returns false? */
if (tryReaping(pid, &info)) if (tryReaping(pid, &payload))
notifyAndFreeInfo(&array->header, &array->entries[i], &info); notifyAndFreeInfo(&array->header, &array->entries[i], &payload);
goto search_next_child; goto search_next_child;
} }
} }
@ -321,9 +343,9 @@ search_arrays:
continue; continue;
} }
#endif #endif
if (tryReaping(pid, &info)) { if (tryReaping(pid, &payload)) {
/* this is our child, send notification and free up this entry */ /* this is our child, send notification and free up this entry */
notifyAndFreeInfo(&children.header, &children.entries[i], &info); notifyAndFreeInfo(&children.header, &children.entries[i], &payload);
} }
} }
@ -344,9 +366,9 @@ search_arrays:
continue; continue;
} }
#endif #endif
if (tryReaping(pid, &info)) { if (tryReaping(pid, &payload)) {
/* this is our child, send notification and free up this entry */ /* this is our child, send notification and free up this entry */
notifyAndFreeInfo(&array->header, &array->entries[i], &info); notifyAndFreeInfo(&array->header, &array->entries[i], &payload);
} }
} }
@ -626,7 +648,7 @@ int spawnfd(int flags, pid_t *ppid, const char *path, const posix_spawn_file_act
{ {
Header *header; Header *header;
ProcessInfo *info; ProcessInfo *info;
siginfo_t si; struct pipe_payload payload;
pid_t pid; pid_t pid;
int death_pipe[2]; int death_pipe[2];
int ret = -1; int ret = -1;
@ -664,8 +686,8 @@ int spawnfd(int flags, pid_t *ppid, const char *path, const posix_spawn_file_act
ffd_atomic_store(&info->pid, pid, FFD_ATOMIC_RELEASE); ffd_atomic_store(&info->pid, pid, FFD_ATOMIC_RELEASE);
/* check if the child has already exited */ /* check if the child has already exited */
if (tryReaping(pid, &si)) if (tryReaping(pid, &payload))
notifyAndFreeInfo(header, info, &si); notifyAndFreeInfo(header, info, &payload);
ret = death_pipe[0]; ret = death_pipe[0];
return ret; return ret;
@ -682,3 +704,28 @@ out:
return -1; return -1;
} }
#endif // _POSIX_SPAWN && !FORKFD_NO_SPAWNFD #endif // _POSIX_SPAWN && !FORKFD_NO_SPAWNFD
int forkfd_wait(int ffd, forkfd_info *info, struct rusage *rusage)
{
struct pipe_payload payload;
int ret;
ret = read(ffd, &payload, sizeof(payload));
if (ret == -1)
return ret; /* pass errno, probably EINTR, EBADF or EWOULDBLOCK */
assert(ret == sizeof(payload));
if (info)
*info = payload.info;
if (rusage)
*rusage = payload.rusage;
return 0; /* success */
}
int forkfd_close(int ffd)
{
return close(ffd);
}

View File

@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2014 Intel Corporation ** Copyright (C) 2015 Intel Corporation
** **
** Permission is hereby granted, free of charge, to any person obtaining a copy ** Permission is hereby granted, free of charge, to any person obtaining a copy
** of this software and associated documentation files (the "Software"), to deal ** of this software and associated documentation files (the "Software"), to deal
@ -26,6 +26,7 @@
#define FORKFD_H #define FORKFD_H
#include <fcntl.h> #include <fcntl.h>
#include <stdint.h>
#include <unistd.h> // to get the POSIX flags #include <unistd.h> // to get the POSIX flags
#ifdef _POSIX_SPAWN #ifdef _POSIX_SPAWN
@ -41,7 +42,14 @@ extern "C" {
#define FFD_CHILD_PROCESS (-2) #define FFD_CHILD_PROCESS (-2)
struct forkfd_info {
int32_t code;
int32_t status;
};
int forkfd(int flags, pid_t *ppid); int forkfd(int flags, pid_t *ppid);
int forkfd_wait(int ffd, forkfd_info *info, struct rusage *rusage);
int forkfd_close(int ffd);
#ifdef _POSIX_SPAWN #ifdef _POSIX_SPAWN
/* only for spawnfd: */ /* only for spawnfd: */

View File

@ -90,7 +90,10 @@ private:
template <typename T> struct QAtomicOps : QBasicAtomicOps<sizeof(T)> template <typename T> struct QAtomicOps : QBasicAtomicOps<sizeof(T)>
{ {
typedef T Type; // this is GCC or GCC-like, so we can use extensions:
// force the alignment to be the size of the type, as on some ABIs the alignment
// of 64-bit types is 32-bit. We need proper alignment for LDREX / STREX.
typedef __attribute__((__aligned__(sizeof(T)))) T Type;
}; };
#ifndef Q_CC_RVCT #ifndef Q_CC_RVCT

View File

@ -601,6 +601,13 @@
container. It only affects the copy, which is probably not what you container. It only affects the copy, which is probably not what you
want. want.
An alternative to Qt's \c foreach loop is the range-based \c for that is
part of C++ 11 and newer. However, keep in mind that the range-based
\c for might force a Qt container to \l{Implicit Sharing}{detach}, whereas
\c foreach would not. But using \c foreach always copies the container,
which is usually not cheap for STL containers. If in doubt, prefer
\c foreach for Qt containers, and range based \c for for STL ones.
In addition to \c foreach, Qt also provides a \c forever In addition to \c foreach, Qt also provides a \c forever
pseudo-keyword for infinite loops: pseudo-keyword for infinite loops:

View File

@ -41,7 +41,7 @@ LIBS_PRIVATE += $$QMAKE_LIBS_EXECINFO
if(linux*|hurd*):!cross_compile:!static:!*-armcc* { if(linux*|hurd*):!cross_compile:!static:!*-armcc* {
QMAKE_LFLAGS += -Wl,-e,qt_core_boilerplate QMAKE_LFLAGS += -Wl,-e,qt_core_boilerplate
prog=$$quote(if (/program interpreter: (.*)]/) { print $1; }) prog=$$quote(if (/program interpreter: (.*)]/) { print $1; })
DEFINES += ELF_INTERPRETER=\\\"$$system(readelf -l /bin/ls | perl -n -e \'$$prog\')\\\" DEFINES += ELF_INTERPRETER=\\\"$$system(LC_ALL=C readelf -l /bin/ls | perl -n -e \'$$prog\')\\\"
} }
slog2 { slog2 {

View File

@ -97,7 +97,7 @@
/* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */ /* Intel C++ disguising as Visual C++: the `using' keyword avoids warnings */
# if defined(__INTEL_COMPILER) # if defined(__INTEL_COMPILER)
# define Q_DECL_VARIABLE_DEPRECATED # define Q_DECL_VARIABLE_DEPRECATED
# define Q_CC_INTEL # define Q_CC_INTEL __INTEL_COMPILER
# endif # endif
/* only defined for MSVC since that's the only compiler that actually optimizes for this */ /* only defined for MSVC since that's the only compiler that actually optimizes for this */
@ -564,6 +564,16 @@
# endif # endif
# define Q_COMPILER_UDL # define Q_COMPILER_UDL
# endif # endif
# ifdef _MSC_VER
# if _MSC_VER == 1700
// <initializer_list> is missing with MSVC 2012 (it's present in 2010, 2013 and up)
# undef Q_COMPILER_INITIALIZER_LISTS
# endif
# if _MSC_VER < 1900
// ICC disables unicode string support when compatibility mode with MSVC 2013 or lower is active
# undef Q_COMPILER_UNICODE_STRINGS
# endif
# endif
# endif # endif
#endif #endif
@ -890,7 +900,8 @@
# define Q_COMPILER_RANGE_FOR # define Q_COMPILER_RANGE_FOR
# define Q_COMPILER_REF_QUALIFIERS # define Q_COMPILER_REF_QUALIFIERS
# define Q_COMPILER_THREAD_LOCAL # define Q_COMPILER_THREAD_LOCAL
# define Q_COMPILER_THREADSAFE_STATICS // Broken, see QTBUG-47224 and https://connect.microsoft.com/VisualStudio/feedback/details/1549785
//# define Q_COMPILER_THREADSAFE_STATICS
# define Q_COMPILER_UDL # define Q_COMPILER_UDL
# define Q_COMPILER_UNICODE_STRINGS # define Q_COMPILER_UNICODE_STRINGS
// Uniform initialization is not working yet -- build errors with QUuid // Uniform initialization is not working yet -- build errors with QUuid

View File

@ -2262,7 +2262,8 @@ static bool readEtcRedHatRelease(QUnixOSVersion &v)
int releaseIndex = line.indexOf(keyword); int releaseIndex = line.indexOf(keyword);
v.productType = QString::fromLatin1(line.mid(0, releaseIndex)).remove(QLatin1Char(' ')); v.productType = QString::fromLatin1(line.mid(0, releaseIndex)).remove(QLatin1Char(' '));
int spaceIndex = line.indexOf(' ', releaseIndex + strlen(keyword)); int spaceIndex = line.indexOf(' ', releaseIndex + strlen(keyword));
v.productVersion = QString::fromLatin1(line.mid(releaseIndex + strlen(keyword), spaceIndex > -1 ? spaceIndex - releaseIndex - strlen(keyword) : -1)); v.productVersion = QString::fromLatin1(line.mid(releaseIndex + strlen(keyword),
spaceIndex > -1 ? spaceIndex - releaseIndex - int(strlen(keyword)) : -1));
return true; return true;
} }

View File

@ -650,11 +650,9 @@ void qt_core_boilerplate()
"Copyright (C) 2015 The Qt Company Ltd.\n" "Copyright (C) 2015 The Qt Company Ltd.\n"
"Contact: http://www.qt.io/licensing/\n" "Contact: http://www.qt.io/licensing/\n"
"\n" "\n"
"Build date: %s\n"
"Installation prefix: %s\n" "Installation prefix: %s\n"
"Library path: %s\n" "Library path: %s\n"
"Include path: %s\n", "Include path: %s\n",
qt_configure_installation + 12,
qt_configure_prefix_path_str + 12, qt_configure_prefix_path_str + 12,
qt_configure_strs + qt_configure_str_offsets[QT_PREPEND_NAMESPACE(QLibraryInfo)::LibrariesPath - 1], qt_configure_strs + qt_configure_str_offsets[QT_PREPEND_NAMESPACE(QLibraryInfo)::LibrariesPath - 1],
qt_configure_strs + qt_configure_str_offsets[QT_PREPEND_NAMESPACE(QLibraryInfo)::HeadersPath - 1]); qt_configure_strs + qt_configure_str_offsets[QT_PREPEND_NAMESPACE(QLibraryInfo)::HeadersPath - 1]);

View File

@ -87,6 +87,10 @@
# endif # endif
#endif #endif
#if defined(QT_USE_SLOG2)
extern char *__progname;
#endif
#if defined(Q_OS_LINUX) && (defined(__GLIBC__) || __has_include(<sys/syscall.h>)) #if defined(Q_OS_LINUX) && (defined(__GLIBC__) || __has_include(<sys/syscall.h>))
# include <sys/syscall.h> # include <sys/syscall.h>
static long qt_gettid() static long qt_gettid()
@ -1173,8 +1177,6 @@ void QMessagePattern::setPattern(const QString &pattern)
#define QT_LOG_CODE 9000 #define QT_LOG_CODE 9000
#endif #endif
extern char *__progname;
static void slog2_default_handler(QtMsgType msgType, const char *message) static void slog2_default_handler(QtMsgType msgType, const char *message)
{ {
if (slog2_set_default_buffer((slog2_buffer_t)-1) == 0) { if (slog2_set_default_buffer((slog2_buffer_t)-1) == 0) {
@ -1357,8 +1359,9 @@ QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, con
} else if (pattern->timeFormat == QLatin1String("boot")) { } else if (pattern->timeFormat == QLatin1String("boot")) {
// just print the milliseconds since the elapsed timer reference // just print the milliseconds since the elapsed timer reference
// like the Linux kernel does // like the Linux kernel does
pattern->timer.elapsed(); QElapsedTimer now;
uint ms = pattern->timer.msecsSinceReference(); now.start();
uint ms = now.msecsSinceReference();
message.append(QString::asprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000))); message.append(QString::asprintf("%6d.%03d", uint(ms / 1000), uint(ms % 1000)));
} else if (pattern->timeFormat.isEmpty()) { } else if (pattern->timeFormat.isEmpty()) {
message.append(QDateTime::currentDateTime().toString(Qt::ISODate)); message.append(QDateTime::currentDateTime().toString(Qt::ISODate));

View File

@ -147,6 +147,7 @@ win32 {
SOURCES += io/qsettings_mac.cpp SOURCES += io/qsettings_mac.cpp
OBJECTIVE_SOURCES += io/qurl_mac.mm OBJECTIVE_SOURCES += io/qurl_mac.mm
} }
freebsd: LIBS_PRIVATE += -lutil # qlockfile_unix.cpp requires this
mac { mac {
osx { osx {
OBJECTIVE_SOURCES += io/qfilesystemwatcher_fsevents.mm OBJECTIVE_SOURCES += io/qfilesystemwatcher_fsevents.mm

View File

@ -1503,11 +1503,19 @@ bool QDir::removeRecursively()
while (di.hasNext()) { while (di.hasNext()) {
di.next(); di.next();
const QFileInfo& fi = di.fileInfo(); const QFileInfo& fi = di.fileInfo();
const QString &filePath = di.filePath();
bool ok; bool ok;
if (fi.isDir() && !fi.isSymLink()) if (fi.isDir() && !fi.isSymLink()) {
ok = QDir(di.filePath()).removeRecursively(); // recursive ok = QDir(filePath).removeRecursively(); // recursive
else } else {
ok = QFile::remove(di.filePath()); ok = QFile::remove(filePath);
if (!ok) { // Read-only files prevent directory deletion on Windows, retry with Write permission.
const QFile::Permissions permissions = QFile::permissions(filePath);
if (!(permissions & QFile::WriteUser))
ok = QFile::setPermissions(filePath, permissions | QFile::WriteUser)
&& QFile::remove(filePath);
}
}
if (!ok) if (!ok)
success = false; success = false;
} }

View File

@ -210,20 +210,23 @@ void QLoggingSettingsParser::setContent(QTextStream &stream)
if (_section == QLatin1String("Rules")) { if (_section == QLatin1String("Rules")) {
int equalPos = line.indexOf(QLatin1Char('=')); int equalPos = line.indexOf(QLatin1Char('='));
if ((equalPos != -1) if (equalPos != -1) {
&& (line.lastIndexOf(QLatin1Char('=')) == equalPos)) { if (line.lastIndexOf(QLatin1Char('=')) == equalPos) {
const QStringRef pattern = line.leftRef(equalPos); const QStringRef pattern = line.leftRef(equalPos);
const QStringRef valueStr = line.midRef(equalPos + 1); const QStringRef valueStr = line.midRef(equalPos + 1);
int value = -1; int value = -1;
if (valueStr == QLatin1String("true")) if (valueStr == QLatin1String("true"))
value = 1; value = 1;
else if (valueStr == QLatin1String("false")) else if (valueStr == QLatin1String("false"))
value = 0; value = 0;
QLoggingRule rule(pattern, (value == 1)); QLoggingRule rule(pattern, (value == 1));
if (rule.flags != 0 && (value != -1)) if (rule.flags != 0 && (value != -1))
_rules.append(rule); _rules.append(rule);
else else
warnMsg("Ignoring malformed logging rule: '%s'", line.toUtf8().constData());
} else {
warnMsg("Ignoring malformed logging rule: '%s'", line.toUtf8().constData()); warnMsg("Ignoring malformed logging rule: '%s'", line.toUtf8().constData());
}
} }
} }
} }

View File

@ -1075,20 +1075,17 @@ bool QProcessPrivate::waitForDeadChild()
return true; // child has already exited return true; // child has already exited
// read the process information from our fd // read the process information from our fd
siginfo_t info; forkfd_info info;
qint64 ret = qt_safe_read(forkfd, &info, sizeof info); int ret;
Q_ASSERT(ret == sizeof info); EINTR_LOOP(ret, forkfd_wait(forkfd, &info, Q_NULLPTR));
Q_UNUSED(ret);
Q_ASSERT(info.si_pid == pid_t(pid)); exitCode = info.status;
crashed = info.code != CLD_EXITED;
exitCode = info.si_status;
crashed = info.si_code != CLD_EXITED;
delete deathNotifier; delete deathNotifier;
deathNotifier = 0; deathNotifier = 0;
qt_safe_close(forkfd); EINTR_LOOP(ret, forkfd_close(forkfd));
forkfd = -1; // Child is dead, don't try to kill it anymore forkfd = -1; // Child is dead, don't try to kill it anymore
#if defined QPROCESS_DEBUG #if defined QPROCESS_DEBUG

View File

@ -215,7 +215,8 @@ bool QSaveFile::open(OpenMode mode)
d->finalFileName = existingFile.filePath(); d->finalFileName = existingFile.filePath();
} }
d->fileEngine = new QTemporaryFileEngine(d->finalFileName, 0666); d->fileEngine = new QTemporaryFileEngine;
static_cast<QTemporaryFileEngine *>(d->fileEngine)->initialize(d->finalFileName, 0666);
// Same as in QFile: QIODevice provides the buffering, so there's no need to request it from the file engine. // Same as in QFile: QIODevice provides the buffering, so there's no need to request it from the file engine.
if (!d->fileEngine->open(mode | QIODevice::Unbuffered)) { if (!d->fileEngine->open(mode | QIODevice::Unbuffered)) {
QFileDevice::FileError err = d->fileEngine->error(); QFileDevice::FileError err = d->fileEngine->error();

View File

@ -409,14 +409,24 @@ QTemporaryFilePrivate::~QTemporaryFilePrivate()
QAbstractFileEngine *QTemporaryFilePrivate::engine() const QAbstractFileEngine *QTemporaryFilePrivate::engine() const
{ {
if (!fileEngine) { if (!fileEngine) {
if (fileName.isEmpty()) fileEngine = new QTemporaryFileEngine;
fileEngine = new QTemporaryFileEngine(templateName, 0600); resetFileEngine();
else
fileEngine = new QTemporaryFileEngine(fileName, 0600, false);
} }
return fileEngine; return fileEngine;
} }
void QTemporaryFilePrivate::resetFileEngine() const
{
if (!fileEngine)
return;
QTemporaryFileEngine *tef = static_cast<QTemporaryFileEngine *>(fileEngine);
if (fileName.isEmpty())
tef->initialize(templateName, 0600);
else
tef->initialize(fileName, 0600, false);
}
QString QTemporaryFilePrivate::defaultTemplateName() QString QTemporaryFilePrivate::defaultTemplateName()
{ {
QString baseName; QString baseName;
@ -769,6 +779,13 @@ bool QTemporaryFile::open(OpenMode flags)
} }
} }
// reset the engine state so it creates a new, unique file name from the template;
// equivalent to:
// delete d->fileEngine;
// d->fileEngine = 0;
// d->engine();
d->resetFileEngine();
if (QFile::open(flags)) { if (QFile::open(flags)) {
d->fileName = d->fileEngine->fileName(QAbstractFileEngine::DefaultName); d->fileName = d->fileEngine->fileName(QAbstractFileEngine::DefaultName);
return true; return true;

View File

@ -64,6 +64,7 @@ protected:
~QTemporaryFilePrivate(); ~QTemporaryFilePrivate();
QAbstractFileEngine *engine() const; QAbstractFileEngine *engine() const;
void resetFileEngine() const;
bool autoRemove; bool autoRemove;
QString templateName; QString templateName;
@ -77,22 +78,17 @@ class QTemporaryFileEngine : public QFSFileEngine
{ {
Q_DECLARE_PRIVATE(QFSFileEngine) Q_DECLARE_PRIVATE(QFSFileEngine)
public: public:
void initialize(const QString &file, quint32 mode, bool nameIsTemplate = true)
QTemporaryFileEngine(const QString &file,
quint32 fileMode,
bool fileIsTemplate = true) :
QFSFileEngine(),
fileMode(fileMode),
filePathIsTemplate(fileIsTemplate),
filePathWasTemplate(fileIsTemplate)
{ {
Q_D(QFSFileEngine); Q_D(QFSFileEngine);
Q_ASSERT(!isReallyOpen());
fileMode = mode;
filePathIsTemplate = filePathWasTemplate = nameIsTemplate;
d->fileEntry = QFileSystemEntry(file); d->fileEntry = QFileSystemEntry(file);
if (!filePathIsTemplate) if (!filePathIsTemplate)
QFSFileEngine::setFileName(file); QFSFileEngine::setFileName(file);
} }
~QTemporaryFileEngine(); ~QTemporaryFileEngine();
bool isReallyOpen() const; bool isReallyOpen() const;

View File

@ -392,7 +392,7 @@ static bool quitLockRefEnabled = true;
// GUI apps or when using MinGW due to its globbing. // GUI apps or when using MinGW due to its globbing.
static inline bool isArgvModified(int argc, char **argv) static inline bool isArgvModified(int argc, char **argv)
{ {
if (__argc != argc) if (__argc != argc || !__argv /* wmain() */)
return true; return true;
if (__argv == argv) if (__argv == argv)
return false; return false;

View File

@ -560,6 +560,17 @@ static HWND qt_create_internal_window(const QEventDispatcherWin32 *eventDispatch
return wnd; return wnd;
} }
static void calculateNextTimeout(WinTimerInfo *t, quint64 currentTime)
{
uint interval = t->interval;
if ((interval >= 20000u && t->timerType != Qt::PreciseTimer) || t->timerType == Qt::VeryCoarseTimer) {
// round the interval, VeryCoarseTimers only have full second accuracy
interval = ((interval + 500)) / 1000 * 1000;
}
t->interval = interval;
t->timeout = currentTime + interval;
}
void QEventDispatcherWin32Private::registerTimer(WinTimerInfo *t) void QEventDispatcherWin32Private::registerTimer(WinTimerInfo *t)
{ {
Q_ASSERT(internalHwnd); Q_ASSERT(internalHwnd);
@ -567,6 +578,7 @@ void QEventDispatcherWin32Private::registerTimer(WinTimerInfo *t)
Q_Q(QEventDispatcherWin32); Q_Q(QEventDispatcherWin32);
int ok = 0; int ok = 0;
calculateNextTimeout(t, qt_msectime());
uint interval = t->interval; uint interval = t->interval;
if (interval == 0u) { if (interval == 0u) {
// optimization for single-shot-zero-timer // optimization for single-shot-zero-timer
@ -575,17 +587,13 @@ void QEventDispatcherWin32Private::registerTimer(WinTimerInfo *t)
} else if ((interval < 20u || t->timerType == Qt::PreciseTimer) && qtimeSetEvent) { } else if ((interval < 20u || t->timerType == Qt::PreciseTimer) && qtimeSetEvent) {
ok = t->fastTimerId = qtimeSetEvent(interval, 1, qt_fast_timer_proc, (DWORD_PTR)t, ok = t->fastTimerId = qtimeSetEvent(interval, 1, qt_fast_timer_proc, (DWORD_PTR)t,
TIME_CALLBACK_FUNCTION | TIME_PERIODIC | TIME_KILL_SYNCHRONOUS); TIME_CALLBACK_FUNCTION | TIME_PERIODIC | TIME_KILL_SYNCHRONOUS);
} else if (interval >= 20000u || t->timerType == Qt::VeryCoarseTimer) {
// round the interval, VeryCoarseTimers only have full second accuracy
interval = ((interval + 500)) / 1000 * 1000;
} }
if (ok == 0) { if (ok == 0) {
// user normal timers for (Very)CoarseTimers, or if no more multimedia timers available // user normal timers for (Very)CoarseTimers, or if no more multimedia timers available
ok = SetTimer(internalHwnd, t->timerId, interval, 0); ok = SetTimer(internalHwnd, t->timerId, interval, 0);
} }
t->timeout = qt_msectime() + interval;
if (ok == 0) if (ok == 0)
qErrnoWarning("QEventDispatcherWin32::registerTimer: Failed to create a timer"); qErrnoWarning("QEventDispatcherWin32::registerTimer: Failed to create a timer");
} }
@ -610,6 +618,9 @@ void QEventDispatcherWin32Private::sendTimerEvent(int timerId)
// send event, but don't allow it to recurse // send event, but don't allow it to recurse
t->inTimerEvent = true; t->inTimerEvent = true;
// recalculate next emission
calculateNextTimeout(t, qt_msectime());
QTimerEvent e(t->timerId); QTimerEvent e(t->timerId);
QCoreApplication::sendEvent(t->obj, &e); QCoreApplication::sendEvent(t->obj, &e);

View File

@ -58,7 +58,7 @@ class QEventDispatcherWin32Private;
// forward declaration // forward declaration
LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp); LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp);
int qt_msectime(); quint64 qt_msectime();
class Q_CORE_EXPORT QEventDispatcherWin32 : public QAbstractEventDispatcher class Q_CORE_EXPORT QEventDispatcherWin32 : public QAbstractEventDispatcher
{ {

View File

@ -52,7 +52,7 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
int qt_msectime(); quint64 qt_msectime();
class QEventDispatcherWinRTPrivate; class QEventDispatcherWinRTPrivate;

View File

@ -1879,13 +1879,14 @@ const char *QMetaMethod::typeName() const
way in the function declaration: way in the function declaration:
\code \code
// In the class MainWindow declaration
#ifndef Q_MOC_RUN #ifndef Q_MOC_RUN
// define the tag text // define the tag text as empty, so the compiler doesn't see it
# define THISISTESTTAG # define MY_CUSTOM_TAG
#endif #endif
... ...
private slots: private slots:
THISISTESTTAG void testFunc(); MY_CUSTOM_TAG void testFunc();
\endcode \endcode
and the information can be accessed by using: and the information can be accessed by using:
@ -1895,12 +1896,14 @@ const char *QMetaMethod::typeName() const
win.show(); win.show();
int functionIndex = win.metaObject()->indexOfSlot("testFunc()"); int functionIndex = win.metaObject()->indexOfSlot("testFunc()");
QMetaMethod mm = metaObject()->method(functionIndex); QMetaMethod mm = win.metaObject()->method(functionIndex);
qDebug() << mm.tag(); // prints THISISTESTTAG qDebug() << mm.tag(); // prints MY_CUSTOM_TAG
\endcode \endcode
For the moment, \c moc will extract and record all tags, but it will not For the moment, \c moc will extract and record all tags, but it will not
handle any of them specially. handle any of them specially. You can use the tags to annotate your methods
differently, and treat them according to the specific needs of your
application.
\note Since Qt 5.0, \c moc expands preprocessor macros, so it is necessary \note Since Qt 5.0, \c moc expands preprocessor macros, so it is necessary
to surround the definition with \c #ifndef \c Q_MOC_RUN, as shown in the to surround the definition with \c #ifndef \c Q_MOC_RUN, as shown in the
@ -1960,8 +1963,9 @@ int QMetaMethod::revision() const
Returns the access specification of this method (private, Returns the access specification of this method (private,
protected, or public). protected, or public).
Signals are always protected, meaning that you can only emit them \note Signals are always public, but you should regard that as an
from the class or from a subclass. implementation detail. It is almost always a bad idea to emit a signal from
outside its class.
\sa methodType() \sa methodType()
*/ */

View File

@ -909,14 +909,7 @@ QObject::~QObject()
} }
if (!d->isWidget && d->isSignalConnected(0)) { if (!d->isWidget && d->isSignalConnected(0)) {
QT_TRY { emit destroyed(this);
emit destroyed(this);
} QT_CATCH(...) {
// all the signal/slots connections are still in place - if we don't
// quit now, we will crash pretty soon.
qWarning("Detected an unexpected exception in ~QObject while emitting destroyed().");
QT_RETHROW;
}
} }
if (d->declarativeData) { if (d->declarativeData) {

View File

@ -117,7 +117,7 @@ static quint64 getTickCount()
#endif // Q_OS_WINRT #endif // Q_OS_WINRT
} }
int qt_msectime() quint64 qt_msectime()
{ {
return ticksToNanoseconds(getTickCount()) / 1000000; return ticksToNanoseconds(getTickCount()) / 1000000;
} }

View File

@ -273,9 +273,9 @@ static inline __m128i mergeQuestionMarks(__m128i chunk)
// that they are doing the right thing. Inverting the arguments in the // that they are doing the right thing. Inverting the arguments in the
// instruction does cause a bunch of test failures. // instruction does cause a bunch of test failures.
const int mode = _SIDD_UWORD_OPS | _SIDD_CMP_RANGES | _SIDD_UNIT_MASK;
const __m128i rangeMatch = _mm_cvtsi32_si128(0xffff0100); const __m128i rangeMatch = _mm_cvtsi32_si128(0xffff0100);
const __m128i offLimitMask = _mm_cmpestrm(rangeMatch, 2, chunk, 8, mode); const __m128i offLimitMask = _mm_cmpestrm(rangeMatch, 2, chunk, 8,
_SIDD_UWORD_OPS | _SIDD_CMP_RANGES | _SIDD_UNIT_MASK);
// replace the non-Latin 1 characters in the chunk with question marks // replace the non-Latin 1 characters in the chunk with question marks
chunk = _mm_blendv_epi8(chunk, questionMark, offLimitMask); chunk = _mm_blendv_epi8(chunk, questionMark, offLimitMask);

View File

@ -43,7 +43,7 @@ QOpenGLShader shader(QOpenGLShader::Vertex);
shader.compileSourceCode(code); shader.compileSourceCode(code);
QOpenGLShaderProgram program(context); QOpenGLShaderProgram program(context);
program.addShader(shader); program.addShader(&shader);
program.link(); program.link();
program.bind(); program.bind();

View File

@ -1103,7 +1103,7 @@ static bool mask_alpha_converter_rgbx_inplace(QImageData *data, Qt::ImageConvers
} }
rgb_data += pad; rgb_data += pad;
} }
data->format = DestFormat; data->format = QImage::Format_RGBX8888;
return true; return true;
#endif #endif
} }

View File

@ -710,6 +710,7 @@ public:
enum State { enum State {
Ready, Ready,
ReadHeader, ReadHeader,
ReadingEnd,
Error Error
}; };
@ -958,7 +959,7 @@ bool QJpegHandlerPrivate::read(QImage *image)
for (int i = 0; i < readTexts.size()-1; i+=2) for (int i = 0; i < readTexts.size()-1; i+=2)
image->setText(readTexts.at(i), readTexts.at(i+1)); image->setText(readTexts.at(i), readTexts.at(i+1));
state = Ready; state = ReadingEnd;
return true; return true;
} }
@ -1006,7 +1007,7 @@ bool QJpegHandler::canRead() const
if(d->state == QJpegHandlerPrivate::Ready && !canRead(device())) if(d->state == QJpegHandlerPrivate::Ready && !canRead(device()))
return false; return false;
if (d->state != QJpegHandlerPrivate::Error) { if (d->state != QJpegHandlerPrivate::Error && d->state != QJpegHandlerPrivate::ReadingEnd) {
setFormat("jpeg"); setFormat("jpeg");
return true; return true;
} }

View File

@ -1889,7 +1889,7 @@ void QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyE
#if !defined(Q_OS_OSX) #if !defined(Q_OS_OSX)
// On OS X the shortcut override is checked earlier, see: QWindowSystemInterface::handleKeyEvent() // On OS X the shortcut override is checked earlier, see: QWindowSystemInterface::handleKeyEvent()
const bool checkShortcut = e->keyType == QEvent::KeyPress && window != 0; const bool checkShortcut = e->keyType == QEvent::KeyPress && window != 0;
if (checkShortcut && QWindowSystemInterface::tryHandleShortcutEvent(window, e->timestamp, e->key, e->modifiers, e->unicode)) if (checkShortcut && QWindowSystemInterface::tryHandleShortcutEvent(window, e->timestamp, e->key, e->modifiers, e->unicode, e->repeat, e->repeatCount))
return; return;
#endif // Q_OS_OSX #endif // Q_OS_OSX

View File

@ -1112,6 +1112,7 @@ void QOpenGLTexturePrivate::setData(int mipLevel, int layer, QOpenGLTexture::Cub
mipLevelSize(mipLevel, dimensions[0]), mipLevelSize(mipLevel, dimensions[0]),
1, 1,
sourceFormat, sourceType, data, options); sourceFormat, sourceType, data, options);
break;
case QOpenGLTexture::Target2D: case QOpenGLTexture::Target2D:
Q_UNUSED(layer); Q_UNUSED(layer);
@ -1210,6 +1211,7 @@ void QOpenGLTexturePrivate::setCompressedData(int mipLevel, int layer, QOpenGLTe
mipLevelSize(mipLevel, dimensions[0]), mipLevelSize(mipLevel, dimensions[0]),
1, 1,
format, dataSize, data, options); format, dataSize, data, options);
break;
case QOpenGLTexture::Target2D: case QOpenGLTexture::Target2D:
Q_UNUSED(layer); Q_UNUSED(layer);

View File

@ -101,6 +101,8 @@ QOpenGLTextureHelper::QOpenGLTextureHelper(QOpenGLContext *context)
// Use our own DSA emulation // Use our own DSA emulation
TextureParameteri = &QOpenGLTextureHelper::qt_TextureParameteri; TextureParameteri = &QOpenGLTextureHelper::qt_TextureParameteri;
TextureParameteriv = &QOpenGLTextureHelper::qt_TextureParameteriv; TextureParameteriv = &QOpenGLTextureHelper::qt_TextureParameteriv;
TextureParameterf = &QOpenGLTextureHelper::qt_TextureParameterf;
TextureParameterfv = &QOpenGLTextureHelper::qt_TextureParameterfv;
GenerateTextureMipmap = &QOpenGLTextureHelper::qt_GenerateTextureMipmap; GenerateTextureMipmap = &QOpenGLTextureHelper::qt_GenerateTextureMipmap;
TextureStorage3D = &QOpenGLTextureHelper::qt_TextureStorage3D; TextureStorage3D = &QOpenGLTextureHelper::qt_TextureStorage3D;
TextureStorage2D = &QOpenGLTextureHelper::qt_TextureStorage2D; TextureStorage2D = &QOpenGLTextureHelper::qt_TextureStorage2D;

View File

@ -1256,7 +1256,7 @@ int QTextEngine::shapeTextWithHarfbuzzNG(const QScriptItem &si, const ushort *st
// scaling the advances for this particular version // scaling the advances for this particular version
if (actualFontEngine->fontDef.stretch != 100 if (actualFontEngine->fontDef.stretch != 100
&& QSysInfo::MacintoshVersion != QSysInfo::MV_10_6) { && QSysInfo::MacintoshVersion != QSysInfo::MV_10_6) {
QFixed stretch = QFixed(actualFontEngine->fontDef.stretch) / QFixed(100); QFixed stretch = QFixed(int(actualFontEngine->fontDef.stretch)) / QFixed(100);
for (uint i = 0; i < num_glyphs; ++i) for (uint i = 0; i < num_glyphs; ++i)
g.advances[i] *= stretch; g.advances[i] *= stretch;
} }

View File

@ -472,11 +472,11 @@ QNetworkAccessManager::QNetworkAccessManager(QObject *parent)
// the QNetworkSession's signals // the QNetworkSession's signals
connect(&d->networkConfigurationManager, SIGNAL(onlineStateChanged(bool)), connect(&d->networkConfigurationManager, SIGNAL(onlineStateChanged(bool)),
SLOT(_q_onlineStateChanged(bool))); SLOT(_q_onlineStateChanged(bool)));
// we would need all active configurations to check for
// d->networkConfigurationManager.isOnline(), which is asynchronous
// and potentially expensive. We can just check the configuration here
d->online = (d->networkConfiguration.state() & QNetworkConfiguration::Active);
} }
// we would need all active configurations to check for
// d->networkConfigurationManager.isOnline(), which is asynchronous
// and potentially expensive. We can just check the configuration here
d->online = (d->networkConfiguration.state() & QNetworkConfiguration::Active);
#endif #endif
} }
@ -946,6 +946,7 @@ QNetworkConfiguration QNetworkAccessManager::activeConfiguration() const
void QNetworkAccessManager::setNetworkAccessible(QNetworkAccessManager::NetworkAccessibility accessible) void QNetworkAccessManager::setNetworkAccessible(QNetworkAccessManager::NetworkAccessibility accessible)
{ {
Q_D(QNetworkAccessManager); Q_D(QNetworkAccessManager);
d->defaultAccessControl = false;
if (d->networkAccessible != accessible) { if (d->networkAccessible != accessible) {
NetworkAccessibility previous = networkAccessible(); NetworkAccessibility previous = networkAccessible();
@ -964,7 +965,6 @@ void QNetworkAccessManager::setNetworkAccessible(QNetworkAccessManager::NetworkA
QNetworkAccessManager::NetworkAccessibility QNetworkAccessManager::networkAccessible() const QNetworkAccessManager::NetworkAccessibility QNetworkAccessManager::networkAccessible() const
{ {
Q_D(const QNetworkAccessManager); Q_D(const QNetworkAccessManager);
if (d->networkSessionRequired) { if (d->networkSessionRequired) {
QSharedPointer<QNetworkSession> networkSession(d->getNetworkSession()); QSharedPointer<QNetworkSession> networkSession(d->getNetworkSession());
if (networkSession) { if (networkSession) {
@ -975,7 +975,13 @@ QNetworkAccessManager::NetworkAccessibility QNetworkAccessManager::networkAccess
return NotAccessible; return NotAccessible;
} else { } else {
// Network accessibility is either disabled or unknown. // Network accessibility is either disabled or unknown.
return (d->networkAccessible == NotAccessible) ? NotAccessible : UnknownAccessibility; if (d->defaultAccessControl) {
if (d->online)
return d->networkAccessible;
else
return NotAccessible;
}
return (d->networkAccessible);
} }
} else { } else {
if (d->online) if (d->online)
@ -1568,7 +1574,7 @@ void QNetworkAccessManagerPrivate::createSession(const QNetworkConfiguration &co
if (!networkSessionStrongRef) { if (!networkSessionStrongRef) {
online = false; online = false;
if (networkAccessible == QNetworkAccessManager::NotAccessible) if (networkAccessible == QNetworkAccessManager::NotAccessible || !online)
emit q->networkAccessibleChanged(QNetworkAccessManager::NotAccessible); emit q->networkAccessibleChanged(QNetworkAccessManager::NotAccessible);
else else
emit q->networkAccessibleChanged(QNetworkAccessManager::UnknownAccessibility); emit q->networkAccessibleChanged(QNetworkAccessManager::UnknownAccessibility);
@ -1616,11 +1622,14 @@ void QNetworkAccessManagerPrivate::_q_networkSessionStateChanged(QNetworkSession
if (online) { if (online) {
if (state != QNetworkSession::Connected && state != QNetworkSession::Roaming) { if (state != QNetworkSession::Connected && state != QNetworkSession::Roaming) {
online = false; online = false;
emit q->networkAccessibleChanged(QNetworkAccessManager::NotAccessible); networkAccessible = QNetworkAccessManager::NotAccessible;
emit q->networkAccessibleChanged(networkAccessible);
} }
} else { } else {
if (state == QNetworkSession::Connected || state == QNetworkSession::Roaming) { if (state == QNetworkSession::Connected || state == QNetworkSession::Roaming) {
online = true; online = true;
if (defaultAccessControl)
networkAccessible = QNetworkAccessManager::Accessible;
emit q->networkAccessibleChanged(networkAccessible); emit q->networkAccessibleChanged(networkAccessible);
} }
} }

View File

@ -84,6 +84,7 @@ public:
initializeSession(true), initializeSession(true),
#endif #endif
cookieJarCreated(false), cookieJarCreated(false),
defaultAccessControl(true),
authenticationManager(QSharedPointer<QNetworkAccessAuthenticationManager>::create()) authenticationManager(QSharedPointer<QNetworkAccessAuthenticationManager>::create())
{ } { }
~QNetworkAccessManagerPrivate(); ~QNetworkAccessManagerPrivate();
@ -164,6 +165,7 @@ public:
#endif #endif
bool cookieJarCreated; bool cookieJarCreated;
bool defaultAccessControl;
// The cache with authorization data: // The cache with authorization data:
QSharedPointer<QNetworkAccessAuthenticationManager> authenticationManager; QSharedPointer<QNetworkAccessAuthenticationManager> authenticationManager;

View File

@ -71,10 +71,8 @@ public:
private: private:
int id; int id;
friend Q_DECL_CONSTEXPR bool operator==(QSslEllipticCurve lhs, QSslEllipticCurve rhs) Q_DECL_NOTHROW friend Q_DECL_CONSTEXPR bool operator==(QSslEllipticCurve lhs, QSslEllipticCurve rhs) Q_DECL_NOTHROW;
{ return lhs.id == rhs.id; } friend Q_DECL_CONSTEXPR uint qHash(QSslEllipticCurve curve, uint seed) Q_DECL_NOTHROW;
friend Q_DECL_CONSTEXPR uint qHash(QSslEllipticCurve curve, uint seed) Q_DECL_NOTHROW
{ return qHash(curve.id, seed); }
friend class QSslSocketPrivate; friend class QSslSocketPrivate;
friend class QSslSocketBackendPrivate; friend class QSslSocketBackendPrivate;
@ -82,6 +80,12 @@ private:
Q_DECLARE_TYPEINFO(QSslEllipticCurve, Q_PRIMITIVE_TYPE); Q_DECLARE_TYPEINFO(QSslEllipticCurve, Q_PRIMITIVE_TYPE);
Q_DECL_CONSTEXPR inline uint qHash(QSslEllipticCurve curve, uint seed) Q_DECL_NOTHROW
{ return qHash(curve.id, seed); }
Q_DECL_CONSTEXPR inline bool operator==(QSslEllipticCurve lhs, QSslEllipticCurve rhs) Q_DECL_NOTHROW
{ return lhs.id == rhs.id; }
Q_DECL_CONSTEXPR inline bool operator!=(QSslEllipticCurve lhs, QSslEllipticCurve rhs) Q_DECL_NOTHROW Q_DECL_CONSTEXPR inline bool operator!=(QSslEllipticCurve lhs, QSslEllipticCurve rhs) Q_DECL_NOTHROW
{ return !operator==(lhs, rhs); } { return !operator==(lhs, rhs); }

View File

@ -33,6 +33,7 @@
#include "qsslsocket.h" #include "qsslsocket.h"
#include "qssl_p.h"
#include "qsslsocket_mac_p.h" #include "qsslsocket_mac_p.h"
#include "qasn1element_p.h" #include "qasn1element_p.h"
#include "qsslcertificate_p.h" #include "qsslcertificate_p.h"
@ -93,7 +94,7 @@ static OSStatus _q_SSLRead(QTcpSocket *plainSocket, char *data, size_t *dataLeng
const qint64 bytes = plainSocket->read(data, *dataLength); const qint64 bytes = plainSocket->read(data, *dataLength);
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "read" << bytes; qCDebug(lcSsl) << plainSocket << "read" << bytes;
#endif #endif
if (bytes < 0) { if (bytes < 0) {
*dataLength = 0; *dataLength = 0;
@ -114,7 +115,7 @@ static OSStatus _q_SSLWrite(QTcpSocket *plainSocket, const char *data, size_t *d
const qint64 bytes = plainSocket->write(data, *dataLength); const qint64 bytes = plainSocket->write(data, *dataLength);
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "write" << bytes; qCDebug(lcSsl) << plainSocket << "write" << bytes;
#endif #endif
if (bytes < 0) { if (bytes < 0) {
*dataLength = 0; *dataLength = 0;
@ -166,7 +167,7 @@ void QSslSocketPrivate::ensureInitialized()
if (!s_loadRootCertsOnDemand) if (!s_loadRootCertsOnDemand)
setDefaultCaCertificates(systemCaCertificates()); setDefaultCaCertificates(systemCaCertificates());
} else { } else {
qWarning() << Q_FUNC_INFO << "SSLCreateContext failed"; qCWarning(lcSsl) << "SSLCreateContext failed";
s_loadedCiphersAndCerts = false; s_loadedCiphersAndCerts = false;
} }
@ -225,7 +226,7 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
} }
} else { } else {
// no detailed error handling here // no detailed error handling here
qWarning("could not retrieve system CA certificates"); qCWarning(lcSsl) << "SecTrustSettingsCopyCertificates failed:" << status;
} }
#endif #endif
return systemCerts; return systemCerts;
@ -244,7 +245,7 @@ QSslSocketBackendPrivate::~QSslSocketBackendPrivate()
void QSslSocketBackendPrivate::continueHandshake() void QSslSocketBackendPrivate::continueHandshake()
{ {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "connection encrypted"; qCDebug(lcSsl) << plainSocket << "connection encrypted";
#endif #endif
Q_Q(QSslSocket); Q_Q(QSslSocket);
connectionEncrypted = true; connectionEncrypted = true;
@ -291,8 +292,7 @@ QSsl::SslProtocol QSslSocketBackendPrivate::sessionProtocol() const
SSLProtocol protocol = kSSLProtocolUnknown; SSLProtocol protocol = kSSLProtocolUnknown;
const OSStatus err = SSLGetNegotiatedProtocolVersion(context, &protocol); const OSStatus err = SSLGetNegotiatedProtocolVersion(context, &protocol);
if (err != noErr) { if (err != noErr) {
qWarning() << Q_FUNC_INFO << "SSLGetNegotiatedProtocolVersion failed:" qCWarning(lcSsl) << "SSLGetNegotiatedProtocolVersion failed:" << err;
<< int(err);
return QSsl::UnknownProtocol; return QSsl::UnknownProtocol;
} }
@ -356,9 +356,12 @@ void QSslSocketBackendPrivate::transmit()
const size_t nextDataBlockSize = writeBuffer.nextDataBlockSize(); const size_t nextDataBlockSize = writeBuffer.nextDataBlockSize();
size_t writtenBytes = 0; size_t writtenBytes = 0;
const OSStatus err = SSLWrite(context, writeBuffer.readPointer(), nextDataBlockSize, &writtenBytes); const OSStatus err = SSLWrite(context, writeBuffer.readPointer(), nextDataBlockSize, &writtenBytes);
#ifdef QSSLSOCKET_DEBUG
qCDebug(lcSsl) << plainSocket << "SSLWrite returned" << err;
#endif
if (err != noErr && err != errSSLWouldBlock) { if (err != noErr && err != errSSLWouldBlock) {
qWarning() << Q_FUNC_INFO << "SSL write failed with error:" << int(err); setError(QStringLiteral("SSLWrite failed: %1").arg(err),
setError("SSL write failed", QAbstractSocket::SslInternalError); QAbstractSocket::SslInternalError);
break; break;
} }
@ -387,9 +390,17 @@ void QSslSocketBackendPrivate::transmit()
size_t readBytes = 0; size_t readBytes = 0;
data.resize(4096); data.resize(4096);
const OSStatus err = SSLRead(context, data.data(), data.size(), &readBytes); const OSStatus err = SSLRead(context, data.data(), data.size(), &readBytes);
if (err != noErr && err != errSSLWouldBlock) { #ifdef QSSLSOCKET_DEBUG
qWarning() << Q_FUNC_INFO << "SSLRead failed with:" << int(err); qCDebug(lcSsl) << plainSocket << "SSLRead returned" << err;
setError("SSL read failed", QAbstractSocket::SslInternalError); #endif
if (err == errSSLClosedGraceful) {
shutdown = true; // the other side shut down, make sure we do not send shutdown ourselves
setError(QSslSocket::tr("The TLS/SSL connection has been closed"),
QAbstractSocket::RemoteHostClosedError);
break;
} else if (err != noErr && err != errSSLWouldBlock) {
setError(QStringLiteral("SSLRead failed: %1").arg(err),
QAbstractSocket::SslInternalError);
break; break;
} }
@ -596,7 +607,7 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(SSLCipherSui
} else if (ciph.d->name.startsWith("ECDH-") || ciph.d->name.startsWith("ECDHE-")) { } else if (ciph.d->name.startsWith("ECDH-") || ciph.d->name.startsWith("ECDHE-")) {
ciph.d->keyExchangeMethod = QLatin1String("ECDH"); ciph.d->keyExchangeMethod = QLatin1String("ECDH");
} else { } else {
qWarning() << Q_FUNC_INFO << "Unknown Kx" << ciph.d->name; qCWarning(lcSsl) << "Unknown Kx" << ciph.d->name;
} }
if (bits.size() == 2 || bits.size() == 3) { if (bits.size() == 2 || bits.size() == 3) {
@ -606,7 +617,7 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(SSLCipherSui
} else if (ciph.d->name.contains("-RSA-")) { } else if (ciph.d->name.contains("-RSA-")) {
ciph.d->authenticationMethod = QLatin1String("RSA"); ciph.d->authenticationMethod = QLatin1String("RSA");
} else { } else {
qWarning() << Q_FUNC_INFO << "Unknown Au" << ciph.d->name; qCWarning(lcSsl) << "Unknown Au" << ciph.d->name;
} }
if (ciph.d->name.contains("RC4-")) { if (ciph.d->name.contains("RC4-")) {
@ -628,7 +639,7 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(SSLCipherSui
} else if (ciph.d->name.contains("NULL-")) { } else if (ciph.d->name.contains("NULL-")) {
ciph.d->encryptionMethod = QLatin1String("NULL"); ciph.d->encryptionMethod = QLatin1String("NULL");
} else { } else {
qWarning() << Q_FUNC_INFO << "Unknown Enc" << ciph.d->name; qCWarning(lcSsl) << "Unknown Enc" << ciph.d->name;
} }
} }
return ciph; return ciph;
@ -647,7 +658,6 @@ bool QSslSocketBackendPrivate::initSslContext()
context = SSLCreateContext(Q_NULLPTR, side, kSSLStreamType); context = SSLCreateContext(Q_NULLPTR, side, kSSLStreamType);
if (!context) { if (!context) {
qWarning() << Q_FUNC_INFO << "SSLCreateContext failed";
setError("SSLCreateContext failed", QAbstractSocket::SslInternalError); setError("SSLCreateContext failed", QAbstractSocket::SslInternalError);
return false; return false;
} }
@ -655,9 +665,9 @@ bool QSslSocketBackendPrivate::initSslContext()
const OSStatus err = SSLSetIOFuncs(context, reinterpret_cast<SSLReadFunc>(&_q_SSLRead), const OSStatus err = SSLSetIOFuncs(context, reinterpret_cast<SSLReadFunc>(&_q_SSLRead),
reinterpret_cast<SSLWriteFunc>(&_q_SSLWrite)); reinterpret_cast<SSLWriteFunc>(&_q_SSLWrite));
if (err != noErr) { if (err != noErr) {
qWarning() << Q_FUNC_INFO << "SSLSetIOFuncs failed with error " << int(err);
destroySslContext(); destroySslContext();
setError("SSLSetIOFuncs failed", QAbstractSocket::SslInternalError); setError(QStringLiteral("SSLSetIOFuncs failed: %1").arg(err),
QAbstractSocket::SslInternalError);
return false; return false;
} }
@ -675,7 +685,6 @@ bool QSslSocketBackendPrivate::initSslContext()
} }
if (!setSessionProtocol()) { if (!setSessionProtocol()) {
qWarning() << Q_FUNC_INFO << "failed to set protocol version";
destroySslContext(); destroySslContext();
setError("Failed to set protocol version", QAbstractSocket::SslInternalError); setError("Failed to set protocol version", QAbstractSocket::SslInternalError);
return false; return false;
@ -688,7 +697,6 @@ bool QSslSocketBackendPrivate::initSslContext()
// But for OS X versions below 10.8 we have to do it explicitly: // But for OS X versions below 10.8 we have to do it explicitly:
const OSStatus err = SSLSetEnableCertVerify(context, false); const OSStatus err = SSLSetEnableCertVerify(context, false);
if (err != noErr) { if (err != noErr) {
qWarning() << Q_FUNC_INFO << "SSLSetEnableCertVerify failed:" << int(err);
destroySslContext(); destroySslContext();
setError(QStringLiteral("SSLSetEnableCertVerify failed: %1").arg(err), setError(QStringLiteral("SSLSetEnableCertVerify failed: %1").arg(err),
QSslSocket::SslInternalError); QSslSocket::SslInternalError);
@ -711,7 +719,6 @@ bool QSslSocketBackendPrivate::initSslContext()
err = SSLSetSessionOption(context, kSSLSessionOptionBreakOnCertRequested, true); err = SSLSetSessionOption(context, kSSLSessionOptionBreakOnCertRequested, true);
if (err != noErr) { if (err != noErr) {
qWarning() << Q_FUNC_INFO << "SSLSetSessionOption failed:" << int(err);
destroySslContext(); destroySslContext();
setError(QStringLiteral("SSLSetSessionOption failed: %1").arg(err), setError(QStringLiteral("SSLSetSessionOption failed: %1").arg(err),
QSslSocket::SslInternalError); QSslSocket::SslInternalError);
@ -729,7 +736,6 @@ bool QSslSocketBackendPrivate::initSslContext()
} }
if (err != noErr) { if (err != noErr) {
qWarning() << Q_FUNC_INFO << "failed to set SSL context option in server mode";
destroySslContext(); destroySslContext();
setError(QStringLiteral("failed to set SSL context option in server mode: %1").arg(err), setError(QStringLiteral("failed to set SSL context option in server mode: %1").arg(err),
QAbstractSocket::SslInternalError); QAbstractSocket::SslInternalError);
@ -781,7 +787,7 @@ bool QSslSocketBackendPrivate::setSessionCertificate(QString &errorDescription,
OSStatus err = SecPKCS12Import(pkcs12, options, &items); OSStatus err = SecPKCS12Import(pkcs12, options, &items);
if (err != noErr) { if (err != noErr) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qWarning() << Q_FUNC_INFO << plainSocket qCWarning(lcSsl) << plainSocket
<< QStringLiteral("SecPKCS12Import failed: %1").arg(err); << QStringLiteral("SecPKCS12Import failed: %1").arg(err);
#endif #endif
errorCode = QAbstractSocket::SslInvalidUserDataError; errorCode = QAbstractSocket::SslInvalidUserDataError;
@ -791,7 +797,7 @@ bool QSslSocketBackendPrivate::setSessionCertificate(QString &errorDescription,
if (!CFArrayGetCount(items)) { if (!CFArrayGetCount(items)) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qWarning() << Q_FUNC_INFO << plainSocket << "SecPKCS12Import returned no items"; qCWarning(lcSsl) << plainSocket << "SecPKCS12Import returned no items";
#endif #endif
errorCode = QAbstractSocket::SslInvalidUserDataError; errorCode = QAbstractSocket::SslInvalidUserDataError;
errorDescription = QStringLiteral("SecPKCS12Import returned no items"); errorDescription = QStringLiteral("SecPKCS12Import returned no items");
@ -802,7 +808,7 @@ bool QSslSocketBackendPrivate::setSessionCertificate(QString &errorDescription,
SecIdentityRef identity = (SecIdentityRef)CFDictionaryGetValue(import, kSecImportItemIdentity); SecIdentityRef identity = (SecIdentityRef)CFDictionaryGetValue(import, kSecImportItemIdentity);
if (!identity) { if (!identity) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qWarning() << Q_FUNC_INFO << plainSocket << "SecPKCS12Import returned no identity"; qCWarning(lcSsl) << plainSocket << "SecPKCS12Import returned no identity";
#endif #endif
errorCode = QAbstractSocket::SslInvalidUserDataError; errorCode = QAbstractSocket::SslInvalidUserDataError;
errorDescription = QStringLiteral("SecPKCS12Import returned no identity"); errorDescription = QStringLiteral("SecPKCS12Import returned no identity");
@ -827,7 +833,7 @@ bool QSslSocketBackendPrivate::setSessionCertificate(QString &errorDescription,
err = SSLSetCertificate(context, certs); err = SSLSetCertificate(context, certs);
if (err != noErr) { if (err != noErr) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qWarning() << Q_FUNC_INFO << plainSocket qCWarning(lcSsl) << plainSocket
<< QStringLiteral("Cannot set certificate and key: %1").arg(err); << QStringLiteral("Cannot set certificate and key: %1").arg(err);
#endif #endif
errorCode = QAbstractSocket::SslInvalidUserDataError; errorCode = QAbstractSocket::SslInvalidUserDataError;
@ -851,41 +857,41 @@ bool QSslSocketBackendPrivate::setSessionProtocol()
// return errSSLIllegalParam; // return errSSLIllegalParam;
// where MINIMUM_STREAM_VERSION is SSL_Version_3_0, MAXIMUM_STREAM_VERSION is TLS_Version_1_2. // where MINIMUM_STREAM_VERSION is SSL_Version_3_0, MAXIMUM_STREAM_VERSION is TLS_Version_1_2.
if (configuration.protocol == QSsl::SslV2) { if (configuration.protocol == QSsl::SslV2) {
qDebug() << Q_FUNC_INFO << "protocol QSsl::SslV2 is disabled"; qCDebug(lcSsl) << "protocol QSsl::SslV2 is disabled";
return false; return false;
} }
if (configuration.protocol == QSsl::SslV3) { if (configuration.protocol == QSsl::SslV3) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : SSLv3"; qCDebug(lcSsl) << plainSocket << "requesting : SSLv3";
#endif #endif
err = SSLSetProtocolVersionMin(context, kSSLProtocol3); err = SSLSetProtocolVersionMin(context, kSSLProtocol3);
if (err == noErr) if (err == noErr)
err = SSLSetProtocolVersionMax(context, kSSLProtocol3); err = SSLSetProtocolVersionMax(context, kSSLProtocol3);
} else if (configuration.protocol == QSsl::TlsV1_0) { } else if (configuration.protocol == QSsl::TlsV1_0) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : TLSv1.0"; qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.0";
#endif #endif
err = SSLSetProtocolVersionMin(context, kTLSProtocol1); err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
if (err == noErr) if (err == noErr)
err = SSLSetProtocolVersionMax(context, kTLSProtocol1); err = SSLSetProtocolVersionMax(context, kTLSProtocol1);
} else if (configuration.protocol == QSsl::TlsV1_1) { } else if (configuration.protocol == QSsl::TlsV1_1) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : TLSv1.1"; qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.1";
#endif #endif
err = SSLSetProtocolVersionMin(context, kTLSProtocol11); err = SSLSetProtocolVersionMin(context, kTLSProtocol11);
if (err == noErr) if (err == noErr)
err = SSLSetProtocolVersionMax(context, kTLSProtocol11); err = SSLSetProtocolVersionMax(context, kTLSProtocol11);
} else if (configuration.protocol == QSsl::TlsV1_2) { } else if (configuration.protocol == QSsl::TlsV1_2) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : TLSv1.2"; qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.2";
#endif #endif
err = SSLSetProtocolVersionMin(context, kTLSProtocol12); err = SSLSetProtocolVersionMin(context, kTLSProtocol12);
if (err == noErr) if (err == noErr)
err = SSLSetProtocolVersionMax(context, kTLSProtocol12); err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
} else if (configuration.protocol == QSsl::AnyProtocol) { } else if (configuration.protocol == QSsl::AnyProtocol) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : any"; qCDebug(lcSsl) << plainSocket << "requesting : any";
#endif #endif
// kSSLProtocol3, since kSSLProtocol2 is disabled: // kSSLProtocol3, since kSSLProtocol2 is disabled:
err = SSLSetProtocolVersionMin(context, kSSLProtocol3); err = SSLSetProtocolVersionMin(context, kSSLProtocol3);
@ -893,41 +899,43 @@ bool QSslSocketBackendPrivate::setSessionProtocol()
err = SSLSetProtocolVersionMax(context, kTLSProtocol12); err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
} else if (configuration.protocol == QSsl::TlsV1SslV3) { } else if (configuration.protocol == QSsl::TlsV1SslV3) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : SSLv3 - TLSv1.2"; qCDebug(lcSsl) << plainSocket << "requesting : SSLv3 - TLSv1.2";
#endif #endif
err = SSLSetProtocolVersionMin(context, kSSLProtocol3); err = SSLSetProtocolVersionMin(context, kSSLProtocol3);
if (err == noErr) if (err == noErr)
err = SSLSetProtocolVersionMax(context, kTLSProtocol12); err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
} else if (configuration.protocol == QSsl::SecureProtocols) { } else if (configuration.protocol == QSsl::SecureProtocols) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : TLSv1 - TLSv1.2"; qCDebug(lcSsl) << plainSocket << "requesting : TLSv1 - TLSv1.2";
#endif #endif
err = SSLSetProtocolVersionMin(context, kTLSProtocol1); err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
if (err == noErr) if (err == noErr)
err = SSLSetProtocolVersionMax(context, kTLSProtocol12); err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
} else if (configuration.protocol == QSsl::TlsV1_0OrLater) { } else if (configuration.protocol == QSsl::TlsV1_0OrLater) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : TLSv1 - TLSv1.2"; qCDebug(lcSsl) << plainSocket << "requesting : TLSv1 - TLSv1.2";
#endif #endif
err = SSLSetProtocolVersionMin(context, kTLSProtocol1); err = SSLSetProtocolVersionMin(context, kTLSProtocol1);
if (err == noErr) if (err == noErr)
err = SSLSetProtocolVersionMax(context, kTLSProtocol12); err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
} else if (configuration.protocol == QSsl::TlsV1_1OrLater) { } else if (configuration.protocol == QSsl::TlsV1_1OrLater) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : TLSv1.1 - TLSv1.2"; qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.1 - TLSv1.2";
#endif #endif
err = SSLSetProtocolVersionMin(context, kTLSProtocol11); err = SSLSetProtocolVersionMin(context, kTLSProtocol11);
if (err == noErr) if (err == noErr)
err = SSLSetProtocolVersionMax(context, kTLSProtocol12); err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
} else if (configuration.protocol == QSsl::TlsV1_2OrLater) { } else if (configuration.protocol == QSsl::TlsV1_2OrLater) {
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "requesting : TLSv1.2"; qCDebug(lcSsl) << plainSocket << "requesting : TLSv1.2";
#endif #endif
err = SSLSetProtocolVersionMin(context, kTLSProtocol12); err = SSLSetProtocolVersionMin(context, kTLSProtocol12);
if (err == noErr) if (err == noErr)
err = SSLSetProtocolVersionMax(context, kTLSProtocol12); err = SSLSetProtocolVersionMax(context, kTLSProtocol12);
} else { } else {
qDebug() << Q_FUNC_INFO << "no protocol version found in the configuration"; #ifdef QSSLSOCKET_DEBUG
qCDebug(lcSsl) << plainSocket << "no protocol version found in the configuration";
#endif
return false; return false;
} }
@ -997,7 +1005,8 @@ bool QSslSocketBackendPrivate::verifyPeerTrust()
if (err != noErr) { if (err != noErr) {
// We can not ignore this, it's not even about trust verification // We can not ignore this, it's not even about trust verification
// probably ... // probably ...
setError("SecTrustEvaluate failed", QAbstractSocket::SslHandshakeFailedError); setError(QStringLiteral("SecTrustEvaluate failed: %1").arg(err),
QAbstractSocket::SslHandshakeFailedError);
plainSocket->disconnectFromHost(); plainSocket->disconnectFromHost();
return false; return false;
} }
@ -1132,7 +1141,7 @@ bool QSslSocketBackendPrivate::startHandshake()
OSStatus err = SSLHandshake(context); OSStatus err = SSLHandshake(context);
#ifdef QSSLSOCKET_DEBUG #ifdef QSSLSOCKET_DEBUG
qDebug() << Q_FUNC_INFO << plainSocket << "SSLHandhake returned" << err; qCDebug(lcSsl) << plainSocket << "SSLHandhake returned" << err;
#endif #endif
if (err == errSSLWouldBlock) { if (err == errSSLWouldBlock) {
@ -1153,7 +1162,6 @@ bool QSslSocketBackendPrivate::startHandshake()
// setSessionCertificate does not fail if we have no certificate. // setSessionCertificate does not fail if we have no certificate.
// Failure means a real error (invalid certificate, no private key, etc). // Failure means a real error (invalid certificate, no private key, etc).
if (!setSessionCertificate(errorDescription, errorCode)) { if (!setSessionCertificate(errorDescription, errorCode)) {
qWarning() << Q_FUNC_INFO << "Failed to provide a client certificate";
setError(errorDescription, errorCode); setError(errorDescription, errorCode);
return false; return false;
} else { } else {
@ -1169,7 +1177,7 @@ bool QSslSocketBackendPrivate::startHandshake()
return startHandshake(); return startHandshake();
} }
setError(QStringLiteral("Error during SSL handshake: %1").arg(err), setError(QStringLiteral("SSLHandshake failed: %1").arg(err),
QAbstractSocket::SslHandshakeFailedError); QAbstractSocket::SslHandshakeFailedError);
plainSocket->disconnectFromHost(); plainSocket->disconnectFromHost();
return false; return false;
@ -1177,7 +1185,7 @@ bool QSslSocketBackendPrivate::startHandshake()
// Connection aborted during handshake phase. // Connection aborted during handshake phase.
if (q->state() != QAbstractSocket::ConnectedState) { if (q->state() != QAbstractSocket::ConnectedState) {
qDebug() << Q_FUNC_INFO << "connection aborted"; qCDebug(lcSsl) << "connection aborted";
return false; return false;
} }

View File

@ -379,17 +379,20 @@ QEvdevKeyboardHandler::KeycodeAction QEvdevKeyboardHandler::processKeycode(quint
} }
if (!skip) { if (!skip) {
qCDebug(qLcEvdevKeyMap, "Processing: uni=%04x, qt=%08x, qtmod=%08x", unicode, qtcode & ~modmask, (qtcode & modmask)); // Up until now qtcode contained both the key and modifiers. Split it.
//If NumLockOff and keypad key pressed remap event sent Qt::KeyboardModifiers qtmods = Qt::KeyboardModifiers(qtcode & modmask);
if (!m_locks[1] && qtcode &= ~modmask;
(qtcode & Qt::KeypadModifier) &&
qCDebug(qLcEvdevKeyMap, "Processing: uni=%04x, qt=%08x, qtmod=%08x", unicode, qtcode, int(qtmods));
// If NumLockOff and keypad key pressed remap event sent
if (!m_locks[1] && (qtmods & Qt::KeypadModifier) &&
keycode >= 71 && keycode >= 71 &&
keycode <= 83 && keycode <= 83 &&
keycode != 74 && keycode != 74 &&
keycode != 78) { keycode != 78) {
unicode = 0xffff; unicode = 0xffff;
int oldMask = (qtcode & modmask);
switch (keycode) { switch (keycode) {
case 71: //7 --> Home case 71: //7 --> Home
qtcode = Qt::Key_Home; qtcode = Qt::Key_Home;
@ -425,11 +428,14 @@ QEvdevKeyboardHandler::KeycodeAction QEvdevKeyboardHandler::processKeycode(quint
qtcode = Qt::Key_Delete; qtcode = Qt::Key_Delete;
break; break;
} }
qtcode ^= oldMask;
} }
// send the result to the server // Map SHIFT + Tab to SHIFT + Backtab, QShortcutMap knows about this translation
processKeyEvent(keycode, unicode, qtcode & ~modmask, Qt::KeyboardModifiers(qtcode & modmask), pressed, autorepeat); if (qtcode == Qt::Key_Tab && (qtmods & Qt::ShiftModifier) == Qt::ShiftModifier)
qtcode = Qt::Key_Backtab;
// Generate the QPA event.
processKeyEvent(keycode, unicode, qtcode, qtmods, pressed, autorepeat);
} }
} }
return result; return result;

View File

@ -79,12 +79,12 @@ QT_USE_NAMESPACE
- (void)QT_MANGLE_NAMESPACE(qt_setDockMenu):(NSMenu *)newMenu - (void)QT_MANGLE_NAMESPACE(qt_setDockMenu):(NSMenu *)newMenu
{ {
[[QCocoaApplicationDelegate sharedDelegate] setDockMenu:newMenu]; [[QT_MANGLE_NAMESPACE(QCocoaApplicationDelegate) sharedDelegate] setDockMenu:newMenu];
} }
- (QT_MANGLE_NAMESPACE(QCocoaMenuLoader) *)QT_MANGLE_NAMESPACE(qt_qcocoamenuLoader) - (QT_MANGLE_NAMESPACE(QCocoaMenuLoader) *)QT_MANGLE_NAMESPACE(qt_qcocoamenuLoader)
{ {
return [[QCocoaApplicationDelegate sharedDelegate] menuLoader]; return [[QT_MANGLE_NAMESPACE(QCocoaApplicationDelegate) sharedDelegate] menuLoader];
} }
- (int)QT_MANGLE_NAMESPACE(qt_validModesForFontPanel):(NSFontPanel *)fontPanel - (int)QT_MANGLE_NAMESPACE(qt_validModesForFontPanel):(NSFontPanel *)fontPanel
@ -147,9 +147,9 @@ static const QByteArray q_macLocalEventType = QByteArrayLiteral("mac_generic_NSE
@end @end
@implementation QNSApplication @implementation QT_MANGLE_NAMESPACE(QNSApplication)
- (void)qt_sendEvent_original:(NSEvent *)event - (void)QT_MANGLE_NAMESPACE(qt_sendEvent_original):(NSEvent *)event
{ {
Q_UNUSED(event); Q_UNUSED(event);
// This method will only be used as a signature // This method will only be used as a signature
@ -157,14 +157,14 @@ static const QByteArray q_macLocalEventType = QByteArrayLiteral("mac_generic_NSE
// containing the original [NSApplication sendEvent:] implementation // containing the original [NSApplication sendEvent:] implementation
} }
- (void)qt_sendEvent_replacement:(NSEvent *)event - (void)QT_MANGLE_NAMESPACE(qt_sendEvent_replacement):(NSEvent *)event
{ {
// This method (or its implementation to be precise) will // This method (or its implementation to be precise) will
// be called instead of sendEvent if redirection occurs. // be called instead of sendEvent if redirection occurs.
// 'self' will then be an instance of NSApplication // 'self' will then be an instance of NSApplication
// (and not QNSApplication) // (and not QNSApplication)
if (![NSApp QT_MANGLE_NAMESPACE(qt_filterEvent):event]) if (![NSApp QT_MANGLE_NAMESPACE(qt_filterEvent):event])
[self qt_sendEvent_original:event]; [self QT_MANGLE_NAMESPACE(qt_sendEvent_original):event];
} }
- (void)sendEvent:(NSEvent *)event - (void)sendEvent:(NSEvent *)event
@ -187,7 +187,7 @@ void qt_redirectNSApplicationSendEvent()
// can be unloaded. // can be unloaded.
return; return;
if ([NSApp isMemberOfClass:[QNSApplication class]]) { if ([NSApp isMemberOfClass:[QT_MANGLE_NAMESPACE(QNSApplication) class]]) {
// No need to change implementation since Qt // No need to change implementation since Qt
// already controls a subclass of NSApplication // already controls a subclass of NSApplication
return; return;
@ -200,9 +200,9 @@ void qt_redirectNSApplicationSendEvent()
qt_cocoa_change_implementation( qt_cocoa_change_implementation(
[NSApplication class], [NSApplication class],
@selector(sendEvent:), @selector(sendEvent:),
[QNSApplication class], [QT_MANGLE_NAMESPACE(QNSApplication) class],
@selector(qt_sendEvent_replacement:), @selector(QT_MANGLE_NAMESPACE(qt_sendEvent_replacement):),
@selector(qt_sendEvent_original:)); @selector(QT_MANGLE_NAMESPACE(qt_sendEvent_original):));
} }
void qt_resetNSApplicationSendEvent() void qt_resetNSApplicationSendEvent()

View File

@ -1436,7 +1436,7 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent)
if (eventType == QEvent::KeyPress) { if (eventType == QEvent::KeyPress) {
if (m_composingText.isEmpty()) if (m_composingText.isEmpty())
m_sendKeyEvent = !QWindowSystemInterface::tryHandleShortcutEvent(focusWindow, timestamp, keyCode, modifiers, text); m_sendKeyEvent = !QWindowSystemInterface::tryHandleShortcutEvent(focusWindow, timestamp, keyCode, modifiers, text, [nsevent isARepeat], 1);
QObject *fo = QGuiApplication::focusObject(); QObject *fo = QGuiApplication::focusObject();
if (m_sendKeyEvent && fo) { if (m_sendKeyEvent && fo) {

View File

@ -1169,23 +1169,19 @@ QT_WARNING_POP
CustomFontFileLoader fontFileLoader; CustomFontFileLoader fontFileLoader;
fontFileLoader.addKey(this, fontData); fontFileLoader.addKey(this, fontData);
IDWriteFactory *factory = 0; QSharedPointer<QWindowsFontEngineData> fontEngineData = sharedFontData();
HRESULT hres = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, if (!initDirectWrite(fontEngineData.data()))
__uuidof(IDWriteFactory),
reinterpret_cast<IUnknown **>(&factory));
if (FAILED(hres)) {
qErrnoWarning(hres, "%s: DWriteCreateFactory failed", __FUNCTION__);
return 0; return 0;
}
IDWriteFontFile *fontFile = 0; IDWriteFontFile *fontFile = 0;
void *key = this; void *key = this;
hres = factory->CreateCustomFontFileReference(&key, sizeof(void *), HRESULT hres = fontEngineData->directWriteFactory->CreateCustomFontFileReference(&key,
fontFileLoader.loader(), &fontFile); sizeof(void *),
fontFileLoader.loader(),
&fontFile);
if (FAILED(hres)) { if (FAILED(hres)) {
qErrnoWarning(hres, "%s: CreateCustomFontFileReference failed", __FUNCTION__); qErrnoWarning(hres, "%s: CreateCustomFontFileReference failed", __FUNCTION__);
factory->Release();
return 0; return 0;
} }
@ -1196,30 +1192,31 @@ QT_WARNING_POP
fontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType, &numberOfFaces); fontFile->Analyze(&isSupportedFontType, &fontFileType, &fontFaceType, &numberOfFaces);
if (!isSupportedFontType) { if (!isSupportedFontType) {
fontFile->Release(); fontFile->Release();
factory->Release();
return 0; return 0;
} }
IDWriteFontFace *directWriteFontFace = 0; IDWriteFontFace *directWriteFontFace = 0;
hres = factory->CreateFontFace(fontFaceType, 1, &fontFile, 0, DWRITE_FONT_SIMULATIONS_NONE, hres = fontEngineData->directWriteFactory->CreateFontFace(fontFaceType,
&directWriteFontFace); 1,
&fontFile,
0,
DWRITE_FONT_SIMULATIONS_NONE,
&directWriteFontFace);
if (FAILED(hres)) { if (FAILED(hres)) {
qErrnoWarning(hres, "%s: CreateFontFace failed", __FUNCTION__); qErrnoWarning(hres, "%s: CreateFontFace failed", __FUNCTION__);
fontFile->Release(); fontFile->Release();
factory->Release();
return 0; return 0;
} }
fontFile->Release(); fontFile->Release();
fontEngine = new QWindowsFontEngineDirectWrite(directWriteFontFace, pixelSize, fontEngine = new QWindowsFontEngineDirectWrite(directWriteFontFace, pixelSize,
sharedFontData()); fontEngineData);
// Get font family from font data // Get font family from font data
fontEngine->fontDef.family = font.familyName(); fontEngine->fontDef.family = font.familyName();
directWriteFontFace->Release(); directWriteFontFace->Release();
factory->Release();
} }
#endif #endif

View File

@ -995,6 +995,7 @@ QVector<FORMATETC> QWindowsMimeImage::formatsForMime(const QString &mimeType, co
if (!image.isNull() && image.hasAlphaChannel()) if (!image.isNull() && image.hasAlphaChannel())
formatetcs += setCf(CF_DIBV5); formatetcs += setCf(CF_DIBV5);
formatetcs += setCf(CF_DIB); formatetcs += setCf(CF_DIB);
formatetcs += setCf(CF_PNG); // QTBUG-86848, Paste into GIMP queries for PNG.
} }
return formatetcs; return formatetcs;
} }
@ -1025,13 +1026,15 @@ bool QWindowsMimeImage::canConvertFromMime(const FORMATETC &formatetc, const QMi
return false; return false;
// QTBUG-11463, deny CF_DIB support for images with alpha to prevent loss of // QTBUG-11463, deny CF_DIB support for images with alpha to prevent loss of
// transparency in conversion. // transparency in conversion.
return cf == CF_DIBV5 || (cf == CF_DIB && !image.hasAlphaChannel()); return cf == CF_DIBV5
|| (cf == CF_DIB && !image.hasAlphaChannel())
|| cf == int(CF_PNG);
} }
bool QWindowsMimeImage::convertFromMime(const FORMATETC &formatetc, const QMimeData *mimeData, STGMEDIUM * pmedium) const bool QWindowsMimeImage::convertFromMime(const FORMATETC &formatetc, const QMimeData *mimeData, STGMEDIUM * pmedium) const
{ {
int cf = getCf(formatetc); int cf = getCf(formatetc);
if ((cf == CF_DIB || cf == CF_DIBV5) && mimeData->hasImage()) { if ((cf == CF_DIB || cf == CF_DIBV5 || cf == int(CF_PNG)) && mimeData->hasImage()) {
QImage img = qvariant_cast<QImage>(mimeData->imageData()); QImage img = qvariant_cast<QImage>(mimeData->imageData());
if (img.isNull()) if (img.isNull())
return false; return false;
@ -1042,6 +1045,12 @@ bool QWindowsMimeImage::convertFromMime(const FORMATETC &formatetc, const QMimeD
const QByteArray ba = writeDib(img); const QByteArray ba = writeDib(img);
if (!ba.isEmpty()) if (!ba.isEmpty())
return setData(ba, pmedium); return setData(ba, pmedium);
} else if (cf == int(CF_PNG)) {
QBuffer buffer(&ba);
const bool written = buffer.open(QIODevice::WriteOnly) && img.save(&buffer, "PNG");
buffer.close();
if (written)
return setData(ba, pmedium);
} else { } else {
QDataStream s(&ba, QIODevice::WriteOnly); QDataStream s(&ba, QIODevice::WriteOnly);
s.setByteOrder(QDataStream::LittleEndian);// Intel byte order #### s.setByteOrder(QDataStream::LittleEndian);// Intel byte order ####

View File

@ -224,7 +224,7 @@ QWindowsOpenGLTester::Renderers QWindowsOpenGLTester::detectSupportedRenderers(c
#elif defined(Q_OS_WINCE) #elif defined(Q_OS_WINCE)
return QWindowsOpenGLTester::Gles; return QWindowsOpenGLTester::Gles;
#else #else
QOpenGLConfig::Gpu qgpu = QOpenGLConfig::Gpu::fromDevice(gpu.deviceId, gpu.vendorId, gpu.driverVersion, gpu.description); QOpenGLConfig::Gpu qgpu = QOpenGLConfig::Gpu::fromDevice(gpu.vendorId, gpu.deviceId, gpu.driverVersion, gpu.description);
SupportedRenderersCache *srCache = supportedRenderersCache(); SupportedRenderersCache *srCache = supportedRenderersCache();
SupportedRenderersCache::const_iterator it = srCache->find(qgpu); SupportedRenderersCache::const_iterator it = srCache->find(qgpu);
if (it != srCache->cend()) if (it != srCache->cend())

View File

@ -454,6 +454,7 @@ QXcbConnection::QXcbConnection(QXcbNativeInterface *nativeInterface, bool canGra
, has_xkb(false) , has_xkb(false)
, m_buttons(0) , m_buttons(0)
, m_focusWindow(0) , m_focusWindow(0)
, m_clientLeader(0)
, m_systemTrayTracker(0) , m_systemTrayTracker(0)
, m_glIntegration(Q_NULLPTR) , m_glIntegration(Q_NULLPTR)
, m_xiGrab(false) , m_xiGrab(false)
@ -1336,6 +1337,58 @@ xcb_window_t QXcbConnection::rootWindow()
return s ? s->root() : 0; return s ? s->root() : 0;
} }
xcb_window_t QXcbConnection::clientLeader()
{
if (m_clientLeader == 0) {
m_clientLeader = xcb_generate_id(xcb_connection());
QXcbScreen *screen = primaryScreen();
Q_XCB_CALL(xcb_create_window(xcb_connection(),
XCB_COPY_FROM_PARENT,
m_clientLeader,
screen->root(),
0, 0, 1, 1,
0,
XCB_WINDOW_CLASS_INPUT_OUTPUT,
screen->screen()->root_visual,
0, 0));
#ifndef QT_NO_DEBUG
QByteArray ba("Qt client leader window");
Q_XCB_CALL(xcb_change_property(xcb_connection(),
XCB_PROP_MODE_REPLACE,
m_clientLeader,
atom(QXcbAtom::_NET_WM_NAME),
atom(QXcbAtom::UTF8_STRING),
8,
ba.length(),
ba.constData()));
#endif
Q_XCB_CALL(xcb_change_property(xcb_connection(),
XCB_PROP_MODE_REPLACE,
m_clientLeader,
atom(QXcbAtom::WM_CLIENT_LEADER),
XCB_ATOM_WINDOW,
32,
1,
&m_clientLeader));
#if !defined(QT_NO_SESSIONMANAGER) && defined(XCB_USE_SM)
// If we are session managed, inform the window manager about it
QByteArray session = qGuiApp->sessionId().toLatin1();
if (!session.isEmpty()) {
Q_XCB_CALL(xcb_change_property(xcb_connection(),
XCB_PROP_MODE_REPLACE,
m_clientLeader,
atom(QXcbAtom::SM_CLIENT_ID),
XCB_ATOM_STRING,
8,
session.length(),
session.constData()));
}
#endif
}
return m_clientLeader;
}
#ifdef XCB_USE_XLIB #ifdef XCB_USE_XLIB
void *QXcbConnection::xlib_display() const void *QXcbConnection::xlib_display() const
{ {
@ -1578,6 +1631,7 @@ static const char * xcb_atomnames = {
"_KDE_NET_WM_WINDOW_TYPE_OVERRIDE\0" "_KDE_NET_WM_WINDOW_TYPE_OVERRIDE\0"
"_KDE_NET_WM_FRAME_STRUT\0" "_KDE_NET_WM_FRAME_STRUT\0"
"_NET_FRAME_EXTENTS\0"
"_NET_STARTUP_INFO\0" "_NET_STARTUP_INFO\0"
"_NET_STARTUP_INFO_BEGIN\0" "_NET_STARTUP_INFO_BEGIN\0"

View File

@ -194,6 +194,7 @@ namespace QXcbAtom {
_KDE_NET_WM_WINDOW_TYPE_OVERRIDE, _KDE_NET_WM_WINDOW_TYPE_OVERRIDE,
_KDE_NET_WM_FRAME_STRUT, _KDE_NET_WM_FRAME_STRUT,
_NET_FRAME_EXTENTS,
_NET_STARTUP_INFO, _NET_STARTUP_INFO,
_NET_STARTUP_INFO_BEGIN, _NET_STARTUP_INFO_BEGIN,
@ -402,6 +403,7 @@ public:
QXcbWMSupport *wmSupport() const { return m_wmSupport.data(); } QXcbWMSupport *wmSupport() const { return m_wmSupport.data(); }
xcb_window_t rootWindow(); xcb_window_t rootWindow();
xcb_window_t clientLeader();
bool hasDefaultVisualId() const { return m_defaultVisualId != UINT_MAX; } bool hasDefaultVisualId() const { return m_defaultVisualId != UINT_MAX; }
xcb_visualid_t defaultVisualId() const { return m_defaultVisualId; } xcb_visualid_t defaultVisualId() const { return m_defaultVisualId; }
@ -641,6 +643,7 @@ private:
QXcbWindow *m_focusWindow; QXcbWindow *m_focusWindow;
xcb_window_t m_clientLeader;
QByteArray m_startupId; QByteArray m_startupId;
QXcbSystemTrayTracker *m_systemTrayTracker; QXcbSystemTrayTracker *m_systemTrayTracker;
QXcbGlIntegration *m_glIntegration; QXcbGlIntegration *m_glIntegration;

View File

@ -170,38 +170,6 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe
else else
m_syncRequestSupported = true; m_syncRequestSupported = true;
m_clientLeader = xcb_generate_id(xcb_connection());
Q_XCB_CALL2(xcb_create_window(xcb_connection(),
XCB_COPY_FROM_PARENT,
m_clientLeader,
screen()->root,
0, 0, 1, 1,
0,
XCB_WINDOW_CLASS_INPUT_OUTPUT,
screen()->root_visual,
0, 0), connection);
#ifndef QT_NO_DEBUG
QByteArray ba("Qt client leader window for screen ");
ba += m_outputName.toUtf8();
Q_XCB_CALL2(xcb_change_property(xcb_connection(),
XCB_PROP_MODE_REPLACE,
m_clientLeader,
atom(QXcbAtom::_NET_WM_NAME),
atom(QXcbAtom::UTF8_STRING),
8,
ba.length(),
ba.constData()), connection);
#endif
Q_XCB_CALL2(xcb_change_property(xcb_connection(),
XCB_PROP_MODE_REPLACE,
m_clientLeader,
atom(QXcbAtom::WM_CLIENT_LEADER),
XCB_ATOM_WINDOW,
32,
1,
&m_clientLeader), connection);
xcb_depth_iterator_t depth_iterator = xcb_depth_iterator_t depth_iterator =
xcb_screen_allowed_depths_iterator(screen()); xcb_screen_allowed_depths_iterator(screen());

View File

@ -116,8 +116,6 @@ public:
xcb_randr_crtc_t crtc() const { return m_crtc; } xcb_randr_crtc_t crtc() const { return m_crtc; }
xcb_randr_mode_t mode() const { return m_mode; } xcb_randr_mode_t mode() const { return m_mode; }
xcb_window_t clientLeader() const { return m_clientLeader; }
void windowShown(QXcbWindow *window); void windowShown(QXcbWindow *window);
QString windowManagerName() const { return m_windowManagerName; } QString windowManagerName() const { return m_windowManagerName; }
bool syncRequestSupported() const { return m_syncRequestSupported; } bool syncRequestSupported() const { return m_syncRequestSupported; }
@ -173,7 +171,6 @@ private:
Qt::ScreenOrientation m_orientation; Qt::ScreenOrientation m_orientation;
QString m_windowManagerName; QString m_windowManagerName;
bool m_syncRequestSupported; bool m_syncRequestSupported;
xcb_window_t m_clientLeader;
QMap<xcb_visualid_t, xcb_visualtype_t> m_visuals; QMap<xcb_visualid_t, xcb_visualtype_t> m_visuals;
QMap<xcb_visualid_t, quint8> m_visualDepths; QMap<xcb_visualid_t, quint8> m_visualDepths;
QXcbCursor *m_cursor; QXcbCursor *m_cursor;

View File

@ -623,7 +623,7 @@ void QXcbWindow::create()
xcb_set_wm_hints(xcb_connection(), m_window, &hints); xcb_set_wm_hints(xcb_connection(), m_window, &hints);
xcb_window_t leader = platformScreen->clientLeader(); xcb_window_t leader = connection()->clientLeader();
Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window, Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
atom(QXcbAtom::WM_CLIENT_LEADER), XCB_ATOM_WINDOW, 32, atom(QXcbAtom::WM_CLIENT_LEADER), XCB_ATOM_WINDOW, 32,
1, &leader)); 1, &leader));
@ -746,6 +746,22 @@ void QXcbWindow::setGeometry(const QRect &rect)
QMargins QXcbWindow::frameMargins() const QMargins QXcbWindow::frameMargins() const
{ {
if (m_dirtyFrameMargins) { if (m_dirtyFrameMargins) {
if (connection()->wmSupport()->isSupportedByWM(atom(QXcbAtom::_NET_FRAME_EXTENTS))) {
xcb_get_property_cookie_t cookie = xcb_get_property(xcb_connection(), false, m_window,
atom(QXcbAtom::_NET_FRAME_EXTENTS), XCB_ATOM_CARDINAL, 0, 4);
QScopedPointer<xcb_get_property_reply_t, QScopedPointerPodDeleter> reply(
xcb_get_property_reply(xcb_connection(), cookie, NULL));
if (reply && reply->type == XCB_ATOM_CARDINAL && reply->format == 32 && reply->value_len == 4) {
quint32 *data = (quint32 *)xcb_get_property_value(reply.data());
// _NET_FRAME_EXTENTS format is left, right, top, bottom
m_frameMargins = QMargins(data[0], data[2], data[1], data[3]);
m_dirtyFrameMargins = false;
return m_frameMargins;
}
}
// _NET_FRAME_EXTENTS property is not available, so
// walk up the window tree to get the frame parent
xcb_window_t window = m_window; xcb_window_t window = m_window;
xcb_window_t parent = m_window; xcb_window_t parent = m_window;
@ -859,7 +875,7 @@ void QXcbWindow::show()
// Default to client leader if there is no transient parent, else modal dialogs can // Default to client leader if there is no transient parent, else modal dialogs can
// be hidden by their parents. // be hidden by their parents.
if (!transientXcbParent) if (!transientXcbParent)
transientXcbParent = xcbScreen()->clientLeader(); transientXcbParent = connection()->clientLeader();
if (transientXcbParent) { // ICCCM 4.1.2.6 if (transientXcbParent) { // ICCCM 4.1.2.6
Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window, Q_XCB_CALL(xcb_change_property(xcb_connection(), XCB_PROP_MODE_REPLACE, m_window,
XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32, XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, 32,
@ -2446,6 +2462,8 @@ void QXcbWindow::handlePropertyNotifyEvent(const xcb_property_notify_event_t *ev
m_windowState = newState; m_windowState = newState;
} }
return; return;
} else if (event->atom == atom(QXcbAtom::_NET_FRAME_EXTENTS)) {
m_dirtyFrameMargins = true;
} else if (event->atom == atom(QXcbAtom::_NET_WORKAREA) && xcbScreen() && event->window == xcbScreen()->root()) { } else if (event->atom == atom(QXcbAtom::_NET_WORKAREA) && xcbScreen() && event->window == xcbScreen()->root()) {
xcbScreen()->updateGeometry(event->time); xcbScreen()->updateGeometry(event->time);
} }

View File

@ -693,7 +693,8 @@ QStringList RCCResourceLibrary::dataFiles() const
RCCFileInfo *child = it.value(); RCCFileInfo *child = it.value();
if (child->m_flags & RCCFileInfo::Directory) if (child->m_flags & RCCFileInfo::Directory)
pending.push(child); pending.push(child);
ret.append(child->m_fileInfo.filePath()); else
ret.append(child->m_fileInfo.filePath());
} }
} }
return ret; return ret;

View File

@ -493,9 +493,6 @@
but Graphics View currently doesn't support the Qt::Sheet and but Graphics View currently doesn't support the Qt::Sheet and
Qt::Drawer flags that are common on OS X. Qt::Drawer flags that are common on OS X.
The capabilities of QGraphicsWidget are expected to grow depending
on community feedback.
\section3 QGraphicsLayout \section3 QGraphicsLayout
QGraphicsLayout is part of a second-generation layout framework QGraphicsLayout is part of a second-generation layout framework

View File

@ -428,7 +428,7 @@
\note If both this flag and ItemClipsChildrenToShape are set, the clip \note If both this flag and ItemClipsChildrenToShape are set, the clip
will be enforced. This is equivalent to just setting will be enforced. This is equivalent to just setting
ItemClipsChildrenToShape. ItemClipsChildrenToShape.
.
This flag was introduced in Qt 5.4. This flag was introduced in Qt 5.4.
*/ */

View File

@ -289,8 +289,15 @@ QWidgetPrivate::QWidgetPrivate(int version)
return; return;
} }
#ifdef QT_BUILD_INTERNAL
// Don't check the version parameter in internal builds.
// This allows incompatible versions to be loaded, possibly for testing.
Q_UNUSED(version);
#else
if (version != QObjectPrivateVersion) if (version != QObjectPrivateVersion)
qFatal("Cannot mix incompatible Qt libraries"); qFatal("Cannot mix incompatible Qt library (version 0x%x) with this library (version 0x%x)",
version, QObjectPrivateVersion);
#endif
isWidget = true; isWidget = true;
memset(high_attributes, 0, sizeof(high_attributes)); memset(high_attributes, 0, sizeof(high_attributes));

View File

@ -396,7 +396,7 @@ void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOpt
case PE_IndicatorBranch: case PE_IndicatorBranch:
{ {
XPThemeData theme(0, painter, QWindowsXPStylePrivate::TreeViewTheme); XPThemeData theme(widget, painter, QWindowsXPStylePrivate::TreeViewTheme);
static int decoration_size = 0; static int decoration_size = 0;
if (d->initTreeViewTheming() && theme.isValid() && !decoration_size) { if (d->initTreeViewTheming() && theme.isValid() && !decoration_size) {
XPThemeData themeSize = theme; XPThemeData themeSize = theme;
@ -657,6 +657,8 @@ void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOpt
newStyle = !qobject_cast<const QTableView*>(view); newStyle = !qobject_cast<const QTableView*>(view);
selectionBehavior = view->selectionBehavior(); selectionBehavior = view->selectionBehavior();
selectionMode = view->selectionMode(); selectionMode = view->selectionMode();
} else if (!widget) {
newStyle = !QStyleHelper::hasAncestor(option->styleObject, QAccessible::MenuItem) ;
} }
if (newStyle && (vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option))) { if (newStyle && (vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option))) {
@ -710,7 +712,7 @@ void QWindowsVistaStyle::drawPrimitive(PrimitiveElement element, const QStyleOpt
state = LISS_HOT; state = LISS_HOT;
QPainter pixmapPainter(&pixmap); QPainter pixmapPainter(&pixmap);
XPThemeData theme(0, &pixmapPainter, XPThemeData theme(widget, &pixmapPainter,
QWindowsXPStylePrivate::TreeViewTheme, QWindowsXPStylePrivate::TreeViewTheme,
LVP_LISTITEM, state, QRect(0, 0, sectionSize.width(), sectionSize.height())); LVP_LISTITEM, state, QRect(0, 0, sectionSize.width(), sectionSize.height()));
if (d->initTreeViewTheming() && theme.isValid()) { if (d->initTreeViewTheming() && theme.isValid()) {

View File

@ -1224,7 +1224,7 @@ void QWindowsXPStyle::polish(QWidget *widget)
if (!d->hasInitColors) { if (!d->hasInitColors) {
// Get text color for group box labels // Get text color for group box labels
COLORREF cref; COLORREF cref;
XPThemeData theme(0, 0, QWindowsXPStylePrivate::ButtonTheme, 0, 0); XPThemeData theme(widget, 0, QWindowsXPStylePrivate::ButtonTheme, 0, 0);
QWindowsXPStylePrivate::pGetThemeColor(theme.handle(), BP_GROUPBOX, GBS_NORMAL, TMT_TEXTCOLOR, &cref); QWindowsXPStylePrivate::pGetThemeColor(theme.handle(), BP_GROUPBOX, GBS_NORMAL, TMT_TEXTCOLOR, &cref);
d->groupBoxTextColor = qRgb(GetRValue(cref), GetGValue(cref), GetBValue(cref)); d->groupBoxTextColor = qRgb(GetRValue(cref), GetGValue(cref), GetBValue(cref));
QWindowsXPStylePrivate::pGetThemeColor(theme.handle(), BP_GROUPBOX, GBS_DISABLED, TMT_TEXTCOLOR, &cref); QWindowsXPStylePrivate::pGetThemeColor(theme.handle(), BP_GROUPBOX, GBS_DISABLED, TMT_TEXTCOLOR, &cref);
@ -1540,7 +1540,7 @@ case PE_Frame:
return; return;
themeNumber = QWindowsXPStylePrivate::ListViewTheme; themeNumber = QWindowsXPStylePrivate::ListViewTheme;
partId = LVP_LISTGROUP; partId = LVP_LISTGROUP;
XPThemeData theme(0, 0, themeNumber, partId, 0); XPThemeData theme(widget, 0, themeNumber, partId, 0);
if (!(flags & State_Enabled)) if (!(flags & State_Enabled))
stateId = ETS_DISABLED; stateId = ETS_DISABLED;

View File

@ -2093,8 +2093,10 @@ void QComboBoxPrivate::setCurrentIndex(const QModelIndex &mi)
const QString newText = itemText(normalized); const QString newText = itemText(normalized);
if (lineEdit->text() != newText) { if (lineEdit->text() != newText) {
lineEdit->setText(newText); lineEdit->setText(newText);
#ifndef QT_NO_COMPLETER
if (lineEdit->completer()) if (lineEdit->completer())
lineEdit->completer()->setCompletionPrefix(newText); lineEdit->completer()->setCompletionPrefix(newText);
#endif
} }
updateLineEditGeometry(); updateLineEditGeometry();
} }

View File

@ -202,9 +202,8 @@ int QDialPrivate::valueFromPoint(const QPoint &p) const
to draw every one, QDial will skip notches to try and draw a uniform to draw every one, QDial will skip notches to try and draw a uniform
set (e.g. by drawing every second or third notch). set (e.g. by drawing every second or third notch).
Like the slider, the dial makes the QAbstractSlider functions Like the slider, the dial makes the QAbstractSlider function setValue()
setValue(), addLine(), subtractLine(), addPage() and available as a slot.
subtractPage() available as slots.
The dial's keyboard interface is fairly simple: The The dial's keyboard interface is fairly simple: The
\uicontrol{left}/\uicontrol{up} and \uicontrol{right}/\uicontrol{down} arrow keys adjust \uicontrol{left}/\uicontrol{up} and \uicontrol{right}/\uicontrol{down} arrow keys adjust

View File

@ -57,7 +57,7 @@ private Q_SLOTS:
void api(); void api();
void constVolatile(); void constVolatile();
void exception(); void exception();
void threadedException(); void catchExceptionAndRetry();
void threadStressTest(); void threadStressTest();
void afterDestruction(); void afterDestruction();
}; };
@ -163,7 +163,7 @@ void tst_QGlobalStatic::exception()
QBasicAtomicInt exceptionControlVar = Q_BASIC_ATOMIC_INITIALIZER(1); QBasicAtomicInt exceptionControlVar = Q_BASIC_ATOMIC_INITIALIZER(1);
Q_GLOBAL_STATIC_WITH_ARGS(ThrowingType, exceptionGS, (exceptionControlVar)) Q_GLOBAL_STATIC_WITH_ARGS(ThrowingType, exceptionGS, (exceptionControlVar))
void tst_QGlobalStatic::threadedException() void tst_QGlobalStatic::catchExceptionAndRetry()
{ {
if (exceptionControlVar.load() != 1) if (exceptionControlVar.load() != 1)
QSKIP("This test cannot be run more than once"); QSKIP("This test cannot be run more than once");

View File

@ -470,21 +470,22 @@ void tst_QDir::removeRecursivelyFailure()
#ifdef Q_OS_UNIX #ifdef Q_OS_UNIX
QFile dirAsFile(path); // yay, I have to use QFile to change a dir's permissions... QFile dirAsFile(path); // yay, I have to use QFile to change a dir's permissions...
QVERIFY(dirAsFile.setPermissions(QFile::Permissions(0))); // no permissions QVERIFY(dirAsFile.setPermissions(QFile::Permissions(0))); // no permissions
#else
QVERIFY(file.setPermissions(QFile::ReadOwner));
#endif
QVERIFY(!QDir().rmdir(path)); QVERIFY(!QDir().rmdir(path));
QDir dir(path); QDir dir(path);
QVERIFY(!dir.removeRecursively()); // didn't work QVERIFY(!dir.removeRecursively()); // didn't work
QVERIFY(dir.exists()); // still exists QVERIFY(dir.exists()); // still exists
#ifdef Q_OS_UNIX
QVERIFY(dirAsFile.setPermissions(QFile::Permissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner))); QVERIFY(dirAsFile.setPermissions(QFile::Permissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner)));
#else
QVERIFY(file.setPermissions(QFile::ReadOwner | QFile::WriteOwner));
#endif
QVERIFY(dir.removeRecursively()); QVERIFY(dir.removeRecursively());
QVERIFY(!dir.exists()); QVERIFY(!dir.exists());
#else // Q_OS_UNIX
QVERIFY(file.setPermissions(QFile::ReadOwner));
QVERIFY(!QDir().rmdir(path));
QDir dir(path);
QVERIFY(dir.removeRecursively());
QVERIFY(!dir.exists());
#endif // !Q_OS_UNIX
} }
void tst_QDir::removeRecursivelySymlink() void tst_QDir::removeRecursivelySymlink()

View File

@ -215,6 +215,8 @@ void tst_QTemporaryDir::autoRemove()
QFile file(dirName + "/dir1/file"); QFile file(dirName + "/dir1/file");
QVERIFY(file.open(QIODevice::WriteOnly)); QVERIFY(file.open(QIODevice::WriteOnly));
QCOMPARE(file.write("Hello"), 5LL); QCOMPARE(file.write("Hello"), 5LL);
file.close();
QVERIFY(file.setPermissions(QFile::ReadUser));
} }
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
QTRY_VERIFY(!QDir(dirName).exists()); QTRY_VERIFY(!QDir(dirName).exists());

View File

@ -353,6 +353,7 @@ void tst_QTemporaryFile::removeAndReOpen()
QVERIFY(!QFile::exists(fileName)); QVERIFY(!QFile::exists(fileName));
QVERIFY(file.open()); QVERIFY(file.open());
QCOMPARE(QFileInfo(file.fileName()).path(), QFileInfo(fileName).path());
fileName = file.fileName(); fileName = file.fileName();
QVERIFY(QFile::exists(fileName)); QVERIFY(QFile::exists(fileName));
} }

View File

@ -54,6 +54,8 @@ private slots:
void singleShotTimeout(); void singleShotTimeout();
void timeout(); void timeout();
void remainingTime(); void remainingTime();
void remainingTimeDuringActivation_data();
void remainingTimeDuringActivation();
void livelock_data(); void livelock_data();
void livelock(); void livelock();
void timerInfiniteRecursion_data(); void timerInfiniteRecursion_data();
@ -79,14 +81,16 @@ class TimerHelper : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
TimerHelper() : QObject(), count(0) TimerHelper() : QObject(), count(0), remainingTime(-1)
{ {
} }
int count; int count;
int remainingTime;
public slots: public slots:
void timeout(); void timeout();
void fetchRemainingTime();
}; };
void TimerHelper::timeout() void TimerHelper::timeout()
@ -94,6 +98,12 @@ void TimerHelper::timeout()
++count; ++count;
} }
void TimerHelper::fetchRemainingTime()
{
QTimer *timer = static_cast<QTimer *>(sender());
remainingTime = timer->remainingTime();
}
void tst_QTimer::zeroTimer() void tst_QTimer::zeroTimer()
{ {
TimerHelper helper; TimerHelper helper;
@ -158,6 +168,53 @@ void tst_QTimer::remainingTime()
int remainingTime = timer.remainingTime(); int remainingTime = timer.remainingTime();
QVERIFY2(qAbs(remainingTime - 150) < 50, qPrintable(QString::number(remainingTime))); QVERIFY2(qAbs(remainingTime - 150) < 50, qPrintable(QString::number(remainingTime)));
// wait for the timer to actually fire now
connect(&timer, SIGNAL(timeout()), &QTestEventLoop::instance(), SLOT(exitLoop()));
QTestEventLoop::instance().enterLoop(5);
QVERIFY(!QTestEventLoop::instance().timeout());
QCOMPARE(helper.count, 1);
// the timer is still active, so it should have a non-zero remaining time
remainingTime = timer.remainingTime();
QVERIFY2(remainingTime > 150, qPrintable(QString::number(remainingTime)));
}
void tst_QTimer::remainingTimeDuringActivation_data()
{
QTest::addColumn<bool>("singleShot");
QTest::newRow("repeating") << true;
QTest::newRow("single-shot") << true;
}
void tst_QTimer::remainingTimeDuringActivation()
{
QFETCH(bool, singleShot);
TimerHelper helper;
QTimer timer;
const int timeout = 20; // 20 ms is short enough and should not round down to 0 in any timer mode
connect(&timer, SIGNAL(timeout()), &helper, SLOT(fetchRemainingTime()));
connect(&timer, SIGNAL(timeout()), &QTestEventLoop::instance(), SLOT(exitLoop()));
timer.start(timeout);
timer.setSingleShot(singleShot);
QTestEventLoop::instance().enterLoop(5);
QVERIFY(!QTestEventLoop::instance().timeout());
if (singleShot)
QCOMPARE(helper.remainingTime, -1); // timer not running
else
QCOMPARE(helper.remainingTime, timeout);
if (!singleShot) {
// do it again - see QTBUG-46940
helper.remainingTime = -1;
QTestEventLoop::instance().enterLoop(5);
QVERIFY(!QTestEventLoop::instance().timeout());
QCOMPARE(helper.remainingTime, timeout);
}
} }
void tst_QTimer::livelock_data() void tst_QTimer::livelock_data()

View File

@ -56,6 +56,7 @@ private slots:
void indexOf(); void indexOf();
void lastIndexOf(); void lastIndexOf();
void contains(); void contains();
void clear();
void initializeListInt(); void initializeListInt();
void initializeListMovable(); void initializeListMovable();
void initializeListComplex(); void initializeListComplex();
@ -812,6 +813,21 @@ void tst_QVarLengthArray::contains()
QVERIFY(myvec.contains(QLatin1String("I don't exist"))); QVERIFY(myvec.contains(QLatin1String("I don't exist")));
} }
void tst_QVarLengthArray::clear()
{
QVarLengthArray<QString, 5> myvec;
for (int i = 0; i < 10; ++i)
myvec << "aaa";
QCOMPARE(myvec.size(), 10);
QVERIFY(myvec.capacity() >= myvec.size());
const int oldCapacity = myvec.capacity();
myvec.clear();
QCOMPARE(myvec.size(), 0);
QCOMPARE(myvec.capacity(), oldCapacity);
}
void tst_QVarLengthArray::initializeListInt() void tst_QVarLengthArray::initializeListInt()
{ {
initializeList<int>(); initializeList<int>();

View File

@ -170,7 +170,10 @@ public:
} }
QRectF boundingRect() const Q_DECL_OVERRIDE { return QRectF(0, 0, 10, 10); } QRectF boundingRect() const Q_DECL_OVERRIDE { return QRectF(0, 0, 10, 10); }
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) Q_DECL_OVERRIDE { } void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) Q_DECL_OVERRIDE
{
painter->fillRect(QRectF(QPointF(0, 0), boundingRect().size()), Qt::yellow);
}
bool sceneEvent(QEvent *event) Q_DECL_OVERRIDE bool sceneEvent(QEvent *event) Q_DECL_OVERRIDE
{ {
@ -1446,6 +1449,7 @@ void tst_QTouchEvent::touchBeginWithGraphicsWidget()
{ {
QGraphicsScene scene; QGraphicsScene scene;
QGraphicsView view(&scene); QGraphicsView view(&scene);
view.setWindowTitle(QTest::currentTestFunction());
QScopedPointer<tst_QTouchEventGraphicsItem> root(new tst_QTouchEventGraphicsItem); QScopedPointer<tst_QTouchEventGraphicsItem> root(new tst_QTouchEventGraphicsItem);
root->setAcceptTouchEvents(true); root->setAcceptTouchEvents(true);
scene.addItem(root.data()); scene.addItem(root.data());
@ -1454,10 +1458,13 @@ void tst_QTouchEvent::touchBeginWithGraphicsWidget()
glassWidget->setMinimumSize(100, 100); glassWidget->setMinimumSize(100, 100);
scene.addItem(glassWidget.data()); scene.addItem(glassWidget.data());
view.resize(200, 200); view.setAlignment(Qt::AlignLeft | Qt::AlignTop);
const QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry();
view.resize(availableGeometry.size() - QSize(100, 100));
view.move(availableGeometry.topLeft() + QPoint(50, 50));
view.fitInView(scene.sceneRect());
view.show(); view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view)); QVERIFY(QTest::qWaitForWindowExposed(&view));
view.fitInView(scene.sceneRect());
QTest::touchEvent(&view, touchScreenDevice) QTest::touchEvent(&view, touchScreenDevice)
.press(0, view.mapFromScene(root->mapToScene(3,3)), view.viewport()); .press(0, view.mapFromScene(root->mapToScene(3,3)), view.viewport());

View File

@ -306,6 +306,7 @@ void tst_QListView::init()
void tst_QListView::cleanup() void tst_QListView::cleanup()
{ {
QVERIFY(QApplication::topLevelWidgets().isEmpty());
} }
@ -791,14 +792,31 @@ void tst_QListView::hideFirstRow()
QTest::qWait(10); QTest::qWait(10);
} }
static int modelIndexCount(const QAbstractItemView *view)
{
QBitArray ba;
for (int y = 0, height = view->height(); y < height; ++y) {
const QModelIndex idx = view->indexAt( QPoint(1, y) );
if (!idx.isValid())
break;
if (idx.row() >= ba.size())
ba.resize(idx.row() + 1);
ba.setBit(idx.row(), true);
}
return ba.size();
}
void tst_QListView::batchedMode() void tst_QListView::batchedMode()
{ {
const int rowCount = 3;
QStringList items; QStringList items;
for (int i=0; i <3; ++i) for (int i = 0; i < rowCount; ++i)
items << "item"; items << QLatin1String("item ") + QString::number(i);
QStringListModel model(items); QStringListModel model(items);
QListView view; QListView view;
view.setWindowTitle(QTest::currentTestFunction());
view.setModel(&model); view.setModel(&model);
view.setUniformItemSizes(true); view.setUniformItemSizes(true);
view.setViewMode(QListView::ListMode); view.setViewMode(QListView::ListMode);
@ -807,22 +825,8 @@ void tst_QListView::batchedMode()
view.resize(200,400); view.resize(200,400);
view.show(); view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view)); QVERIFY(QTest::qWaitForWindowExposed(&view));
QTest::qWait(100);
#if defined(Q_OS_WINCE)
QTest::qWait(2000);
#endif
QBitArray ba;
for (int y = 0; y < view.height(); ++y) {
QModelIndex idx = view.indexAt( QPoint(1, y) );
if (!idx.isValid())
break;
if (idx.row() >= ba.size())
ba.resize(idx.row() + 1);
ba.setBit(idx.row(), true);
}
QCOMPARE(ba.size(), 3);
QTRY_COMPARE(modelIndexCount(&view), rowCount);
// Test the dynamic listview too. // Test the dynamic listview too.
view.setViewMode(QListView::IconMode); view.setViewMode(QListView::IconMode);
@ -830,22 +834,7 @@ void tst_QListView::batchedMode()
view.setFlow(QListView::TopToBottom); view.setFlow(QListView::TopToBottom);
view.setBatchSize(2); view.setBatchSize(2);
#if !defined(Q_OS_WINCE) QTRY_COMPARE(modelIndexCount(&view), rowCount);
QTest::qWait(100);
#else
QTest::qWait(2000);
#endif
ba.clear();
for (int y = 0; y < view.height(); ++y) {
QModelIndex idx = view.indexAt( QPoint(1, y) );
if (!idx.isValid())
break;
if (idx.row() >= ba.size())
ba.resize(idx.row() + 1);
ba.setBit(idx.row(), true);
}
QCOMPARE(ba.size(), 3);
} }
void tst_QListView::setCurrentIndex() void tst_QListView::setCurrentIndex()

View File

@ -69,6 +69,7 @@ private slots:
void task200823_tooltip(); void task200823_tooltip();
void task229128TriggeredSignalWithoutActiongroup(); void task229128TriggeredSignalWithoutActiongroup();
void task229128TriggeredSignalWhenInActiongroup(); void task229128TriggeredSignalWhenInActiongroup();
void repeat();
private: private:
int m_lastEventType; int m_lastEventType;
@ -380,5 +381,42 @@ void tst_QAction::task229128TriggeredSignalWhenInActiongroup()
QCOMPARE(actionSpy.count(), 1); QCOMPARE(actionSpy.count(), 1);
} }
void tst_QAction::repeat()
{
QWidget *wid = m_tstWidget;
QAction act(wid);
wid->addAction(&act);
act.setShortcut(QKeySequence(Qt::Key_F));
QSignalSpy spy(&act, SIGNAL(triggered()));
act.setAutoRepeat(true);
QTest::keyPress(wid, Qt::Key_F);
QTest::keyRelease(wid, Qt::Key_F);
QCOMPARE(spy.count(), 1);
spy.clear();
QTest::keyPress(wid, Qt::Key_F);
// repeat event
QTest::simulateEvent(wid, true, Qt::Key_F, Qt::NoModifier, QString("f"), true);
QTest::simulateEvent(wid, true, Qt::Key_F, Qt::NoModifier, QString("f"), true);
QTest::keyRelease(wid, Qt::Key_F);
QCOMPARE(spy.count(), 3);
spy.clear();
act.setAutoRepeat(false);
QTest::keyPress(wid, Qt::Key_F);
QTest::simulateEvent(wid, true, Qt::Key_F, Qt::NoModifier, QString("f"), true);
QTest::simulateEvent(wid, true, Qt::Key_F, Qt::NoModifier, QString("f"), true);
QTest::keyRelease(wid, Qt::Key_F);
QCOMPARE(spy.count(), 1);
spy.clear();
act.setAutoRepeat(true);
QTest::keyPress(wid, Qt::Key_F);
QTest::simulateEvent(wid, true, Qt::Key_F, Qt::NoModifier, QString("f"), true);
QTest::keyRelease(wid, Qt::Key_F);
QCOMPARE(spy.count(), 2);
}
QTEST_MAIN(tst_QAction) QTEST_MAIN(tst_QAction)
#include "tst_qaction.moc" #include "tst_qaction.moc"

View File

@ -2088,11 +2088,12 @@ void tst_QApplication::touchEventPropagation()
window.resize(200, 200); window.resize(200, 200);
window.setObjectName("2. window"); window.setObjectName("2. window");
TouchEventPropagationTestWidget widget(&window); TouchEventPropagationTestWidget widget(&window);
widget.resize(200, 200);
widget.setObjectName("2. widget"); widget.setObjectName("2. widget");
window.show(); window.show();
QVERIFY(QTest::qWaitForWindowExposed(&window)); QVERIFY(QTest::qWaitForWindowExposed(&window));
pressedTouchPoints[0].setScreenPos(window.mapToGlobal(QPoint(0, 0))); pressedTouchPoints[0].setScreenPos(window.mapToGlobal(QPoint(50, 50)));
releasedTouchPoints[0].setScreenPos(window.mapToGlobal(QPoint(0, 0))); releasedTouchPoints[0].setScreenPos(window.mapToGlobal(QPoint(50, 50)));
QWindowSystemInterface::handleTouchEvent(window.windowHandle(), QWindowSystemInterface::handleTouchEvent(window.windowHandle(),
0, 0,
@ -2102,9 +2103,8 @@ void tst_QApplication::touchEventPropagation()
0, 0,
device, device,
touchPointList(releasedTouchPoints)); touchPointList(releasedTouchPoints));
QCoreApplication::processEvents(); QTRY_VERIFY(widget.seenMouseEvent);
QVERIFY(!widget.seenTouchEvent); QVERIFY(!widget.seenTouchEvent);
QVERIFY(widget.seenMouseEvent);
QVERIFY(!window.seenTouchEvent); QVERIFY(!window.seenTouchEvent);
QVERIFY(window.seenMouseEvent); QVERIFY(window.seenMouseEvent);