From 69fa0012c748f9024ac21b5d6a9f1be1abb805a5 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 6 Jun 2013 11:58:19 +0200 Subject: [PATCH 01/79] use qtconcurrent instead of qtgui in test code this works with -no-gui, and doesn't interfere with our upcoming ANGLE hackery. Change-Id: I2985cc0acd1fbf185b8967ffe58606b1b7dd9d1e Reviewed-by: Friedemann Kleint Reviewed-by: Olivier Goffart --- tests/auto/tools/moc/no-keywords.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/auto/tools/moc/no-keywords.h b/tests/auto/tools/moc/no-keywords.h index e04e36b678..ffd5928370 100644 --- a/tests/auto/tools/moc/no-keywords.h +++ b/tests/auto/tools/moc/no-keywords.h @@ -47,7 +47,7 @@ #define slots Baz #define emit Yoyodyne -#include +#include #include #include #include From 150408e37d58c64509e7183014593c51f370415b Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 7 Jun 2013 15:55:30 +0200 Subject: [PATCH 02/79] don't process ANGLE and zlib headers like real qt modules we run syncqt on them only to get normal forwarding headers and the headers.pri file. the module master include header and the module version header are useless, and scanning for qt class names just wastes time. Change-Id: I58e8d1eb36cea5c31cbd46ce673438316d1963dc Reviewed-by: Joerg Bornemann --- bin/syncqt.pl | 11 ++++++++--- sync.profile | 8 ++++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/bin/syncqt.pl b/bin/syncqt.pl index 497e8deb2c..cc91a11de0 100755 --- a/bin/syncqt.pl +++ b/bin/syncqt.pl @@ -837,7 +837,9 @@ foreach my $lib (@modules_to_sync) { die "No such module: $lib" unless(defined $modules{$lib}); #iteration info - my @dirs = split(/;/, $modules{$lib}); + my $module = $modules{$lib}; + my $is_qt = !($module =~ s/^!//); + my @dirs = split(/;/, $module); my $dir = $dirs[0]; my $pathtoheaders = ""; @@ -946,7 +948,7 @@ foreach my $lib (@modules_to_sync) { } my $iheader = $subdir . "/" . $header; - my @classes = $public_header && !$minimal ? classNames($iheader) : (); + my @classes = $public_header && (!$minimal && $is_qt) ? classNames($iheader) : (); if($showonly) { print "$header [$lib]\n"; foreach(@classes) { @@ -1056,7 +1058,7 @@ foreach my $lib (@modules_to_sync) { "#include \"".lc($lib)."version.h\"\n" . "#endif\n"; - unless ($showonly || $minimal) { + unless ($showonly || $minimal || !$is_qt) { # create deprecated headers my $first = 1; while (my ($header, $include) = each %{$deprecatedheaders{$lib}}) { @@ -1141,7 +1143,9 @@ foreach my $lib (@modules_to_sync) { my $master_include = "$out_basedir/include/$lib/$lib"; $pri_install_files .= fixPaths($master_include, $dir) . " "; writeFile($master_include, $master_contents, $lib, "master header"); + } + unless ($showonly || $minimal) { #handle the headers.pri for each module my $headers_pri_contents = ""; $headers_pri_contents .= "SYNCQT.HEADER_FILES = $pri_install_files\n"; @@ -1174,6 +1178,7 @@ unless($showonly || !$create_uic_class_map) { if($check_includes) { foreach my $lib (@modules_to_sync) { + next if ($modules{$lib} =~ /^!/); #calc subdirs my @subdirs = listSubdirs(map { s/^\^//; $_ } split(/;/, $modules{$lib})); diff --git a/sync.profile b/sync.profile index 3d89d9d71f..91503d425f 100644 --- a/sync.profile +++ b/sync.profile @@ -11,10 +11,10 @@ "QtDBus" => "$basedir/src/dbus", "QtConcurrent" => "$basedir/src/concurrent", "QtPlatformSupport" => "$basedir/src/platformsupport", - "KHR" => "$basedir/src/3rdparty/angle/include/KHR", - "GLES2" => "$basedir/src/3rdparty/angle/include/GLES2", - "EGL" => "$basedir/src/3rdparty/angle/include/EGL", - "QtZlib" => "$basedir/src/3rdparty/zlib", + "KHR" => "!$basedir/src/3rdparty/angle/include/KHR", + "GLES2" => "!$basedir/src/3rdparty/angle/include/GLES2", + "EGL" => "!$basedir/src/3rdparty/angle/include/EGL", + "QtZlib" => "!$basedir/src/3rdparty/zlib", "QtOpenGLExtensions" => "$basedir/src/openglextensions", ); %moduleheaders = ( # restrict the module headers to those found in relative path From 366d276f8c534819b0624ea86e36c7f2eb020f24 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 5 Jun 2013 13:20:37 +0200 Subject: [PATCH 03/79] allow modules to extend their MODULE_{,PRIVATE_}INCLUDES Change-Id: I5e401edbe891846579cf6d9ff84427d16783923b Reviewed-by: Joerg Bornemann --- mkspecs/features/qt_module_pris.prf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf index 666989f75e..9eb9b02e14 100644 --- a/mkspecs/features/qt_module_pris.prf +++ b/mkspecs/features/qt_module_pris.prf @@ -56,6 +56,8 @@ else: \ MODULE_PRIVATE_INCLUDES = \$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME/$$VERSION \ \$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME/$$VERSION/$$MODULE_INCNAME } + MODULE_INCLUDES += $$MODULE_AUX_INCLUDES + MODULE_PRIVATE_INCLUDES += $$MODULE_PRIVATE_AUX_INCLUDES !git_build:if(!equals(_PRO_FILE_PWD_, $$OUT_PWD) \ |if(!prefix_build:!equals(MODULE_BASE_DIR, $$[QT_HOST_PREFIX]))) { pub_inc = $$replace(MODULE_INCLUDES, ^\\\$\\\$QT_MODULE_INCLUDE_BASE, $$MODULE_BASE_DIR/include) From b35ea875a12e89661f370df7e91c4791234aaa44 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 5 Jun 2013 13:24:23 +0200 Subject: [PATCH 04/79] put ANGLE includes in a QtANGLE subdir otherwise even non-angle builds with pre-generated headers will get them into their include path, which is Not Good (tm). Change-Id: Ie98354297baf3564ef82b3d4a32e5763e625b8f2 Reviewed-by: Friedemann Kleint Reviewed-by: Joerg Bornemann --- src/angle/angle.pro | 2 +- src/angle/src/libEGL/libEGL.pro | 2 +- src/angle/src/libGLESv2/libGLESv2.pro | 4 ++-- src/gui/Qt5GuiConfigExtras.cmake.in | 6 ++++-- src/gui/gui.pro | 6 ++++++ sync.profile | 6 +++--- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/angle/angle.pro b/src/angle/angle.pro index 721caf880a..83510698d3 100644 --- a/src/angle/angle.pro +++ b/src/angle/angle.pro @@ -6,5 +6,5 @@ SUBDIRS += src # 2) If we made a 'QtANGLE' module, the include directory would be flattened which won't work since # we need to support "#include " CONFIG += minimal_syncqt -QMAKE_SYNCQT_OPTIONS = -module KHR -module EGL -module GLES2 -version none +QMAKE_SYNCQT_OPTIONS = -module QtANGLE/KHR -module QtANGLE/EGL -module QtANGLE/GLES2 -version none load(qt_module_headers) diff --git a/src/angle/src/libEGL/libEGL.pro b/src/angle/src/libEGL/libEGL.pro index c0d021ccab..1a338ef0d2 100644 --- a/src/angle/src/libEGL/libEGL.pro +++ b/src/angle/src/libEGL/libEGL.pro @@ -40,5 +40,5 @@ egl_headers.files = \ $$ANGLE_DIR/include/EGL/egl.h \ $$ANGLE_DIR/include/EGL/eglext.h \ $$ANGLE_DIR/include/EGL/eglplatform.h -egl_headers.path = $$[QT_INSTALL_HEADERS]/EGL +egl_headers.path = $$[QT_INSTALL_HEADERS]/QtANGLE/EGL INSTALLS += egl_headers diff --git a/src/angle/src/libGLESv2/libGLESv2.pro b/src/angle/src/libGLESv2/libGLESv2.pro index d12202f33b..ba1f226143 100644 --- a/src/angle/src/libGLESv2/libGLESv2.pro +++ b/src/angle/src/libGLESv2/libGLESv2.pro @@ -235,12 +235,12 @@ for (vs, CLEAR_SHADERS) { load(qt_installs) khr_headers.files = $$ANGLE_DIR/include/KHR/khrplatform.h -khr_headers.path = $$[QT_INSTALL_HEADERS]/KHR +khr_headers.path = $$[QT_INSTALL_HEADERS]/QtANGLE/KHR gles2_headers.files = \ $$ANGLE_DIR/include/GLES2/gl2.h \ $$ANGLE_DIR/include/GLES2/gl2ext.h \ $$ANGLE_DIR/include/GLES2/gl2platform.h -gles2_headers.path = $$[QT_INSTALL_HEADERS]/GLES2 +gles2_headers.path = $$[QT_INSTALL_HEADERS]/QtANGLE/GLES2 INSTALLS += khr_headers gles2_headers diff --git a/src/gui/Qt5GuiConfigExtras.cmake.in b/src/gui/Qt5GuiConfigExtras.cmake.in index f1bc441009..4a6f6250f5 100644 --- a/src/gui/Qt5GuiConfigExtras.cmake.in +++ b/src/gui/Qt5GuiConfigExtras.cmake.in @@ -2,13 +2,15 @@ !!IF !isEmpty(CMAKE_ANGLE_EGL_DLL_RELEASE) !!IF isEmpty(CMAKE_INCLUDE_DIR_IS_ABSOLUTE) -set(Qt5Gui_EGL_INCLUDE_DIRS \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$$CMAKE_INCLUDE_DIR\") +set(Qt5Gui_EGL_INCLUDE_DIRS \"${_qt5$${CMAKE_MODULE_NAME}_install_prefix}/$$CMAKE_INCLUDE_DIR/QtANGLE\") !!ELSE -set(Qt5Gui_EGL_INCLUDE_DIRS \"$$CMAKE_INCLUDE_DIR\") +set(Qt5Gui_EGL_INCLUDE_DIRS \"$$CMAKE_INCLUDE_DIR/QtANGLE\") !!ENDIF _qt5_Gui_check_file_exists(${Qt5Gui_EGL_INCLUDE_DIRS}) +list(APPEND Qt5Gui_INCLUDE_DIRS ${Qt5Gui_EGL_INCLUDE_DIRS}) +set_property(TARGET Qt5::Gui APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${Qt5Gui_EGL_INCLUDE_DIRS}) set(Qt5Gui_OPENGL_INCLUDE_DIRS ${Qt5Gui_EGL_INCLUDE_DIRS}) macro(_populate_qt5gui_gl_target_properties TargetName Configuration LIB_LOCATION IMPLIB_LOCATION) diff --git a/src/gui/gui.pro b/src/gui/gui.pro index e2dd5efcde..3203b41362 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -12,6 +12,12 @@ MODULE_PLUGIN_TYPES = \ platforms \ imageformats +# This is here only because the platform plugin is no module, obviously. +win32:contains(QT_CONFIG, angle) { + MODULE_AUX_INCLUDES = \ + \$\$QT_MODULE_INCLUDE_BASE/QtANGLE +} + load(qt_module) # Code coverage with TestCocoon diff --git a/sync.profile b/sync.profile index 91503d425f..74e29a7acf 100644 --- a/sync.profile +++ b/sync.profile @@ -11,9 +11,9 @@ "QtDBus" => "$basedir/src/dbus", "QtConcurrent" => "$basedir/src/concurrent", "QtPlatformSupport" => "$basedir/src/platformsupport", - "KHR" => "!$basedir/src/3rdparty/angle/include/KHR", - "GLES2" => "!$basedir/src/3rdparty/angle/include/GLES2", - "EGL" => "!$basedir/src/3rdparty/angle/include/EGL", + "QtANGLE/KHR" => "!$basedir/src/3rdparty/angle/include/KHR", + "QtANGLE/GLES2" => "!$basedir/src/3rdparty/angle/include/GLES2", + "QtANGLE/EGL" => "!$basedir/src/3rdparty/angle/include/EGL", "QtZlib" => "!$basedir/src/3rdparty/zlib", "QtOpenGLExtensions" => "$basedir/src/openglextensions", ); From f533941179b92af5a6c4db85233496ac5b9a5f31 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 7 Jun 2013 14:06:24 +0200 Subject: [PATCH 05/79] update some comments relating to forwarding module pri files Change-Id: I3486f949fee2ac977e3cde669188790e5f4b3167 Reviewed-by: Joerg Bornemann --- mkspecs/features/qt_config.prf | 6 +++--- mkspecs/features/qt_module_pris.prf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mkspecs/features/qt_config.prf b/mkspecs/features/qt_config.prf index 77d2c0ffc7..cbbd136270 100644 --- a/mkspecs/features/qt_config.prf +++ b/mkspecs/features/qt_config.prf @@ -15,9 +15,9 @@ QMAKE_QT_CONFIG = $$[QT_HOST_DATA/get]/mkspecs/qconfig.pri for(dir, QMAKE_MODULE_PATH) { debug(1, "Loading modules from $${dir}") for(mod, $$list($$files($$dir/qt_*.pri))) { - # For installed Qt these paths will be common for all modules - # For development these will vary per module, and syncqt will override the value in the - # qt_.pri forwarding file + # For installed Qt these paths will be common for all modules. + # For uninstalled prefix builds these will vary per module, via the + # forwarding module pri files. Keep qt_module_pris.prf in sync with this! QT_MODULE_INCLUDE_BASE = $$[QT_INSTALL_HEADERS] QT_MODULE_LIB_BASE = $$[QT_INSTALL_LIBS] QT_MODULE_HOST_LIB_BASE = $$[QT_HOST_LIBS] diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf index 9eb9b02e14..a80b44f2f6 100644 --- a/mkspecs/features/qt_module_pris.prf +++ b/mkspecs/features/qt_module_pris.prf @@ -120,7 +120,7 @@ else: \ } else { # prefix_build - # This is needed for the direct include() below. + # This is needed for the direct include() below. Mirrors qt_config.prf QT_MODULE_BIN_BASE = $$[QT_INSTALL_BINS] QT_MODULE_INCLUDE_BASE = $$[QT_INSTALL_HEADERS] QT_MODULE_IMPORT_BASE = $$[QT_INSTALL_IMPORTS] From 81b942f0d15d2e73f017cea507ed01c1c29b7952 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Sat, 8 Jun 2013 11:50:45 +0200 Subject: [PATCH 06/79] use correct variable for library base path Change-Id: I6d621db2c4d5365a9c9a7284026b464e663a4cc6 Reviewed-by: Joerg Bornemann --- mkspecs/features/qt_android_deps.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/qt_android_deps.prf b/mkspecs/features/qt_android_deps.prf index c258d55687..96337da9de 100644 --- a/mkspecs/features/qt_android_deps.prf +++ b/mkspecs/features/qt_android_deps.prf @@ -13,7 +13,7 @@ # of the module on JNI-based libraries etc. Used for deployment of an Android # app. -ANDROID_DEPENDS_DIR = $$MODULE_QMAKE_OUTDIR/lib/ +ANDROID_DEPENDS_DIR = $$MODULE_BASE_OUTDIR/lib/ DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml !build_pass { From f3331e14e68089035cc302e11c6e60153f806026 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Sat, 8 Jun 2013 11:58:54 +0200 Subject: [PATCH 07/79] reshuffle path setup rename MODULE_PROFILE_DIR to MODULE_BASE_INDIR. force MODULE_BASE_OUTDIR to be always the shadow of the above. rename MODULE_BASE_DIR to MODULE_SYNCQT_DIR (the former is still recognized for backwards compat with webkit). the idea behind these changes is making the variable names and override possibilities reflect their actual use. Change-Id: Ica4062d7231a0ce13241670e0d0f43e6b1b97160 Reviewed-by: Joerg Bornemann --- mkspecs/features/qt_build_paths.prf | 9 +++++---- mkspecs/features/qt_module_headers.prf | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/mkspecs/features/qt_build_paths.prf b/mkspecs/features/qt_build_paths.prf index 25fc2c3033..9163ac30b2 100644 --- a/mkspecs/features/qt_build_paths.prf +++ b/mkspecs/features/qt_build_paths.prf @@ -11,12 +11,13 @@ # Find the module's source root dir. isEmpty(_QMAKE_CONF_): error("Project has no top-level .qmake.conf file.") -MODULE_PROFILE_DIR = $$dirname(_QMAKE_CONF_) -isEmpty(MODULE_BASE_DIR): MODULE_BASE_DIR = $$MODULE_PROFILE_DIR -isEmpty(MODULE_BASE_OUTDIR): MODULE_BASE_OUTDIR = $$shadowed($$MODULE_BASE_DIR) +MODULE_BASE_INDIR = $$dirname(_QMAKE_CONF_) +MODULE_BASE_OUTDIR = $$shadowed($$MODULE_BASE_INDIR) +!isEmpty(MODULE_BASE_DIR): MODULE_SYNCQT_DIR = $$MODULE_BASE_DIR # compat for webkit +isEmpty(MODULE_SYNCQT_DIR): MODULE_SYNCQT_DIR = $$MODULE_BASE_INDIR isEmpty(MODULE_QMAKE_OUTDIR): MODULE_QMAKE_OUTDIR = $$MODULE_BASE_OUTDIR -exists($$MODULE_PROFILE_DIR/.git): \ +exists($$MODULE_BASE_INDIR/.git): \ CONFIG += git_build !prefix_build { diff --git a/mkspecs/features/qt_module_headers.prf b/mkspecs/features/qt_module_headers.prf index fd6cf6b943..ca26eb674b 100644 --- a/mkspecs/features/qt_module_headers.prf +++ b/mkspecs/features/qt_module_headers.prf @@ -21,7 +21,7 @@ load(qt_build_paths) QMAKE_SYNCQT += -module $$MODULE_INCNAME -version $$VERSION } QMAKE_SYNCQT += \ - -outdir $$MODULE_BASE_OUTDIR $$MODULE_BASE_DIR + -outdir $$MODULE_BASE_OUTDIR $$MODULE_SYNCQT_DIR !silent: message($$QMAKE_SYNCQT) system($$QMAKE_SYNCQT)|error("Failed to run: $$QMAKE_SYNCQT") } @@ -32,11 +32,11 @@ minimal_syncqt: return() git_build: \ INC_PATH = $$MODULE_BASE_OUTDIR else: \ - INC_PATH = $$MODULE_BASE_DIR + INC_PATH = $$MODULE_BASE_INDIR include($$INC_PATH/include/$$MODULE_INCNAME/headers.pri, "", true) autogen_warning = \ - "/* This file was generated by qmake with the info from /$$relative_path($$_PRO_FILE_, $$MODULE_BASE_DIR). */" + "/* This file was generated by qmake with the info from /$$relative_path($$_PRO_FILE_, $$MODULE_BASE_INDIR). */" # Create a module master depends header MODULE_MASTER_DEPS_HEADER = $$MODULE_BASE_OUTDIR/include/$$MODULE_INCNAME/$${MODULE_INCNAME}Depends From 4fd568fa0633b17b4a8e24736a4766e81afff4f3 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 7 Jun 2013 16:23:25 +0200 Subject: [PATCH 08/79] redo include path logic for pre-generated headers make the include dir in the source tree the "main" include path, as that's where the majority of the headers is. then selectively add the shadowed dirs. Change-Id: I03ad13cfcf77175c141b94d41b1221740d851faf Reviewed-by: Joerg Bornemann --- mkspecs/features/qt_module_pris.prf | 48 ++++++++++++++------- src/tools/bootstrap-dbus/bootstrap-dbus.pro | 3 +- src/tools/bootstrap/bootstrap.pro | 5 ++- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf index a80b44f2f6..81b37f0e92 100644 --- a/mkspecs/features/qt_module_pris.prf +++ b/mkspecs/features/qt_module_pris.prf @@ -10,8 +10,17 @@ # load(qt_build_paths) +# Pre-generated headers in the source tree and +# - shadow build or +# - non-shadow non-prefix build of a module which is not qtbase (because the build-time +# generated headers all end up in qtbase). +!git_build:if(!equals(_PRO_FILE_PWD_, $$OUT_PWD) \ + |if(!prefix_build:!equals(MODULE_BASE_INDIR, $$[QT_HOST_PREFIX]))): \ + CONFIG += split_incpath +force_independent|split_incpath: \ + CONFIG += need_fwd_pri MODULE_FWD_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules/qt_lib_$${MODULE}.pri -force_independent: \ +need_fwd_pri: \ MODULE_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules-inst/qt_lib_$${MODULE}.pri else: \ MODULE_PRI = $$MODULE_FWD_PRI @@ -56,20 +65,22 @@ else: \ MODULE_PRIVATE_INCLUDES = \$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME/$$VERSION \ \$\$QT_MODULE_INCLUDE_BASE/$$MODULE_INCNAME/$$VERSION/$$MODULE_INCNAME } + split_incpath: \ + MODULE_SHADOW_INCLUDES = $$replace(MODULE_INCLUDES, ^\\\$\\\$QT_MODULE_INCLUDE_BASE, \ + $$MODULE_BASE_OUTDIR/include) MODULE_INCLUDES += $$MODULE_AUX_INCLUDES MODULE_PRIVATE_INCLUDES += $$MODULE_PRIVATE_AUX_INCLUDES - !git_build:if(!equals(_PRO_FILE_PWD_, $$OUT_PWD) \ - |if(!prefix_build:!equals(MODULE_BASE_DIR, $$[QT_HOST_PREFIX]))) { - pub_inc = $$replace(MODULE_INCLUDES, ^\\\$\\\$QT_MODULE_INCLUDE_BASE, $$MODULE_BASE_DIR/include) - priv_inc = $$replace(MODULE_PRIVATE_INCLUDES, ^\\\$\\\$QT_MODULE_INCLUDE_BASE, $$MODULE_BASE_DIR/include) - force_independent { - MODULE_FWD_PRI_CONT_SUFFIX = \ - "QT.$${MODULE}.includes += $$pub_inc" \ - "QT.$${MODULE}.private_includes = $$priv_inc" - } else { - MODULE_INCLUDES += $$pub_inc - MODULE_PRIVATE_INCLUDES = $$priv_inc - } + internal_module { + MODULE_PRIVATE_INCLUDES = $$MODULE_INCLUDES $$MODULE_PRIVATE_INCLUDES + MODULE_INCLUDES = + MODULE_PRIVATE_SHADOW_INCLUDES = $$MODULE_SHADOW_INCLUDES + MODULE_SHADOW_INCLUDES = + } + split_incpath { + !isEmpty(MODULE_SHADOW_INCLUDES): \ + MODULE_FWD_PRI_CONT_SUFFIX += "QT.$${MODULE}.includes += $$MODULE_SHADOW_INCLUDES" + !isEmpty(MODULE_PRIVATE_SHADOW_INCLUDES): \ + MODULE_FWD_PRI_CONT_SUFFIX += "QT.$${MODULE}.private_includes += $$MODULE_PRIVATE_SHADOW_INCLUDES" } MODULE_PRI_CONT = \ "QT.$${MODULE}.VERSION = $${VERSION}" \ @@ -100,12 +111,17 @@ else: \ write_file($$MODULE_PRI, MODULE_PRI_CONT)|error("Aborting.") MODULE_PRI_FILES = $$MODULE_PRI - force_independent { + need_fwd_pri { + + split_incpath: \ + MODULE_BASE_INCDIR = $$MODULE_BASE_INDIR + else: \ + MODULE_BASE_INCDIR = $$MODULE_BASE_OUTDIR # Create a forwarding module .pri file MODULE_FWD_PRI_CONT = \ "QT_MODULE_BIN_BASE = $$MODULE_BASE_OUTDIR/bin" \ - "QT_MODULE_INCLUDE_BASE = $$MODULE_BASE_OUTDIR/include" \ + "QT_MODULE_INCLUDE_BASE = $$MODULE_BASE_INCDIR/include" \ "QT_MODULE_IMPORT_BASE = $$MODULE_BASE_OUTDIR/imports" \ "QT_MODULE_QML_BASE = $$MODULE_BASE_OUTDIR/qml" \ "QT_MODULE_LIB_BASE = $$MODULE_BASE_OUTDIR/lib" \ @@ -118,7 +134,7 @@ else: \ touch($$MODULE_FWD_PRI, $$MODULE_PRI) MODULE_PRI_FILES += $$MODULE_FWD_PRI - } else { # prefix_build + } else { # This is needed for the direct include() below. Mirrors qt_config.prf QT_MODULE_BIN_BASE = $$[QT_INSTALL_BINS] diff --git a/src/tools/bootstrap-dbus/bootstrap-dbus.pro b/src/tools/bootstrap-dbus/bootstrap-dbus.pro index 6af70efda7..62f9f96a9b 100644 --- a/src/tools/bootstrap-dbus/bootstrap-dbus.pro +++ b/src/tools/bootstrap-dbus/bootstrap-dbus.pro @@ -7,8 +7,9 @@ CONFIG += no_module_headers internal_module force_bootstrap DEFINES += \ QT_NO_CAST_FROM_ASCII +MODULE_INCLUDES = \ + \$\$QT_MODULE_INCLUDE_BASE/QtDBus MODULE_PRIVATE_INCLUDES = \ - \$\$QT_MODULE_INCLUDE_BASE/QtDBus \ \$\$QT_MODULE_INCLUDE_BASE/QtDBus/$$QT_VERSION \ \$\$QT_MODULE_INCLUDE_BASE/QtDBus/$$QT_VERSION/QtDBus diff --git a/src/tools/bootstrap/bootstrap.pro b/src/tools/bootstrap/bootstrap.pro index 972f57260e..bf19828634 100644 --- a/src/tools/bootstrap/bootstrap.pro +++ b/src/tools/bootstrap/bootstrap.pro @@ -30,12 +30,13 @@ DEFINES += \ DEFINES -= QT_EVAL -MODULE_PRIVATE_INCLUDES = \ +MODULE_INCLUDES = \ \$\$QT_MODULE_INCLUDE_BASE \ \$\$QT_MODULE_INCLUDE_BASE/QtCore \ + \$\$QT_MODULE_INCLUDE_BASE/QtXml +MODULE_PRIVATE_INCLUDES = \ \$\$QT_MODULE_INCLUDE_BASE/QtCore/$$QT_VERSION \ \$\$QT_MODULE_INCLUDE_BASE/QtCore/$$QT_VERSION/QtCore \ - \$\$QT_MODULE_INCLUDE_BASE/QtXml \ \$\$QT_MODULE_INCLUDE_BASE/QtXml/$$QT_VERSION \ \$\$QT_MODULE_INCLUDE_BASE/QtXml/$$QT_VERSION/QtXml From 45d8bf327eee744570933211f611cf4410ae7e29 Mon Sep 17 00:00:00 2001 From: Topi Reinio Date: Mon, 10 Jun 2013 14:45:40 +0200 Subject: [PATCH 09/79] Doc: Mark QOpenGLFunctions_4_1_Core as a wrapper class The class documentation missing the \wrapper command, making QDoc complain a lot. Change-Id: Iad8fa3d2facadfb3393642dc08ff4dc416bdccc7 Reviewed-by: Martin Smith Reviewed-by: Jerome Pasion --- src/gui/opengl/qopenglfunctions_4_1_core.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/opengl/qopenglfunctions_4_1_core.cpp b/src/gui/opengl/qopenglfunctions_4_1_core.cpp index b36cb0de94..474397bb1f 100644 --- a/src/gui/opengl/qopenglfunctions_4_1_core.cpp +++ b/src/gui/opengl/qopenglfunctions_4_1_core.cpp @@ -57,6 +57,7 @@ QT_BEGIN_NAMESPACE \class QOpenGLFunctions_4_1_Core \inmodule QtGui \since 5.1 + \wrapper \brief The QOpenGLFunctions_4_1_Core class provides all functions for this version and profile of OpenGL. \sa QAbstractOpenGLFunctions From 074c5c94f6018d08abac9bad5151f9300284feb4 Mon Sep 17 00:00:00 2001 From: Topi Reinio Date: Mon, 10 Jun 2013 13:17:18 +0200 Subject: [PATCH 10/79] Doc: Fixed snippet issues in QDoc documentation QDoc uses .qdoc files as snippets in other .qdoc files. These snippet .qdoc files are also parsed, which is not the intent. This change resolves the issue by renaming the files to have a different extension. Task-number: QTBUG-31574 Change-Id: I399c8b714478b9c4b8fbe2db53f601e6a1386cea Reviewed-by: Jerome Pasion --- .../doc/examples/{cpp.qdoc => cpp.qdoc.sample} | 0 .../doc/examples/{qml.qdoc => qml.qdoc.sample} | 0 .../qdoc/doc/qdoc-guide/qtwritingstyle-cpp.qdoc | 14 +++++++------- .../qdoc/doc/qdoc-guide/qtwritingstyle-qml.qdoc | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) rename src/tools/qdoc/doc/examples/{cpp.qdoc => cpp.qdoc.sample} (100%) rename src/tools/qdoc/doc/examples/{qml.qdoc => qml.qdoc.sample} (100%) diff --git a/src/tools/qdoc/doc/examples/cpp.qdoc b/src/tools/qdoc/doc/examples/cpp.qdoc.sample similarity index 100% rename from src/tools/qdoc/doc/examples/cpp.qdoc rename to src/tools/qdoc/doc/examples/cpp.qdoc.sample diff --git a/src/tools/qdoc/doc/examples/qml.qdoc b/src/tools/qdoc/doc/examples/qml.qdoc.sample similarity index 100% rename from src/tools/qdoc/doc/examples/qml.qdoc rename to src/tools/qdoc/doc/examples/qml.qdoc.sample diff --git a/src/tools/qdoc/doc/qdoc-guide/qtwritingstyle-cpp.qdoc b/src/tools/qdoc/doc/qdoc-guide/qtwritingstyle-cpp.qdoc index 4ad1f19f67..2095c4e7cb 100644 --- a/src/tools/qdoc/doc/qdoc-guide/qtwritingstyle-cpp.qdoc +++ b/src/tools/qdoc/doc/qdoc-guide/qtwritingstyle-cpp.qdoc @@ -41,7 +41,7 @@ Note that the documentation must be in the implementation files such as \c .cpp. Class documentation is generated using the \l{class-command}{\\class} command and the name of the class as the first argument. -\snippet examples/cpp.qdoc class +\snippet examples/cpp.qdoc.sample class \l{Context commands} add information about the class, such as its module or which version the class was added. @@ -79,7 +79,7 @@ Typically, function documentation immediately precedes the implementation of the function in the \c .cpp file. For function documentation that is not immediately above the implementation, the \l{fn-command}{\\fn} is needed. -\snippet examples/cpp.qdoc function +\snippet examples/cpp.qdoc.sample function The function documentation starts with a verb, indicating the operation the function performs. This also applies to constructors and destructors. @@ -102,7 +102,7 @@ The \l{a-command}{\\a} command marks the parameter in the documentation. The return type documentation should link to the type documentation or be marked with the \l{c-command}{\\c} command in the case of boolean values. -\snippet examples/cpp.qdoc return +\snippet examples/cpp.qdoc.sample return \section1 Properties @@ -110,7 +110,7 @@ The property documentation resides immediately above the read function's implementation. The \l{topic-commands}{topic command} for properties is \l{property-command}{\\property}. -\snippet examples/cpp.qdoc property +\snippet examples/cpp.qdoc.sample property Property documentation usually starts with "This property...", but these are alternate expressions: @@ -142,7 +142,7 @@ The \l{topic-commands}{topic command} for signals, notifiers, and slots is \l{fn-command}{\\fn}. Signal documentation state when they are triggered or emitted. -\snippet examples/cpp.qdoc signals +\snippet examples/cpp.qdoc.sample signals Signal documentation typically begin with "This signal is triggered when...". Here are alternate styles: @@ -164,7 +164,7 @@ notifiers together. To refer to a specifc version of a notifier or signal, simply refer to the property and mention that there are different versions of the notifier. -\snippet examples/cpp.qdoc overloaded notifier +\snippet examples/cpp.qdoc.sample overloaded notifier \section1 Enums, Namespaces, and other Types @@ -181,7 +181,7 @@ continues with the type description. For enumerations, the \l{value-command}{\\value} command is for listing the values. QDoc creates a table of values for the enum. -\snippet examples/cpp.qdoc enums +\snippet examples/cpp.qdoc.sample enums */ diff --git a/src/tools/qdoc/doc/qdoc-guide/qtwritingstyle-qml.qdoc b/src/tools/qdoc/doc/qdoc-guide/qtwritingstyle-qml.qdoc index 2d67e62f94..7ca0abed71 100644 --- a/src/tools/qdoc/doc/qdoc-guide/qtwritingstyle-qml.qdoc +++ b/src/tools/qdoc/doc/qdoc-guide/qtwritingstyle-qml.qdoc @@ -60,7 +60,7 @@ does not exist. The class documentation may be marked as The \l{qmltype-command}{\\qmltype} command is for QML type documentation. -\snippet examples/qml.qdoc qmltype +\snippet examples/qml.qdoc.sample qmltype The \l{instantiates-command}{\\instantiates} accepts the C++ class which implements the QML type as the argument. For types implemented in QML, this @@ -108,7 +108,7 @@ with the \l{qmlsignal-command}{\\qmlsignal} command. Signal documentation must include the condition for emitting the signal, mention the corresponding signal handler, and document whether the signal accepts a parameter. -\snippet examples/qml.qdoc signals +\snippet examples/qml.qdoc.sample signals These are the possible documentation styles for signals: \list @@ -127,7 +127,7 @@ documentation must reside immediately above the function declaration. The function documentation starts with a verb, indicating the operation the function performs. -\snippet examples/qml.qdoc function +\snippet examples/qml.qdoc.sample function Some common verbs for function documentation: \list @@ -153,7 +153,7 @@ QML enumerations are documented as QML properties with the \l{qmlproperty-command}{\\qmlproperty} command. The type of the property is \c enumeration. -\snippet examples/qml.qdoc enums +\snippet examples/qml.qdoc.sample enums The QDoc comment lists the values of the enumeration. If the enumeration is implemented in C++, the documentation may link to the corresponding C++ From b2a0a1437000c6cd78de4bf960993732457a8e92 Mon Sep 17 00:00:00 2001 From: Gatis Paeglis Date: Tue, 28 May 2013 13:09:20 +0200 Subject: [PATCH 11/79] Fix issue when QKeyEvent::text() was returning empty string MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The code that sets 'text' variable was executed only for KeyPress events. This patch moves 'text' initialization higher up where it will be run for both - KeyPress and KeyRelease events. Task-number: QTBUG-31285 Change-Id: I140de9ef5d29beedad276d348bed964ecdf46f9d Reviewed-by: Tor Arne Vestbø Reviewed-by: Andy Shaw --- src/plugins/platforms/cocoa/qnsview.mm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 5c5da830ac..10fb293ec0 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -917,13 +917,13 @@ static QTouchDevice *touchDevice = 0; // we will send a key event unless the input method sets m_sendKeyEvent to false m_sendKeyEvent = true; - QString text; + // ignore text for the U+F700-U+F8FF range. This is used by Cocoa when + // delivering function keys (e.g. arrow keys, backspace, F1-F35, etc.) + if (ch.unicode() < 0xf700 || ch.unicode() > 0xf8ff) + text = QCFString::toQString(characters); + if (eventType == QEvent::KeyPress) { - // ignore text for the U+F700-U+F8FF range. This is used by Cocoa when - // delivering function keys (e.g. arrow keys, backspace, F1-F35, etc.) - if (ch.unicode() < 0xf700 || ch.unicode() > 0xf8ff) - text = QCFString::toQString(characters); if (m_composingText.isEmpty()) m_sendKeyEvent = !QWindowSystemInterface::tryHandleShortcutEvent(m_window, timestamp, keyCode, modifiers, text); From a90d93285a0b95013020644f29c5d932aa989d37 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 6 Jun 2013 13:50:23 +0200 Subject: [PATCH 12/79] Windows save file dialog: Set default suffix only once. IFileDialog::SetDefaultExtension() needs to be called for the dialog to automatically update the suffix when the user chooses a new file type. Calling it IFileDialogEvents::OnTypeChanged as introduced by 42760e43eaa64e834809ef5fb01a83cfb75f4f04 causes it to use the previous suffix when switching. Call in setNameFilters() using the first available suffix instead. Task-number: QTBUG-31381 Task-number: QTBUG-30748 Change-Id: Idd532e4190c752aa80abce963dd0389be7d22a34 Reviewed-by: Andy Shaw Reviewed-by: Oliver Wolff Reviewed-by: Joerg Bornemann --- .../windows/qwindowsdialoghelpers.cpp | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp index 33b4eb4771..f7ccb00233 100644 --- a/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp +++ b/src/plugins/platforms/windows/qwindowsdialoghelpers.cpp @@ -825,7 +825,7 @@ public: inline void updateDirectory() { setDirectory(m_data.directory()); } inline QString directory() const; virtual void exec(HWND owner = 0); - inline void setNameFilters(const QStringList &f); + virtual void setNameFilters(const QStringList &f); inline void selectNameFilter(const QString &filter); inline void updateSelectedNameFilter() { selectNameFilter(m_data.selectedNameFilter()); } inline QString selectedNameFilter() const; @@ -1335,12 +1335,11 @@ class QWindowsNativeSaveFileDialog : public QWindowsNativeFileDialogBase { Q_OBJECT public: - explicit QWindowsNativeSaveFileDialog(const QWindowsFileDialogSharedData &data); + explicit QWindowsNativeSaveFileDialog(const QWindowsFileDialogSharedData &data) + : QWindowsNativeFileDialogBase(data) {} + virtual void setNameFilters(const QStringList &f); virtual QStringList selectedFiles() const; virtual QStringList dialogResult() const; - -private slots: - void slotFilterSelected(const QString &); }; // Return the first suffix from the name filter "Foo files (*.foo;*.bar)" -> "foo". @@ -1358,20 +1357,21 @@ static inline QString suffixFromFilter(const QString &filter) return endPos >= 0 ? filter.mid(suffixPos, endPos - suffixPos) : QString(); } -QWindowsNativeSaveFileDialog::QWindowsNativeSaveFileDialog(const QWindowsFileDialogSharedData &data) - : QWindowsNativeFileDialogBase(data) +void QWindowsNativeSaveFileDialog::setNameFilters(const QStringList &f) { - connect(this, &QWindowsNativeFileDialogBase::filterSelected, - this, &QWindowsNativeSaveFileDialog::slotFilterSelected); -} - -void QWindowsNativeSaveFileDialog::slotFilterSelected(const QString &filter) -{ - // Cause the dialog to append the suffix of the current filter unless a default - // suffix is set (Note: Qt 4.8 sets the selected filter's suffix before - // calling GetSaveFileName()). - if (!hasDefaultSuffix()) - setDefaultSuffixSys(suffixFromFilter(filter)); + QWindowsNativeFileDialogBase::setNameFilters(f); + // QTBUG-31381, QTBUG-30748: IFileDialog will update the suffix of the selected name + // filter only if a default suffix is set (see docs). Set the first available + // suffix unless we have a defaultSuffix. + if (!hasDefaultSuffix()) { + foreach (const QString &filter, f) { + const QString suffix = suffixFromFilter(filter); + if (!suffix.isEmpty()) { + setDefaultSuffixSys(suffix); + break; + } + } + } // m_hasDefaultSuffix } QStringList QWindowsNativeSaveFileDialog::dialogResult() const From d7b79ff3ef714ca0c433763a0563a069575271cb Mon Sep 17 00:00:00 2001 From: Fawzi Mohamed Date: Mon, 13 May 2013 18:34:08 +0200 Subject: [PATCH 13/79] mkspecs/qml_plugin: adding -nonrelocatable flag to qmldump call nonrelocatable adds the full uri to the exported type information which is the correct thing to do for the qt plugins (and 99% of the cases). This way import bla.x 1.0 works correctly in the code model. Change-Id: Ia06873dd8b2ea4627e3297a98e8df87275ceaf73 Reviewed-by: Alan Alpert Reviewed-by: Kai Koehne Reviewed-by: Oswald Buddenhagen --- mkspecs/features/qml_plugin.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/qml_plugin.prf b/mkspecs/features/qml_plugin.prf index 70c3bd6b66..28fbb392a7 100644 --- a/mkspecs/features/qml_plugin.prf +++ b/mkspecs/features/qml_plugin.prf @@ -86,7 +86,7 @@ load(qt_common) qtAddToolEnv(QMLPLUGINDUMP, importpath) TARGETPATHBASE = $$replace(TARGETPATH, \\.\\d+\$, ) qmltypes.target = qmltypes - qmltypes.commands = $$QMLPLUGINDUMP $$replace(TARGETPATHBASE, /, .) $$IMPORT_VERSION > $$QMLTYPEFILE + qmltypes.commands = $$QMLPLUGINDUMP -nonrelocatable $$replace(TARGETPATHBASE, /, .) $$IMPORT_VERSION > $$QMLTYPEFILE qmltypes.depends = $$QMAKE_RESOLVED_TARGET } else { qmltypes.CONFIG += recursive From e1109df7a92812233935489bc9fbae524536130a Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Fri, 7 Jun 2013 13:22:51 +0200 Subject: [PATCH 14/79] Remove the use of CMAKE_FIND_ROOT_PATH. This is actually a list in CMake, not a value to be prepended to paths. Specify the QT_SYSROOT instead to root the location of include directories. CMake will soon get a CMAKE_SYSROOT variable which will replace this. Change-Id: I239f69f127f3676a3835aa4f29638f44ef209819 Reviewed-by: Volker Krause Reviewed-by: Stephen Kelly Reviewed-by: Oswald Buddenhagen --- mkspecs/features/cmake_functions.prf | 2 +- src/corelib/Qt5CTestMacros.cmake | 4 ---- src/gui/Qt5GuiConfigExtras.cmake.in | 12 +++++++----- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/mkspecs/features/cmake_functions.prf b/mkspecs/features/cmake_functions.prf index f48ef43b88..a67fd9af9b 100644 --- a/mkspecs/features/cmake_functions.prf +++ b/mkspecs/features/cmake_functions.prf @@ -45,7 +45,7 @@ defineReplace(cmakePortablePaths) { variable = $$1 out = for(v, variable) { - out += ${CMAKE_FIND_ROOT_PATH}$$cmakeTargetPath($$v) + out += $$[QT_SYSROOT]$$cmakeTargetPath($$v) } return ($$join(out, ";")) } diff --git a/src/corelib/Qt5CTestMacros.cmake b/src/corelib/Qt5CTestMacros.cmake index 51537a3904..126a348b47 100644 --- a/src/corelib/Qt5CTestMacros.cmake +++ b/src/corelib/Qt5CTestMacros.cmake @@ -38,10 +38,6 @@ foreach(module ${CMAKE_MODULES_UNDER_TEST}) ) endforeach() -if(CMAKE_CROSSCOMPILING AND CMAKE_FIND_ROOT_PATH) - list(APPEND BUILD_OPTIONS_LIST "-DCMAKE_CXX_LINK_FLAGS=--sysroot=\"${CMAKE_FIND_ROOT_PATH}\"") -endif() - macro(expect_pass _dir) string(REPLACE "(" "_" testname "${_dir}") string(REPLACE ")" "_" testname "${testname}") diff --git a/src/gui/Qt5GuiConfigExtras.cmake.in b/src/gui/Qt5GuiConfigExtras.cmake.in index 4a6f6250f5..83e77280d5 100644 --- a/src/gui/Qt5GuiConfigExtras.cmake.in +++ b/src/gui/Qt5GuiConfigExtras.cmake.in @@ -57,7 +57,7 @@ find_path(_qt5gui_OPENGL_INCLUDE_DIR $$CMAKE_GL_HEADER_NAME PATHS $$CMAKE_GL_INCDIRS NO_DEFAULT_PATH) if (NOT _qt5gui_OPENGL_INCLUDE_DIR) - message(FATAL_ERROR \"Failed to find \\\"$$CMAKE_GL_HEADER_NAME\\\" in \\\"$$CMAKE_GL_INCDIRS\\\", using the CMAKE_FIND_ROOT_PATH \\\"${CMAKE_FIND_ROOT_PATH}\\\".\") + message(FATAL_ERROR \"Failed to find \\\"$$CMAKE_GL_HEADER_NAME\\\" in \\\"$$CMAKE_GL_INCDIRS\\\".\") endif() _qt5_Gui_check_file_exists(${_qt5gui_OPENGL_INCLUDE_DIR}) @@ -87,7 +87,7 @@ macro(_qt5gui_find_extra_libs Name Libs LibDir IncDirs) if (\"${ARGN}\" STREQUAL \"OPTIONAL\") break() else() - message(FATAL_ERROR \"Failed to find \\\"${_lib}\\\" in \\\"${LibDir}\\\", using the CMAKE_FIND_ROOT_PATH \\\"${CMAKE_FIND_ROOT_PATH}\\\".\") + message(FATAL_ERROR \"Failed to find \\\"${_lib}\\\" in \\\"${LibDir}\\\".\") endif() endif() add_library(Qt5::Gui_${_cmake_lib_name} SHARED IMPORTED) @@ -116,9 +116,11 @@ macro(_qt5gui_find_extra_libs Name Libs LibDir IncDirs) endif() list(APPEND Qt5Gui_${Name}_LIBRARIES Qt5::Gui_${_cmake_lib_name}) endforeach() - foreach(_dir ${IncDirs}) - _qt5_Gui_check_file_exists(${_dir}) - endforeach() + if (NOT CMAKE_CROSSCOMPILING) + foreach(_dir ${IncDirs}) + _qt5_Gui_check_file_exists(${_dir}) + endforeach() + endif() endmacro() From f2ea45363dae1ad67386d0aeb0697e716cc10aee Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Mon, 10 Jun 2013 11:25:24 +0200 Subject: [PATCH 15/79] qdoc: QGLFrameBufferObject::bindDefault() was marked \internal The \internal is removed. Task-number: QTBUG-31638 Change-Id: Ib1b65783599fe50e907373e3223a0774f17ac65e Reviewed-by: Jerome Pasion Reviewed-by: Gunnar Sletta --- src/opengl/qglframebufferobject.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/opengl/qglframebufferobject.cpp b/src/opengl/qglframebufferobject.cpp index 1c802cabcb..8210b218ec 100644 --- a/src/opengl/qglframebufferobject.cpp +++ b/src/opengl/qglframebufferobject.cpp @@ -1122,7 +1122,6 @@ QPaintEngine *QGLFramebufferObject::paintEngine() const /*! \fn bool QGLFramebufferObject::bindDefault() - \internal Switches rendering back to the default, windowing system provided framebuffer. From 1937012b3e09e5f0b9a1c056e05e6109e3bd8d55 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Mon, 10 Jun 2013 11:19:21 +0200 Subject: [PATCH 16/79] Don't test existence of private header directories for mac frameworks These directories are not currently part of the Qt installation for mac frameworks. Task-number: QTBUG-31641 Change-Id: Ifef372cc2ebb692f9ae5a7b1f8dba5f683d1e7eb Reviewed-by: Oswald Buddenhagen Reviewed-by: Stephen Kelly --- mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in index f6fd61602f..c55b728f1b 100644 --- a/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in +++ b/mkspecs/features/data/cmake/Qt5BasicConfig.cmake.in @@ -104,7 +104,11 @@ if (NOT TARGET Qt5::$${CMAKE_MODULE_NAME}) set(Qt5$${CMAKE_MODULE_NAME}_PRIVATE_INCLUDE_DIRS) !!ENDIF - foreach(_dir ${_Qt5$${CMAKE_MODULE_NAME}_OWN_INCLUDE_DIRS} ${Qt5$${CMAKE_MODULE_NAME}_PRIVATE_INCLUDE_DIRS}) + foreach(_dir ${_Qt5$${CMAKE_MODULE_NAME}_OWN_INCLUDE_DIRS} +!!IF isEmpty(CMAKE_BUILD_IS_FRAMEWORK) + ${Qt5$${CMAKE_MODULE_NAME}_PRIVATE_INCLUDE_DIRS} +!!ENDIF + ) _qt5_$${CMAKE_MODULE_NAME}_check_file_exists(${_dir}) endforeach() From 900cccfd459fcbdbc4aa3d313afe12cfbf68fd87 Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Mon, 10 Jun 2013 13:50:44 +0200 Subject: [PATCH 17/79] Fix drawing of 0-width polylines from outside the devicerect. This was broken by a previous fix which aimed to fix gaps in polylines with tiny line segments. The result was that we skipped updating the origin point when stroke() didn't produce pixels which accidentally included the case of the line being completely outside the deviceRect. I fixed this by returning the value of clipLine in drawLine to the caller so we could still update the origin for this case. Task-number: QTBUG-31579 Change-Id: Iac29436f042da7658bbeaf9370351dc6f2c95065 Reviewed-by: Lars Knoll --- src/gui/painting/qcosmeticstroker.cpp | 42 +++++++++++++++++---------- src/gui/painting/qcosmeticstroker_p.h | 2 +- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/gui/painting/qcosmeticstroker.cpp b/src/gui/painting/qcosmeticstroker.cpp index 0f3cde3efd..39f64224f0 100644 --- a/src/gui/painting/qcosmeticstroker.cpp +++ b/src/gui/painting/qcosmeticstroker.cpp @@ -133,10 +133,15 @@ struct NoDasher { }; +/* + * The return value is the result of the clipLine() call performed at the start + * of each of the two functions, aka "false" means completely outside the devices + * rect. + */ template -static void drawLine(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps); +static bool drawLine(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps); template -static void drawLineAA(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps); +static bool drawLineAA(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps); inline void drawPixel(QCosmeticStroker *stroker, int x, int y, int coverage) { @@ -602,17 +607,20 @@ void QCosmeticStroker::drawPath(const QVectorPath &path) caps |= CapEnd; QCosmeticStroker::Point last = this->lastPixel; - stroke(this, p.x(), p.y(), p2.x(), p2.y(), caps); + bool unclipped = stroke(this, p.x(), p.y(), p2.x(), p2.y(), caps); /* fix for gaps in polylines with fastpen and aliased in a sequence of points with small distances: if current point p2 has been dropped - out, keep last non dropped point p. */ - if (fastPenAliased) { - if (last.x != lastPixel.x || last.y != lastPixel.y || - points == begin + 2 || points == end - 2 ) { - { - p = p2; - } + out, keep last non dropped point p. + + However, if the line was completely outside the devicerect, we + still need to update p to avoid drawing the line after this one from + a bad starting position. + */ + if (fastPenAliased && unclipped) { + if (last.x != lastPixel.x || last.y != lastPixel.y + || points == begin + 2 || points == end - 2) { + p = p2; } } else { p = p2; @@ -720,10 +728,10 @@ static inline void capAdjust(int caps, int &x1, int &x2, int &y, int yinc) the drawing shifts from horizontal to vertical or back. */ template -static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps) +static bool drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps) { if (stroker->clipLine(rx1, ry1, rx2, ry2)) - return; + return false; const int half = stroker->legacyRounding ? 31 : 0; int x1 = toF26Dot6(rx1) + half; @@ -813,7 +821,7 @@ static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, } else { // horizontal if (!dx) - return; + return true; QCosmeticStroker::Direction dir = QCosmeticStroker::LeftToRight; @@ -886,14 +894,15 @@ static void drawLine(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, } } stroker->lastPixel = last; + return true; } template -static void drawLineAA(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps) +static bool drawLineAA(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx2, qreal ry2, int caps) { if (stroker->clipLine(rx1, ry1, rx2, ry2)) - return; + return false; int x1 = toF26Dot6(rx1); int y1 = toF26Dot6(ry1); @@ -967,7 +976,7 @@ static void drawLineAA(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx } else { // horizontal if (!dx) - return; + return true; int yinc = F16Dot16FixedDiv(dy, dx); @@ -1029,6 +1038,7 @@ static void drawLineAA(QCosmeticStroker *stroker, qreal rx1, qreal ry1, qreal rx drawPixel(stroker, x, (y>>16) + 1, alpha * alphaEnd >> 6); } } + return true; } QT_END_NAMESPACE diff --git a/src/gui/painting/qcosmeticstroker_p.h b/src/gui/painting/qcosmeticstroker_p.h index 05c8a2b0cf..5fc3559da4 100644 --- a/src/gui/painting/qcosmeticstroker_p.h +++ b/src/gui/painting/qcosmeticstroker_p.h @@ -53,7 +53,7 @@ QT_BEGIN_NAMESPACE class QCosmeticStroker; -typedef void (*StrokeLine)(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps); +typedef bool (*StrokeLine)(QCosmeticStroker *stroker, qreal x1, qreal y1, qreal x2, qreal y2, int caps); class QCosmeticStroker { From 425af59f534ed8a0f4bc7a77a1f83e4d1e2e2bdc Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Mon, 10 Jun 2013 11:56:14 +0200 Subject: [PATCH 18/79] Disable long press on Android Remove the mapping from press-and-hold to right-mouse-button press. This logic was implemented in the android plugin, and there was no way to disable it for applications that needed to handle long presses in a different way. Add an environment variable to enable the mapping for those who really need it, but do not advertise it. (We want to add a proper API for this in 5.2) Task-number: QTBUG-31644 Change-Id: Ia5ae75d6147485b73c78b7c3fa88d11af5d84c06 Reviewed-by: BogDan Vatra --- src/plugins/platforms/android/src/androidjniinput.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/platforms/android/src/androidjniinput.cpp b/src/plugins/platforms/android/src/androidjniinput.cpp index da6156a330..29ccfe0125 100644 --- a/src/plugins/platforms/android/src/androidjniinput.cpp +++ b/src/plugins/platforms/android/src/androidjniinput.cpp @@ -163,6 +163,10 @@ namespace QtAndroidInput static void longPress(JNIEnv */*env*/, jobject /*thiz*/, jint /*winId*/, jint x, jint y) { + //### TODO: add proper API for Qt 5.2 + static bool rightMouseFromLongPress = qgetenv("QT_NECESSITAS_COMPATIBILITY_LONG_PRESS").toInt(); + if (!rightMouseFromLongPress) + return; m_ignoreMouseEvents = true; QPoint globalPos(x,y); QWindow *tlw = topLevelWindowAt(globalPos); From 85b4f0d2d3ffd326548ca8f0e15ac27f5fd8d77d Mon Sep 17 00:00:00 2001 From: Gunnar Sletta Date: Tue, 11 Jun 2013 11:09:34 +0200 Subject: [PATCH 19/79] Avoid floating point exceptions in rasterizeLine. Task-number: QTBUG-16757 Change-Id: I3ef988f1e039c12529d62197d85a62f201e4ae12 Reviewed-by: Lars Knoll --- src/gui/painting/qrasterizer.cpp | 61 +++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/src/gui/painting/qrasterizer.cpp b/src/gui/painting/qrasterizer.cpp index a6be7c6c78..197d49369e 100644 --- a/src/gui/painting/qrasterizer.cpp +++ b/src/gui/painting/qrasterizer.cpp @@ -734,6 +734,35 @@ static inline QPointF snapTo26Dot6Grid(const QPointF &p) qFloorF(p.y() * 64) * (1 / qreal(64))); } +/* + The rasterize line function relies on some div by zero which should + result in +/-inf values. However, when floating point exceptions are + enabled, this will cause crashes, so we return high numbers instead. + As the returned value is used in further arithmetic, returning + FLT_MAX/DBL_MAX will also cause values, so instead return a value + that is well outside the int-range. + */ +static inline qreal qSafeDivide(qreal x, qreal y) +{ + if (y == 0) + return x > 0 ? 1e20 : -1e20; + return x / y; +} + +/* Conversion to int fails if the value is too large to fit into INT_MAX or + too small to fit into INT_MIN, so we need this slightly safer conversion + when floating point exceptions are enabled + */ +static inline int qSafeFloatToQ16Dot16(qreal x) +{ + qreal tmp = x * 65536.; + if (tmp > qreal(INT_MAX)) + return INT_MAX; + else if (tmp < qreal(INT_MIN)) + return -INT_MAX; + return int(tmp); +} + void QRasterizer::rasterizeLine(const QPointF &a, const QPointF &b, qreal width, bool squareCap) { if (a == b || width == 0 || d->clipRect.isEmpty()) @@ -946,23 +975,23 @@ void QRasterizer::rasterizeLine(const QPointF &a, const QPointF &b, qreal width, const QPointF bottomLeftEdge = bottom - left; const QPointF bottomRightEdge = bottom - right; - const qreal topLeftSlope = topLeftEdge.x() / topLeftEdge.y(); - const qreal bottomLeftSlope = bottomLeftEdge.x() / bottomLeftEdge.y(); + const qreal topLeftSlope = qSafeDivide(topLeftEdge.x(), topLeftEdge.y()); + const qreal bottomLeftSlope = qSafeDivide(bottomLeftEdge.x(), bottomLeftEdge.y()); - const qreal topRightSlope = topRightEdge.x() / topRightEdge.y(); - const qreal bottomRightSlope = bottomRightEdge.x() / bottomRightEdge.y(); + const qreal topRightSlope = qSafeDivide(topRightEdge.x(), topRightEdge.y()); + const qreal bottomRightSlope = qSafeDivide(bottomRightEdge.x(), bottomRightEdge.y()); - const Q16Dot16 topLeftSlopeFP = FloatToQ16Dot16(topLeftSlope); - const Q16Dot16 topRightSlopeFP = FloatToQ16Dot16(topRightSlope); + const Q16Dot16 topLeftSlopeFP = qSafeFloatToQ16Dot16(topLeftSlope); + const Q16Dot16 topRightSlopeFP = qSafeFloatToQ16Dot16(topRightSlope); - const Q16Dot16 bottomLeftSlopeFP = FloatToQ16Dot16(bottomLeftSlope); - const Q16Dot16 bottomRightSlopeFP = FloatToQ16Dot16(bottomRightSlope); + const Q16Dot16 bottomLeftSlopeFP = qSafeFloatToQ16Dot16(bottomLeftSlope); + const Q16Dot16 bottomRightSlopeFP = qSafeFloatToQ16Dot16(bottomRightSlope); - const Q16Dot16 invTopLeftSlopeFP = FloatToQ16Dot16(1 / topLeftSlope); - const Q16Dot16 invTopRightSlopeFP = FloatToQ16Dot16(1 / topRightSlope); + const Q16Dot16 invTopLeftSlopeFP = qSafeFloatToQ16Dot16(qSafeDivide(1, topLeftSlope)); + const Q16Dot16 invTopRightSlopeFP = qSafeFloatToQ16Dot16(qSafeDivide(1, topRightSlope)); - const Q16Dot16 invBottomLeftSlopeFP = FloatToQ16Dot16(1 / bottomLeftSlope); - const Q16Dot16 invBottomRightSlopeFP = FloatToQ16Dot16(1 / bottomRightSlope); + const Q16Dot16 invBottomLeftSlopeFP = qSafeFloatToQ16Dot16(qSafeDivide(1, bottomLeftSlope)); + const Q16Dot16 invBottomRightSlopeFP = qSafeFloatToQ16Dot16(qSafeDivide(1, bottomRightSlope)); if (d->antialiased) { const Q16Dot16 iTopFP = IntToQ16Dot16(int(topBound)); @@ -1137,10 +1166,10 @@ void QRasterizer::rasterizeLine(const QPointF &a, const QPointF &b, qreal width, int iBottom = bottom.y() < 0.5f? -1 : int(bottom.y() - 0.5f); int iMiddle = qMin(iLeft, iRight); - Q16Dot16 leftIntersectAf = FloatToQ16Dot16(top.x() + 0.5f + (iTop + 0.5f - top.y()) * topLeftSlope); - Q16Dot16 leftIntersectBf = FloatToQ16Dot16(left.x() + 0.5f + (iLeft + 1.5f - left.y()) * bottomLeftSlope); - Q16Dot16 rightIntersectAf = FloatToQ16Dot16(top.x() - 0.5f + (iTop + 0.5f - top.y()) * topRightSlope); - Q16Dot16 rightIntersectBf = FloatToQ16Dot16(right.x() - 0.5f + (iRight + 1.5f - right.y()) * bottomRightSlope); + Q16Dot16 leftIntersectAf = qSafeFloatToQ16Dot16(top.x() + 0.5f + (iTop + 0.5f - top.y()) * topLeftSlope); + Q16Dot16 leftIntersectBf = qSafeFloatToQ16Dot16(left.x() + 0.5f + (iLeft + 1.5f - left.y()) * bottomLeftSlope); + Q16Dot16 rightIntersectAf = qSafeFloatToQ16Dot16(top.x() - 0.5f + (iTop + 0.5f - top.y()) * topRightSlope); + Q16Dot16 rightIntersectBf = qSafeFloatToQ16Dot16(right.x() - 0.5f + (iRight + 1.5f - right.y()) * bottomRightSlope); int ny; int y = iTop; From 70cb5db4f219dd3e0e5fdffc4309c35b0195a017 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 11 Jun 2013 10:41:33 +0200 Subject: [PATCH 20/79] Fix gcc warnings about unused-value Fix multiple gcc warnings about statements in accessibleDebug arguments have no effect. Change-Id: I34bf05d911707f0b50592bf76442a3805c560d56 Reviewed-by: Friedemann Kleint Reviewed-by: Frederik Gladhorn --- .../platforms/windows/accessible/qwindowsmsaaaccessible.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h index d4f141c5d8..5b8d08d3c8 100644 --- a/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h +++ b/src/plugins/platforms/windows/accessible/qwindowsmsaaaccessible.h @@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE bool debug_accessibility(); # define accessibleDebug !debug_accessibility() ? (void)0 : qDebug #else -# define accessibleDebug +# define accessibleDebug while (false) qDebug #endif #ifndef QT_NO_DEBUG_OUTPUT From c47b66589341a07abb42ca913247cef51bfe624f Mon Sep 17 00:00:00 2001 From: Nico Vertriest Date: Tue, 11 Jun 2013 14:07:00 +0200 Subject: [PATCH 21/79] Qdoc: replaced example file qt.qdocconf with qtgui.qdocconf Task-number: QTBUG-31574 Change-Id: Idf8509395dd5f16c696473d1eeb91fb86f2b97e7 Reviewed-by: Martin Smith --- src/tools/qdoc/doc/files/qtgui.qdocconf | 50 +++++++++++++++++++++++++ src/tools/qdoc/doc/qdoc-manual.qdoc | 50 ++++++++----------------- 2 files changed, 65 insertions(+), 35 deletions(-) create mode 100644 src/tools/qdoc/doc/files/qtgui.qdocconf diff --git a/src/tools/qdoc/doc/files/qtgui.qdocconf b/src/tools/qdoc/doc/files/qtgui.qdocconf new file mode 100644 index 0000000000..5073dd7f0f --- /dev/null +++ b/src/tools/qdoc/doc/files/qtgui.qdocconf @@ -0,0 +1,50 @@ +include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) + +project = QtGui +description = Qt GUI Reference Documentation +url = http://qt-project.org/doc/qt-$QT_VER/qtgui +version = $QT_VERSION + +examplesinstallpath = gui + +qhp.projects = QtGui + +qhp.QtGui.file = qtgui.qhp +qhp.QtGui.namespace = org.qt-project.qtgui.$QT_VERSION_TAG +qhp.QtGui.virtualFolder = qtgui +qhp.QtGui.indexTitle = Qt GUI +qhp.QtGui.indexRoot = + +qhp.QtGui.filterAttributes = qtgui $QT_VERSION qtrefdoc +qhp.QtGui.customFilters.Qt.name = Qtgui $QT_VERSION +qhp.QtGui.customFilters.Qt.filterAttributes = qtgui $QT_VERSION + +qhp.QtGui.subprojects = classes +qhp.QtGui.subprojects.classes.title = C++ Classes +qhp.QtGui.subprojects.classes.indexTitle = Qt GUI C++ Classes +qhp.QtGui.subprojects.classes.selectors = class fake:headerfile +qhp.QtGui.subprojects.classes.sortPages = true + +tagfile = ../../../doc/qtgui/qtgui.tags + +depends += \ + qtcore \ + qtnetwork \ + qtopengl \ + qtsvg \ + qtqml \ + qtquick \ + qtwidgets \ + qtdoc + +headerdirs += .. + +sourcedirs += .. \ + ../../../examples/gui/doc/src + +exampledirs += ../../../examples/gui \ + snippets + +imagedirs += images \ + ../../../examples/gui/doc/images \ + ../../../doc/src/images \ diff --git a/src/tools/qdoc/doc/qdoc-manual.qdoc b/src/tools/qdoc/doc/qdoc-manual.qdoc index b715b200bf..4a4b1db6ff 100644 --- a/src/tools/qdoc/doc/qdoc-manual.qdoc +++ b/src/tools/qdoc/doc/qdoc-manual.qdoc @@ -66,7 +66,7 @@ \li \l {HTML Specific Configuration Variables} \li \l {Supporting Derived Projects} \li \l {Example Manifest Files} - \li \l {qt.qdocconf} + \li \l {qtgui.qdocconf} \li \l {minimum.qdocconf} \li \l {Generating DITA XML Output} \endlist @@ -7179,13 +7179,13 @@ \list \li A minimum configuration file: \l minimum.qdocconf - \li The Qt configuration file: \l qt.qdocconf + \li The Qt configuration file: \l qtgui.qdocconf \endlist */ /*! \page 21-1-minimum-qdocconf.html - \previouspage qt.qdocconf + \previouspage qtgui.qdocconf \contentspage QDoc Manual \nextpage Generating DITA XML Output @@ -7195,14 +7195,14 @@ */ /*! - \page 21-2-qt-qdocconf.html + \page 21-2-qtgui-qdocconf.html \previouspage Supporting Derived Projects \contentspage QDoc Manual \nextpage minimum.qdocconf - \title qt.qdocconf + \title qtgui.qdocconf - \quotefile files/qt.qdocconf + \quotefile files/qtgui.qdocconf */ /*! @@ -7548,10 +7548,9 @@ The general syntax is \tt {extraimages.\e{format} = \e image}. The file extension is optional. - For example, in \l qt.qdocconf we use a couple of images within - the HTML.postheader variable which value is pure HTML. For that - reason, these images are specified using the \c extraimages - variable: + For example, if additional images are used within the HTML.postheader + value, then these images must also be specified using the \c + extraimages variable: \code extraimages.HTML = qt-logo @@ -7819,7 +7818,7 @@ Currently, C++ is the only language that QDoc understands. It is also the default language, and doesn't really need to be - specified. But for example in \l qt.qdocconf: + specified. \code language = Cpp @@ -7889,7 +7888,7 @@ The \c outputdir variable specifies the directory where QDoc will put the generated documentation. - In qt.qdocconf: + For example: \code outputdir = $QTDIR/doc/html @@ -7972,8 +7971,6 @@ The \c sourcedirs variable specifies the directories containing the \c .cpp or \c .qdoc files used in the documentation. - For example in \l qt.qdocconf - \code sourcedirs = $QTDIR/src \ $QTDIR/doc/src \ @@ -8157,7 +8154,7 @@ The \c versionsym variable specifies a C++ preprocessor symbol that defines the version number of the documented software. - For example in \l qt.qdocconf: + For example: \code versionsym = QT_VERSION_STR @@ -8270,7 +8267,7 @@ Cpp.ignoredirectives} variables, non-standard constructs (typically macros) can result in erroneous documentation. - In \l qt.qdocconf: + For example: \code Cpp.ignoredirectives = Q_DECLARE_INTERFACE \ @@ -8324,8 +8321,6 @@ Cpp.ignoredirectives} variables, non-standard constructs (typically macros) can result in erroneous documentation. - In \l qt.qdocconf: - \code Cpp.ignoretokens = QAXFACTORY_EXPORT \ QM_EXPORT_CANVAS \ @@ -8389,18 +8384,12 @@ quotation marks. Note that if the value spans several lines, each line needs to be enclosed by quotation marks. - For example in \l qt.qdocconf: - \code HTML.footer = "


\n" \ ... "
" \endcode - The complete variable entry in \l qt.qdocconf provides the - standard footer of the \l {http://doc.qt.digia.com/4.0/index.html} - {Qt Reference Documentation}. - \target HTML.postheader-variable \section1 HTML.postheader @@ -8414,8 +8403,6 @@ marks. Note that if the value spans several lines, each line needs to be enclosed by quotation marks. - For example in \l qt.qdocconf: - \code HTML.postheader = "" \endcode - The complete variable entry in \l qt.qdocconf provides the - standard header of the \l {http://doc.qt.digia.com/} {Qt Reference Documentation}. \target HTML.style-variable @@ -8440,8 +8425,6 @@ marks. Note that if the value spans several lines, each line needs to be enclosed by quotation marks. - For example in \l qt.qdocconf: - \code HTML.style = "h3.fn,span.fn" \ "{ margin-left: 1cm; text-indent: -1cm; }\n" \ @@ -8473,7 +8456,7 @@ \endcode QDoc expects to find stylesheets in the directory containing the - \l qt.qdocconf file, and it will copy those specified to the output + \l qtgui.qdocconf file, and it will copy those specified to the output directory alongside the HTML pages. */ @@ -8565,7 +8548,7 @@ This feature makes use of the comprehensive indexes generated by QDoc when it creates the Qt reference documentation. - For example, \l qt.qdocconf (the configuration file for Qt) + For example, \l qtgui.qdocconf (the configuration file for Qt) contains the following variable definitions: \code @@ -8585,9 +8568,6 @@ In a mini-project, you can use an index file by defining an \l indexes configuration variable in your \c .qdocconf file. - For example, you can create a \c qtcreator.qdocconf file to help you - check the Qt Creator documentation: - \code project = QtCreator description = Qt Creator Manual From 80d24a737ac4f93eaabaab79e0c60c9da97d6eed Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Mon, 10 Jun 2013 16:56:42 -0400 Subject: [PATCH 22/79] Update support status for older Mac OS X platforms. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ifdf487fbae8acbffb32b6db5f8dd93e9eb213d77 Reviewed-by: Gabriel de Dietrich Reviewed-by: Tor Arne Vestbø --- src/corelib/global/qglobal.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 4598f60d5e..6f63a0d9d3 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -1050,9 +1050,9 @@ bool qSharedBuild() Q_DECL_NOTHROW \value MV_10_0 Mac OS X 10.0 (unsupported) \value MV_10_1 Mac OS X 10.1 (unsupported) \value MV_10_2 Mac OS X 10.2 (unsupported) - \value MV_10_3 Mac OS X 10.3 - \value MV_10_4 Mac OS X 10.4 - \value MV_10_5 Mac OS X 10.5 + \value MV_10_3 Mac OS X 10.3 (unsupported) + \value MV_10_4 Mac OS X 10.4 (unsupported) + \value MV_10_5 Mac OS X 10.5 (unsupported) \value MV_10_6 Mac OS X 10.6 \value MV_10_7 Mac OS X 10.7 \value MV_10_8 Mac OS X 10.8 From 3b5954e405cfbc3dcf1564d0e9e397825c5c1e5a Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Mon, 3 Jun 2013 18:28:03 +0200 Subject: [PATCH 23/79] Cocoa: Remove compilation warning Change-Id: Ib530e7ef4643de07aec91c4af0de8bbedef9882a Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm index c40ae3d81d..3ec6ad7a20 100644 --- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm +++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm @@ -113,6 +113,7 @@ static void cleanupCocoaApplicationDelegate() - (void)updateScreens:(NSNotification *)notification { + Q_UNUSED(notification); if (QCocoaIntegration *ci = dynamic_cast(QGuiApplicationPrivate::platformIntegration())) ci->updateScreens(); } From 7ee15bfbb815df87ae0526f105a13a591b192c76 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Mon, 3 Jun 2013 18:29:56 +0200 Subject: [PATCH 24/79] Cocoa: Make sure we update internal window fullscreen state We update the internal/synched state by assigning it its QWindow's state. Since that one is not a flag, it can only be in one state at a time, meaning that we may lose the maximized state (but we've been losing it for some time). Task-number: QTBUG-30139 Change-Id: Idf30713c6ae912cafe3bbdd7be18214cf4de34f7 Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/cocoa/qcocoawindow.h | 2 ++ src/plugins/platforms/cocoa/qcocoawindow.mm | 6 ++++++ src/plugins/platforms/cocoa/qnsview.mm | 13 +++++++++---- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h index 91eaea21b6..b82d096bb5 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.h +++ b/src/plugins/platforms/cocoa/qcocoawindow.h @@ -136,6 +136,8 @@ public: bool windowShouldClose(); bool windowIsPopupType(Qt::WindowType type = Qt::Widget) const; + void setSynchedWindowStateFromWindow(); + NSInteger windowLevel(Qt::WindowFlags flags); NSUInteger windowStyleMask(Qt::WindowFlags flags); void setWindowShadow(Qt::WindowFlags flags); diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index f8d0eafcb3..d9043979d6 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -725,6 +725,12 @@ bool QCocoaWindow::windowShouldClose() return accepted; } +void QCocoaWindow::setSynchedWindowStateFromWindow() +{ + if (QWindow *w = window()) + m_synchedWindowState = w->windowState(); +} + bool QCocoaWindow::windowIsPopupType(Qt::WindowType type) const { if (type == Qt::Widget) diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 10fb293ec0..529a0ccfe7 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -290,10 +290,15 @@ static QTouchDevice *touchDevice = 0; #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 if (QSysInfo::QSysInfo::MacintoshVersion >= QSysInfo::MV_10_7) { - if (notificationName == NSWindowDidEnterFullScreenNotification) { - QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowFullScreen); - } else if (notificationName == NSWindowDidExitFullScreenNotification) { - QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowNoState); + if (notificationName == NSWindowDidEnterFullScreenNotification + || notificationName == NSWindowDidExitFullScreenNotification) { + Qt::WindowState newState = notificationName == NSWindowDidEnterFullScreenNotification ? + Qt::WindowFullScreen : Qt::WindowNoState; + QWindowSystemInterface::handleWindowStateChanged(m_window, newState); + // We want to read the window state back from the window, + // but the event we just sent may be asynchronous. + QWindowSystemInterface::flushWindowSystemEvents(); + m_platformWindow->setSynchedWindowStateFromWindow(); } } #endif From b8c007ede01360594ec5399532f2229e82715cc3 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Mon, 3 Jun 2013 18:33:03 +0200 Subject: [PATCH 25/79] Cocoa: Update window state when maximizing from the title bar There's no NSWindow notification we can listen to, but we can override behavior from its delegate. Change-Id: I61cebf4119f83c770fe4e7f45ff0d4e8bf9d0df9 Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/cocoa/qnsview.h | 1 + src/plugins/platforms/cocoa/qnsview.mm | 10 ++++++++++ src/plugins/platforms/cocoa/qnswindowdelegate.h | 1 + src/plugins/platforms/cocoa/qnswindowdelegate.mm | 8 ++++++++ 4 files changed, 20 insertions(+) diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h index 85f72a4dbb..d28e38886b 100644 --- a/src/plugins/platforms/cocoa/qnsview.h +++ b/src/plugins/platforms/cocoa/qnsview.h @@ -82,6 +82,7 @@ QT_END_NAMESPACE - (void)drawRect:(NSRect)dirtyRect; - (void)updateGeometry; - (void)windowNotification : (NSNotification *) windowNotification; +- (void)notifyWindowWillZoom:(BOOL)willZoom; - (void)viewDidHide; - (void)viewDidUnhide; diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index 529a0ccfe7..ec53fc6a7e 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -306,6 +306,16 @@ static QTouchDevice *touchDevice = 0; } } +- (void)notifyWindowWillZoom:(BOOL)willZoom +{ + Qt::WindowState newState = willZoom ? Qt::WindowMaximized : Qt::WindowNoState; + QWindowSystemInterface::handleWindowStateChanged(m_window, newState); + // We want to read the window state back from the window, + // but the event we just sent may be asynchronous. + QWindowSystemInterface::flushWindowSystemEvents(); + m_platformWindow->setSynchedWindowStateFromWindow(); +} + - (void)viewDidHide { m_platformWindow->obscureWindow(); diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.h b/src/plugins/platforms/cocoa/qnswindowdelegate.h index 9a616ba8e8..06e11fffbb 100644 --- a/src/plugins/platforms/cocoa/qnswindowdelegate.h +++ b/src/plugins/platforms/cocoa/qnswindowdelegate.h @@ -57,6 +57,7 @@ - (void)windowDidMove:(NSNotification *)notification; - (void)windowWillMove:(NSNotification *)notification; - (BOOL)windowShouldClose:(NSNotification *)notification; +- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame; @end diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.mm b/src/plugins/platforms/cocoa/qnswindowdelegate.mm index 8e17936a78..10536bd5f4 100644 --- a/src/plugins/platforms/cocoa/qnswindowdelegate.mm +++ b/src/plugins/platforms/cocoa/qnswindowdelegate.mm @@ -90,4 +90,12 @@ return YES; } +- (BOOL)windowShouldZoom:(NSWindow *)window toFrame:(NSRect)newFrame +{ + Q_UNUSED(newFrame); + if (m_cocoaWindow && m_cocoaWindow->m_qtView) + [m_cocoaWindow->m_qtView notifyWindowWillZoom:![window isZoomed]]; + return YES; +} + @end From bfab741cb7ed24d2decfab4cffdcdbf14f6317ca Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Tue, 4 Jun 2013 13:54:07 +0200 Subject: [PATCH 26/79] Cocoa: Make sure internal minimized state is up to date Refactors some code from previous changes addressing the same issue for maximized and fullscreen states. Change-Id: I8a27274a90e6610b424ea7af3269369a1d724c48 Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/cocoa/qnsview.h | 1 + src/plugins/platforms/cocoa/qnsview.mm | 30 ++++++++++++++------------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h index d28e38886b..92215b9e67 100644 --- a/src/plugins/platforms/cocoa/qnsview.h +++ b/src/plugins/platforms/cocoa/qnsview.h @@ -81,6 +81,7 @@ QT_END_NAMESPACE - (void)invalidateWindowShadowIfNeeded; - (void)drawRect:(NSRect)dirtyRect; - (void)updateGeometry; +- (void)notifyWindowStateChanged:(Qt::WindowState)newState; - (void)windowNotification : (NSNotification *) windowNotification; - (void)notifyWindowWillZoom:(BOOL)willZoom; - (void)viewDidHide; diff --git a/src/plugins/platforms/cocoa/qnsview.mm b/src/plugins/platforms/cocoa/qnsview.mm index ec53fc6a7e..ab3f495a60 100644 --- a/src/plugins/platforms/cocoa/qnsview.mm +++ b/src/plugins/platforms/cocoa/qnsview.mm @@ -251,6 +251,15 @@ static QTouchDevice *touchDevice = 0; } } +- (void)notifyWindowStateChanged:(Qt::WindowState)newState +{ + QWindowSystemInterface::handleWindowStateChanged(m_window, newState); + // We want to read the window state back from the window, + // but the event we just sent may be asynchronous. + QWindowSystemInterface::flushWindowSystemEvents(); + m_platformWindow->setSynchedWindowStateFromWindow(); +} + - (void)windowNotification : (NSNotification *) windowNotification { //qDebug() << "windowNotification" << QCFString::toQString([windowNotification name]); @@ -269,10 +278,11 @@ static QTouchDevice *touchDevice = 0; if (!m_platformWindow->windowIsPopupType()) QWindowSystemInterface::handleWindowActivated(0); } - } else if (notificationName == NSWindowDidMiniaturizeNotification) { - QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowMinimized); - } else if (notificationName == NSWindowDidDeminiaturizeNotification) { - QWindowSystemInterface::handleWindowStateChanged(m_window, Qt::WindowNoState); + } else if (notificationName == NSWindowDidMiniaturizeNotification + || notificationName == NSWindowDidDeminiaturizeNotification) { + Qt::WindowState newState = notificationName == NSWindowDidMiniaturizeNotification ? + Qt::WindowMinimized : Qt::WindowNoState; + [self notifyWindowStateChanged:newState]; } else if ([notificationName isEqualToString: @"NSWindowDidOrderOffScreenNotification"]) { m_platformWindow->obscureWindow(); } else if ([notificationName isEqualToString: @"NSWindowDidOrderOnScreenAndFinishAnimatingNotification"]) { @@ -294,11 +304,7 @@ static QTouchDevice *touchDevice = 0; || notificationName == NSWindowDidExitFullScreenNotification) { Qt::WindowState newState = notificationName == NSWindowDidEnterFullScreenNotification ? Qt::WindowFullScreen : Qt::WindowNoState; - QWindowSystemInterface::handleWindowStateChanged(m_window, newState); - // We want to read the window state back from the window, - // but the event we just sent may be asynchronous. - QWindowSystemInterface::flushWindowSystemEvents(); - m_platformWindow->setSynchedWindowStateFromWindow(); + [self notifyWindowStateChanged:newState]; } } #endif @@ -309,11 +315,7 @@ static QTouchDevice *touchDevice = 0; - (void)notifyWindowWillZoom:(BOOL)willZoom { Qt::WindowState newState = willZoom ? Qt::WindowMaximized : Qt::WindowNoState; - QWindowSystemInterface::handleWindowStateChanged(m_window, newState); - // We want to read the window state back from the window, - // but the event we just sent may be asynchronous. - QWindowSystemInterface::flushWindowSystemEvents(); - m_platformWindow->setSynchedWindowStateFromWindow(); + [self notifyWindowStateChanged:newState]; } - (void)viewDidHide From d8f4abec711d7af4013209fd8b0c9edcedb44ab6 Mon Sep 17 00:00:00 2001 From: Gabriel de Dietrich Date: Wed, 5 Jun 2013 15:47:55 +0200 Subject: [PATCH 27/79] Cocoa: Make QWidget::showNormal() work on minimized windows Cocoa sets the NSWindow hidden when it's minimized, and we don't propagate that further to QWindow or QWidget (QWidget's 'visible' documentation is quite ambiguous about that state). The obvious fix is to check for QWindow's visibility. However, this might need to be corrected later if we truly want the visible state to be in sync. Task-number: QTBUG-31117 Change-Id: I457452eff75e6ea746a0ef5351104f8bbb65f98b Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/cocoa/qcocoawindow.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm index d9043979d6..19c4faf369 100644 --- a/src/plugins/platforms/cocoa/qcocoawindow.mm +++ b/src/plugins/platforms/cocoa/qcocoawindow.mm @@ -486,7 +486,7 @@ void QCocoaWindow::setWindowFlags(Qt::WindowFlags flags) void QCocoaWindow::setWindowState(Qt::WindowState state) { - if ([m_nsWindow isVisible]) + if (window()->isVisible()) syncWindowState(state); // Window state set for hidden windows take effect when show() is called. } From e2765098db18a7570b04fe3e30ded728aa97120a Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 11 Jun 2013 16:23:24 +0200 Subject: [PATCH 28/79] don't claim that we need perl for shadow builds any more amends 0a1b89bff, which took care only of the unix version. Change-Id: Idb82881a9c47e67c973500721fd499bcf41a848b Reviewed-by: Joerg Bornemann --- tools/configure/configureapp.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 98b59ab6fd..f92fad1d69 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -151,12 +151,6 @@ Configure::Configure(int& argc, char** argv) const QString installPath = buildPath; #endif if (sourceDir != buildDir) { //shadow builds! - if (QStandardPaths::findExecutable(QStringLiteral("perl.exe")).isEmpty()) { - cout << "Error: Creating a shadow build of Qt requires" << endl - << "perl to be in the PATH environment"; - exit(0); // Exit cleanly for Ctrl+C - } - cout << "Preparing build tree..." << endl; QDir(buildPath).mkpath("bin"); From aa3f1cc8c6a15e29b592a46252a78c571262928d Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 10 Jun 2013 11:37:55 +0200 Subject: [PATCH 29/79] fix QMAKE_COMPILER fallback for clang specs in the actual specs, we also set 'gcc' for clang. Change-Id: Ifc6b27d56596f34c944205795d665f545d090f80 Reviewed-by: Joerg Bornemann Reviewed-by: Jake Petroules --- mkspecs/features/spec_post.prf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkspecs/features/spec_post.prf b/mkspecs/features/spec_post.prf index 46a512bf17..c9e9f8b2f6 100644 --- a/mkspecs/features/spec_post.prf +++ b/mkspecs/features/spec_post.prf @@ -42,7 +42,7 @@ isEmpty(QMAKE_COMPILER) { else:*-llvm*: \ QMAKE_COMPILER = gcc llvm else:*-clang*: \ - QMAKE_COMPILER = clang llvm + QMAKE_COMPILER = gcc clang llvm else:*-msvc*: \ QMAKE_COMPILER = msvc else: \ From 7f6c864157d63091e351fd0f11c1b2408969a670 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 11 Jun 2013 15:38:52 +0200 Subject: [PATCH 30/79] remove overquoting of extra compiler commands the commands are already quoted appropriately for the shell. Change-Id: I746bb5fba2cd6548c5dc7ef81087c69a200ecbb8 Reviewed-by: Joerg Bornemann --- mkspecs/features/resources.prf | 4 ++-- mkspecs/features/uic.prf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mkspecs/features/resources.prf b/mkspecs/features/resources.prf index ed44d9c308..5092362b44 100644 --- a/mkspecs/features/resources.prf +++ b/mkspecs/features/resources.prf @@ -18,8 +18,8 @@ resource_combine { QMAKE_RESOURCE_FLAGS += -name ${QMAKE_FILE_BASE} } } -rcc.commands = "$$QMAKE_RCC" $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}" -o "${QMAKE_FILE_OUT}" -rcc.depend_command = "$$QMAKE_RCC" -list $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}" +rcc.commands = $$QMAKE_RCC $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}" -o "${QMAKE_FILE_OUT}" +rcc.depend_command = $$QMAKE_RCC -list $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}" rcc.CONFIG += add_inputs_as_makefile_deps rcc.input = RESOURCES rcc.variable_out = SOURCES diff --git a/mkspecs/features/uic.prf b/mkspecs/features/uic.prf index 36ec185f7b..6d85443200 100644 --- a/mkspecs/features/uic.prf +++ b/mkspecs/features/uic.prf @@ -4,7 +4,7 @@ isEmpty(UI_DIR):UI_DIR = . isEmpty(QMAKE_MOD_UIC):QMAKE_MOD_UIC = ui_ uic.commands = $$QMAKE_UIC ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} -uic.depend_command = "$$QMAKE_UIC" -d "${QMAKE_FILE_IN}" +uic.depend_command = $$QMAKE_UIC -d "${QMAKE_FILE_IN}" uic.output = $$UI_DIR/$${QMAKE_MOD_UIC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_H)} uic.input = FORMS uic.variable_out = GENERATED_FILES From 6bf5ef044f12bd4ac2bcb608365162334cb50252 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 11 Jun 2013 15:45:44 +0200 Subject: [PATCH 31/79] remove overquoting of extra compiler arguments qmake automatically escapes the ${expandos}. Change-Id: If74b6d2f2c68ff50785fdcbb66351122a273051f Reviewed-by: Joerg Bornemann --- mkspecs/features/resources.prf | 6 +++--- mkspecs/features/uic.prf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mkspecs/features/resources.prf b/mkspecs/features/resources.prf index 5092362b44..34a04b4ee2 100644 --- a/mkspecs/features/resources.prf +++ b/mkspecs/features/resources.prf @@ -18,11 +18,11 @@ resource_combine { QMAKE_RESOURCE_FLAGS += -name ${QMAKE_FILE_BASE} } } -rcc.commands = $$QMAKE_RCC $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}" -o "${QMAKE_FILE_OUT}" -rcc.depend_command = $$QMAKE_RCC -list $$QMAKE_RESOURCE_FLAGS "${QMAKE_FILE_IN}" +rcc.commands = $$QMAKE_RCC $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} +rcc.depend_command = $$QMAKE_RCC -list $$QMAKE_RESOURCE_FLAGS ${QMAKE_FILE_IN} rcc.CONFIG += add_inputs_as_makefile_deps rcc.input = RESOURCES rcc.variable_out = SOURCES rcc.name = RCC ${QMAKE_FILE_IN} -silent:rcc.commands = @echo rcc "${QMAKE_FILE_IN}" && $$rcc.commands +silent:rcc.commands = @echo rcc ${QMAKE_FILE_IN} && $$rcc.commands QMAKE_EXTRA_COMPILERS += rcc diff --git a/mkspecs/features/uic.prf b/mkspecs/features/uic.prf index 6d85443200..83e579cb3a 100644 --- a/mkspecs/features/uic.prf +++ b/mkspecs/features/uic.prf @@ -4,7 +4,7 @@ isEmpty(UI_DIR):UI_DIR = . isEmpty(QMAKE_MOD_UIC):QMAKE_MOD_UIC = ui_ uic.commands = $$QMAKE_UIC ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT} -uic.depend_command = $$QMAKE_UIC -d "${QMAKE_FILE_IN}" +uic.depend_command = $$QMAKE_UIC -d ${QMAKE_FILE_IN} uic.output = $$UI_DIR/$${QMAKE_MOD_UIC}${QMAKE_FILE_BASE}$${first(QMAKE_EXT_H)} uic.input = FORMS uic.variable_out = GENERATED_FILES From 2d9cd8eef8652873e73d5cde6b6545eea9a17612 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 12 Jun 2013 09:37:46 +0200 Subject: [PATCH 32/79] Fix xkbcommon.pri not to override QMAKE_CFLAGS Task-number: QTBUG-31585 Change-Id: I6628a8eececc34aef4cd358ad2c8b246d8845602 Reviewed-by: Jani Heikkinen Reviewed-by: Andy Shaw --- src/3rdparty/xkbcommon.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/3rdparty/xkbcommon.pri b/src/3rdparty/xkbcommon.pri index 99536576f7..d437c6b8b6 100644 --- a/src/3rdparty/xkbcommon.pri +++ b/src/3rdparty/xkbcommon.pri @@ -1,4 +1,4 @@ -QMAKE_CFLAGS = -std=gnu99 -w +QMAKE_CFLAGS += -std=gnu99 -w INCLUDEPATH += $$PWD/xkbcommon $$PWD/xkbcommon/src $$PWD/xkbcommon/src/xkbcomp DEFINES += DFLT_XKB_CONFIG_ROOT='\\"/usr/share/X11/xkb\\"' From 5fc98982372444a745ff888cb5c2f4fbce5c358f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 13 Jun 2013 12:13:07 +0200 Subject: [PATCH 33/79] Fix format in platform plugin loading error reporting. qguiapplication.cpp:792:133: warning: format not a string literal and no format arguments [-Wformat-security]. Introduced by 0d7d53fd46e8ab512bed88d0dab114cfada227ce . Change-Id: I70268a8b597be33226efb9bb4d7d9f672f0d7440 Reviewed-by: Kai Koehne --- src/gui/kernel/qguiapplication.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 3c3cea2910..add1c1f90b 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -789,7 +789,7 @@ static void init_platform(const QString &pluginArgument, const QString &platform fatalMessage += QStringLiteral("Available platforms are: %1\n").arg( keys.join(QStringLiteral(", "))); fatalMessage += QStringLiteral("GUI applications require a platform plugin. Terminating."); - qFatal(qPrintable(fatalMessage)); + qFatal("%s", qPrintable(fatalMessage)); return; } From 46667d604fb2ae11a87c0c075a3d2468d02f7bdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Tue, 11 Jun 2013 15:05:13 +0200 Subject: [PATCH 34/79] Fix crash when re-creating QThreadData after initially destroying it We destroy the thread data for the main thread when the QCoreApplication is destructed, and then delete the pthread key for the thread data in the global static destructor function 'destroy_current_thread_data_key'. The user may have its own Q_DESTRUCTOR_FUNCTION though, which may or may not run after we've destroyed the key. If it runs after we've destroyed the key, we'll end up trying to re-create the tread-data, as expected, but set_thread_data() will fail to persist it, as pthread_setspecific is called with an invalid key. The result is an infinite recursion: ... 6 in QThreadData::current () at qthread_unix.cpp:216 7 in QObject::QObject (this=0x48e1b30, dd=@0x48e1b40, parent=0x0) at qobject.cpp:703 8 in QThread::QThread (this=0x48e1b30, dd=@0x48e1b40, parent=0x0) at qthread.cpp:396 9 in QAdoptedThread::QAdoptedThread (this=0x48e1b30, data=0x48e1af0) at qthread.cpp:120 10 in QAdoptedThread::QAdoptedThread (this=0x48e1b30, data=0x48e1af0) at qthread.cpp:130 11 in QThreadData::current () at qthread_unix.cpp:219 12 in QObject::QObject (this=0x48e1a20, dd=@0x48e1a30, parent=0x0) at qobject.cpp:703 ... To solve this, we reset current_thread_data_once when destroying the key, so that subsequent calls to pthread_once to potentially create the key will call create_current_thread_data_key once more. This means we'll leak the key for this particular use-case, since we don't end up calling pthread_key_delete a second time, but this leak is small and happens typically only for a short duration during application shutdown. Change-Id: I580484a3239849e891172e24e7f77b75afd2c51b Reviewed-by: Olivier Goffart Reviewed-by: Thiago Macieira --- src/corelib/thread/qthread_unix.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/corelib/thread/qthread_unix.cpp b/src/corelib/thread/qthread_unix.cpp index f123e1813b..be9b946990 100644 --- a/src/corelib/thread/qthread_unix.cpp +++ b/src/corelib/thread/qthread_unix.cpp @@ -172,6 +172,12 @@ static void destroy_current_thread_data_key() { pthread_once(¤t_thread_data_once, create_current_thread_data_key); pthread_key_delete(current_thread_data_key); + + // Reset current_thread_data_once in case we end up recreating + // the thread-data in the rare case of QObject construction + // after destroying the QThreadData. + pthread_once_t pthread_once_init = PTHREAD_ONCE_INIT; + current_thread_data_once = pthread_once_init; } Q_DESTRUCTOR_FUNCTION(destroy_current_thread_data_key) From 6a9333841d9d5233b0457ec6f0da5bdacda8ea5b Mon Sep 17 00:00:00 2001 From: Rafael Roquetto Date: Mon, 3 Jun 2013 15:09:12 -0300 Subject: [PATCH 35/79] BlackBerry: fix delayed root window posting on OpenGL The delayed root window posting introduced by 77a06e7e6c517003 broke the OpenGL support. In that patch, the posting of the root window is trigerred by QQnxRasterRasterBackingStore's call to QQnxWindow::post(), that obviously does not happen when OpenGL is enabled, therefore requiring the OpenGL context to explicitly post() the root window. Change-Id: Ifd302c1dde612a03b79c778ec4586aa70f88260d Reviewed-by: Sean Harmer --- src/plugins/platforms/qnx/qqnxglcontext.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/platforms/qnx/qqnxglcontext.cpp b/src/plugins/platforms/qnx/qqnxglcontext.cpp index 005b6d272a..ed959467ff 100644 --- a/src/plugins/platforms/qnx/qqnxglcontext.cpp +++ b/src/plugins/platforms/qnx/qqnxglcontext.cpp @@ -315,6 +315,9 @@ void QQnxGLContext::createSurface(QPlatformSurface *surface) } platformWindow->setBufferSize(surfaceSize); + // Post root window, in case it hasn't been posted yet, to make it appear. + platformWindow->screen()->onWindowPost(platformWindow); + // Obtain the native handle for our window screen_window_t handle = platformWindow->nativeHandle(); From 686c94c892006a3e72291ca8971aabf18ea1ec85 Mon Sep 17 00:00:00 2001 From: El Mehdi Fekari Date: Wed, 12 Jun 2013 16:54:07 +0200 Subject: [PATCH 36/79] QSystemLocale: Fix the time format on BlackBerry 10 The time format should depend on the device settings (24 hour format) Change-Id: I452d9b7158d39c4a657adfd9e64c99549eeda4ff Reviewed-by: Oswald Buddenhagen Reviewed-by: Rafael Roquetto --- src/corelib/tools/qlocale_blackberry.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/corelib/tools/qlocale_blackberry.cpp b/src/corelib/tools/qlocale_blackberry.cpp index 6d60a97062..e2dfa6c801 100644 --- a/src/corelib/tools/qlocale_blackberry.cpp +++ b/src/corelib/tools/qlocale_blackberry.cpp @@ -289,9 +289,9 @@ QVariant QSystemLocale::query(QueryType type, QVariant in) const case DateToStringShort: return lc_region.toString(in.toDate(), QLocale::ShortFormat); case TimeToStringLong: - return lc_region.toString(in.toTime(), QLocale::LongFormat); + return lc_region.toString(in.toTime(), d->timeFormat(QLocale::LongFormat).toString()); case TimeToStringShort: - return lc_region.toString(in.toTime(), QLocale::ShortFormat); + return lc_region.toString(in.toTime(), d->timeFormat(QLocale::ShortFormat).toString()); case DateTimeToStringShort: return lc_region.toString(in.toDateTime(), d->dateTimeFormat(QLocale::ShortFormat).toString()); case DateTimeToStringLong: From af2deb85caa5e179ce1bd6b7031af757eadc3ba9 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 14 Jun 2013 14:09:23 +0200 Subject: [PATCH 37/79] Add object names to QGLWidget-reparenting test. Task-number: QTBUG-31762 Change-Id: I213b4f17aa04cc99df7183df547a52c2c2a68626 Reviewed-by: Shawn Rutledge --- tests/auto/opengl/qgl/tst_qgl.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/auto/opengl/qgl/tst_qgl.cpp b/tests/auto/opengl/qgl/tst_qgl.cpp index 28ec699427..3fc89acb67 100644 --- a/tests/auto/opengl/qgl/tst_qgl.cpp +++ b/tests/auto/opengl/qgl/tst_qgl.cpp @@ -1309,14 +1309,17 @@ void tst_QGL::glWidgetReparent() { // Try it as a top-level first: GLWidget *widget = new GLWidget; + widget->setObjectName(QStringLiteral("glWidget1")); widget->setGeometry(0, 0, 200, 30); widget->show(); QWidget grandParentWidget; + grandParentWidget.setObjectName(QStringLiteral("grandParentWidget")); grandParentWidget.setPalette(Qt::blue); QVBoxLayout grandParentLayout(&grandParentWidget); QWidget parentWidget(&grandParentWidget); + parentWidget.setObjectName(QStringLiteral("parentWidget")); grandParentLayout.addWidget(&parentWidget); parentWidget.setPalette(Qt::green); parentWidget.setAutoFillBackground(true); @@ -1348,6 +1351,7 @@ void tst_QGL::glWidgetReparent() // Now do pretty much the same thing, but don't show the // widget first: widget = new GLWidget; + widget->setObjectName(QStringLiteral("glWidget2")); parentLayout.addWidget(widget); QVERIFY(QTest::qWaitForWindowExposed(&grandParentWidget)); From d57d184b6d18deab172ac400b9db973e6aacab21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Mon, 6 May 2013 10:26:38 +0200 Subject: [PATCH 38/79] Add basic conversion functions from QVariant(QJsonValue). There is a mismatch how QML and C++ converts QJsonValue. This patch unifies conversions by adding QJsonValue support in QVariant::convert(). Change-Id: I8a1db3d77c517945ef48064b4b66ba03aa4f2fd0 Reviewed-by: Frederik Gladhorn --- src/corelib/kernel/qvariant.cpp | 48 +++++++++++++++++++ .../corelib/kernel/qvariant/tst_qvariant.cpp | 42 ++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index bae4a837a0..276257ddcf 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -162,6 +162,10 @@ static qlonglong qMetaTypeNumber(const QVariant::Private *d) return qRound64(d->data.f); case QVariant::Double: return qRound64(d->data.d); +#ifndef QT_BOOTSTRAPPED + case QMetaType::QJsonValue: + return v_cast(d)->toDouble(); +#endif } Q_ASSERT(false); return 0; @@ -206,12 +210,14 @@ static qlonglong qConvertToNumber(const QVariant::Private *d, bool *ok) case QMetaType::Long: case QMetaType::Float: case QMetaType::LongLong: + case QMetaType::QJsonValue: return qMetaTypeNumber(d); case QVariant::ULongLong: case QVariant::UInt: case QMetaType::UChar: case QMetaType::UShort: case QMetaType::ULong: + return qlonglong(qMetaTypeUNumber(d)); } @@ -240,6 +246,7 @@ static qulonglong qConvertToUnsignedNumber(const QVariant::Private *d, bool *ok) case QMetaType::Long: case QMetaType::Float: case QMetaType::LongLong: + case QMetaType::QJsonValue: return qulonglong(qMetaTypeNumber(d)); case QVariant::ULongLong: case QVariant::UInt: @@ -340,6 +347,9 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) case QVariant::Url: *str = v_cast(d)->toString(); break; + case QMetaType::QJsonValue: + *str = v_cast(d)->toString(); + break; #endif case QVariant::Uuid: *str = v_cast(d)->toString(); @@ -580,6 +590,11 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) case QMetaType::ULong: *b = qMetaTypeUNumber(d) != Q_UINT64_C(0); break; +#ifndef QT_BOOTSTRAPPED + case QMetaType::QJsonValue: + *b = v_cast(d)->toBool(); + break; +#endif default: *b = false; return false; @@ -616,6 +631,11 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) case QMetaType::ULong: *f = double(qMetaTypeUNumber(d)); break; +#ifndef QT_BOOTSTRAPPED + case QMetaType::QJsonValue: + *f = v_cast(d)->toDouble(); + break; +#endif default: *f = 0.0; return false; @@ -652,6 +672,11 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) case QMetaType::ULong: *f = float(qMetaTypeUNumber(d)); break; +#ifndef QT_BOOTSTRAPPED + case QMetaType::QJsonValue: + *f = v_cast(d)->toDouble(); + break; +#endif default: *f = 0.0f; return false; @@ -2731,6 +2756,29 @@ bool QVariant::canConvert(int targetTypeId) const if (targetTypeId >= QMetaType::User) return canConvertMetaObject(currentType, targetTypeId, d.data.o); + if (currentType == QMetaType::QJsonValue) { + switch (targetTypeId) { + case QMetaType::QString: + case QMetaType::Bool: + case QMetaType::Int: + case QMetaType::UInt: + case QMetaType::Double: + case QMetaType::Float: + case QMetaType::ULong: + case QMetaType::Long: + case QMetaType::LongLong: + case QMetaType::ULongLong: + case QMetaType::UShort: + case QMetaType::UChar: + case QMetaType::Char: + case QMetaType::SChar: + case QMetaType::Short: + return true; + default: + return false; + } + } + // FIXME It should be LastCoreType intead of Uuid if (currentType > int(QMetaType::QUuid) || targetTypeId > int(QMetaType::QUuid)) { switch (uint(targetTypeId)) { diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index 62b894178e..4d862f4fc5 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -142,6 +142,9 @@ private slots: void toDouble_data(); void toDouble(); + void toFloat_data(); + void toFloat(); + void toPointF_data(); void toPointF(); @@ -456,6 +459,9 @@ void tst_QVariant::canConvert_data() var = QVariant::fromValue(-1); QTest::newRow("SChar") << var << N << N << Y << N << Y << N << N << N << N << Y << N << N << Y << N << N << N << Y << N << N << N << N << N << N << N << N << N << Y << N << N << Y << Y; + var = QVariant::fromValue(QJsonValue(QStringLiteral("hello"))); + QTest::newRow("JsonValue") + << var << N << N << Y << N << N << N << N << N << N << Y << N << N << Y << N << N << N << Y << N << N << N << N << N << N << N << N << N << Y << N << N << Y << Y; #undef N #undef Y @@ -511,6 +517,7 @@ void tst_QVariant::toInt_data() bytearray[2] = '0'; bytearray[3] = '0'; QTest::newRow( "QByteArray2" ) << QVariant( bytearray ) << 4500 << true; + QTest::newRow("QJsonValue") << QVariant(QJsonValue(321)) << 321 << true; } void tst_QVariant::toInt() @@ -557,6 +564,7 @@ void tst_QVariant::toUInt_data() bytearray[2] = '2'; bytearray[3] = '1'; QTest::newRow( "QByteArray" ) << QVariant( bytearray ) << (uint)4321 << true; + QTest::newRow("QJsonValue") << QVariant(QJsonValue(321)) << (uint)321 << true; } void tst_QVariant::toUInt() @@ -742,6 +750,8 @@ void tst_QVariant::toBool_data() QTest::newRow( "ulonglong1" ) << QVariant( (qulonglong)1 ) << true; QTest::newRow( "QChar" ) << QVariant(QChar('a')) << true; QTest::newRow( "Null_QChar" ) << QVariant(QChar(0)) << false; + QTest::newRow("QJsonValue(true)") << QVariant(QJsonValue(true)) << true; + QTest::newRow("QJsonValue(false)") << QVariant(QJsonValue(false)) << false; } void tst_QVariant::toBool() @@ -805,6 +815,7 @@ void tst_QVariant::toDouble_data() bytearray[2] = '.'; bytearray[3] = '1'; QTest::newRow( "bytearray" ) << QVariant( bytearray ) << 32.1 << true; + QTest::newRow("QJsonValue") << QVariant(QJsonValue(32.1)) << 32.1 << true; } void tst_QVariant::toDouble() @@ -820,6 +831,34 @@ void tst_QVariant::toDouble() QVERIFY( ok == valueOK ); } +void tst_QVariant::toFloat_data() +{ + QTest::addColumn("value"); + QTest::addColumn("result"); + QTest::addColumn("valueOK"); + + QByteArray bytearray(4, ' '); + bytearray[0] = '3'; + bytearray[1] = '2'; + bytearray[2] = '.'; + bytearray[3] = '1'; + QTest::newRow("QByteArray") << QVariant(bytearray) << float(32.1) << true; + QTest::newRow("QJsonValue") << QVariant(QJsonValue(32.1)) << float(32.1) << true; +} + +void tst_QVariant::toFloat() +{ + QFETCH(QVariant, value ); + QFETCH(float, result); + QFETCH(bool, valueOK); + QVERIFY(value.isValid()); + QVERIFY(value.canConvert(QMetaType::Float)); + bool ok; + float d = value.toFloat(&ok); + QCOMPARE(d, result); + QVERIFY(ok == valueOK); +} + void tst_QVariant::toLongLong_data() { QTest::addColumn("value"); @@ -843,6 +882,7 @@ void tst_QVariant::toLongLong_data() bytearray[2] = '0'; bytearray[3] = '0'; QTest::newRow( "QByteArray" ) << QVariant( bytearray ) << (qlonglong) 3200 << true; + QTest::newRow("QJsonValue") << QVariant(QJsonValue(321)) << (qlonglong)321 << true; } void tst_QVariant::toLongLong() @@ -887,6 +927,7 @@ void tst_QVariant::toULongLong_data() bytearray[2] = '0'; bytearray[3] = '1'; QTest::newRow( "QByteArray" ) << QVariant( bytearray ) << (qulonglong) 3201 << true; + QTest::newRow("QJsonValue") << QVariant(QJsonValue(321)) << (qulonglong)321 << true; } void tst_QVariant::toULongLong() @@ -953,6 +994,7 @@ void tst_QVariant::toString_data() QTest::newRow( "qdatetime" ) << QVariant( QDateTime( QDate( 2002, 1, 1 ), QTime( 12, 34, 56 ) ) ) << QString( "2002-01-01T12:34:56" ); QTest::newRow( "llong" ) << QVariant( (qlonglong)Q_INT64_C(123456789012) ) << QString( "123456789012" ); + QTest::newRow("QJsonValue") << QVariant(QJsonValue(QString("hello"))) << QString("hello"); } void tst_QVariant::toString() From 2e49b795645908079ec19c28f4ca025084d137ef Mon Sep 17 00:00:00 2001 From: Dominik Holland Date: Thu, 13 Jun 2013 15:23:04 +0200 Subject: [PATCH 39/79] Read SingleClickActivation from KDE settings file Change-Id: Ia2ccea89cefb85a7641628d32f925b32ecd6bdc6 Reviewed-by: J-P Nurmi Reviewed-by: Jens Bache-Wiig --- .../themes/genericunix/qgenericunixthemes.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp index cabddcc815..be21e39ecd 100644 --- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp +++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp @@ -164,6 +164,7 @@ public: , kdeVersion(kdeVersion) , toolButtonStyle(Qt::ToolButtonTextBesideIcon) , toolBarIconSize(0) + , singleClick(true) { } QString globalSettingsFile() const @@ -186,6 +187,7 @@ public: QStringList styleNames; int toolButtonStyle; int toolBarIconSize; + bool singleClick; }; void QKdeThemePrivate::refresh() @@ -217,6 +219,8 @@ void QKdeThemePrivate::refresh() styleNames.push_front(style); } + singleClick = kdeSettings.value(QStringLiteral("KDE/SingleClick"), true).toBool(); + const QVariant themeValue = kdeSettings.value(QStringLiteral("Icons/Theme")); if (themeValue.isValid()) iconThemeName = themeValue.toString(); @@ -360,6 +364,8 @@ QVariant QKdeTheme::themeHint(QPlatformTheme::ThemeHint hint) const return QVariant(d->styleNames); case QPlatformTheme::KeyboardScheme: return QVariant(int(KdeKeyboardScheme)); + case QPlatformTheme::ItemViewActivateItemOnSingleClick: + return QVariant(d->singleClick); default: break; } From bd4f92969af2b8b11dcd631d408550a858a63f8a Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Thu, 13 Jun 2013 19:42:32 +0200 Subject: [PATCH 40/79] QKdeTheme: generate sensible disabled colors for the system palette Task-number: QTBUG-31670 Change-Id: Icbd2f35d9c2f5c1ef05c9dfeae4922be01ff2751 Reviewed-by: Dominik Holland Reviewed-by: Jens Bache-Wiig --- .../themes/genericunix/qgenericunixthemes.cpp | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp index be21e39ecd..fdd45a49c5 100644 --- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp +++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp @@ -265,6 +265,14 @@ static inline bool kdeColor(QPalette *pal, QPalette::ColorRole role, void QKdeThemePrivate::readKdeSystemPalette(const QSettings &kdeSettings, QPalette *pal) { + if (!kdeSettings.contains(QStringLiteral("Colors:Button/BackgroundNormal"))) { + // kcolorscheme.cpp: SetDefaultColors + const QColor defaultWindowBackground(214, 210, 208); + const QColor defaultButtonBackground(223, 220, 217); + *pal = QPalette(defaultButtonBackground, defaultWindowBackground); + return; + } + kdeColor(pal, QPalette::Button, kdeSettings, QStringLiteral("Colors:Button/BackgroundNormal")); kdeColor(pal, QPalette::Window, kdeSettings, QStringLiteral("Colors:Window/BackgroundNormal")); kdeColor(pal, QPalette::Text, kdeSettings, QStringLiteral("Colors:View/ForegroundNormal")); @@ -276,6 +284,34 @@ void QKdeThemePrivate::readKdeSystemPalette(const QSettings &kdeSettings, QPalet kdeColor(pal, QPalette::ButtonText, kdeSettings, QStringLiteral("Colors:Button/ForegroundNormal")); kdeColor(pal, QPalette::Link, kdeSettings, QStringLiteral("Colors:View/ForegroundLink")); kdeColor(pal, QPalette::LinkVisited, kdeSettings, QStringLiteral("Colors:View/ForegroundVisited")); + kdeColor(pal, QPalette::ToolTipBase, kdeSettings, QStringLiteral("Colors:Tooltip/BackgroundNormal")); + kdeColor(pal, QPalette::ToolTipText, kdeSettings, QStringLiteral("Colors:Tooltip/ForegroundNormal")); + + // The above code sets _all_ color roles to "normal" colors. In KDE, the disabled + // color roles are calculated by applying various effects described in kdeglobals. + // We use a bit simpler approach here, similar logic than in qt_palette_from_color(). + const QColor button = pal->color(QPalette::Button); + int h, s, v; + button.getHsv(&h, &s, &v); + + const QBrush whiteBrush = QBrush(Qt::white); + const QBrush buttonBrush = QBrush(button); + const QBrush buttonBrushDark = QBrush(button.darker(v > 128 ? 200 : 50)); + const QBrush buttonBrushDark150 = QBrush(button.darker(v > 128 ? 150 : 75)); + const QBrush buttonBrushLight150 = QBrush(button.lighter(v > 128 ? 150 : 75)); + + pal->setBrush(QPalette::Disabled, QPalette::WindowText, buttonBrushDark); + pal->setBrush(QPalette::Disabled, QPalette::ButtonText, buttonBrushDark); + pal->setBrush(QPalette::Disabled, QPalette::Button, buttonBrush); + pal->setBrush(QPalette::Disabled, QPalette::Light, buttonBrushLight150); + pal->setBrush(QPalette::Disabled, QPalette::Dark, buttonBrushDark); + pal->setBrush(QPalette::Disabled, QPalette::Mid, buttonBrushDark150); + pal->setBrush(QPalette::Disabled, QPalette::Text, buttonBrushDark); + pal->setBrush(QPalette::Disabled, QPalette::BrightText, whiteBrush); + pal->setBrush(QPalette::Disabled, QPalette::Base, buttonBrush); + pal->setBrush(QPalette::Disabled, QPalette::Window, buttonBrush); + pal->setBrush(QPalette::Disabled, QPalette::Highlight, buttonBrushDark150); + pal->setBrush(QPalette::Disabled, QPalette::HighlightedText, buttonBrushLight150); } /*! From c492b2bffa70ce12af71ac585c2ec58bcface8f7 Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Sun, 14 Apr 2013 00:05:34 +0900 Subject: [PATCH 41/79] Make qtbase compile with QT_NO_XMLSTREAMREADER D-Bus depends on QXmlStreamReader instead of QDom Change-Id: Ic435970af21ac6e45c4100359ff54bd5793ccce2 Reviewed-by: Thiago Macieira Reviewed-by: Oswald Buddenhagen --- src/corelib/global/qfeatures.h | 10 +++++----- src/corelib/global/qfeatures.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/corelib/global/qfeatures.h b/src/corelib/global/qfeatures.h index 4534e9bf13..2cadea59c1 100644 --- a/src/corelib/global/qfeatures.h +++ b/src/corelib/global/qfeatures.h @@ -391,11 +391,6 @@ #define QT_NO_CONTEXTMENU #endif -// Qt D-Bus module -#if !defined(QT_NO_DBUS) && (defined(QT_NO_PROPERTIES) || defined(QT_NO_DOM)) -#define QT_NO_DBUS -#endif - // QPrinter #if !defined(QT_NO_PRINTER) && (defined(QT_NO_PICTURE) || defined(QT_NO_TEMPORARYFILE)) #define QT_NO_PRINTER @@ -451,6 +446,11 @@ #define QT_NO_BEARERMANAGEMENT #endif +// Qt D-Bus module +#if !defined(QT_NO_DBUS) && (defined(QT_NO_PROPERTIES) || defined(QT_NO_XMLSTREAMREADER)) +#define QT_NO_DBUS +#endif + // QGraphicsView #if !defined(QT_NO_GRAPHICSVIEW) && (defined(QT_NO_SCROLLAREA)) #define QT_NO_GRAPHICSVIEW diff --git a/src/corelib/global/qfeatures.txt b/src/corelib/global/qfeatures.txt index 61a3df39f3..814e95c256 100644 --- a/src/corelib/global/qfeatures.txt +++ b/src/corelib/global/qfeatures.txt @@ -1102,7 +1102,7 @@ SeeAlso: ??? Feature: DBUS Description: Provides classes for D-Bus. Section: D-Bus -Requires: PROPERTIES DOM +Requires: PROPERTIES XMLSTREAMREADER Name: Qt D-Bus module SeeAlso: ??? From 570cf51919515c4e49b3dfa3723ea154ae04fd73 Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Thu, 6 Jun 2013 11:55:56 +0200 Subject: [PATCH 42/79] Fix for OS X QFileDialog showing bundle as directory Also check if the selectedFile is a bundle to correctly set currentDir. Patch for Qt 4.8 has been submitted Task-number: QTBUG-31562 Change-Id: I72b0e8484b3c3a610932c03cd7fdab4ddee70277 Reviewed-by: Richard Moe Gustavsen --- src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm index 071edb5b60..a2001b0c05 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -168,7 +168,7 @@ typedef QSharedPointer SharedPointerFileDialogOptions; mSelectedNameFilter = new QStringList([self findStrippedFilterWithVisualFilterName:selectedVisualNameFilter]); QFileInfo sel(selectFile); - if (sel.isDir()){ + if (sel.isDir() && !sel.isBundle()){ mCurrentDir = [QCFString::toNSString(sel.absoluteFilePath()) retain]; mCurrentSelection = new QString; } else { From 3ac5499a9e2fe76e12f7b9adc9865bfdcb2d77aa Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Sat, 8 Jun 2013 00:33:10 +0200 Subject: [PATCH 43/79] Cocoa save file dialog behavior fix Currently, in save mode, if selectFile has not been called, the native cocoa file dialog puts the folder name in the line edit. This patch restores the old behavior where the line edit is presented empty to the user. Task-number: QTBUG-31619 Change-Id: I938eb6d968e0e2c343e70bc19f29663e112d0496 Reviewed-by: Richard Moe Gustavsen --- .../platforms/cocoa/qcocoafiledialoghelper.mm | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm index a2001b0c05..76cd235514 100644 --- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm +++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm @@ -244,15 +244,15 @@ static QString strippedText(QString s) - (void)showModelessPanel { if (mOpenPanel){ - QFileInfo info(!mCurrentSelection->isEmpty() ? *mCurrentSelection : QT_PREPEND_NAMESPACE(QCFString::toQString)(mCurrentDir)); + QFileInfo info(*mCurrentSelection); NSString *filepath = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath()); bool selectable = (mOptions->acceptMode() == QFileDialogOptions::AcceptSave) || [self panel:nil shouldShowFilename:filepath]; [self updateProperties]; [mOpenPanel setAllowedFileTypes:nil]; - [mOpenPanel setDirectoryURL:selectable ? [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath())] - : [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.path())]]; + [mSavePanel setNameFieldStringValue:selectable ? QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.fileName()) : @""]; + [mOpenPanel beginWithCompletionHandler:^(NSInteger result){ mReturnCode = result; if (mHelper) @@ -263,13 +263,12 @@ static QString strippedText(QString s) - (BOOL)runApplicationModalPanel { - QFileInfo info(!mCurrentSelection->isEmpty() ? *mCurrentSelection : QT_PREPEND_NAMESPACE(QCFString::toQString)(mCurrentDir)); + QFileInfo info(*mCurrentSelection); NSString *filepath = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath()); bool selectable = (mOptions->acceptMode() == QFileDialogOptions::AcceptSave) || [self panel:nil shouldShowFilename:filepath]; - [mSavePanel setDirectoryURL:selectable ? [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath())] - : [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.path())]]; + [mSavePanel setDirectoryURL: [NSURL fileURLWithPath:mCurrentDir]]; [mSavePanel setNameFieldStringValue:selectable ? QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.fileName()) : @""]; // Call processEvents in case the event dispatcher has been interrupted, and needs to do @@ -289,14 +288,14 @@ static QString strippedText(QString s) - (void)showWindowModalSheet:(QWindow *)parent { - QFileInfo info(!mCurrentSelection->isEmpty() ? *mCurrentSelection : QT_PREPEND_NAMESPACE(QCFString::toQString)(mCurrentDir)); + QFileInfo info(*mCurrentSelection); NSString *filepath = QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath()); bool selectable = (mOptions->acceptMode() == QFileDialogOptions::AcceptSave) || [self panel:nil shouldShowFilename:filepath]; [self updateProperties]; - [mSavePanel setDirectoryURL:selectable ? [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.filePath())] - : [NSURL fileURLWithPath:QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.path())]]; + [mSavePanel setDirectoryURL: [NSURL fileURLWithPath:mCurrentDir]]; + [mSavePanel setNameFieldStringValue:selectable ? QT_PREPEND_NAMESPACE(QCFString::toNSString)(info.fileName()) : @""]; NSWindow *nsparent = static_cast(qGuiApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parent)); From f730cd7542548d7d5fb7cd25f631e471697960c8 Mon Sep 17 00:00:00 2001 From: Leonard Lee Date: Wed, 12 Jun 2013 11:26:53 +0200 Subject: [PATCH 44/79] Recognize separator item in QMenu. The mouse over event on upper level menu separator should automatically close the sub menu listing. Manual test is not needed for this commit since it is easy to test it against common examples. Task-number: QTBUG-31664 Change-Id: I323d7ba206352a5d533584543b9a2ebf842b4dfc Reviewed-by: J-P Nurmi --- src/widgets/widgets/qmenu.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp index 7c72c5c456..4df89a5ede 100644 --- a/src/widgets/widgets/qmenu.cpp +++ b/src/widgets/widgets/qmenu.cpp @@ -2854,9 +2854,9 @@ void QMenu::mouseMoveEvent(QMouseEvent *e) d->hasHadMouse = d->hasHadMouse || rect().contains(e->pos()); QAction *action = d->actionAt(e->pos()); - if (!action) { + if (!action || action->isSeparator()) { if (d->hasHadMouse - && (!d->currentAction + && (!d->currentAction || (action && action->isSeparator()) || !(d->currentAction->menu() && d->currentAction->menu()->isVisible()))) d->setCurrentAction(0); return; From d9e722d8560c07adb1852cfd061ffb23197d06fd Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Mon, 15 Apr 2013 08:27:02 +0900 Subject: [PATCH 45/79] Make qtbase compile with QT_NO_TEXTCODEC Change-Id: I1614dc08c0dd1950020e415f37c97160431b2336 Reviewed-by: Oswald Buddenhagen --- src/plugins/platforms/xcb/qxcbkeyboard.cpp | 8 +++++++- src/plugins/platforms/xcb/qxcbmime.cpp | 2 ++ src/tools/qdoc/config.cpp | 2 ++ src/tools/qdoc/ditaxmlgenerator.cpp | 6 ++++++ src/tools/qdoc/generator.cpp | 2 ++ src/tools/qdoc/generator.h | 2 ++ src/tools/qdoc/htmlgenerator.cpp | 10 ++++++++++ src/tools/qdoc/tokenizer.cpp | 12 ++++++++++++ 8 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp index 155b327315..f7c473de88 100644 --- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp +++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp @@ -883,13 +883,19 @@ int QXcbKeyboard::keysymToQtKey(xcb_keysym_t key) const int QXcbKeyboard::keysymToQtKey(xcb_keysym_t keysym, Qt::KeyboardModifiers &modifiers, QString text) const { int code = 0; +#ifndef QT_NO_TEXTCODEC QTextCodec *systemCodec = QTextCodec::codecForLocale(); +#endif // Commentary in X11/keysymdef says that X codes match ASCII, so it // is safe to use the locale functions to process X codes in ISO8859-1. // This is mainly for compatibility - applications should not use the // Qt keycodes between 128 and 255 (extended ACSII codes), but should // rather use the QKeyEvent::text(). - if (keysym < 128 || (keysym < 256 && systemCodec->mibEnum() == 4)) { + if (keysym < 128 || (keysym < 256 +#ifndef QT_NO_TEXTCODEC + && systemCodec->mibEnum() == 4 +#endif + )) { // upper-case key, if known code = isprint((int)keysym) ? toupper((int)keysym) : 0; } else if (keysym >= XK_F1 && keysym <= XK_F35) { diff --git a/src/plugins/platforms/xcb/qxcbmime.cpp b/src/plugins/platforms/xcb/qxcbmime.cpp index bc8c559c6e..b205a63267 100644 --- a/src/plugins/platforms/xcb/qxcbmime.cpp +++ b/src/plugins/platforms/xcb/qxcbmime.cpp @@ -170,11 +170,13 @@ QVariant QXcbMime::mimeConvertToFormat(QXcbConnection *connection, xcb_atom_t a, if (!encoding.isEmpty() && atomName == format + QLatin1String(";charset=") + QString::fromLatin1(encoding)) { +#ifndef QT_NO_TEXTCODEC if (requestedType == QVariant::String) { QTextCodec *codec = QTextCodec::codecForName(encoding); if (codec) return codec->toUnicode(data); } +#endif return data; } diff --git a/src/tools/qdoc/config.cpp b/src/tools/qdoc/config.cpp index 273cb60d7d..a475ccbfb6 100644 --- a/src/tools/qdoc/config.cpp +++ b/src/tools/qdoc/config.cpp @@ -877,7 +877,9 @@ void Config::load(Location location, const QString& fileName) } QTextStream stream(&fin); +#ifndef QT_NO_TEXTCODEC stream.setCodec("UTF-8"); +#endif QString text = stream.readAll(); text += QLatin1String("\n\n"); text += QLatin1Char('\0'); diff --git a/src/tools/qdoc/ditaxmlgenerator.cpp b/src/tools/qdoc/ditaxmlgenerator.cpp index dd87e889bf..af8ac505f8 100644 --- a/src/tools/qdoc/ditaxmlgenerator.cpp +++ b/src/tools/qdoc/ditaxmlgenerator.cpp @@ -532,10 +532,12 @@ void DitaXmlGenerator::initializeGenerator(const Config &config) projectUrl = config.getString(CONFIG_URL); tagFile_ = config.getString(CONFIG_TAGFILE); +#ifndef QT_NO_TEXTCODEC outputEncoding = config.getString(CONFIG_OUTPUTENCODING); if (outputEncoding.isEmpty()) outputEncoding = QLatin1String("ISO-8859-1"); outputCodec = QTextCodec::codecForName(outputEncoding.toLocal8Bit()); +#endif naturalLanguage = config.getString(CONFIG_NATURALLANGUAGE); if (naturalLanguage.isEmpty()) @@ -3586,7 +3588,11 @@ QString DitaXmlGenerator::registerRef(const QString& ref) */ QString DitaXmlGenerator::protectEnc(const QString& string) { +#ifndef QT_NO_TEXTCODEC return protect(string, outputEncoding); +#else + return protect(string); +#endif } QString DitaXmlGenerator::protect(const QString& string, const QString& ) //outputEncoding) diff --git a/src/tools/qdoc/generator.cpp b/src/tools/qdoc/generator.cpp index 81be63abe1..187253df50 100644 --- a/src/tools/qdoc/generator.cpp +++ b/src/tools/qdoc/generator.cpp @@ -273,8 +273,10 @@ void Generator::beginSubPage(const InnerNode* node, const QString& fileName) node->location().fatal(tr("Cannot open output file '%1'").arg(outFile->fileName())); QTextStream* out = new QTextStream(outFile); +#ifndef QT_NO_TEXTCODEC if (outputCodec) out->setCodec(outputCodec); +#endif outStreamStack.push(out); const_cast(node)->setOutputFileName(fileName); } diff --git a/src/tools/qdoc/generator.h b/src/tools/qdoc/generator.h index 28a9ae5ce8..2fb3117765 100644 --- a/src/tools/qdoc/generator.h +++ b/src/tools/qdoc/generator.h @@ -178,8 +178,10 @@ protected: QMap editionGroupMap; QMap editionModuleMap; QString naturalLanguage; +#ifndef QT_NO_TEXTCODEC QTextCodec* outputCodec; QString outputEncoding; +#endif QString tagFile_; QStack outStreamStack; diff --git a/src/tools/qdoc/htmlgenerator.cpp b/src/tools/qdoc/htmlgenerator.cpp index 3d6f04decf..845ed35b3c 100644 --- a/src/tools/qdoc/htmlgenerator.cpp +++ b/src/tools/qdoc/htmlgenerator.cpp @@ -179,10 +179,12 @@ void HtmlGenerator::initializeGenerator(const Config &config) projectUrl = config.getString(CONFIG_URL); tagFile_ = config.getString(CONFIG_TAGFILE); +#ifndef QT_NO_TEXTCODEC outputEncoding = config.getString(CONFIG_OUTPUTENCODING); if (outputEncoding.isEmpty()) outputEncoding = QLatin1String("UTF-8"); outputCodec = QTextCodec::codecForName(outputEncoding.toLocal8Bit()); +#endif naturalLanguage = config.getString(CONFIG_NATURALLANGUAGE); if (naturalLanguage.isEmpty()) @@ -1743,7 +1745,11 @@ void HtmlGenerator::generateHeader(const QString& title, const Node *node, CodeMarker *marker) { +#ifndef QT_NO_TEXTCODEC out() << QString("\n").arg(outputEncoding); +#else + out() << QString("\n"); +#endif out() << "\n"; out() << QString("\n").arg(naturalLanguage); out() << "\n"; @@ -3185,7 +3191,11 @@ QString HtmlGenerator::registerRef(const QString& ref) QString HtmlGenerator::protectEnc(const QString &string) { +#ifndef QT_NO_TEXTCODEC return protect(string, outputEncoding); +#else + return protect(string); +#endif } QString HtmlGenerator::protect(const QString &string, const QString &outputEncoding) diff --git a/src/tools/qdoc/tokenizer.cpp b/src/tools/qdoc/tokenizer.cpp index 3968cdb828..224d451f4c 100644 --- a/src/tools/qdoc/tokenizer.cpp +++ b/src/tools/qdoc/tokenizer.cpp @@ -101,7 +101,9 @@ static QRegExp *definedX = 0; static QRegExp *defines = 0; static QRegExp *falsehoods = 0; +#ifndef QT_NO_TEXTCODEC static QTextCodec *sourceCodec = 0; +#endif /* This function is a perfect hash function for the 37 keywords of C99 @@ -496,7 +498,9 @@ void Tokenizer::initialize(const Config &config) QString sourceEncoding = config.getString(CONFIG_SOURCEENCODING); if (sourceEncoding.isEmpty()) sourceEncoding = QLatin1String("ISO-8859-1"); +#ifndef QT_NO_TEXTCODEC sourceCodec = QTextCodec::codecForName(sourceEncoding.toLocal8Bit()); +#endif comment = new QRegExp("/(?:\\*.*\\*/|/.*\n|/[^\n]*$)"); comment->setMinimal(true); @@ -770,12 +774,20 @@ bool Tokenizer::isTrue(const QString &condition) QString Tokenizer::lexeme() const { +#ifndef QT_NO_TEXTCODEC return sourceCodec->toUnicode(yyLex); +#else + return QString::fromUtf8(yyLex); +#endif } QString Tokenizer::previousLexeme() const { +#ifndef QT_NO_TEXTCODEC return sourceCodec->toUnicode(yyPrevLex); +#else + return QString::fromUtf8(yyPrevLex); +#endif } QT_END_NAMESPACE From d9fb6e6dbb2b322556d581265da2442e3b91a6a3 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sat, 15 Jun 2013 11:49:45 +0200 Subject: [PATCH 46/79] Remove use of 'register' from Qt. It is deprecated and clang is starting to warn about it. Patch mostly generated by clang itself, with some careful grep and sed for the platform-specific parts. Change-Id: I8058e6db0f1b41b33a9e8f17a712739159982450 Reviewed-by: Thiago Macieira --- src/corelib/arch/qatomic_alpha.h | 40 ++--- src/corelib/arch/qatomic_armv5.h | 16 +- src/corelib/arch/qatomic_armv6.h | 112 +++++++------- src/corelib/arch/qatomic_ia64.h | 30 ++-- src/corelib/arch/qatomic_mips.h | 40 ++--- src/corelib/arch/qatomic_power.h | 56 +++---- src/corelib/arch/qatomic_sh4a.h | 36 ++--- src/corelib/codecs/qtextcodec.cpp | 4 +- src/corelib/global/qlogging.cpp | 2 +- src/corelib/io/qfilesystemwatcher_inotify.cpp | 2 +- src/corelib/io/qurl.cpp | 8 +- src/corelib/io/qurlidna.cpp | 8 +- src/corelib/io/qurlrecode.cpp | 4 +- src/corelib/kernel/qcore_unix.cpp | 2 +- src/corelib/kernel/qcore_unix_p.h | 18 +-- src/corelib/kernel/qcoreapplication.cpp | 4 +- src/corelib/kernel/qmetatype.h | 2 +- src/corelib/kernel/qsystemsemaphore_unix.cpp | 2 +- src/corelib/kernel/qtimerinfo_unix.cpp | 20 +-- src/corelib/thread/qgenericatomic.h | 4 +- src/corelib/thread/qmutex.cpp | 2 +- src/corelib/tools/qbytearray.cpp | 20 +-- src/corelib/tools/qbytearraymatcher.cpp | 2 +- src/corelib/tools/qlocale_tools.cpp | 24 +-- src/corelib/tools/qlocale_tools_p.h | 4 +- src/corelib/tools/qsharedpointer_impl.h | 10 +- src/corelib/tools/qstring.cpp | 10 +- src/corelib/tools/qstringmatcher.cpp | 2 +- src/dbus/qdbusutil.cpp | 8 +- src/gui/image/qbmphandler.cpp | 12 +- src/gui/image/qimage.cpp | 10 +- src/gui/image/qppmhandler.cpp | 2 +- src/gui/image/qxbmhandler.cpp | 4 +- src/gui/painting/qdrawhelper.cpp | 16 +- src/gui/painting/qdrawhelper_p.h | 4 +- src/gui/painting/qpolygon.cpp | 12 +- src/gui/painting/qregion.cpp | 142 +++++++++--------- src/network/access/qnetworkcookie_p.h | 2 +- src/network/access/qnetworkreplyhttpimpl.cpp | 6 +- src/network/socket/qnet_unix_p.h | 8 +- src/plugins/imageformats/ico/qicohandler.cpp | 4 +- .../platforms/windows/qwindowskeymapper.cpp | 2 +- .../platforms/windows/qwindowsmime.cpp | 2 +- src/widgets/kernel/qapplication.cpp | 16 +- src/widgets/kernel/qwhatsthis.cpp | 2 +- src/widgets/styles/qwindowsxpstyle.cpp | 12 +- src/widgets/widgets/qlcdnumber.cpp | 2 +- 47 files changed, 375 insertions(+), 375 deletions(-) diff --git a/src/corelib/arch/qatomic_alpha.h b/src/corelib/arch/qatomic_alpha.h index 71cb112d47..5008a1acda 100644 --- a/src/corelib/arch/qatomic_alpha.h +++ b/src/corelib/arch/qatomic_alpha.h @@ -114,7 +114,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::isFetchAndAddWaitFree() inline bool QBasicAtomicInt::ref() { - register int old, tmp; + int old, tmp; asm volatile("1:\n" "ldl_l %0,%2\n" /* old=*ptr; */ "addl %0,1,%1\n" /* tmp=old+1; */ @@ -131,7 +131,7 @@ inline bool QBasicAtomicInt::ref() inline bool QBasicAtomicInt::deref() { - register int old, tmp; + int old, tmp; asm volatile("1:\n" "ldl_l %0,%2\n" /* old=*ptr; */ "subl %0,1,%1\n" /* tmp=old-1; */ @@ -148,7 +148,7 @@ inline bool QBasicAtomicInt::deref() inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) { - register int ret; + int ret; asm volatile("1:\n" "ldl_l %0,%1\n" /* ret=*ptr; */ "cmpeq %0,%2,%0\n"/* if (ret==expected) ret=0; else ret=1; */ @@ -167,7 +167,7 @@ inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) { - register int ret; + int ret; asm volatile("1:\n" "ldl_l %0,%1\n" /* ret=*ptr; */ "cmpeq %0,%2,%0\n"/* if (ret==expected) ret=0; else ret=1; */ @@ -187,7 +187,7 @@ inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) { - register int ret; + int ret; asm volatile("mb\n" "1:\n" "ldl_l %0,%1\n" /* ret=*ptr; */ @@ -207,7 +207,7 @@ inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) { - register int old, tmp; + int old, tmp; asm volatile("1:\n" "ldl_l %0,%2\n" /* old=*ptr; */ "mov %3,%1\n" /* tmp=newval; */ @@ -224,7 +224,7 @@ inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) { - register int old, tmp; + int old, tmp; asm volatile("1:\n" "ldl_l %0,%2\n" /* old=*ptr; */ "mov %3,%1\n" /* tmp=newval; */ @@ -242,7 +242,7 @@ inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue) { - register int old, tmp; + int old, tmp; asm volatile("mb\n" "1:\n" "ldl_l %0,%2\n" /* old=*ptr; */ @@ -260,7 +260,7 @@ inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue) inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) { - register int old, tmp; + int old, tmp; asm volatile("1:\n" "ldl_l %0,%2\n" /* old=*ptr; */ "addl %0,%3,%1\n"/* tmp=old+value; */ @@ -277,7 +277,7 @@ inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) { - register int old, tmp; + int old, tmp; asm volatile("1:\n" "ldl_l %0,%2\n" /* old=*ptr; */ "addl %0,%3,%1\n"/* tmp=old+value; */ @@ -295,7 +295,7 @@ inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd) { - register int old, tmp; + int old, tmp; asm volatile("mb\n" "1:\n" "ldl_l %0,%2\n" /* old=*ptr; */ @@ -314,7 +314,7 @@ inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd) template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue) { - register void *ret; + void *ret; asm volatile("1:\n" "ldq_l %0,%1\n" /* ret=*ptr; */ "cmpeq %0,%2,%0\n"/* if (ret==expected) tmp=0; else tmp=1; */ @@ -334,7 +334,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValu template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValue, T *newValue) { - register void *ret; + void *ret; asm volatile("1:\n" "ldq_l %0,%1\n" /* ret=*ptr; */ "cmpeq %0,%2,%0\n"/* if (ret==expected) tmp=0; else tmp=1; */ @@ -355,7 +355,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValu template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelease(T *expectedValue, T *newValue) { - register void *ret; + void *ret; asm volatile("mb\n" "1:\n" "ldq_l %0,%1\n" /* ret=*ptr; */ @@ -376,7 +376,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelease(T *expectedValu template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) { - register T *old, *tmp; + T *old, *tmp; asm volatile("1:\n" "ldq_l %0,%2\n" /* old=*ptr; */ "mov %3,%1\n" /* tmp=newval; */ @@ -394,7 +394,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreAcquire(T *newValue) { - register T *old, *tmp; + T *old, *tmp; asm volatile("1:\n" "ldq_l %0,%2\n" /* old=*ptr; */ "mov %3,%1\n" /* tmp=newval; */ @@ -413,7 +413,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreAcquire(T *newValue) template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelease(T *newValue) { - register T *old, *tmp; + T *old, *tmp; asm volatile("mb\n" "1:\n" "ldq_l %0,%2\n" /* old=*ptr; */ @@ -432,7 +432,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelease(T *newValue) template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelaxed(qptrdiff valueToAdd) { - register T *old, *tmp; + T *old, *tmp; asm volatile("1:\n" "ldq_l %0,%2\n" /* old=*ptr; */ "addq %0,%3,%1\n"/* tmp=old+value; */ @@ -450,7 +450,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelaxed(qptrdiff valueTo template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddAcquire(qptrdiff valueToAdd) { - register T *old, *tmp; + T *old, *tmp; asm volatile("1:\n" "ldq_l %0,%2\n" /* old=*ptr; */ "addq %0,%3,%1\n"/* tmp=old+value; */ @@ -469,7 +469,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddAcquire(qptrdiff valueTo template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelease(qptrdiff valueToAdd) { - register T *old, *tmp; + T *old, *tmp; asm volatile("mb\n" "1:\n" "ldq_l %0,%2\n" /* old=*ptr; */ diff --git a/src/corelib/arch/qatomic_armv5.h b/src/corelib/arch/qatomic_armv5.h index e0a50b3c24..b583ec662c 100644 --- a/src/corelib/arch/qatomic_armv5.h +++ b/src/corelib/arch/qatomic_armv5.h @@ -114,8 +114,8 @@ template struct QAtomicOps : QBasicAtomicOps template<> template inline bool QBasicAtomicOps<4>::ref(T &_q_value) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; + T originalValue; + T newValue; do { originalValue = _q_value; newValue = originalValue + 1; @@ -126,8 +126,8 @@ bool QBasicAtomicOps<4>::ref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<4>::deref(T &_q_value) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; + T originalValue; + T newValue; do { originalValue = _q_value; newValue = originalValue - 1; @@ -138,7 +138,7 @@ bool QBasicAtomicOps<4>::deref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<4>::testAndSetRelaxed(T &_q_value, T expectedValue, T newValue) Q_DECL_NOTHROW { - register T originalValue; + T originalValue; do { originalValue = _q_value; if (originalValue != expectedValue) @@ -165,7 +165,7 @@ template<> template inline T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { #if defined(__thumb__) - register T originalValue; + T originalValue; do { originalValue = _q_value; } while (_q_cmpxchg(originalValue, newValue, &_q_value) != 0); @@ -184,8 +184,8 @@ T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHR template<> template inline T QBasicAtomicOps<4>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; + T originalValue; + T newValue; do { originalValue = _q_value; newValue = originalValue + valueToAdd; diff --git a/src/corelib/arch/qatomic_armv6.h b/src/corelib/arch/qatomic_armv6.h index 7f5939e391..08b2b02133 100644 --- a/src/corelib/arch/qatomic_armv6.h +++ b/src/corelib/arch/qatomic_armv6.h @@ -117,8 +117,8 @@ template struct QAtomicOps : QBasicAtomicOps template<> template inline bool QBasicAtomicOps<4>::ref(T &_q_value) Q_DECL_NOTHROW { - register T newValue; - register int result; + T newValue; + int result; asm volatile("0:\n" "ldrex %[newValue], [%[_q_value]]\n" "add %[newValue], %[newValue], #1\n" @@ -136,8 +136,8 @@ bool QBasicAtomicOps<4>::ref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<4>::deref(T &_q_value) Q_DECL_NOTHROW { - register T newValue; - register int result; + T newValue; + int result; asm volatile("0:\n" "ldrex %[newValue], [%[_q_value]]\n" "sub %[newValue], %[newValue], #1\n" @@ -155,7 +155,7 @@ bool QBasicAtomicOps<4>::deref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<4>::testAndSetRelaxed(T &_q_value, T expectedValue, T newValue) Q_DECL_NOTHROW { - register int result; + int result; asm volatile("0:\n" "ldrex %[result], [%[_q_value]]\n" "eors %[result], %[result], %[expectedValue]\n" @@ -175,8 +175,8 @@ bool QBasicAtomicOps<4>::testAndSetRelaxed(T &_q_value, T expectedValue, T newVa template<> template inline T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { - register T originalValue; - register int result; + T originalValue; + int result; asm volatile("0:\n" "ldrex %[originalValue], [%[_q_value]]\n" "strex %[result], %[newValue], [%[_q_value]]\n" @@ -194,9 +194,9 @@ T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHR template<> template inline T QBasicAtomicOps<4>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; - register int result; + T originalValue; + T newValue; + int result; asm volatile("0:\n" "ldrex %[originalValue], [%[_q_value]]\n" "add %[newValue], %[originalValue], %[valueToAdd]\n" @@ -256,8 +256,8 @@ template<> struct QAtomicIntegerTraits { enum { IsInteger = 1 }; }; template<> template inline bool QBasicAtomicOps<1>::ref(T &_q_value) Q_DECL_NOTHROW { - register T newValue; - register int result; + T newValue; + int result; asm volatile("0:\n" "ldrexb %[newValue], [%[_q_value]]\n" "add %[newValue], %[newValue], #1\n" @@ -275,8 +275,8 @@ bool QBasicAtomicOps<1>::ref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<1>::deref(T &_q_value) Q_DECL_NOTHROW { - register T newValue; - register int result; + T newValue; + int result; asm volatile("0:\n" "ldrexb %[newValue], [%[_q_value]]\n" "sub %[newValue], %[newValue], #1\n" @@ -294,7 +294,7 @@ bool QBasicAtomicOps<1>::deref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<1>::testAndSetRelaxed(T &_q_value, T expectedValue, T newValue) Q_DECL_NOTHROW { - register T result; + T result; asm volatile("0:\n" "ldrexb %[result], [%[_q_value]]\n" "eors %[result], %[result], %[expectedValue]\n" @@ -314,8 +314,8 @@ bool QBasicAtomicOps<1>::testAndSetRelaxed(T &_q_value, T expectedValue, T newVa template<> template inline T QBasicAtomicOps<1>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { - register T originalValue; - register int result; + T originalValue; + int result; asm volatile("0:\n" "ldrexb %[originalValue], [%[_q_value]]\n" "strexb %[result], %[newValue], [%[_q_value]]\n" @@ -333,9 +333,9 @@ T QBasicAtomicOps<1>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHR template<> template inline T QBasicAtomicOps<1>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; - register int result; + T originalValue; + T newValue; + int result; asm volatile("0:\n" "ldrexb %[originalValue], [%[_q_value]]\n" "add %[newValue], %[originalValue], %[valueToAdd]\n" @@ -355,8 +355,8 @@ T QBasicAtomicOps<1>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveTy template<> template inline bool QBasicAtomicOps<2>::ref(T &_q_value) Q_DECL_NOTHROW { - register T newValue; - register int result; + T newValue; + int result; asm volatile("0:\n" "ldrexh %[newValue], [%[_q_value]]\n" "add %[newValue], %[newValue], #1\n" @@ -374,8 +374,8 @@ bool QBasicAtomicOps<2>::ref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<2>::deref(T &_q_value) Q_DECL_NOTHROW { - register T newValue; - register int result; + T newValue; + int result; asm volatile("0:\n" "ldrexh %[newValue], [%[_q_value]]\n" "sub %[newValue], %[newValue], #1\n" @@ -393,7 +393,7 @@ bool QBasicAtomicOps<2>::deref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<2>::testAndSetRelaxed(T &_q_value, T expectedValue, T newValue) Q_DECL_NOTHROW { - register T result; + T result; asm volatile("0:\n" "ldrexh %[result], [%[_q_value]]\n" "eors %[result], %[result], %[expectedValue]\n" @@ -413,8 +413,8 @@ bool QBasicAtomicOps<2>::testAndSetRelaxed(T &_q_value, T expectedValue, T newVa template<> template inline T QBasicAtomicOps<2>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { - register T originalValue; - register int result; + T originalValue; + int result; asm volatile("0:\n" "ldrexh %[originalValue], [%[_q_value]]\n" "strexh %[result], %[newValue], [%[_q_value]]\n" @@ -432,9 +432,9 @@ T QBasicAtomicOps<2>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHR template<> template inline T QBasicAtomicOps<2>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; - register int result; + T originalValue; + T newValue; + int result; asm volatile("0:\n" "ldrexh %[originalValue], [%[_q_value]]\n" "add %[newValue], %[originalValue], %[valueToAdd]\n" @@ -462,8 +462,8 @@ T QBasicAtomicOps<2>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveTy template<> template inline bool QBasicAtomicOps<8>::ref(T &_q_value) Q_DECL_NOTHROW { - register T newValue; - register int result; + T newValue; + int result; asm volatile("0:\n" "ldrexd %[newValue], %H[newValue], [%[_q_value]]\n" "adds %Q[newValue], %Q[newValue], #1\n" @@ -482,8 +482,8 @@ bool QBasicAtomicOps<8>::ref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<8>::deref(T &_q_value) Q_DECL_NOTHROW { - register T newValue; - register int result; + T newValue; + int result; asm volatile("0:\n" "ldrexd %[newValue], %H[newValue], [%[_q_value]]\n" "subs %Q[newValue], %Q[newValue], #1\n" @@ -502,7 +502,7 @@ bool QBasicAtomicOps<8>::deref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<8>::testAndSetRelaxed(T &_q_value, T expectedValue, T newValue) Q_DECL_NOTHROW { - register T result; + T result; asm volatile("0:\n" "ldrexd %[result], %H[result], [%[_q_value]]\n" "eor %[result], %[result], %[expectedValue]\n" @@ -524,8 +524,8 @@ bool QBasicAtomicOps<8>::testAndSetRelaxed(T &_q_value, T expectedValue, T newVa template<> template inline T QBasicAtomicOps<8>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { - register T originalValue; - register int result; + T originalValue; + int result; asm volatile("0:\n" "ldrexd %[originalValue], %H[originalValue], [%[_q_value]]\n" "strexd %[result], %[newValue], %H[newValue], [%[_q_value]]\n" @@ -543,9 +543,9 @@ T QBasicAtomicOps<8>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHR template<> template inline T QBasicAtomicOps<8>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; - register int result; + T originalValue; + T newValue; + int result; asm volatile("0:\n" "ldrexd %[originalValue], %H[originalValue], [%[_q_value]]\n" "adds %Q[newValue], %Q[originalValue], %Q[valueToAdd]\n" @@ -588,8 +588,8 @@ T QBasicAtomicOps<8>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveTy inline bool QBasicAtomicInt::ref() Q_DECL_NOTHROW { - register int newValue; - register int result; + int newValue; + int result; retry: __asm { ldrex newValue, [&_q_value] @@ -603,8 +603,8 @@ inline bool QBasicAtomicInt::ref() Q_DECL_NOTHROW inline bool QBasicAtomicInt::deref() Q_DECL_NOTHROW { - register int newValue; - register int result; + int newValue; + int result; retry: __asm { ldrex newValue, [&_q_value] @@ -618,7 +618,7 @@ inline bool QBasicAtomicInt::deref() Q_DECL_NOTHROW inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) Q_DECL_NOTHROW { - register int result; + int result; retry: __asm { ldrex result, [&_q_value] @@ -632,8 +632,8 @@ inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) Q_DECL_NOTHROW { - register int originalValue; - register int result; + int originalValue; + int result; retry: __asm { ldrex originalValue, [&_q_value] @@ -646,9 +646,9 @@ inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) Q_DECL_NOTHROW inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) Q_DECL_NOTHROW { - register int originalValue; - register int newValue; - register int result; + int originalValue; + int newValue; + int result; retry: __asm { ldrex originalValue, [&_q_value] @@ -663,7 +663,7 @@ inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) Q_DECL_NOTHROW template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue) Q_DECL_NOTHROW { - register T *result; + T *result; retry: __asm { ldrex result, [&_q_value] @@ -678,8 +678,8 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValu template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) Q_DECL_NOTHROW { - register T *originalValue; - register int result; + T *originalValue; + int result; retry: __asm { ldrex originalValue, [&_q_value] @@ -693,9 +693,9 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) Q template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelaxed(qptrdiff valueToAdd) Q_DECL_NOTHROW { - register T *originalValue; - register T *newValue; - register int result; + T *originalValue; + T *newValue; + int result; retry: __asm { ldrex originalValue, [&_q_value] diff --git a/src/corelib/arch/qatomic_ia64.h b/src/corelib/arch/qatomic_ia64.h index ed72036076..98937c7551 100644 --- a/src/corelib/arch/qatomic_ia64.h +++ b/src/corelib/arch/qatomic_ia64.h @@ -192,7 +192,7 @@ template struct QAtomicOps : QBasicAtomicOps typedef T Type; }; -inline bool _q_ia64_fetchadd_immediate(register int value) +inline bool _q_ia64_fetchadd_immediate(int value) { return value == 1 || value == -1 || value == 4 || value == -4 @@ -218,7 +218,7 @@ inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) { - register int expectedValueCopy = expectedValue; + int expectedValueCopy = expectedValue; return (static_cast(_InterlockedCompareExchange(&_q_value, newValue, expectedValueCopy)) @@ -227,7 +227,7 @@ inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) { - register int expectedValueCopy = expectedValue; + int expectedValueCopy = expectedValue; return (static_cast(_InterlockedCompareExchange_acq(reinterpret_cast(&_q_value), newValue, expectedValueCopy)) @@ -236,7 +236,7 @@ inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) { - register int expectedValueCopy = expectedValue; + int expectedValueCopy = expectedValue; return (static_cast(_InterlockedCompareExchange_rel(reinterpret_cast(&_q_value), newValue, expectedValueCopy)) @@ -285,7 +285,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreAcquire(T *newValue) template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue) { - register T *expectedValueCopy = expectedValue; + T *expectedValueCopy = expectedValue; return (_InterlockedCompareExchangePointer(reinterpret_cast(&_q_value), newValue, expectedValueCopy) @@ -300,7 +300,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValu volatile unsigned long *p; }; x = &_q_value; - register T *expectedValueCopy = expectedValue; + T *expectedValueCopy = expectedValue; return (_InterlockedCompareExchange64_acq(p, quintptr(newValue), quintptr(expectedValueCopy)) == quintptr(expectedValue)); } @@ -313,7 +313,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelease(T *expectedValu volatile unsigned long *p; }; x = &_q_value; - register T *expectedValueCopy = expectedValue; + T *expectedValueCopy = expectedValue; return (_InterlockedCompareExchange64_rel(p, quintptr(newValue), quintptr(expectedValueCopy)) == quintptr(expectedValue)); } @@ -912,7 +912,7 @@ T QBasicAtomicOps<1>::fetchAndAddAcquire(T &_q_value, typename QAtomicAdditiveTy { valueToAdd *= QAtomicAdditiveType::AddScale; // implement the test-and-set loop - register T old, ret; + T old, ret; do { old = _q_value; _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, (quint8)old, FENCE); @@ -926,7 +926,7 @@ template<> template inline T QBasicAtomicOps<1>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { // implement the test-and-set loop - register T old, ret; + T old, ret; do { old = _q_value; _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, (quint8)old, FENCE); @@ -941,7 +941,7 @@ T QBasicAtomicOps<2>::fetchAndAddAcquire(T &_q_value, typename QAtomicAdditiveTy { valueToAdd *= QAtomicAdditiveType::AddScale; // implement the test-and-set loop - register T old, ret; + T old, ret; do { old = _q_value; _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, (quint16)old, FENCE); @@ -955,7 +955,7 @@ template<> template inline T QBasicAtomicOps<2>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { // implement the test-and-set loop - register T old, ret; + T old, ret; do { old = _q_value; _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, (quint16)old, FENCE); @@ -970,7 +970,7 @@ T QBasicAtomicOps<4>::fetchAndAddAcquire(T &_q_value, typename QAtomicAdditiveTy { valueToAdd *= QAtomicAdditiveType::AddScale; // implement the test-and-set loop - register T old, ret; + T old, ret; do { old = _q_value; _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, (unsigned)old, FENCE); @@ -984,7 +984,7 @@ template<> template inline T QBasicAtomicOps<4>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { // implement the test-and-set loop - register T old, ret; + T old, ret; do { old = _q_value; _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, (unsigned)old, FENCE); @@ -999,7 +999,7 @@ T QBasicAtomicOps<8>::fetchAndAddAcquire(T &_q_value, typename QAtomicAdditiveTy { valueToAdd *= QAtomicAdditiveType::AddScale; // implement the test-and-set loop - register T old, ret; + T old, ret; do { old = _q_value; _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, (quint64)old, FENCE); @@ -1013,7 +1013,7 @@ template<> template inline T QBasicAtomicOps<8>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { // implement the test-and-set loop - register T old, ret; + T old, ret; do { old = _q_value; _Asm_mov_to_ar((_Asm_app_reg)_AREG_CCV, (quint64)old, FENCE); diff --git a/src/corelib/arch/qatomic_mips.h b/src/corelib/arch/qatomic_mips.h index 7716750332..6eb9613e31 100644 --- a/src/corelib/arch/qatomic_mips.h +++ b/src/corelib/arch/qatomic_mips.h @@ -137,8 +137,8 @@ void QBasicAtomicOps::orderedMemoryFence(const T &) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<4>::ref(T &_q_value) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; + T originalValue; + T newValue; asm volatile("0:\n" "ll %[originalValue], %[_q_value]\n" "addiu %[newValue], %[originalValue], %[one]\n" @@ -156,8 +156,8 @@ bool QBasicAtomicOps<4>::ref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<4>::deref(T &_q_value) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; + T originalValue; + T newValue; asm volatile("0:\n" "ll %[originalValue], %[_q_value]\n" "addiu %[newValue], %[originalValue], %[minusOne]\n" @@ -175,8 +175,8 @@ bool QBasicAtomicOps<4>::deref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<4>::testAndSetRelaxed(T &_q_value, T expectedValue, T newValue) Q_DECL_NOTHROW { - register T result; - register T tempValue; + T result; + T tempValue; asm volatile("0:\n" "ll %[result], %[_q_value]\n" "xor %[result], %[result], %[expectedValue]\n" @@ -199,8 +199,8 @@ bool QBasicAtomicOps<4>::testAndSetRelaxed(T &_q_value, T expectedValue, T newVa template<> template inline T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { - register T originalValue; - register T tempValue; + T originalValue; + T tempValue; asm volatile("0:\n" "ll %[originalValue], %[_q_value]\n" "move %[tempValue], %[newValue]\n" @@ -218,8 +218,8 @@ T QBasicAtomicOps<4>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHR template<> template inline T QBasicAtomicOps<4>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; + T originalValue; + T newValue; asm volatile("0:\n" "ll %[originalValue], %[_q_value]\n" "addu %[newValue], %[originalValue], %[valueToAdd]\n" @@ -254,8 +254,8 @@ template<> struct QAtomicIntegerTraits { enum { IsInteger = 1 }; }; template<> template inline bool QBasicAtomicOps<8>::ref(T &_q_value) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; + T originalValue; + T newValue; asm volatile("0:\n" "lld %[originalValue], %[_q_value]\n" "addiu %[newValue], %[originalValue], %[one]\n" @@ -273,8 +273,8 @@ bool QBasicAtomicOps<8>::ref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<8>::deref(T &_q_value) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; + T originalValue; + T newValue; asm volatile("0:\n" "lld %[originalValue], %[_q_value]\n" "addiu %[newValue], %[originalValue], %[minusOne]\n" @@ -292,8 +292,8 @@ bool QBasicAtomicOps<8>::deref(T &_q_value) Q_DECL_NOTHROW template<> template inline bool QBasicAtomicOps<8>::testAndSetRelaxed(T &_q_value, T expectedValue, T newValue) Q_DECL_NOTHROW { - register T result; - register T tempValue; + T result; + T tempValue; asm volatile("0:\n" "lld %[result], %[_q_value]\n" "xor %[result], %[result], %[expectedValue]\n" @@ -316,8 +316,8 @@ bool QBasicAtomicOps<8>::testAndSetRelaxed(T &_q_value, T expectedValue, T newVa template<> template inline T QBasicAtomicOps<8>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHROW { - register T originalValue; - register T tempValue; + T originalValue; + T tempValue; asm volatile("0:\n" "lld %[originalValue], %[_q_value]\n" "move %[tempValue], %[newValue]\n" @@ -335,8 +335,8 @@ T QBasicAtomicOps<8>::fetchAndStoreRelaxed(T &_q_value, T newValue) Q_DECL_NOTHR template<> template inline T QBasicAtomicOps<8>::fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) Q_DECL_NOTHROW { - register T originalValue; - register T newValue; + T originalValue; + T newValue; asm volatile("0:\n" "lld %[originalValue], %[_q_value]\n" "addu %[newValue], %[originalValue], %[valueToAdd]\n" diff --git a/src/corelib/arch/qatomic_power.h b/src/corelib/arch/qatomic_power.h index ad1c619d56..3ddd303795 100644 --- a/src/corelib/arch/qatomic_power.h +++ b/src/corelib/arch/qatomic_power.h @@ -124,8 +124,8 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::isFetchAndAddWaitFree() inline bool QBasicAtomicInt::ref() { - register int originalValue; - register int newValue; + int originalValue; + int newValue; asm volatile("lwarx %[originalValue]," _Q_VALUE "\n" "addi %[newValue], %[originalValue], %[one]\n" "stwcx. %[newValue]," _Q_VALUE "\n" @@ -141,8 +141,8 @@ inline bool QBasicAtomicInt::ref() inline bool QBasicAtomicInt::deref() { - register int originalValue; - register int newValue; + int originalValue; + int newValue; asm volatile("lwarx %[originalValue]," _Q_VALUE "\n" "addi %[newValue], %[originalValue], %[minusOne]\n" "stwcx. %[newValue]," _Q_VALUE "\n" @@ -158,7 +158,7 @@ inline bool QBasicAtomicInt::deref() inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) { - register int result; + int result; asm volatile("lwarx %[result]," _Q_VALUE "\n" "xor. %[result], %[result], %[expectedValue]\n" "bne $+12\n" @@ -175,7 +175,7 @@ inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) { - register int result; + int result; asm volatile("lwarx %[result]," _Q_VALUE "\n" "xor. %[result], %[result], %[expectedValue]\n" "bne $+16\n" @@ -193,7 +193,7 @@ inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) { - register int result; + int result; asm volatile("eieio\n" "lwarx %[result]," _Q_VALUE "\n" "xor. %[result], %[result], %[expectedValue]\n" @@ -211,7 +211,7 @@ inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) { - register int originalValue; + int originalValue; asm volatile("lwarx %[originalValue]," _Q_VALUE "\n" "stwcx. %[newValue]," _Q_VALUE "\n" "bne- $-8\n" @@ -225,7 +225,7 @@ inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) { - register int originalValue; + int originalValue; asm volatile("lwarx %[originalValue]," _Q_VALUE "\n" "stwcx. %[newValue]," _Q_VALUE "\n" "bne- $-8\n" @@ -240,7 +240,7 @@ inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue) { - register int originalValue; + int originalValue; asm volatile("eieio\n" "lwarx %[originalValue]," _Q_VALUE "\n" "stwcx. %[newValue]," _Q_VALUE "\n" @@ -255,8 +255,8 @@ inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue) inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) { - register int originalValue; - register int newValue; + int originalValue; + int newValue; asm volatile("lwarx %[originalValue]," _Q_VALUE "\n" "add %[newValue], %[originalValue], %[valueToAdd]\n" "stwcx. %[newValue]," _Q_VALUE "\n" @@ -272,8 +272,8 @@ inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) { - register int originalValue; - register int newValue; + int originalValue; + int newValue; asm volatile("lwarx %[originalValue]," _Q_VALUE "\n" "add %[newValue], %[originalValue], %[valueToAdd]\n" "stwcx. %[newValue]," _Q_VALUE "\n" @@ -290,8 +290,8 @@ inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd) { - register int originalValue; - register int newValue; + int originalValue; + int newValue; asm volatile("eieio\n" "lwarx %[originalValue]," _Q_VALUE "\n" "add %[newValue], %[originalValue], %[valueToAdd]\n" @@ -317,7 +317,7 @@ inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd) template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue) { - register void *result; + void *result; asm volatile(LPARX" %[result]," _Q_VALUE "\n" "xor. %[result], %[result], %[expectedValue]\n" "bne $+12\n" @@ -335,7 +335,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValu template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValue, T *newValue) { - register void *result; + void *result; asm volatile(LPARX" %[result]," _Q_VALUE "\n" "xor. %[result], %[result], %[expectedValue]\n" "bne $+16\n" @@ -354,7 +354,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValu template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelease(T *expectedValue, T *newValue) { - register void *result; + void *result; asm volatile("eieio\n" LPARX" %[result]," _Q_VALUE "\n" "xor. %[result], %[result], %[expectedValue]\n" @@ -373,7 +373,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelease(T *expectedValu template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) { - register T *originalValue; + T *originalValue; asm volatile(LPARX" %[originalValue]," _Q_VALUE "\n" STPCX" %[newValue]," _Q_VALUE "\n" "bne- $-8\n" @@ -388,7 +388,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreAcquire(T *newValue) { - register T *originalValue; + T *originalValue; asm volatile(LPARX" %[originalValue]," _Q_VALUE "\n" STPCX" %[newValue]," _Q_VALUE "\n" "bne- $-8\n" @@ -404,7 +404,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreAcquire(T *newValue) template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelease(T *newValue) { - register T *originalValue; + T *originalValue; asm volatile("eieio\n" LPARX" %[originalValue]," _Q_VALUE "\n" STPCX" %[newValue]," _Q_VALUE "\n" @@ -420,8 +420,8 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelease(T *newValue) template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelaxed(qptrdiff valueToAdd) { - register T *originalValue; - register T *newValue; + T *originalValue; + T *newValue; asm volatile(LPARX" %[originalValue]," _Q_VALUE "\n" "add %[newValue], %[originalValue], %[valueToAdd]\n" STPCX" %[newValue]," _Q_VALUE "\n" @@ -438,8 +438,8 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelaxed(qptrdiff valueTo template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddAcquire(qptrdiff valueToAdd) { - register T *originalValue; - register T *newValue; + T *originalValue; + T *newValue; asm volatile(LPARX" %[originalValue]," _Q_VALUE "\n" "add %[newValue], %[originalValue], %[valueToAdd]\n" STPCX" %[newValue]," _Q_VALUE "\n" @@ -457,8 +457,8 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddAcquire(qptrdiff valueTo template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelease(qptrdiff valueToAdd) { - register T *originalValue; - register T *newValue; + T *originalValue; + T *newValue; asm volatile("eieio\n" LPARX" %[originalValue]," _Q_VALUE "\n" "add %[newValue], %[originalValue], %[valueToAdd]\n" diff --git a/src/corelib/arch/qatomic_sh4a.h b/src/corelib/arch/qatomic_sh4a.h index 08f75e44f2..6e59279f3e 100644 --- a/src/corelib/arch/qatomic_sh4a.h +++ b/src/corelib/arch/qatomic_sh4a.h @@ -147,7 +147,7 @@ inline bool QBasicAtomicInt::deref() inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) { - register int result; + int result; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "xor %[expectedValue], r0\n" @@ -169,7 +169,7 @@ inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) { - register int result; + int result; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "xor %[expectedValue], r0\n" @@ -192,7 +192,7 @@ inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) { - register int result; + int result; asm volatile("synco\n" "0:\n" "movli.l @%[_q_value], r0\n" @@ -220,7 +220,7 @@ inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue) inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) { - register int originalValue; + int originalValue; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "mov r0, %[originalValue]\n" @@ -237,7 +237,7 @@ inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue) inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) { - register int originalValue; + int originalValue; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "mov r0, %[originalValue]\n" @@ -255,7 +255,7 @@ inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue) inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue) { - register int originalValue; + int originalValue; asm volatile("synco\n" "0:\n" "movli.l @%[_q_value], r0\n" @@ -278,7 +278,7 @@ inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue) inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) { - register int originalValue; + int originalValue; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "mov r0, %[originalValue]\n" @@ -295,7 +295,7 @@ inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) { - register int originalValue; + int originalValue; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "mov r0, %[originalValue]\n" @@ -313,7 +313,7 @@ inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd) { - register int originalValue; + int originalValue; asm volatile("synco\n" "0:\n" "movli.l @%[_q_value], r0\n" @@ -337,7 +337,7 @@ inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd) template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValue, T *newValue) { - register T *result; + T *result; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "xor %[expectedValue], r0\n" @@ -360,7 +360,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelaxed(T *expectedValu template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValue, T *newValue) { - register T *result; + T *result; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "xor %[expectedValue], r0\n" @@ -384,7 +384,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetAcquire(T *expectedValu template Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetRelease(T *expectedValue, T *newValue) { - register T *result; + T *result; asm volatile("synco\n" "0:\n" "movli.l @%[_q_value], r0\n" @@ -414,7 +414,7 @@ Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetOrdered(T *expectedValu template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) { - register T *originalValue; + T *originalValue; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "mov r0, %[originalValue]\n" @@ -432,7 +432,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelaxed(T *newValue) template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreAcquire(T *newValue) { - register T *originalValue; + T *originalValue; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "mov r0, %[originalValue]\n" @@ -451,7 +451,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreAcquire(T *newValue) template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreRelease(T *newValue) { - register T *originalValue; + T *originalValue; asm volatile("synco\n" "0:\n" "movli.l @%[_q_value], r0\n" @@ -476,7 +476,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndStoreOrdered(T *newValue) template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelaxed(qptrdiff valueToAdd) { - register T *originalValue; + T *originalValue; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "mov r0, %[originalValue]\n" @@ -494,7 +494,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelaxed(qptrdiff valueTo template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddAcquire(qptrdiff valueToAdd) { - register T *originalValue; + T *originalValue; asm volatile("0:\n" "movli.l @%[_q_value], r0\n" "mov r0, %[originalValue]\n" @@ -513,7 +513,7 @@ Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddAcquire(qptrdiff valueTo template Q_INLINE_TEMPLATE T *QBasicAtomicPointer::fetchAndAddRelease(qptrdiff valueToAdd) { - register T *originalValue; + T *originalValue; asm volatile("synco\n" "0:\n" "movli.l @%[_q_value], r0\n" diff --git a/src/corelib/codecs/qtextcodec.cpp b/src/corelib/codecs/qtextcodec.cpp index 1cedd3a28d..4ed7b00e53 100644 --- a/src/corelib/codecs/qtextcodec.cpp +++ b/src/corelib/codecs/qtextcodec.cpp @@ -99,9 +99,9 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMutex, textCodecsMutex, (QMutex::Recursive)); QMutex *qTextCodecsMutex() { return textCodecsMutex(); } #if !defined(QT_USE_ICU) -static char qtolower(register char c) +static char qtolower(char c) { if (c >= 'A' && c <= 'Z') return c + 0x20; return c; } -static bool qisalnum(register char c) +static bool qisalnum(char c) { return (c >= '0' && c <= '9') || ((c | 0x20) >= 'a' && (c | 0x20) <= 'z'); } bool qTextCodecNameMatch(const char *n, const char *h) diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp index c8293beb4e..85ff89ebdd 100644 --- a/src/corelib/global/qlogging.cpp +++ b/src/corelib/global/qlogging.cpp @@ -501,7 +501,7 @@ Q_AUTOTEST_EXPORT QByteArray qCleanupFuncinfo(QByteArray info) templatecount = 1; --pos; while (pos && templatecount) { - register char c = info.at(pos); + char c = info.at(pos); if (c == '>') ++templatecount; else if (c == '<') diff --git a/src/corelib/io/qfilesystemwatcher_inotify.cpp b/src/corelib/io/qfilesystemwatcher_inotify.cpp index 18f3404c5d..024af79c33 100644 --- a/src/corelib/io/qfilesystemwatcher_inotify.cpp +++ b/src/corelib/io/qfilesystemwatcher_inotify.cpp @@ -220,7 +220,7 @@ QT_BEGIN_NAMESPACE QInotifyFileSystemWatcherEngine *QInotifyFileSystemWatcherEngine::create(QObject *parent) { - register int fd = -1; + int fd = -1; #ifdef IN_CLOEXEC fd = inotify_init1(IN_CLOEXEC); #endif diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index 02e7b967ea..f2e1f9bbc7 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -882,7 +882,7 @@ inline bool QUrlPrivate::setScheme(const QString &value, int len, bool doSetErro // schemes are ASCII only, so we don't need the full Unicode toLower QChar *schemeData = scheme.data(); // force detaching here for (int i = needsLowercasing; i >= 0; --i) { - register ushort c = schemeData[i].unicode(); + ushort c = schemeData[i].unicode(); if (c >= 'A' && c <= 'Z') schemeData[i] = c + 0x20; } @@ -1244,7 +1244,7 @@ inline void QUrlPrivate::parse(const QString &url, QUrl::ParsingMode parsingMode const ushort *const data = reinterpret_cast(begin); for (int i = 0; i < len; ++i) { - register uint uc = data[i]; + uint uc = data[i]; if (uc == '#' && hash == -1) { hash = i; @@ -1472,7 +1472,7 @@ inline QUrlPrivate::ErrorCode QUrlPrivate::validityError(QString *source, int *p // check for a path of "text:text/" for (int i = 0; i < path.length(); ++i) { - register ushort c = path.at(i).unicode(); + ushort c = path.at(i).unicode(); if (c == '/') { // found the slash before the colon return NoError; @@ -1512,7 +1512,7 @@ bool QUrlPrivate::validateComponent(QUrlPrivate::Section section, const QString const ushort *const data = reinterpret_cast(input.constData()); for (uint i = uint(begin); i < uint(end); ++i) { - register uint uc = data[i]; + uint uc = data[i]; if (uc >= 0x80) continue; diff --git a/src/corelib/io/qurlidna.cpp b/src/corelib/io/qurlidna.cpp index 5fa4b5f7a1..70db9e09eb 100644 --- a/src/corelib/io/qurlidna.cpp +++ b/src/corelib/io/qurlidna.cpp @@ -2028,7 +2028,7 @@ Q_AUTOTEST_EXPORT void qt_nameprep(QString *source, int from) const QChar *e = src + source->size(); for ( ; out < e; ++out) { - register ushort uc = out->unicode(); + ushort uc = out->unicode(); if (uc >= 0x80) { break; } else if (uc >= 'A' && uc <= 'Z') { @@ -2121,7 +2121,7 @@ Q_AUTOTEST_EXPORT bool qt_check_std3rules(const QChar *uc, int len) return false; for (int i = 0; i < len; ++i) { - register ushort c = uc[i].unicode(); + ushort c = uc[i].unicode(); if (c == '-' && (i == 0 || i == len - 1)) return false; @@ -2504,7 +2504,7 @@ QString qt_ACE_do(const QString &domain, AceOperation op) const QChar *in = domain.constData() + lastIdx; const QChar *e = in + labelLength; for (; in < e; ++in, ++out) { - register ushort uc = in->unicode(); + ushort uc = in->unicode(); if (uc > 0x7f) simple = false; if (uc >= 'A' && uc <= 'Z') @@ -2533,7 +2533,7 @@ QString qt_ACE_do(const QString &domain, AceOperation op) // That means we need one or two temporaries qt_nameprep(&result, prevLen); labelLength = result.length() - prevLen; - register int toReserve = labelLength + 4 + 6; // "xn--" plus some extra bytes + int toReserve = labelLength + 4 + 6; // "xn--" plus some extra bytes aceForm.resize(0); if (toReserve > aceForm.capacity()) aceForm.reserve(toReserve); diff --git a/src/corelib/io/qurlrecode.cpp b/src/corelib/io/qurlrecode.cpp index 6e01272831..5ff0c40a4f 100644 --- a/src/corelib/io/qurlrecode.cpp +++ b/src/corelib/io/qurlrecode.cpp @@ -464,7 +464,7 @@ static int recode(QString &result, const ushort *begin, const ushort *end, QUrl: ushort *output = 0; for ( ; input != end; ++input) { - register ushort c; + ushort c; EncodingAction action; // try a run where no change is necessary @@ -483,7 +483,7 @@ static int recode(QString &result, const ushort *begin, const ushort *end, QUrl: break; non_trivial: - register uint decoded; + uint decoded; if (c == '%' && retryBadEncoding) { // always write "%25" ensureDetached(result, output, begin, input, end); diff --git a/src/corelib/kernel/qcore_unix.cpp b/src/corelib/kernel/qcore_unix.cpp index 241658acb1..98e697eb57 100644 --- a/src/corelib/kernel/qcore_unix.cpp +++ b/src/corelib/kernel/qcore_unix.cpp @@ -79,7 +79,7 @@ int qt_safe_select(int nfds, fd_set *fdread, fd_set *fdwrite, fd_set *fdexcept, { if (!orig_timeout) { // no timeout -> block forever - register int ret; + int ret; EINTR_LOOP(ret, select(nfds, fdread, fdwrite, fdexcept, 0)); return ret; } diff --git a/src/corelib/kernel/qcore_unix_p.h b/src/corelib/kernel/qcore_unix_p.h index b68146cd6c..8c0589fdc6 100644 --- a/src/corelib/kernel/qcore_unix_p.h +++ b/src/corelib/kernel/qcore_unix_p.h @@ -168,7 +168,7 @@ static inline int qt_safe_open(const char *pathname, int flags, mode_t mode = 07 #ifdef O_CLOEXEC flags |= O_CLOEXEC; #endif - register int fd; + int fd; EINTR_LOOP(fd, QT_OPEN(pathname, flags, mode)); // unknown flags are ignored, so we have no way of verifying if @@ -191,7 +191,7 @@ static inline int qt_safe_pipe(int pipefd[2], int flags = 0) Q_ASSERT((flags & ~O_NONBLOCK) == 0); #endif - register int ret; + int ret; #if QT_UNIX_SUPPORTS_THREADSAFE_CLOEXEC && defined(O_CLOEXEC) // use pipe2 flags |= O_CLOEXEC; @@ -223,7 +223,7 @@ static inline int qt_safe_dup(int oldfd, int atleast = 0, int flags = FD_CLOEXEC { Q_ASSERT(flags == FD_CLOEXEC || flags == 0); - register int ret; + int ret; #ifdef F_DUPFD_CLOEXEC // use this fcntl if (flags & FD_CLOEXEC) { @@ -247,7 +247,7 @@ static inline int qt_safe_dup2(int oldfd, int newfd, int flags = FD_CLOEXEC) { Q_ASSERT(flags == FD_CLOEXEC || flags == 0); - register int ret; + int ret; #if QT_UNIX_SUPPORTS_THREADSAFE_CLOEXEC && defined(O_CLOEXEC) // use dup3 if (flags & FD_CLOEXEC) { @@ -291,7 +291,7 @@ static inline qint64 qt_safe_write_nosignal(int fd, const void *data, qint64 len static inline int qt_safe_close(int fd) { - register int ret; + int ret; EINTR_LOOP(ret, QT_CLOSE(fd)); return ret; } @@ -303,28 +303,28 @@ static inline int qt_safe_close(int fd) static inline int qt_safe_execve(const char *filename, char *const argv[], char *const envp[]) { - register int ret; + int ret; EINTR_LOOP(ret, ::execve(filename, argv, envp)); return ret; } static inline int qt_safe_execv(const char *path, char *const argv[]) { - register int ret; + int ret; EINTR_LOOP(ret, ::execv(path, argv)); return ret; } static inline int qt_safe_execvp(const char *file, char *const argv[]) { - register int ret; + int ret; EINTR_LOOP(ret, ::execvp(file, argv)); return ret; } static inline pid_t qt_safe_waitpid(pid_t pid, int *status, int options) { - register int ret; + int ret; EINTR_LOOP(ret, ::waitpid(pid, status, options)); return ret; } diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 100e014e99..e49d5f961c 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -938,7 +938,7 @@ bool QCoreApplicationPrivate::sendThroughApplicationEventFilters(QObject *receiv if (receiver->d_func()->threadData == this->threadData && extraData) { // application event filters are only called for objects in the GUI thread for (int i = 0; i < extraData->eventFilters.size(); ++i) { - register QObject *obj = extraData->eventFilters.at(i); + QObject *obj = extraData->eventFilters.at(i); if (!obj) continue; if (obj->d_func()->threadData != threadData) { @@ -957,7 +957,7 @@ bool QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject *receiver, Q Q_Q(QCoreApplication); if (receiver != q && receiver->d_func()->extraData) { for (int i = 0; i < receiver->d_func()->extraData->eventFilters.size(); ++i) { - register QObject *obj = receiver->d_func()->extraData->eventFilters.at(i); + QObject *obj = receiver->d_func()->extraData->eventFilters.at(i); if (!obj) continue; if (obj->d_func()->threadData != receiver->d_func()->threadData) { diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index 7413ef4d89..d9b286e691 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -686,7 +686,7 @@ struct QMetaTypeIdQObject template inline int qRegisterMetaTypeStreamOperators() { - register int id = qMetaTypeId(); + int id = qMetaTypeId(); QMetaType::registerStreamOperators(id, QtMetaTypePrivate::QMetaTypeFunctionHelper::Save, QtMetaTypePrivate::QMetaTypeFunctionHelper::Load); return id; diff --git a/src/corelib/kernel/qsystemsemaphore_unix.cpp b/src/corelib/kernel/qsystemsemaphore_unix.cpp index 6e2838a8a5..073bd020ba 100644 --- a/src/corelib/kernel/qsystemsemaphore_unix.cpp +++ b/src/corelib/kernel/qsystemsemaphore_unix.cpp @@ -212,7 +212,7 @@ bool QSystemSemaphorePrivate::modifySemaphore(int count) operation.sem_op = count; operation.sem_flg = SEM_UNDO; - register int res; + int res; EINTR_LOOP(res, semop(semaphore, &operation, 1)); if (-1 == res) { // If the semaphore was removed be nice and create it and then modifySemaphore again diff --git a/src/corelib/kernel/qtimerinfo_unix.cpp b/src/corelib/kernel/qtimerinfo_unix.cpp index 0e33fa697a..f1bbbe5338 100644 --- a/src/corelib/kernel/qtimerinfo_unix.cpp +++ b/src/corelib/kernel/qtimerinfo_unix.cpp @@ -153,7 +153,7 @@ void QTimerInfoList::timerRepair(const timespec &diff) { // repair all timers for (int i = 0; i < size(); ++i) { - register QTimerInfo *t = at(i); + QTimerInfo *t = at(i); t->timeout = t->timeout + diff; } } @@ -182,7 +182,7 @@ void QTimerInfoList::timerInsert(QTimerInfo *ti) { int index = size(); while (index--) { - register const QTimerInfo * const t = at(index); + const QTimerInfo * const t = at(index); if (!(ti->timeout < t->timeout)) break; } @@ -244,8 +244,8 @@ static void calculateCoarseTimerTimeout(QTimerInfo *t, timespec currentTime) // // The objective is to make most timers wake up at the same time, thereby reducing CPU wakeups. - register uint interval = uint(t->interval); - register uint msec = uint(t->timeout.tv_nsec) / 1000 / 1000; + uint interval = uint(t->interval); + uint msec = uint(t->timeout.tv_nsec) / 1000 / 1000; Q_ASSERT(interval >= 20); // Calculate how much we can round and still keep within 5% error @@ -256,14 +256,14 @@ static void calculateCoarseTimerTimeout(QTimerInfo *t, timespec currentTime) if (interval < 50) { // round to even // round towards multiples of 50 ms - register bool roundUp = (msec % 50) >= 25; + bool roundUp = (msec % 50) >= 25; msec >>= 1; msec |= uint(roundUp); msec <<= 1; } else { // round to multiple of 4 // round towards multiples of 100 ms - register bool roundUp = (msec % 100) >= 50; + bool roundUp = (msec % 100) >= 50; msec >>= 2; msec |= uint(roundUp); msec <<= 2; @@ -423,7 +423,7 @@ int QTimerInfoList::timerRemainingTime(int timerId) timespec tm = {0, 0}; for (int i = 0; i < count(); ++i) { - register QTimerInfo *t = at(i); + QTimerInfo *t = at(i); if (t->id == timerId) { if (currentTime < t->timeout) { // time to wait @@ -509,7 +509,7 @@ bool QTimerInfoList::unregisterTimer(int timerId) { // set timer inactive for (int i = 0; i < count(); ++i) { - register QTimerInfo *t = at(i); + QTimerInfo *t = at(i); if (t->id == timerId) { // found it removeAt(i); @@ -530,7 +530,7 @@ bool QTimerInfoList::unregisterTimers(QObject *object) if (isEmpty()) return false; for (int i = 0; i < count(); ++i) { - register QTimerInfo *t = at(i); + QTimerInfo *t = at(i); if (t->obj == object) { // object found removeAt(i); @@ -550,7 +550,7 @@ QList QTimerInfoList::registeredTimers(QObj { QList list; for (int i = 0; i < count(); ++i) { - register const QTimerInfo * const t = at(i); + const QTimerInfo * const t = at(i); if (t->obj == object) { list << QAbstractEventDispatcher::TimerInfo(t->id, (t->timerType == Qt::VeryCoarseTimer diff --git a/src/corelib/thread/qgenericatomic.h b/src/corelib/thread/qgenericatomic.h index a0a851eabb..3a213f6a25 100644 --- a/src/corelib/thread/qgenericatomic.h +++ b/src/corelib/thread/qgenericatomic.h @@ -172,7 +172,7 @@ template struct QGenericAtomicOps { // implement fetchAndStore on top of testAndSet Q_FOREVER { - register T tmp = load(_q_value); + T tmp = load(_q_value); if (BaseClass::testAndSetRelaxed(_q_value, tmp, newValue)) return tmp; } @@ -207,7 +207,7 @@ template struct QGenericAtomicOps { // implement fetchAndAdd on top of testAndSet Q_FOREVER { - register T tmp = BaseClass::load(_q_value); + T tmp = BaseClass::load(_q_value); if (BaseClass::testAndSetRelaxed(_q_value, tmp, T(tmp + valueToAdd))) return tmp; } diff --git a/src/corelib/thread/qmutex.cpp b/src/corelib/thread/qmutex.cpp index 1ed4a77950..378813c889 100644 --- a/src/corelib/thread/qmutex.cpp +++ b/src/corelib/thread/qmutex.cpp @@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE static inline bool isRecursive(QMutexData *d) { - register quintptr u = quintptr(d); + quintptr u = quintptr(d); if (Q_LIKELY(u <= 0x3)) return false; #ifdef QT_LINUX_FUTEX diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp index dc3f5f3be9..75900e9775 100644 --- a/src/corelib/tools/qbytearray.cpp +++ b/src/corelib/tools/qbytearray.cpp @@ -261,8 +261,8 @@ int qstrcmp(const char *str1, const char *str2) int qstricmp(const char *str1, const char *str2) { - register const uchar *s1 = reinterpret_cast(str1); - register const uchar *s2 = reinterpret_cast(str2); + const uchar *s1 = reinterpret_cast(str1); + const uchar *s2 = reinterpret_cast(str2); int res; uchar c; if (!s1 || !s2) @@ -295,8 +295,8 @@ int qstricmp(const char *str1, const char *str2) int qstrnicmp(const char *str1, const char *str2, uint len) { - register const uchar *s1 = reinterpret_cast(str1); - register const uchar *s2 = reinterpret_cast(str2); + const uchar *s1 = reinterpret_cast(str1); + const uchar *s2 = reinterpret_cast(str2); int res; uchar c; if (!s1 || !s2) @@ -321,7 +321,7 @@ int qstrcmp(const QByteArray &str1, const char *str2) const char *str1data = str1.constData(); const char *str1end = str1data + str1.length(); for ( ; str1data < str1end && *str2; ++str1data, ++str2) { - register int diff = int(uchar(*str1data)) - uchar(*str2); + int diff = int(uchar(*str1data)) - uchar(*str2); if (diff) // found a difference return diff; @@ -357,8 +357,8 @@ int qstrcmp(const QByteArray &str1, const QByteArray &str2) #if 0 static void createCRC16Table() // build CRC16 lookup table { - register unsigned int i; - register unsigned int j; + unsigned int i; + unsigned int j; unsigned short crc_tbl[16]; unsigned int v0, v1, v2, v3; for (i = 0; i < 16; i++) { @@ -410,7 +410,7 @@ static const quint16 crc_tbl[16] = { quint16 qChecksum(const char *data, uint len) { - register quint16 crc = 0xffff; + quint16 crc = 0xffff; uchar c; const uchar *p = reinterpret_cast(data); while (len--) { @@ -2671,7 +2671,7 @@ QByteArray QByteArray::mid(int pos, int len) const QByteArray QByteArray::toLower() const { QByteArray s(*this); - register uchar *p = reinterpret_cast(s.data()); + uchar *p = reinterpret_cast(s.data()); if (p) { while (*p) { *p = QChar::toLower((ushort)*p); @@ -2694,7 +2694,7 @@ QByteArray QByteArray::toLower() const QByteArray QByteArray::toUpper() const { QByteArray s(*this); - register uchar *p = reinterpret_cast(s.data()); + uchar *p = reinterpret_cast(s.data()); if (p) { while (*p) { *p = QChar::toUpper((ushort)*p); diff --git a/src/corelib/tools/qbytearraymatcher.cpp b/src/corelib/tools/qbytearraymatcher.cpp index bcd6a56aad..d030192117 100644 --- a/src/corelib/tools/qbytearraymatcher.cpp +++ b/src/corelib/tools/qbytearraymatcher.cpp @@ -61,7 +61,7 @@ static inline int bm_find(const uchar *cc, int l, int index, const uchar *puc, u return index > l ? -1 : index; const uint pl_minus_one = pl - 1; - register const uchar *current = cc + index + pl_minus_one; + const uchar *current = cc + index + pl_minus_one; const uchar *end = cc + l; while (current < end) { uint skip = skiptable[*current]; diff --git a/src/corelib/tools/qlocale_tools.cpp b/src/corelib/tools/qlocale_tools.cpp index 24ca628b5a..6b716b356f 100644 --- a/src/corelib/tools/qlocale_tools.cpp +++ b/src/corelib/tools/qlocale_tools.cpp @@ -300,13 +300,13 @@ bool removeGroupSeparators(QLocalePrivate::CharBuff *num) * Ignores `locale' stuff. Assumes that the upper and lower case * alphabets and digits are each contiguous. */ -qulonglong qstrtoull(const char *nptr, const char **endptr, register int base, bool *ok) +qulonglong qstrtoull(const char *nptr, const char **endptr, int base, bool *ok) { - register const char *s = nptr; - register qulonglong acc; - register unsigned char c; - register qulonglong qbase, cutoff; - register int any, cutlim; + const char *s = nptr; + qulonglong acc; + unsigned char c; + qulonglong qbase, cutoff; + int any, cutlim; if (ok != 0) *ok = true; @@ -381,13 +381,13 @@ qulonglong qstrtoull(const char *nptr, const char **endptr, register int base, b * Ignores `locale' stuff. Assumes that the upper and lower case * alphabets and digits are each contiguous. */ -qlonglong qstrtoll(const char *nptr, const char **endptr, register int base, bool *ok) +qlonglong qstrtoll(const char *nptr, const char **endptr, int base, bool *ok) { - register const char *s; - register qulonglong acc; - register unsigned char c; - register qulonglong qbase, cutoff; - register int neg, any, cutlim; + const char *s; + qulonglong acc; + unsigned char c; + qulonglong qbase, cutoff; + int neg, any, cutlim; /* * Skip white space and pick up leading +/- sign if any. diff --git a/src/corelib/tools/qlocale_tools_p.h b/src/corelib/tools/qlocale_tools_p.h index 3c4e9b5bd5..cb47bfcb5e 100644 --- a/src/corelib/tools/qlocale_tools_p.h +++ b/src/corelib/tools/qlocale_tools_p.h @@ -110,8 +110,8 @@ bool removeGroupSeparators(QLocalePrivate::CharBuff *num); Q_CORE_EXPORT char *qdtoa(double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **digits_str); Q_CORE_EXPORT double qstrtod(const char *s00, char const **se, bool *ok); -qlonglong qstrtoll(const char *nptr, const char **endptr, register int base, bool *ok); -qulonglong qstrtoull(const char *nptr, const char **endptr, register int base, bool *ok); +qlonglong qstrtoll(const char *nptr, const char **endptr, int base, bool *ok); +qulonglong qstrtoull(const char *nptr, const char **endptr, int base, bool *ok); QT_END_NAMESPACE diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h index 5e30cf3ecb..1423449a69 100644 --- a/src/corelib/tools/qsharedpointer_impl.h +++ b/src/corelib/tools/qsharedpointer_impl.h @@ -506,7 +506,7 @@ public: if (o) { // increase the strongref, but never up from zero // or less (-1 is used by QWeakPointer on untracked QObject) - register int tmp = o->strongref.load(); + int tmp = o->strongref.load(); while (tmp > 0) { // try to increment from "tmp" to "tmp + 1" if (o->strongref.testAndSetRelaxed(tmp, tmp + 1)) @@ -801,7 +801,7 @@ namespace QtSharedPointer { template Q_INLINE_TEMPLATE QSharedPointer qSharedPointerCast(const QSharedPointer &src) { - register X *ptr = static_cast(src.data()); // if you get an error in this line, the cast is invalid + X *ptr = static_cast(src.data()); // if you get an error in this line, the cast is invalid return QtSharedPointer::copyAndSetPointer(ptr, src); } template @@ -813,7 +813,7 @@ Q_INLINE_TEMPLATE QSharedPointer qSharedPointerCast(const QWeakPointer &sr template Q_INLINE_TEMPLATE QSharedPointer qSharedPointerDynamicCast(const QSharedPointer &src) { - register X *ptr = dynamic_cast(src.data()); // if you get an error in this line, the cast is invalid + X *ptr = dynamic_cast(src.data()); // if you get an error in this line, the cast is invalid if (!ptr) return QSharedPointer(); return QtSharedPointer::copyAndSetPointer(ptr, src); @@ -827,7 +827,7 @@ Q_INLINE_TEMPLATE QSharedPointer qSharedPointerDynamicCast(const QWeakPointer template Q_INLINE_TEMPLATE QSharedPointer qSharedPointerConstCast(const QSharedPointer &src) { - register X *ptr = const_cast(src.data()); // if you get an error in this line, the cast is invalid + X *ptr = const_cast(src.data()); // if you get an error in this line, the cast is invalid return QtSharedPointer::copyAndSetPointer(ptr, src); } template @@ -847,7 +847,7 @@ QWeakPointer qWeakPointerCast(const QSharedPointer &src) template Q_INLINE_TEMPLATE QSharedPointer qSharedPointerObjectCast(const QSharedPointer &src) { - register X *ptr = qobject_cast(src.data()); + X *ptr = qobject_cast(src.data()); return QtSharedPointer::copyAndSetPointer(ptr, src); } template diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 54b1a084b2..de09e5bbe0 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -266,7 +266,7 @@ static bool qMemEquals(const quint16 *a, const quint16 *b, int length) if (a == b || !length) return true; - register union { + union { const quint16 *w; const quint32 *d; quintptr value; @@ -291,7 +291,7 @@ static bool qMemEquals(const quint16 *a, const quint16 *b, int length) // both addresses are 4-bytes aligned // do a fast 32-bit comparison - register const quint32 *e = sa.d + (length >> 1); + const quint32 *e = sa.d + (length >> 1); for ( ; sa.d != e; ++sa.d, ++sb.d) { if (*sa.d != *sb.d) return false; @@ -301,7 +301,7 @@ static bool qMemEquals(const quint16 *a, const quint16 *b, int length) return (length & 1) ? *sa.w == *sb.w : true; } else { // one of the addresses isn't 4-byte aligned but the other is - register const quint16 *e = sa.w + length; + const quint16 *e = sa.w + length; for ( ; sa.w != e; ++sa.w, ++sb.w) { if (*sa.w != *sb.w) return false; @@ -4908,8 +4908,8 @@ int QString::compare_helper(const QChar *data1, int length1, const QChar *data2, { if (cs == Qt::CaseSensitive) return ucstrcmp(data1, length1, data2, length2); - register const ushort *s1 = reinterpret_cast(data1); - register const ushort *s2 = reinterpret_cast(data2); + const ushort *s1 = reinterpret_cast(data1); + const ushort *s2 = reinterpret_cast(data2); return ucstricmp(s1, s1 + length1, s2, s2 + length2); } diff --git a/src/corelib/tools/qstringmatcher.cpp b/src/corelib/tools/qstringmatcher.cpp index d54e9c7ba7..1b8a40ef2f 100644 --- a/src/corelib/tools/qstringmatcher.cpp +++ b/src/corelib/tools/qstringmatcher.cpp @@ -69,7 +69,7 @@ static inline int bm_find(const ushort *uc, uint l, int index, const ushort *puc return index > (int)l ? -1 : index; const uint pl_minus_one = pl - 1; - register const ushort *current = uc + index + pl_minus_one; + const ushort *current = uc + index + pl_minus_one; const ushort *end = uc + l; if (cs == Qt::CaseSensitive) { while (current < end) { diff --git a/src/dbus/qdbusutil.cpp b/src/dbus/qdbusutil.cpp index df5e272a1e..c90490df7f 100644 --- a/src/dbus/qdbusutil.cpp +++ b/src/dbus/qdbusutil.cpp @@ -54,7 +54,7 @@ QT_BEGIN_NAMESPACE static inline bool isValidCharacterNoDash(QChar c) { - register ushort u = c.unicode(); + ushort u = c.unicode(); return (u >= 'a' && u <= 'z') || (u >= 'A' && u <= 'Z') || (u >= '0' && u <= '9') @@ -63,7 +63,7 @@ static inline bool isValidCharacterNoDash(QChar c) static inline bool isValidCharacter(QChar c) { - register ushort u = c.unicode(); + ushort u = c.unicode(); return (u >= 'a' && u <= 'z') || (u >= 'A' && u <= 'Z') || (u >= '0' && u <= '9') @@ -72,7 +72,7 @@ static inline bool isValidCharacter(QChar c) static inline bool isValidNumber(QChar c) { - register ushort u = c.unicode(); + ushort u = c.unicode(); return (u >= '0' && u <= '9'); } @@ -259,7 +259,7 @@ static bool isFixedType(int c) // returns NULL if it isn't valid. static const char *validateSingleType(const char *signature) { - register char c = *signature; + char c = *signature; if (c == DBUS_TYPE_INVALID) return 0; diff --git a/src/gui/image/qbmphandler.cpp b/src/gui/image/qbmphandler.cpp index 6abde5e420..cb4e45f1d0 100644 --- a/src/gui/image/qbmphandler.cpp +++ b/src/gui/image/qbmphandler.cpp @@ -53,7 +53,7 @@ static void swapPixel01(QImage *image) // 1-bpp: swap 0 and 1 pixels { int i; if (image->depth() == 1 && image->colorCount() == 2) { - register uint *p = (uint *)image->bits(); + uint *p = (uint *)image->bits(); int nbytes = image->byteCount(); for (i=0; igetChar((char *)&b)) @@ -440,7 +440,7 @@ static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, int offset, int while (--h >= 0) { if (d->read((char*)buf,buflen) != buflen) break; - register uchar *p = data + h*bpl; + uchar *p = data + h*bpl; uchar *b = buf; for (int i=0; i> 4; @@ -457,7 +457,7 @@ static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, int offset, int if (comp == BMP_RLE8) { // run length compression int x=0, y=0; quint8 b; - register uchar *p = data + (h-1)*bpl; + uchar *p = data + (h-1)*bpl; const uchar *endp = p + w; while (y < h) { if (!d->getChar((char *)&b)) @@ -520,7 +520,7 @@ static bool read_dib_body(QDataStream &s, const BMP_INFOHDR &bi, int offset, int } else if (nbits == 16 || nbits == 24 || nbits == 32) { // 16,24,32 bit BMP image - register QRgb *p; + QRgb *p; QRgb *end; uchar *buf24 = new uchar[bpl]; int bpl24 = ((w*nbits+31)/32)*4; @@ -632,7 +632,7 @@ bool qt_write_dib(QDataStream &s, QImage image) uchar *buf = new uchar[bpl_bmp]; uchar *b, *end; - register const uchar *p; + const uchar *p; memset(buf, 0, bpl_bmp); for (y=image.height()-1; y>=0; y--) { // write the image bits diff --git a/src/gui/image/qimage.cpp b/src/gui/image/qimage.cpp index 0efb9c2646..98f3aeeeb9 100644 --- a/src/gui/image/qimage.cpp +++ b/src/gui/image/qimage.cpp @@ -2270,7 +2270,7 @@ static void dither_to_Mono(QImageData *dst, const QImageData *src, int *b1, *b2; int wbytes = w * (d/8); - register const uchar *p = src->data; + const uchar *p = src->data; const uchar *end = p + wbytes; b2 = line2; if (use_gray) { // 8 bit image @@ -2830,7 +2830,7 @@ static void convert_Mono_to_X32(QImageData *dest, const QImageData *src, Qt::Ima uchar *dest_data = dest->data; if (src->format == QImage::Format_Mono) { for (int y = 0; y < dest->height; y++) { - register uint *p = (uint *)dest_data; + uint *p = (uint *)dest_data; for (int x = 0; x < dest->width; x++) *p++ = colorTable.at((src_data[x>>3] >> (7 - (x & 7))) & 1); @@ -2839,7 +2839,7 @@ static void convert_Mono_to_X32(QImageData *dest, const QImageData *src, Qt::Ima } } else { for (int y = 0; y < dest->height; y++) { - register uint *p = (uint *)dest_data; + uint *p = (uint *)dest_data; for (int x = 0; x < dest->width; x++) *p++ = colorTable.at((src_data[x>>3] >> (x & 7)) & 1); @@ -2873,7 +2873,7 @@ static void convert_Mono_to_Indexed8(QImageData *dest, const QImageData *src, Qt uchar *dest_data = dest->data; if (src->format == QImage::Format_Mono) { for (int y = 0; y < dest->height; y++) { - register uchar *p = dest_data; + uchar *p = dest_data; for (int x = 0; x < dest->width; x++) *p++ = (src_data[x>>3] >> (7 - (x & 7))) & 1; src_data += src->bytes_per_line; @@ -2881,7 +2881,7 @@ static void convert_Mono_to_Indexed8(QImageData *dest, const QImageData *src, Qt } } else { for (int y = 0; y < dest->height; y++) { - register uchar *p = dest_data; + uchar *p = dest_data; for (int x = 0; x < dest->width; x++) *p++ = (src_data[x>>3] >> (x & 7)) & 1; src_data += src->bytes_per_line; diff --git a/src/gui/image/qppmhandler.cpp b/src/gui/image/qppmhandler.cpp index e425eca521..6fc41df77c 100644 --- a/src/gui/image/qppmhandler.cpp +++ b/src/gui/image/qppmhandler.cpp @@ -188,7 +188,7 @@ static bool read_pbm_body(QIODevice *device, char type, int w, int h, int mcc, Q } } } else { // read ascii data - register uchar *p; + uchar *p; int n; for (y=0; yscanLine(y); diff --git a/src/gui/image/qxbmhandler.cpp b/src/gui/image/qxbmhandler.cpp index 498f6ce767..aceb6623ea 100644 --- a/src/gui/image/qxbmhandler.cpp +++ b/src/gui/image/qxbmhandler.cpp @@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE X bitmap image read/write functions *****************************************************************************/ -static inline int hex2byte(register char *p) +static inline int hex2byte(char *p) { return ((isdigit((uchar) *p) ? *p - '0' : toupper((uchar) *p) - 'A' + 10) << 4) | (isdigit((uchar) *(p+1)) ? *(p+1) - '0' : toupper((uchar) *(p+1)) - 'A' + 10); @@ -215,7 +215,7 @@ static bool write_xbm_image(const QImage &sourceImage, QIODevice *device, const } } int bcnt = 0; - register char *p = buf; + char *p = buf; int bpl = (w+7)/8; for (int y = 0; y < h; ++y) { uchar *b = image.scanLine(y); diff --git a/src/gui/painting/qdrawhelper.cpp b/src/gui/painting/qdrawhelper.cpp index 2ebba967ed..de0ab53c1b 100644 --- a/src/gui/painting/qdrawhelper.cpp +++ b/src/gui/painting/qdrawhelper.cpp @@ -1121,13 +1121,13 @@ static const uint * QT_FASTCALL fetchTransformedBilinearARGB32PM(uint *buffer, c fx &= fixed_scale - 1; Q_ASSERT((fx >> 16) == 0); while (b < end) { - register int x1 = (fx >> 16); - register int x2 = x1 + 1; + int x1 = (fx >> 16); + int x2 = x1 + 1; Q_ASSERT(x1 >= 0); Q_ASSERT(x2 < count); - register int distx = (fx & 0x0000ffff) >> 8; - register int idistx = 256 - distx; + int distx = (fx & 0x0000ffff) >> 8; + int idistx = 256 - distx; int rb = ((intermediate_buffer[0][x1] * idistx + intermediate_buffer[0][x2] * distx) >> 8) & 0xff00ff; int ag = (intermediate_buffer[1][x1] * idistx + intermediate_buffer[1][x2] * distx) & 0xff00ff00; *b = rb | ag; @@ -1533,13 +1533,13 @@ static const uint *QT_FASTCALL fetchTransformedBilinear(uint *buffer, const Oper fx &= fixed_scale - 1; Q_ASSERT((fx >> 16) == 0); for (int i = 0; i < length; ++i) { - register int x1 = (fx >> 16); - register int x2 = x1 + 1; + int x1 = (fx >> 16); + int x2 = x1 + 1; Q_ASSERT(x1 >= 0); Q_ASSERT(x2 < count); - register int distx = (fx & 0x0000ffff) >> 8; - register int idistx = 256 - distx; + int distx = (fx & 0x0000ffff) >> 8; + int idistx = 256 - distx; int rb = ((buf1[x1] * idistx + buf1[x2] * distx) >> 8) & 0xff00ff; int ag = (buf2[x1] * idistx + buf2[x2] * distx) & 0xff00ff00; buffer[i] = rb | ag; diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h index 5d9867012f..0b8a41c904 100644 --- a/src/gui/painting/qdrawhelper_p.h +++ b/src/gui/painting/qdrawhelper_p.h @@ -759,7 +759,7 @@ do { \ /* Duff's device */ \ uint *_d = (uint*)(dest) + length; \ const uint *_s = (uint*)(src) + length; \ - register int n = ((length) + 7) / 8; \ + int n = ((length) + 7) / 8; \ switch ((length) & 0x07) \ { \ case 0: do { *--_d = *--_s; \ @@ -779,7 +779,7 @@ do { \ /* Duff's device */ \ ushort *_d = (ushort*)(dest); \ const ushort *_s = (ushort*)(src); \ - register int n = ((length) + 7) / 8; \ + int n = ((length) + 7) / 8; \ switch ((length) & 0x07) \ { \ case 0: do { *_d++ = *_s++; \ diff --git a/src/gui/painting/qpolygon.cpp b/src/gui/painting/qpolygon.cpp index 5398387bcf..34215b53b0 100644 --- a/src/gui/painting/qpolygon.cpp +++ b/src/gui/painting/qpolygon.cpp @@ -218,8 +218,8 @@ void QPolygon::translate(int dx, int dy) if (dx == 0 && dy == 0) return; - register QPoint *p = data(); - register int i = size(); + QPoint *p = data(); + int i = size(); QPoint pt(dx, dy); while (i--) { *p += pt; @@ -447,7 +447,7 @@ QRect QPolygon::boundingRect() const { if (isEmpty()) return QRect(0, 0, 0, 0); - register const QPoint *pd = constData(); + const QPoint *pd = constData(); int minx, maxx, miny, maxy; minx = maxx = pd->x(); miny = maxy = pd->y(); @@ -599,8 +599,8 @@ void QPolygonF::translate(const QPointF &offset) if (offset.isNull()) return; - register QPointF *p = data(); - register int i = size(); + QPointF *p = data(); + int i = size(); while (i--) { *p += offset; ++p; @@ -660,7 +660,7 @@ QRectF QPolygonF::boundingRect() const { if (isEmpty()) return QRectF(0, 0, 0, 0); - register const QPointF *pd = constData(); + const QPointF *pd = constData(); qreal minx, maxx, miny, maxy; minx = maxx = pd->x(); miny = maxy = pd->y(); diff --git a/src/gui/painting/qregion.cpp b/src/gui/painting/qregion.cpp index ce5abdbbd9..47668c62b6 100644 --- a/src/gui/painting/qregion.cpp +++ b/src/gui/painting/qregion.cpp @@ -1585,14 +1585,14 @@ void QRegionPrivate::selfTest() const static QRegionPrivate qrp; QRegion::QRegionData QRegion::shared_empty = {Q_BASIC_ATOMIC_INITIALIZER(1), &qrp}; -typedef void (*OverlapFunc)(register QRegionPrivate &dest, register const QRect *r1, const QRect *r1End, - register const QRect *r2, const QRect *r2End, register int y1, register int y2); -typedef void (*NonOverlapFunc)(register QRegionPrivate &dest, register const QRect *r, const QRect *rEnd, - register int y1, register int y2); +typedef void (*OverlapFunc)(QRegionPrivate &dest, const QRect *r1, const QRect *r1End, + const QRect *r2, const QRect *r2End, int y1, int y2); +typedef void (*NonOverlapFunc)(QRegionPrivate &dest, const QRect *r, const QRect *rEnd, + int y1, int y2); static bool EqualRegion(const QRegionPrivate *r1, const QRegionPrivate *r2); static void UnionRegion(const QRegionPrivate *reg1, const QRegionPrivate *reg2, QRegionPrivate &dest); -static void miRegionOp(register QRegionPrivate &dest, const QRegionPrivate *reg1, const QRegionPrivate *reg2, +static void miRegionOp(QRegionPrivate &dest, const QRegionPrivate *reg1, const QRegionPrivate *reg2, OverlapFunc overlapFunc, NonOverlapFunc nonOverlap1Func, NonOverlapFunc nonOverlap2Func); @@ -1789,7 +1789,7 @@ SOFTWARE. */ /* $XFree86: xc/lib/X11/Region.c,v 1.1.1.2.2.2 1998/10/04 15:22:50 hohndel Exp $ */ -static void UnionRectWithRegion(register const QRect *rect, const QRegionPrivate *source, +static void UnionRectWithRegion(const QRect *rect, const QRegionPrivate *source, QRegionPrivate &dest) { if (rect->isEmpty()) @@ -1824,9 +1824,9 @@ static void UnionRectWithRegion(register const QRect *rect, const QRegionPrivate */ static void miSetExtents(QRegionPrivate &dest) { - register const QRect *pBox, + const QRect *pBox, *pBoxEnd; - register QRect *pExtents; + QRect *pExtents; dest.innerRect.setCoords(0, 0, -1, -1); dest.innerArea = -1; @@ -1871,11 +1871,11 @@ static void miSetExtents(QRegionPrivate &dest) added by raymond */ -static void OffsetRegion(register QRegionPrivate ®ion, register int x, register int y) +static void OffsetRegion(QRegionPrivate ®ion, int x, int y) { if (region.rects.size()) { - register QRect *pbox = region.rects.data(); - register int nbox = region.numRects; + QRect *pbox = region.rects.data(); + int nbox = region.numRects; while (nbox--) { pbox->translate(x, y); @@ -1902,12 +1902,12 @@ static void OffsetRegion(register QRegionPrivate ®ion, register int x, regist * *----------------------------------------------------------------------- */ -static void miIntersectO(register QRegionPrivate &dest, register const QRect *r1, const QRect *r1End, - register const QRect *r2, const QRect *r2End, int y1, int y2) +static void miIntersectO(QRegionPrivate &dest, const QRect *r1, const QRect *r1End, + const QRect *r2, const QRect *r2End, int y1, int y2) { - register int x1; - register int x2; - register QRect *pNextRect; + int x1; + int x2; + QRect *pNextRect; pNextRect = dest.rects.data() + dest.numRects; @@ -1967,11 +1967,11 @@ static void miIntersectO(register QRegionPrivate &dest, register const QRect *r1 * *----------------------------------------------------------------------- */ -static int miCoalesce(register QRegionPrivate &dest, int prevStart, int curStart) +static int miCoalesce(QRegionPrivate &dest, int prevStart, int curStart) { - register QRect *pPrevBox; /* Current box in previous band */ - register QRect *pCurBox; /* Current box in current band */ - register QRect *pRegEnd; /* End of region */ + QRect *pPrevBox; /* Current box in previous band */ + QRect *pCurBox; /* Current box in current band */ + QRect *pRegEnd; /* End of region */ int curNumRects; /* Number of rectangles in current band */ int prevNumRects; /* Number of rectangles in previous band */ int bandY1; /* Y1 coordinate for current band */ @@ -2096,21 +2096,21 @@ static int miCoalesce(register QRegionPrivate &dest, int prevStart, int curStart * *----------------------------------------------------------------------- */ -static void miRegionOp(register QRegionPrivate &dest, +static void miRegionOp(QRegionPrivate &dest, const QRegionPrivate *reg1, const QRegionPrivate *reg2, OverlapFunc overlapFunc, NonOverlapFunc nonOverlap1Func, NonOverlapFunc nonOverlap2Func) { - register const QRect *r1; // Pointer into first region - register const QRect *r2; // Pointer into 2d region + const QRect *r1; // Pointer into first region + const QRect *r2; // Pointer into 2d region const QRect *r1End; // End of 1st region const QRect *r2End; // End of 2d region - register int ybot; // Bottom of intersection - register int ytop; // Top of intersection + int ybot; // Bottom of intersection + int ytop; // Top of intersection int prevBand; // Index of start of previous band in dest int curBand; // Index of start of current band in dest - register const QRect *r1BandEnd; // End of current band in r1 - register const QRect *r2BandEnd; // End of current band in r2 + const QRect *r1BandEnd; // End of current band in r1 + const QRect *r2BandEnd; // End of current band in r2 int top; // Top of non-overlapping band int bot; // Bottom of non-overlapping band @@ -2312,10 +2312,10 @@ static void miRegionOp(register QRegionPrivate &dest, *----------------------------------------------------------------------- */ -static void miUnionNonO(register QRegionPrivate &dest, register const QRect *r, const QRect *rEnd, - register int y1, register int y2) +static void miUnionNonO(QRegionPrivate &dest, const QRect *r, const QRect *rEnd, + int y1, int y2) { - register QRect *pNextRect; + QRect *pNextRect; pNextRect = dest.rects.data() + dest.numRects; @@ -2348,10 +2348,10 @@ static void miUnionNonO(register QRegionPrivate &dest, register const QRect *r, *----------------------------------------------------------------------- */ -static void miUnionO(register QRegionPrivate &dest, register const QRect *r1, const QRect *r1End, - register const QRect *r2, const QRect *r2End, register int y1, register int y2) +static void miUnionO(QRegionPrivate &dest, const QRect *r1, const QRect *r1End, + const QRect *r2, const QRect *r2End, int y1, int y2) { - register QRect *pNextRect; + QRect *pNextRect; pNextRect = dest.rects.data() + dest.numRects; @@ -2437,10 +2437,10 @@ static void UnionRegion(const QRegionPrivate *reg1, const QRegionPrivate *reg2, *----------------------------------------------------------------------- */ -static void miSubtractNonO1(register QRegionPrivate &dest, register const QRect *r, - const QRect *rEnd, register int y1, register int y2) +static void miSubtractNonO1(QRegionPrivate &dest, const QRect *r, + const QRect *rEnd, int y1, int y2) { - register QRect *pNextRect; + QRect *pNextRect; pNextRect = dest.rects.data() + dest.numRects; @@ -2471,11 +2471,11 @@ static void miSubtractNonO1(register QRegionPrivate &dest, register const QRect *----------------------------------------------------------------------- */ -static void miSubtractO(register QRegionPrivate &dest, register const QRect *r1, const QRect *r1End, - register const QRect *r2, const QRect *r2End, register int y1, register int y2) +static void miSubtractO(QRegionPrivate &dest, const QRect *r1, const QRect *r1End, + const QRect *r2, const QRect *r2End, int y1, int y2) { - register QRect *pNextRect; - register int x1; + QRect *pNextRect; + int x1; x1 = r1->left(); @@ -2573,7 +2573,7 @@ static void miSubtractO(register QRegionPrivate &dest, register const QRect *r1, */ static void SubtractRegion(QRegionPrivate *regM, QRegionPrivate *regS, - register QRegionPrivate &dest) + QRegionPrivate &dest) { Q_ASSERT(!isEmptyHelper(regM)); Q_ASSERT(!isEmptyHelper(regS)); @@ -2668,12 +2668,12 @@ static bool PointInRegion(QRegionPrivate *pRegion, int x, int y) return false; } -static bool RectInRegion(register QRegionPrivate *region, int rx, int ry, uint rwidth, uint rheight) +static bool RectInRegion(QRegionPrivate *region, int rx, int ry, uint rwidth, uint rheight) { - register const QRect *pbox; - register const QRect *pboxEnd; + const QRect *pbox; + const QRect *pboxEnd; QRect rect(rx, ry, rwidth, rheight); - register QRect *prect = ▭ + QRect *prect = ▭ int partIn, partOut; if (!region || region->numRects == 0 || !EXTENTCHECK(®ion->extents, prect)) @@ -3094,8 +3094,8 @@ SOFTWARE. static void InsertEdgeInET(EdgeTable *ET, EdgeTableEntry *ETE, int scanline, ScanLineListBlock **SLLBlock, int *iSLLBlock) { - register EdgeTableEntry *start, *prev; - register ScanLineList *pSLL, *pPrevSLL; + EdgeTableEntry *start, *prev; + ScanLineList *pSLL, *pPrevSLL; ScanLineListBlock *tmpSLLBlock; /* @@ -3172,11 +3172,11 @@ static void InsertEdgeInET(EdgeTable *ET, EdgeTableEntry *ETE, int scanline, * */ -static void CreateETandAET(register int count, register const QPoint *pts, - EdgeTable *ET, EdgeTableEntry *AET, register EdgeTableEntry *pETEs, +static void CreateETandAET(int count, const QPoint *pts, + EdgeTable *ET, EdgeTableEntry *AET, EdgeTableEntry *pETEs, ScanLineListBlock *pSLLBlock) { - register const QPoint *top, + const QPoint *top, *bottom, *PrevPt, *CurrPt; @@ -3259,10 +3259,10 @@ static void CreateETandAET(register int count, register const QPoint *pts, * */ -static void loadAET(register EdgeTableEntry *AET, register EdgeTableEntry *ETEs) +static void loadAET(EdgeTableEntry *AET, EdgeTableEntry *ETEs) { - register EdgeTableEntry *pPrevAET; - register EdgeTableEntry *tmp; + EdgeTableEntry *pPrevAET; + EdgeTableEntry *tmp; pPrevAET = AET; AET = AET->next; @@ -3303,11 +3303,11 @@ static void loadAET(register EdgeTableEntry *AET, register EdgeTableEntry *ETEs) * V-------------------> V---> ... * */ -static void computeWAET(register EdgeTableEntry *AET) +static void computeWAET(EdgeTableEntry *AET) { - register EdgeTableEntry *pWETE; - register int inside = 1; - register int isInside = 0; + EdgeTableEntry *pWETE; + int inside = 1; + int isInside = 0; AET->nextWETE = 0; pWETE = AET; @@ -3337,12 +3337,12 @@ static void computeWAET(register EdgeTableEntry *AET) * */ -static int InsertionSort(register EdgeTableEntry *AET) +static int InsertionSort(EdgeTableEntry *AET) { - register EdgeTableEntry *pETEchase; - register EdgeTableEntry *pETEinsert; - register EdgeTableEntry *pETEchaseBackTMP; - register int changed = 0; + EdgeTableEntry *pETEchase; + EdgeTableEntry *pETEinsert; + EdgeTableEntry *pETEchaseBackTMP; + int changed = 0; AET = AET->next; while (AET) { @@ -3370,9 +3370,9 @@ static int InsertionSort(register EdgeTableEntry *AET) /* * Clean up our act. */ -static void FreeStorage(register ScanLineListBlock *pSLLBlock) +static void FreeStorage(ScanLineListBlock *pSLLBlock) { - register ScanLineListBlock *tmpSLLBlock; + ScanLineListBlock *tmpSLLBlock; while (pSLLBlock) { tmpSLLBlock = pSLLBlock->next; @@ -3436,7 +3436,7 @@ static inline void flushRow(const QRegionSpan *spans, int y, int numSpans, QRegi * stack by the calling procedure. * */ -static void PtsToRegion(register int numFullPtBlocks, register int iCurPtBlock, +static void PtsToRegion(int numFullPtBlocks, int iCurPtBlock, POINTBLOCK *FirstPtBlock, QRegionPrivate *reg) { int lastRow = 0; @@ -3512,12 +3512,12 @@ static QRegionPrivate *PolygonRegion(const QPoint *Pts, int Count, int rule) //int rule; /* winding rule */ { QRegionPrivate *region; - register EdgeTableEntry *pAET; /* Active Edge Table */ - register int y; /* current scanline */ - register int iPts = 0; /* number of pts in buffer */ - register EdgeTableEntry *pWETE; /* Winding Edge Table Entry*/ - register ScanLineList *pSLL; /* current scanLineList */ - register QPoint *pts; /* output buffer */ + EdgeTableEntry *pAET; /* Active Edge Table */ + int y; /* current scanline */ + int iPts = 0; /* number of pts in buffer */ + EdgeTableEntry *pWETE; /* Winding Edge Table Entry*/ + ScanLineList *pSLL; /* current scanLineList */ + QPoint *pts; /* output buffer */ EdgeTableEntry *pPrevAET; /* ptr to previous AET */ EdgeTable ET; /* header node for ET */ EdgeTableEntry AET; /* header node for AET */ diff --git a/src/network/access/qnetworkcookie_p.h b/src/network/access/qnetworkcookie_p.h index 2c099ac922..6bf8a059a4 100644 --- a/src/network/access/qnetworkcookie_p.h +++ b/src/network/access/qnetworkcookie_p.h @@ -73,7 +73,7 @@ public: bool httpOnly; }; -static inline bool isLWS(register char c) +static inline bool isLWS(char c) { return c == ' ' || c == '\t' || c == '\r' || c == '\n'; } diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp index c04421e5c7..c7d3846465 100644 --- a/src/network/access/qnetworkreplyhttpimpl.cpp +++ b/src/network/access/qnetworkreplyhttpimpl.cpp @@ -67,7 +67,7 @@ QT_BEGIN_NAMESPACE class QNetworkProxy; -static inline bool isSeparator(register char c) +static inline bool isSeparator(char c) { static const char separators[] = "()<>@,;:\\\"/[]?={}"; return isLWS(c) || strchr(separators, c) != 0; @@ -123,7 +123,7 @@ static QHash parseHttpOptionHeader(const QByteArray &hea // quoted-pair = "\" CHAR ++pos; while (pos < header.length()) { - register char c = header.at(pos); + char c = header.at(pos); if (c == '"') { // end of quoted text break; @@ -141,7 +141,7 @@ static QHash parseHttpOptionHeader(const QByteArray &hea } else { // case: token while (pos < header.length()) { - register char c = header.at(pos); + char c = header.at(pos); if (isSeparator(c)) break; value += c; diff --git a/src/network/socket/qnet_unix_p.h b/src/network/socket/qnet_unix_p.h index 5e6a1cac54..80e23075d3 100644 --- a/src/network/socket/qnet_unix_p.h +++ b/src/network/socket/qnet_unix_p.h @@ -84,7 +84,7 @@ static inline int qt_safe_socket(int domain, int type, int protocol, int flags = { Q_ASSERT((flags & ~O_NONBLOCK) == 0); - register int fd; + int fd; #if defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) int newtype = type | SOCK_CLOEXEC; if (flags & O_NONBLOCK) @@ -112,7 +112,7 @@ static inline int qt_safe_accept(int s, struct sockaddr *addr, QT_SOCKLEN_T *add { Q_ASSERT((flags & ~O_NONBLOCK) == 0); - register int fd; + int fd; #if QT_UNIX_SUPPORTS_THREADSAFE_CLOEXEC && defined(SOCK_CLOEXEC) && defined(SOCK_NONBLOCK) // use accept4 int sockflags = SOCK_CLOEXEC; @@ -144,7 +144,7 @@ static inline int qt_safe_listen(int s, int backlog) static inline int qt_safe_connect(int sockfd, const struct sockaddr *addr, QT_SOCKLEN_T addrlen) { - register int ret; + int ret; // Solaris e.g. expects a non-const 2nd parameter EINTR_LOOP(ret, QT_SOCKET_CONNECT(sockfd, const_cast(addr), addrlen)); return ret; @@ -192,7 +192,7 @@ static inline int qt_safe_sendto(int sockfd, const void *buf, size_t len, int fl qt_ignore_sigpipe(); #endif - register int ret; + int ret; #ifdef Q_OS_VXWORKS EINTR_LOOP(ret, ::sendto(sockfd, (char *) buf, len, flags, (struct sockaddr *) to, tolen)); #else diff --git a/src/plugins/imageformats/ico/qicohandler.cpp b/src/plugins/imageformats/ico/qicohandler.cpp index a45c3875bc..b1a674365d 100644 --- a/src/plugins/imageformats/ico/qicohandler.cpp +++ b/src/plugins/imageformats/ico/qicohandler.cpp @@ -448,7 +448,7 @@ void ICOReader::read4BitBMP(QImage & image) image = QImage(); break; } - register uchar *p = image.scanLine(h); + uchar *p = image.scanLine(h); uchar *b = buf; for (int i=0; i> 4; @@ -487,7 +487,7 @@ void ICOReader::read16_24_32BMP(QImage & image) { if (iod) { int h = icoAttrib.h; - register QRgb *p; + QRgb *p; QRgb *end; uchar *buf = new uchar[image.bytesPerLine()]; int bpl = ((icoAttrib.w*icoAttrib.nbits+31)/32)*4; diff --git a/src/plugins/platforms/windows/qwindowskeymapper.cpp b/src/plugins/platforms/windows/qwindowskeymapper.cpp index f6163ed8c7..47c136991a 100644 --- a/src/plugins/platforms/windows/qwindowskeymapper.cpp +++ b/src/plugins/platforms/windows/qwindowskeymapper.cpp @@ -664,7 +664,7 @@ void QWindowsKeyMapper::updatePossibleKeyCodes(unsigned char *kbdBuffer, quint32 bool QWindowsKeyMapper::isADeadKey(unsigned int vk_key, unsigned int modifiers) { if ((vk_key < NumKeyboardLayoutItems) && keyLayout[vk_key].exists) { - for (register size_t i = 0; i < NumMods; ++i) { + for (size_t i = 0; i < NumMods; ++i) { if (uint(ModsTbl[i]) == modifiers) return bool(keyLayout[vk_key].deadkeys & 1<constBegin(); it != mySet->constEnd(); ++it) { - register QWidget *w = *it; + QWidget *w = *it; if (!w->parent()) // window w->destroy(true, true); } @@ -1044,7 +1044,7 @@ void QApplication::setStyle(QStyle *style) if (QApplicationPrivate::app_style) { if (QApplicationPrivate::is_app_running && !QApplicationPrivate::is_app_closing) { for (QWidgetList::ConstIterator it = all.constBegin(); it != all.constEnd(); ++it) { - register QWidget *w = *it; + QWidget *w = *it; if (!(w->windowType() == Qt::Desktop) && // except desktop w->testAttribute(Qt::WA_WState_Polished)) { // has been polished QApplicationPrivate::app_style->unpolish(w); @@ -1086,7 +1086,7 @@ void QApplication::setStyle(QStyle *style) // re-polish existing widgets if necessary if (QApplicationPrivate::is_app_running && !QApplicationPrivate::is_app_closing) { for (QWidgetList::ConstIterator it1 = all.constBegin(); it1 != all.constEnd(); ++it1) { - register QWidget *w = *it1; + QWidget *w = *it1; if (w->windowType() != Qt::Desktop && w->testAttribute(Qt::WA_WState_Polished)) { if (w->style() == QApplicationPrivate::app_style) QApplicationPrivate::app_style->polish(w); // repolish @@ -1098,7 +1098,7 @@ void QApplication::setStyle(QStyle *style) } for (QWidgetList::ConstIterator it2 = all.constBegin(); it2 != all.constEnd(); ++it2) { - register QWidget *w = *it2; + QWidget *w = *it2; if (w->windowType() != Qt::Desktop && !w->testAttribute(Qt::WA_SetStyle)) { QEvent e(QEvent::StyleChange); QApplication::sendEvent(w, &e); @@ -1328,7 +1328,7 @@ void QApplicationPrivate::setPalette_helper(const QPalette &palette, const char* QWidgetList wids = QApplication::allWidgets(); for (QWidgetList::ConstIterator it = wids.constBegin(); it != wids.constEnd(); ++it) { - register QWidget *w = *it; + QWidget *w = *it; if (all || (!className && w->isWindow()) || w->inherits(className)) // matching class QApplication::sendEvent(w, &e); } @@ -1510,7 +1510,7 @@ void QApplication::setFont(const QFont &font, const char *className) QWidgetList wids = QApplication::allWidgets(); for (QWidgetList::ConstIterator it = wids.constBegin(); it != wids.constEnd(); ++it) { - register QWidget *w = *it; + QWidget *w = *it; if (all || (!className && w->isWindow()) || w->inherits(className)) // matching class sendEvent(w, &e); } @@ -1580,7 +1580,7 @@ void QApplication::setWindowIcon(const QIcon &icon) QEvent e(QEvent::ApplicationWindowIconChange); QWidgetList all = QApplication::allWidgets(); for (QWidgetList::ConstIterator it = all.constBegin(); it != all.constEnd(); ++it) { - register QWidget *w = *it; + QWidget *w = *it; if (w->isWindow()) sendEvent(w, &e); } @@ -2962,7 +2962,7 @@ bool QApplication::notify(QObject *receiver, QEvent *e) && mouse->type() == QEvent::MouseMove && mouse->buttons() == 0) { // but still send them through all application event filters (normally done by notify_helper) for (int i = 0; d->extraData && i < d->extraData->eventFilters.size(); ++i) { - register QObject *obj = d->extraData->eventFilters.at(i); + QObject *obj = d->extraData->eventFilters.at(i); if (!obj) continue; if (obj->d_func()->threadData != w->d_func()->threadData) { diff --git a/src/widgets/kernel/qwhatsthis.cpp b/src/widgets/kernel/qwhatsthis.cpp index b96bd024cb..661317d21a 100644 --- a/src/widgets/kernel/qwhatsthis.cpp +++ b/src/widgets/kernel/qwhatsthis.cpp @@ -380,7 +380,7 @@ void QWhatsThisPrivate::notifyToplevels(QEvent *e) { QWidgetList toplevels = QApplication::topLevelWidgets(); for (int i = 0; i < toplevels.count(); ++i) { - register QWidget *w = toplevels.at(i); + QWidget *w = toplevels.at(i); QApplication::sendEvent(w, e); } } diff --git a/src/widgets/styles/qwindowsxpstyle.cpp b/src/widgets/styles/qwindowsxpstyle.cpp index 31cf329262..3b3c27f6cb 100644 --- a/src/widgets/styles/qwindowsxpstyle.cpp +++ b/src/widgets/styles/qwindowsxpstyle.cpp @@ -582,7 +582,7 @@ bool QWindowsXPStylePrivate::hasAlphaChannel(const QRect &rect) int firstAlpha = -1; for (int y = startY; y < h/2; ++y) { - register DWORD *buffer = (DWORD*)bufferPixels + (y * bufferW); + DWORD *buffer = (DWORD*)bufferPixels + (y * bufferW); for (int x = startX; x < w; ++x, ++buffer) { int alpha = (*buffer) >> 24; if (firstAlpha == -1) @@ -611,8 +611,8 @@ bool QWindowsXPStylePrivate::fixAlphaChannel(const QRect &rect) bool hasFixedAlphaValue = false; for (int y = startY; y < h; ++y) { - register DWORD *buffer = (DWORD*)bufferPixels + (y * bufferW); - for (register int x = startX; x < w; ++x, ++buffer) { + DWORD *buffer = (DWORD*)bufferPixels + (y * bufferW); + for (int x = startX; x < w; ++x, ++buffer) { uint pixel = *buffer; int alpha = qAlpha(pixel); if (qRed(pixel) > alpha || qGreen(pixel) > alpha || qBlue(pixel) > alpha) { @@ -643,13 +643,13 @@ bool QWindowsXPStylePrivate::swapAlphaChannel(const QRect &rect, bool allPixels) // Flip the alphas, so that 255-alpha pixels are 0, and 0-alpha are 255. for (int y = startY; y < h; ++y) { - register DWORD *buffer = (DWORD*)bufferPixels + (y * bufferW); - for (register int x = startX; x < w; ++x, ++buffer) { + DWORD *buffer = (DWORD*)bufferPixels + (y * bufferW); + for (int x = startX; x < w; ++x, ++buffer) { if (allPixels) { *buffer |= 0xFF000000; continue; } - register unsigned int alphaValue = (*buffer) & 0xFF000000; + unsigned int alphaValue = (*buffer) & 0xFF000000; if (alphaValue == 0xFF000000) { *buffer = 0; valueChange = true; diff --git a/src/widgets/widgets/qlcdnumber.cpp b/src/widgets/widgets/qlcdnumber.cpp index 3ba9ad9ba3..5104171fb1 100644 --- a/src/widgets/widgets/qlcdnumber.cpp +++ b/src/widgets/widgets/qlcdnumber.cpp @@ -429,7 +429,7 @@ void QLCDNumber::setDigitCount(int numDigits) bool doDisplay = d->ndigits == 0; if (numDigits == d->ndigits) // no change return; - register int i; + int i; int dif; if (numDigits > d->ndigits) { // expand dif = numDigits - d->ndigits; From 1c05791bd1e89bd7551d77e80db7fa4750f2631f Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 13 Jun 2013 20:42:07 +0200 Subject: [PATCH 47/79] move qmake docs into qtbase as of qttools/18a5e89623815f5355b4173a2e93609eb10289d1 Change-Id: I75cb55e0c404449a4e0d963e09185287a3f6343e Reviewed-by: Martin Smith Reviewed-by: Leena Miettinen --- qmake/doc/qmake.qdocconf | 26 + qmake/doc/src/images/qmake-precompile-ui.png | Bin 0 -> 89070 bytes qmake/doc/src/qmake-manual.qdoc | 4491 +++++++++++++++++ .../snippets/code/doc_src_qmake-manual.cpp | 58 + .../snippets/code/doc_src_qmake-manual.pro | 917 ++++ qmake/doc/src/snippets/qmake/comments.pro | 10 + qmake/doc/src/snippets/qmake/configscopes.pro | 23 + .../src/snippets/qmake/debug_and_release.pro | 14 + qmake/doc/src/snippets/qmake/delegate.h | 40 + .../doc/src/snippets/qmake/dereferencing.pro | 5 + qmake/doc/src/snippets/qmake/destdir.pro | 2 + qmake/doc/src/snippets/qmake/dirname.pro | 6 + qmake/doc/src/snippets/qmake/environment.pro | 9 + qmake/doc/src/snippets/qmake/functions.pro | 34 + qmake/doc/src/snippets/qmake/include.pro | 3 + qmake/doc/src/snippets/qmake/main.cpp | 40 + qmake/doc/src/snippets/qmake/model.cpp | 40 + qmake/doc/src/snippets/qmake/model.h | 40 + qmake/doc/src/snippets/qmake/other.pro | 0 .../src/snippets/qmake/paintwidget_mac.cpp | 40 + .../src/snippets/qmake/paintwidget_unix.cpp | 44 + .../src/snippets/qmake/paintwidget_win.cpp | 40 + .../src/snippets/qmake/precompile-stable.h | 52 + .../src/snippets/qmake/project_location.pro | 6 + .../src/snippets/qmake/qtconfiguration.pro | 18 + qmake/doc/src/snippets/qmake/quoting.pro | 8 + qmake/doc/src/snippets/qmake/replace.pro | 4 + .../src/snippets/qmake/replacefunction.pro | 46 + qmake/doc/src/snippets/qmake/scopes.pro | 42 + .../src/snippets/qmake/shared_or_static.pro | 8 + qmake/doc/src/snippets/qmake/spaces.pro | 9 + .../doc/src/snippets/qmake/specifications.pro | 7 + qmake/doc/src/snippets/qmake/testfunction.pro | 20 + qmake/doc/src/snippets/qmake/variables.pro | 7 + qmake/doc/src/snippets/qmake/view.h | 40 + qmake/qmake-docs.pro | 2 + qtbase.pro | 2 + 37 files changed, 6153 insertions(+) create mode 100644 qmake/doc/qmake.qdocconf create mode 100644 qmake/doc/src/images/qmake-precompile-ui.png create mode 100644 qmake/doc/src/qmake-manual.qdoc create mode 100644 qmake/doc/src/snippets/code/doc_src_qmake-manual.cpp create mode 100644 qmake/doc/src/snippets/code/doc_src_qmake-manual.pro create mode 100644 qmake/doc/src/snippets/qmake/comments.pro create mode 100644 qmake/doc/src/snippets/qmake/configscopes.pro create mode 100644 qmake/doc/src/snippets/qmake/debug_and_release.pro create mode 100644 qmake/doc/src/snippets/qmake/delegate.h create mode 100644 qmake/doc/src/snippets/qmake/dereferencing.pro create mode 100644 qmake/doc/src/snippets/qmake/destdir.pro create mode 100644 qmake/doc/src/snippets/qmake/dirname.pro create mode 100644 qmake/doc/src/snippets/qmake/environment.pro create mode 100644 qmake/doc/src/snippets/qmake/functions.pro create mode 100644 qmake/doc/src/snippets/qmake/include.pro create mode 100644 qmake/doc/src/snippets/qmake/main.cpp create mode 100644 qmake/doc/src/snippets/qmake/model.cpp create mode 100644 qmake/doc/src/snippets/qmake/model.h create mode 100644 qmake/doc/src/snippets/qmake/other.pro create mode 100644 qmake/doc/src/snippets/qmake/paintwidget_mac.cpp create mode 100644 qmake/doc/src/snippets/qmake/paintwidget_unix.cpp create mode 100644 qmake/doc/src/snippets/qmake/paintwidget_win.cpp create mode 100644 qmake/doc/src/snippets/qmake/precompile-stable.h create mode 100644 qmake/doc/src/snippets/qmake/project_location.pro create mode 100644 qmake/doc/src/snippets/qmake/qtconfiguration.pro create mode 100644 qmake/doc/src/snippets/qmake/quoting.pro create mode 100644 qmake/doc/src/snippets/qmake/replace.pro create mode 100644 qmake/doc/src/snippets/qmake/replacefunction.pro create mode 100644 qmake/doc/src/snippets/qmake/scopes.pro create mode 100644 qmake/doc/src/snippets/qmake/shared_or_static.pro create mode 100644 qmake/doc/src/snippets/qmake/spaces.pro create mode 100644 qmake/doc/src/snippets/qmake/specifications.pro create mode 100644 qmake/doc/src/snippets/qmake/testfunction.pro create mode 100644 qmake/doc/src/snippets/qmake/variables.pro create mode 100644 qmake/doc/src/snippets/qmake/view.h create mode 100644 qmake/qmake-docs.pro diff --git a/qmake/doc/qmake.qdocconf b/qmake/doc/qmake.qdocconf new file mode 100644 index 0000000000..67e6e95650 --- /dev/null +++ b/qmake/doc/qmake.qdocconf @@ -0,0 +1,26 @@ +include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) + +project = QMake +description = QMake Manual +url = http://qt-project.org/doc/qt-$QT_VER/qmake + +qhp.projects = qmake + +qhp.qmake.file = qmake.qhp +qhp.qmake.namespace = org.qt-project.qmake.$QT_VERSION_TAG +qhp.qmake.virtualFolder = qmake +qhp.qmake.indexTitle = QMake Manual +qhp.qmake.filterAttributes = qt $QT_VERSION tools qmake +qhp.qmake.customFilters.qmake.name = qmake Manual +qhp.qmake.customFilters.qmake.filterAttributes = qt tools qmake +qhp.qmake.subprojects = manual +qhp.qmake.subprojects.manual.title = Manual +qhp.qmake.subprojects.manual.indexTitle = qmake Manual +qhp.qmake.subprojects.manual.selectors = fake:page + +language = Cpp + +sources = src/qmake-manual.qdoc + +imagedirs = src/images +exampledirs = src diff --git a/qmake/doc/src/images/qmake-precompile-ui.png b/qmake/doc/src/images/qmake-precompile-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..8c7b936feee1ed429141d38b3a64f0d7315a5fd8 GIT binary patch literal 89070 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 z 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.version variables instead. + \endlist + + For example, you can query the installation of Qt for this version of qmake with the + \c QT_INSTALL_PREFIX property: + + \snippet snippets/code/doc_src_qmake-manual.pro 77 + + You can query the values of properties in a project file as follows: + + \snippet snippets/code/doc_src_qmake-manual.pro 78 + + \target QMAKESPEC + \section1 QMAKESPEC + + qmake requires a platform and compiler + description file which contains many default values used to generate + appropriate Makefiles. The standard Qt distribution comes with many of + these files, located in the \c mkspecs subdirectory of the Qt installation. + + The \c QMAKESPEC environment variable can contain any of the following: + + \list + \li A complete path to a directory containing a \c{qmake.conf} file. + In this case qmake will open the + \c{qmake.conf} file from within that directory. If the file does not + exist, qmake will exit with an error. + \li The name of a platform-compiler combination. In this case, + qmake will search in the directory specified + by the \c mkspecs subdirectory of the data path specified when Qt was + compiled (see QLibraryInfo::DataPath). + \endlist + + \note The \c QMAKESPEC path will automatically be added to the + \l{INCLUDEPATH} system variable. + + \target cache + \section1 Cache File + + The cache file is a special file qmake reads to + find settings not specified in the \c qmake.conf file, project files, or + at the command line. When qmake is run, it looks for a file called + \c{.qmake.cache} in parent directories of the current directory, unless you + specify \c -nocache. If qmake + fails to find this file, it will silently ignore this step of processing. + + If qmake finds a \c{.qmake.cache} file then it will process this file first before + it processes the project file. + + \target Extensions + \section1 File Extensions + + Under normal circumstances qmake will try to + use appropriate file extensions for your platform. However, it is + sometimes necessary to override the default choices for each platform and + explicitly define file extensions for qmake to + use. This is achieved by redefining certain built-in variables. For + example, the extension used for \l moc files can be redefined with the + following assignment in a project file: + + \snippet snippets/code/doc_src_qmake-manual.pro 85 + + The following variables can be used to redefine common file extensions recognized + by qmake: + + \list + \li \l{QMAKE_EXT_MOC} modifies the extension placed on included moc files. + \li \l{QMAKE_EXT_UI} modifies the extension used for \QD UI files + (usually in \l{FORMS}). + \li \l{QMAKE_EXT_PRL} modifies the extension placed on + \l{#LibDepend}{library dependency files}. + \li \l{QMAKE_EXT_LEX} changes the suffix used in Lex files (usually in + \l{LEXSOURCES}). + \li \l{QMAKE_EXT_YACC} changes the suffix used in Yacc files (usually in + \l{YACCSOURCES}). + \li \l{QMAKE_EXT_OBJ} changes the suffix used on generated object files. + \endlist + + All of the above accept just the first value, so you must assign to it just one + value that will be used throughout your project file. There are two variables that + accept a list of values: + + \list + \li \l{QMAKE_EXT_CPP} causes qmake to interpret + all files with these suffixes as C++ source files. + \li \l{QMAKE_EXT_H} causes qmake to interpret + all files with these suffixes as C and C++ header files. + \endlist +*/ + +/*! + \page qmake-language.html + \title qmake Language + \contentspage {qmake Manual}{Contents} + \previouspage Platform Notes + \nextpage Advanced Usage + + Many qmake project files simply describe the + sources and header files used by the project, using a list of + \c{name = value} and \c{name += value} definitions. + qmake also provides other operators, functions, + and scopes that can be used to process the information supplied in + variable declarations. These advanced features allow Makefiles to be + generated for multiple platforms from a single project file. + + \section1 Operators + + In many project files, the assignment (\c{=}) and append (\c{+=}) operators can + be used to include all the information about a project. The typical pattern of + use is to assign a list of values to a variable, and append more values + depending on the result of various tests. Since + qmake defines certain variables using default + values, it is sometimes necessary to use the removal (\c{-=}) operator to + filter out values that are not required. The following sections describe how + to use operators to manipulate the contents of variables. + + \section2 Assigning Values + + The \c = operator assigns a value to a variable: + + \snippet snippets/code/doc_src_qmake-manual.pro 89 + + The above line sets the \l{TARGET} variable to \c myapp. This will overwrite any + values previously set for \c TARGET with \c myapp. + + \section2 Appending Values + + The \c += operator appends a new value to the list of values in a variable: + + \snippet snippets/code/doc_src_qmake-manual.pro 90 + + The above line appends \c USE_MY_STUFF to the list of pre-processor defines to be put + in the generated Makefile. + + \section2 Removing Values + + The \c -= operator removes a value from the list of values in a variable: + + \snippet snippets/code/doc_src_qmake-manual.pro 91 + + The above line removes \c USE_MY_STUFF from the list of pre-processor defines to be + put in the generated Makefile. + + \section2 Adding Unique Values + + The \c *= operator adds a value to the list of values in a variable, but only + if it is not already present. This prevents values from being included many + times in a variable. For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 92 + + In the above line, \c USE_MY_STUFF will only be added to the list of pre-processor + defines if it is not already defined. Note that the \l{unique}{unique()} + function can also be used to ensure that a variable only contains one + instance of each value. + + \section2 Replacing Values + + The \c ~= operator replaces any values that match a regular expression with + the specified value: + + \snippet snippets/code/doc_src_qmake-manual.pro 93 + + In the above line, any values in the list that start with \c QT_D or \c QT_T are + replaced with \c QT. + + \section2 Variable Expansion + + The \c $$ operator is used to extract the contents of a variable, and can be + used to pass values between variables or supply them to functions: + + \snippet snippets/code/doc_src_qmake-manual.pro 94 + + Variables can be used to store the contents of environment variables. + These can be evaluated at the time when qmake + is run, or included in the generated Makefile for evaluation when the + project is built. + + To obtain the contents of an environment value when + qmake is run, use the \c $$(...) operator: + + \snippet snippets/qmake/environment.pro 0 + + In the above assignment, the value of the \c PWD environment variable + is read when the project file is processed. + + To obtain the contents of an environment value at the time when the + generated Makefile is processed, use the \c $(...) operator: + + \snippet snippets/qmake/environment.pro 1 + + In the above assignment, the value of \c PWD is read immediately + when the project file is processed, but \c $(PWD) is assigned to + \c DESTDIR in the generated Makefile. This makes the build process + more flexible as long as the environment variable is set correctly + when the Makefile is processed. + + \section2 Accessing qmake Properties + + The special \c $$[...] operator can be used to access qmake properties: + + \snippet snippets/qmake/qtconfiguration.pro 0 + + For more information, see \l{Configuring qmake}. + + The properties accessible with this operator are typically used to + enable third party plugins and components to be integrated in Qt. + For example, a \QD plugin can be installed alongside \QD's built-in + plugins if the following declaration is made in its project file: + + \snippet snippets/code/doc_src_qmake-manual.pro 101 + + \target Scopes + \section1 Scopes + + Scopes are similar to \c if statements in procedural programming languages. + If a certain condition is true, the declarations inside the scope are processed. + + \section2 Scope Syntax + + Scopes consist of a condition followed by an opening brace on the same line, + a sequence of commands and definitions, and a closing brace on a new line: + + \snippet snippets/qmake/scopes.pro syntax + + The opening brace \e{must be written on the same line as the condition}. + Scopes may be concatenated to include more than one condition, as described + in the following sections. + + \section2 Scopes and Conditions + + A scope is written as a condition followed by a series of declarations + contained within a pair of braces. For example: + + \snippet snippets/qmake/scopes.pro 0 + + The above code will add the \c paintwidget_win.cpp file to the sources listed + in the generated Makefile when building for a Windows platform. When + building for other platforms, the define will be ignored. + + The conditions used in a given scope can also be negated to provide an + alternative set of declarations that will be processed only if the + original condition is false. For example, to process something when building + for all platforms \e except Windows, negate the scope like this: + + \snippet snippets/qmake/scopes.pro 1 + + Scopes can be nested to combine more than one condition. For instance, to + include a particular file for a certain platform only if + debugging is enabled, write the following: + + \snippet snippets/qmake/scopes.pro 2 + + To save writing many nested scopes, you can nest scopes using the \c : + operator. The nested scopes in the above example can be rewritten in + the following way: + + \snippet snippets/qmake/scopes.pro 3 + + You may also use the \c : operator to perform single line conditional + assignments. For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 95 + + The above line adds \c USE_MY_STUFF to the \l{DEFINES} variable only when + building for the Windows platform. + Generally, the \c : operator behaves like a logical AND operator, joining + together a number of conditions, and requiring all of them to be true. + + There is also the \c | operator to act like a logical OR operator, joining + together a number of conditions, and requiring only one of them to be true. + + \snippet snippets/qmake/scopes.pro 4 + + You can also provide alternative declarations to those within a scope by + using an \c else scope. Each \c else scope is processed if the conditions + for the preceding scopes are false. + This allows you to write complex tests when combined with other scopes + (separated by the \c : operator as above). For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 96 + + \section2 Configuration and Scopes + + The values stored in the \l{CONFIG} variable are + treated specially by qmake. Each of the possible + values can be used as the condition for a scope. For example, the list of + values held by \c CONFIG can be extended with the \c opengl value: + + \snippet snippets/qmake/configscopes.pro 0 + + As a result of this operation, any scopes that test for \c opengl will + be processed. We can use this feature to give the final executable an + appropriate name: + + \snippet snippets/qmake/configscopes.pro 1 + \snippet snippets/qmake/configscopes.pro 2 + \snippet snippets/qmake/configscopes.pro 3 + + This feature makes it easy to change the configuration for a project + without losing all the custom settings that might be needed for a specific + configuration. In the above code, the declarations in the first scope are + processed, and the final executable will be called \c application-gl. + However, if \c opengl is not specified, the declarations in the second + scope are processed instead, and the final executable will be called + \c application. + + Since it is possible to put your own values on the \c CONFIG + line, this provides you with a convenient way to customize project files + and fine-tune the generated Makefiles. + + \section2 Platform Scope Values + + In addition to the \c win32, \c macx, and \c unix values used in many + scope conditions, various other built-in platform and compiler-specific + values can be tested with scopes. These are based on platform + specifications provided in Qt's \c mkspecs directory. For example, the + following lines from a project file show the current specification in + use and test for the \c linux-g++ specification: + + \snippet snippets/qmake/specifications.pro 0 + + You can test for any other platform-compiler combination as long as a + specification exists for it in the \c mkspecs directory. + + \target UsingVariables + \section1 Variables + + Many of the variables used in project files are special variables that + qmake uses when generating Makefiles, such as \l{DEFINES}, \l{SOURCES}, and + \l{HEADERS}. In addition, you can create variables for your own use. qmake + creates new + variables with a given name when it encounters an assignment to that name. + For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 97 + + There are no restricitions on what you do to your own variables, as + qmake will ignore them unless it needs to evaluate them when processing + a scope. + + You can also assign the value of a current variable to another + variable by prefixing $$ to the variable name. For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 98 + + Now the MY_DEFINES variable contains what is in the DEFINES variable at + this point in the project file. This is also equivalent to: + + \snippet snippets/code/doc_src_qmake-manual.pro 99 + + The second notation allows you to append the contents of the variable to + another value without separating the two with a space. For example, the + following will ensure that the final executable will be given a name + that includes the project template being used: + + \snippet snippets/code/doc_src_qmake-manual.pro 100 + + \target UsingReplaceFunctions + \section1 Replace Functions + + qmake provides a selection of built-in + functions to allow the contents of variables to be processed. These + functions process the arguments supplied to them and return a value, or + list of values, as a result. To assign a result to a variable, use the \c $$ + operator with this type of function as you would to assign contents of one + variable to another: + + \snippet snippets/qmake/functions.pro 1 + + This type of function should be used on the right-hand side of + assignments (that is, as an operand). + + You can define your own functions for processing the contents of variables + as follows: + + \snippet snippets/code/doc_src_qmake-manual.pro 102 + + The following example function takes a variable name as its only + argument, extracts a list of values from the variable with the + \l{eval(string)}{eval()} built-in function, and compiles a list of files: + + \snippet snippets/qmake/replacefunction.pro 0 + + \target UsingTestFunctions + \section1 Test Functions + + qmake provides built-in functions that can be + used as conditions when writing scopes. These functions do not return a + value, but instead indicate \e success or \e failure: + + \snippet snippets/qmake/functions.pro 3 + + This type of function should be used in conditional expressions + only. + + It is possible to define your own functions to provide conditions + for scopes. The following example tests whether each file in a list + exists and returns true if they all exist, or false if not: + + \snippet snippets/qmake/testfunction.pro 0 +*/ + +/*! + \page qmake-advanced-usage.html + \title Advanced Usage + \contentspage {qmake Manual}{Contents} + \previouspage qmake Language + \nextpage Using Precompiled Headers + + \section1 Adding New Configuration Features + + qmake lets you create your own \c features that + can be included in project files by adding their names to the list of + values specified by the \l{CONFIG} variable. Features are collections of + custom functions and definitions in \c{.prf} files that can reside in one + of many standard directories. The locations of these directories are + defined in a number of places, and qmake checks + each of them in the following order when it looks for \c{.prf} files: + + \omit + TODO: Fix the list, as it is incomplete and partly incorrect. + \endomit + + \list 1 + \li In a directory listed in the \c QMAKEFEATURES environment variable that + contains a colon-separated list of directories. + \li In a directory listed in the \c QMAKEFEATURES property variable that + contains a colon-spearated list of directories. + \omit + \li In a features directory beneath the project's root directory (where + the \c{.qmake.cache} file is generated). + \endomit + \li In a features directory residing within a \c mkspecs directory. + \c mkspecs directories can be located beneath any of the directories + listed in the \c QMAKEPATH environment variable that contains a + colon-separated list of directories. For example: + \c{$QMAKEPATH/mkspecs/}. + \li In a features directory residing beneath the directory provided by the + \l{QMAKESPEC} environment variable. For example: \c{$QMAKESPEC/}. + \li In a features directory residing in the \c data_install/mkspecs directory. + For example: \c{data_install/mkspecs/}. + \li In a features directory that exists as a sibling of the directory + specified by the \c QMAKESPEC environment variable. + For example: \c{$QMAKESPEC/../}. + \endlist + + The following features directories are searched for features files: + + \list 1 + \li \c{features/unix}, \c{features/win32}, or \c{features/macx}, depending on + the platform in use + \li \c features/ + \endlist + + For example, consider the following assignment in a project file: + + \snippet snippets/code/doc_src_qmake-manual.pro 103 + + With this addition to the \c CONFIG variable, + qmake will search the locations listed above for + the \c myfeatures.prf file after it has finished parsing your project file. + On Unix systems, it will look for the following file: + + \list 1 + \li \c $QMAKEFEATURES/myfeatures.prf (for each directory listed in the + \c QMAKEFEATURES environment variable) + \li \c $$QMAKEFEATURES/myfeatures.prf (for each directory listed in the + \c QMAKEFEATURES property variable) + \li \c myfeatures.prf (in the project's root directory) + \li \c $QMAKEPATH/mkspecs/features/unix/myfeatures.prf and + \c $QMAKEPATH/mkspecs/features/myfeatures.prf (for each directory + listed in the \c QMAKEPATH environment variable) + \li \c $QMAKESPEC/features/unix/myfeatures.prf and + \c $QMAKESPEC/features/myfeatures.prf + \li \c data_install/mkspecs/features/unix/myfeatures.prf and + \c data_install/mkspecs/features/myfeatures.prf + \li \c $QMAKESPEC/../features/unix/myfeatures.prf and + \c $QMAKESPEC/../features/myfeatures.prf + \endlist + + \note The \c{.prf} files must have names in lower case. + + \section1 Installing Files + + It is common on Unix to also use the build tool to install applications + and libraries; for example, by invoking \c{make install}. For this reason, + qmake has the concept of an \c {install set}, an + object which contains instructions about the way a part of a project is to + be installed. For example, a collection of documentation files can be + described in the following way: + + \snippet snippets/code/doc_src_qmake-manual.pro 79 + + The \c path member informs qmake that the files + should be installed in \c /usr/local/program/doc (the path member), and the + \c files member specifies the files that should be copied to the + installation directory. In this case, everything in the \c docs directory + will be copied to \c /usr/local/program/doc. + + Once an install set has been fully described, you can append it to the + install list with a line like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 80 + + qmake will ensure that the specified files are + copied to the installation directory. If you require more control over + this process, you can also provide a definition for the \c extra member of + the object. For example, the following line tells + qmake to execute a series of commands for this + install set: + + \snippet snippets/code/doc_src_qmake-manual.pro 81 + + The \c unix \l{Scopes and Conditions}{scope} + ensures that these particular commands are only executed on Unix platforms. + Appropriate commands for other platforms can be defined using other scope + rules. + + Commands specified in the \c extra member are executed before the instructions + in the other members of the object are performed. + + If you append a built-in install set to the \c INSTALLS variable and do + not specify \c files or \c extra members, qmake + will decide what needs to be copied for you. Currently, the \c target and \c dlltarget + install sets are supported. For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 82 + + In the above lines, qmake knows what needs to + be copied, and will handle the installation process automatically. + + \section1 Adding Custom Targets + + qmake tries to do everything expected of a + cross-platform build tool. This is often less than ideal when you really + need to run special platform-dependent commands. This can be achieved with + specific instructions to the different qmake backends. + + Customization of the Makefile output is performed through an object-style + API as found in other places in qmake. Objects are defined automatically by + specifying their \e members. For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 86 + + The definitions above define a qmake target called \c mytarget, containing a + Makefile target called \c{.buildfile} which in turn is generated with the + \l{touchfunction}{touch()} function. Finally, the + \c{.depends} member specifies that \c mytarget depends on \c mytarget2, + another target that is defined afterwards. \c mytarget2 is a dummy target. + It is only defined to echo some text to the console. + + The final step is to use the \c QMAKE_EXTRA_TARGETS variable to instruct + qmake that this object is a target to be built: + + \snippet snippets/code/doc_src_qmake-manual.pro 87 + + This is all you need to do to actually build custom targets. Of course, + you may want to tie one of these targets to the + \l{TARGET}{qmake build target}. To do this, you + simply need to include your Makefile target in the list of + \l{PRE_TARGETDEPS}. + + Custom target specifications support the following members: + + \table + \header + \li Member + \li Description + \row + \li commands + \li The commands for generating the custom build target. + \row + \li CONFIG + \li Specific configuration options for the custom build target. Can be + set to \c recursive to indicate that rules should be created in the + Makefile to call the relevant target inside the sub-target specific + Makefile. This member defaults to creating an entry for each of the + sub-targets. + \row + \li depends + \li The existing build targets that the custom build target depends on. + \row + \li recurse + \li Specifies which sub-targets should be used when creating the rules + in the Makefile to call in the sub-target specific Makefile. This + member is used only when \c recursive is set in \c CONFIG. Typical + values are "Debug" and "Release". + \row + \li recurse_target + \li Specifies the target that should be built via the sub-target + Makefile for the rule in the Makefile. This member adds something + like \c {$(MAKE) -f Makefile.[subtarget] [recurse_target]}. This + member is used only when \c recursive is set in \c CONFIG. + \row + \li target + \li The name of the custom build target. + \endtable + + \section1 Adding Compilers + + It is possible to customize qmake to support new compilers and + preprocessors: + + \snippet snippets/code/doc_src_qmake-manual.pro 88 + + With the above definitions, you can use a drop-in replacement for moc if one + is available. The command is executed on all arguments given to the + \c NEW_HEADERS variable (from the \c input member), and the result is written + to the file defined by the \c output member. This file is added to the + other source files in the project. Additionally, qmake will execute + \c depend_command to generate dependency information, and place this + information in the project as well. + + Custom compiler specifications support the following members: + + \table + \header + \li Member + \li Description + \row + \li commands + \li The commands used for for generating the output from the input. + \row + \li CONFIG + \li Specific configuration options for the custom compiler. See the + CONFIG table for details. + \row + \li depend_command + \li Specifies a command used to generate the list of dependencies for + the output. + \row + \li dependency_type + \li Specifies the type of file the output is. If it is a known type + (such as TYPE_C, TYPE_UI, TYPE_QRC), it is handled as one of those + type of files. + \row + \li depends + \li Specifies the dependencies of the output file. + \row + \li input + \li The variable that specifies the files that should be processed with + the custom compiler. + \row + \li name + \li A description of what the custom compiler is doing. This is only + used in some backends. + \row + \li output + \li The filename that is created from the custom compiler. + \row + \li output_function + \li Specifies a custom qmake function that is used to specify the + filename to be created. + \row + \li variables + \li Indicates that the variables specified here are replaced with + $(QMAKE_COMP_VARNAME) when referred to in the pro file as + $(VARNAME). + \row + \li variable_out + \li The variable that the files created from the output should be added + to. + \endtable + + The CONFIG member supports the following options: + + \table + \header + \li Option + \li Description + \row + \li combine + \li Indicates that all of the input files are combined into a single + output file. + \row + \li target_predeps + \li Indicates that the output should be added to the list of + \l{PRE_TARGETDEPS}. + \row + \li explicit_dependencies + \li The dependencies for the output only get generated from the depends + member and from nowhere else. + \row + \li no_link + \li Indicates that the output should not be added to the list of objects + to be linked in. + \endtable + + \target LibDepend + \section1 Library Dependencies + + Often when linking against a library, qmake + relies on the underlying platform to know what other libraries this + library links against, and lets the platform pull them in. In many cases, + however, this is not sufficient. For example, when statically linking a + library, no other libraries are linked to, and therefore no dependencies + to those libraries are created. However, an application that later links + against this library will need to know where to find the symbols that + the static library will require. qmake attempts to keep track of the + dependencies of a library, where appropriate, if you explicitly enable + tracking. + + The first step is to enable dependency tracking in the library itself. + To do this you must tell qmake to save information about the library: + + \snippet snippets/code/doc_src_qmake-manual.pro 83 + + This is only relevant to the \c lib template, and will be ignored for all + others. When this option is enabled, qmake will create a file ending in .prl + which will save some meta-information about the library. This metafile is + just like an ordinary project file, but only contains internal variable + declarations. When installing this library, by specifying it as a target in + an \l{INSTALLS} declaration, qmake will automatically copy the .prl file to + the installation path. + + The second step in this process is to enable reading of this meta + information in the applications that use the static library: + + \snippet snippets/code/doc_src_qmake-manual.pro 84 + + When this is enabled, qmake will process all + libraries linked to by the application and find their meta-information. + qmake will use this to determine the relevant + linking information, specifically adding values to the application project + file's list of \l{DEFINES} as well as \l{LIBS}. Once + qmake has processed this file, it will then + look through the newly introduced libraries in the \c LIBS variable, and + find their dependent .prl files, continuing until all libraries have been + resolved. At this point, the Makefile is created as usual, and the + libraries are linked explicitly against the application. + + The .prl files should be created by qmake only, and should not be + transferred between operating systems, as they may contain + platform-dependent information. +*/ + +/*! + \page qmake-precompiledheaders.html + \title Using Precompiled Headers + \contentspage {qmake Manual}{Contents} + \previouspage Advanced Usage + \nextpage Configuring qmake + + \target Introduction + + Precompiled headers (PCH) are a performance feature supported by some + compilers to compile a stable body of code, and store the compiled + state of the code in a binary file. During subsequent compilations, + the compiler will load the stored state, and continue compiling the + specified file. Each subsequent compilation is faster because the + stable code does not need to be recompiled. + + qmake supports the use of precompiled headers + on some platforms and build environments, including: + \list + \li Windows + \list + \li nmake + \li Visual Studio projects (VS 2008 and later) + \endlist + \li Mac OS X + \list + \li Makefile + \li Xcode + \endlist + \li Unix + \list + \li GCC 3.4 and above + \endlist + \endlist + + \target ADD_PCH + \section1 Adding Precompiled Headers to Your Project + + The precompiled header must contain code which is \e stable + and \e static throughout your project. A typical precompiled header might + look like this: + + \snippet snippets/code/doc_src_qmake-manual.cpp 104 + + \note A precompiled header file needs to separate C includes from + C++ includes, since the precompiled header file for C files may not + contain C++ code. + + \target PROJECT_OPTIONS + \section2 Project Options + + To make your project use precompiled headers, you only need to define the + \l{PRECOMPILED_HEADER} variable in your project file: + + \snippet snippets/code/doc_src_qmake-manual.pro 105 + + qmake will handle the rest, to ensure the + creation and use of the precompiled header file. You do not need to + include the precompiled header file in \c HEADERS, as + qmake will do this if the configuration supports precompiled headers. + + All platforms that support precompiled headers have the configuration + option \c precompile_header set. Using this option, you may trigger + conditional blocks in your project file to add settings when using + precompiled headers. + For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 106 + + \section1 Notes on Possible Issues + + On some platforms, the file name suffix for precompiled header files is + the same as that for other object files. For example, the following + declarations may cause two different object files with the same name to + be generated: + + \snippet snippets/code/doc_src_qmake-manual.pro 107 + + To avoid potential conflicts like these, give distinctive names to header + files that will be precompiled. + + \target EXAMPLE_PROJECT + \section1 Example Project + + You can find the following source code in the + \c{examples/qmake/precompile} directory in the Qt distribution: + + \section2 \c mydialog.ui + + The following image displays the mydialog.ui file in Qt Creator Design mode. + You can view the code in the Edit mode. + + \image qmake-precompile-ui.png + + \section2 \c stable.h + + \snippet snippets/qmake/precompile-stable.h 0 + + \omit + ##Keeping the snippet in qtdoc is a workaround, because it contains code + that would tell qdoc to start a new page. Remove it and put the + following snippet back after modularizing the docs. + \snippet examples/qmake/precompile/stable.h 0 + \endomit + + \section2 \c myobject.h + + \code + #include + + class MyObject : public QObject + { + public: + MyObject(); + ~MyObject(); + }; + \endcode + + \omit + ##Remove the code and put the snippets back after modularizing the docs. + \snippet examples/qmake/precompile/myobject.h 0 + \endomit + + \section2 \c myobject.cpp + + \code + #include + #include + #include + #include "myobject.h" + + MyObject::MyObject() + : QObject() + { + std::cout << "MyObject::MyObject()\n"; + } + \endcode + + \omit + \snippet examples/qmake/precompile/myobject.cpp 0 + \endomit + + \section2 \c util.cpp + + \code + void util_function_does_nothing() + { + // Nothing here... + int x = 0; + ++x; + } + \endcode + + \omit + \snippet examples/qmake/precompile/util.cpp 0 + \endomit + + \section2 \c main.cpp + + \code + #include + #include + #include + #include "myobject.h" + #include "mydialog.h" + + int main(int argc, char **argv) + { + QApplication app(argc, argv); + + MyObject obj; + MyDialog dialog; + + dialog.connect(dialog.aButton, SIGNAL(clicked()), SLOT(close())); + dialog.show(); + + return app.exec(); + } + \endcode + + \omit + \snippet examples/qmake/precompile/main.cpp 0 + \endomit + + \section2 \c precompile.pro + + \code + TEMPLATE = app + LANGUAGE = C++ + CONFIG += console precompile_header + CONFIG -= app_bundle + + # Use Precompiled headers (PCH) + PRECOMPILED_HEADER = stable.h + + HEADERS = stable.h \ + mydialog.h \ + myobject.h + SOURCES = main.cpp \ + mydialog.cpp \ + myobject.cpp \ + util.cpp + FORMS = mydialog.ui + \endcode + + \omit + \snippet examples/qmake/precompile/precompile.pro 0 + \endomit +*/ + +/*! + \page qmake-tutorial.html + \title Getting Started + \contentspage {qmake Manual}{Contents} + \previouspage Overview + \nextpage Creating Project Files + + This tutorial teaches you the basics of qmake. The other topics in this + manual contain more detailed information about using qmake. + + \section1 Starting off Simple + + Let's assume that you have just finished a basic implementation of + your application, and you have created the following files: + + \list + \li hello.cpp + \li hello.h + \li main.cpp + \endlist + + You will find these files in the \c{examples/qmake/tutorial} directory + of the Qt distribution. The only other thing you know about the setup of + the application is that it's written in Qt. First, using your favorite + plain text editor, create a file called \c hello.pro in + \c{examples/qmake/tutorial}. The first thing you need to do is add the + lines that tell qmake about the source and + header files that are part of your development project. + + We'll add the source files to the project file first. To do this you + need to use the \l{SOURCES} variable. + Just start a new line with \c {SOURCES +=} and put hello.cpp after it. + You should have something like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 108 + + We repeat this for each source file in the project, until we end up + with the following: + + \snippet snippets/code/doc_src_qmake-manual.pro 109 + + If you prefer to use a Make-like syntax, with all the files listed in + one go you can use the newline escaping like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 110 + + Now that the source files are listed in the project file, the header + files must be added. These are added in exactly the same way as source + files, except that the variable name we use is \l{HEADERS}. + + Once you have done this, your project file should look something like + this: + + \snippet snippets/code/doc_src_qmake-manual.pro 111 + + The target name is set automatically. It is the same as the project + filename, but with the suffix appropriate for the platform. For example, if + the project file is called \c hello.pro, the target will be \c hello.exe + on Windows and \c hello on Unix. If you want to use a different name + you can set it in the project file: + + \snippet snippets/code/doc_src_qmake-manual.pro 112 + + The finished project file should look like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 113 + + You can now use qmake to generate a Makefile + for your application. On the command line, in your project directory, + type the following: + + \snippet snippets/code/doc_src_qmake-manual.pro 114 + + Then type \c make or \c nmake depending on the compiler you use. + + For Visual Studio users, qmake can also generate Visual Studio project + files. For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 115 + + \section1 Making an Application Debuggable + + The release version of an application does not contain any debugging + symbols or other debugging information. During development, it is useful + to produce a debugging version of the application that has the + relevant information. This is easily achieved by adding \c debug to the + \l{CONFIG} variable in the project file. + + For example: + + \snippet snippets/code/doc_src_qmake-manual.pro 116 + + Use qmake as before to generate a Makefile. You will now obtain useful + information about your application when running it in a debugging + environment. + + \section1 Adding Platform-Specific Source Files + + After a few hours of coding, you might have made a start on the + platform-specific part of your application, and decided to keep the + platform-dependent code separate. So you now have two new files to + include into your project file: \c hellowin.cpp and \c + hellounix.cpp. We cannot just add these to the \c SOURCES + variable since that would place both files in the Makefile. So, what we + need to do here is to use a scope which will be processed depending on + which platform we are building for. + + A simple scope that adds the platform-dependent file for + Windows looks like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 117 + + When building for Windows, qmake adds \c hellowin.cpp to the list of source + files. When building for any other platform, qmake simply ignores it. Now + all that is left to be done is to create a scope for the Unix-specific file. + + When you have done that, your project file should look + something like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 118 + + Use qmake as before to generate a Makefile. + + \section1 Stopping qmake If a File Does Not Exist + + You may not want to create a Makefile if a certain file does not exist. + We can check if a file exists by using the \l{exists(filename)}{exists()} + function. We can stop qmake from processing by using the \l{error(string)} + {error()} function. This works in the same way as scopes do. Simply replace + the scope condition with the function. A check for a file called main.cpp looks + like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 119 + + The \c{!} symbol is used to negate the test. That is, \c{exists( main.cpp )} + is true if the file exists, and \c{!exists( main.cpp )} is true if the + file does not exist. + + \snippet snippets/code/doc_src_qmake-manual.pro 120 + + Use qmake as before to generate a makefile. + If you rename \c main.cpp temporarily, you will see the message and + qmake will stop processing. + + \section1 Checking for More than One Condition + + Suppose you use Windows and you want to be able to see statement + output with \c {qDebug()} when you run your application on the command line. + To see the output, you must build your application with the appropriate + console setting. We can easily put \c console on the \c CONFIG + line to include this setting in the Makefile on Windows. However, + let's say that we only want to add the \c CONFIG line when we are running + on Windows \e and when \c debug is already on the \c CONFIG line. + This requires using two nested scopes. First create one scope, then create + the other inside it. Put the settings to be processed inside the second + scope, like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 121 + + Nested scopes can be joined together using colons, so the final + project file looks like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 122 + + That's it! You have now completed the tutorial for + qmake, and are ready to write project files for + your development projects. +*/ + +/*! + \page qmake-common-projects.html + \title Building Common Project Types + \contentspage {qmake Manual}{Contents} + \previouspage Creating Project Files + \nextpage Running qmake + + This chapter describes how to set up qmake project files for three common + project types that are based on Qt: application, library, and plugin. + Although all project types use many of the same variables, each of + them uses project-specific variables to customize output files. + + Platform-specific variables are not described here. For more information, + see \l{Deploying an Application on Windows} and + \l{Developing Qt Applications for Mac OS X}. + + \target Application + \section1 Building an Application + + The \c app template tells qmake to generate a + Makefile that will build an application. With this template, the type of + application can be specified by adding one of the following options to the + \l{CONFIG} variable definition: + + \table + \header \li Option \li Description + \row \li windows \li The application is a Windows GUI application. + \row \li console \li \c app template only: the application is a Windows console + application. + \row \li testcase \li The application is \l{Building a Testcase}{an automated test}. + \endtable + + When using this template, the following qmake + system variables are recognized. You should use these in your .pro file to + specify information about your application. + + \list + \li \l{HEADERS} - A list of header files for the application. + \li \l{SOURCES} - A list of C++ source files for the application. + \li \l{FORMS} - A list of UI files for the application (created using + Qt Designer). + \li \l{LEXSOURCES} - A list of Lex source files for the application. + \li \l{YACCSOURCES} - A list of Yacc source files for the + application. + \li \l{TARGET} - Name of the executable for the application. This defaults + to the name of the project file. (The extension, if any, is added + automatically). + \li \l{DESTDIR} - The directory in which the target executable is placed. + \li \l{DEFINES} - A list of any additional pre-processor defines needed for + the application. + \li \l{INCLUDEPATH} - A list of any additional include paths needed for the + application. + \li \l{DEPENDPATH} - The dependency search path for the application. + \li \l{VPATH} - The search path to find supplied files. + \li \l{DEF_FILE} - Windows only: A .def file to be linked against for the + application. + \li \l{RC_FILE} - Windows only: A resource file for the application. + \li \l{RES_FILE} - Windows only: A resource file to be linked against for + the application. + \endlist + + You only need to use the system variables that you have values for. For + example, if you do not have any extra INCLUDEPATHs then you do not need + to specify any. qmake will add the necessary default values. + An example project file might look like this: + + \snippet snippets/code/doc_src_qmake-manual.pro 123 + + For items that are single valued, such as the template or the destination + directory, we use "="; but for multi-valued items we use "+=" to \e + add to the existing items of that type. Using "=" replaces the variable + value with the new value. For example, if we write \c{DEFINES=USE_MY_STUFF}, + all other definitions are deleted. + + \section1 Building a Testcase + + A testcase project is an \c app project intended to be run as an automated + test. Any \c app may be marked as a testcase by adding the value \c testcase + to the \c CONFIG variable. + + For testcase projects, qmake will insert a \c check + target into the generated Makefile. This target will run the application. + The test is considered to pass if it terminates with an exit code equal to zero. + + The \c check target automatically recurses through + \l{SUBDIRS} projects. This means it is + possible to issue a \c{make check} command from within a SUBDIRS project + to run an entire test suite. + + The execution of the \c check target may be customized by certain Makefile + variables. These variables are: + + \table + \header + \li Variable + \li Description + \row + \li TESTRUNNER + \li A command or shell fragment prepended to each test command. An example + use-case is a "timeout" script which will terminate a test if it does not + complete within a specified time. + \row + \li TESTARGS + \li Additional arguments appended to each test command. For example, it may + be useful to pass additional arguments to set the output file and format + from the test (such as the \c{-o filename,format} option supported by + \l{QTestLib}). + \endtable + + \note The variables must be set while invoking the \c make tool, not in the + .pro file. Most \c make tools support the setting of Makefile variables directly + on the command-line: + + \code + # Run tests through test-wrapper and use xunitxml output format. + # In this example, test-wrapper is a fictional wrapper script which terminates + # a test if it does not complete within the amount of seconds set by "--timeout". + # The "-o result.xml,xunitxml" options are interpreted by QTestLib. + make check TESTRUNNER="test-wrapper --timeout 120" TESTARGS="-o result.xml,xunitxml" + \endcode + + Testcase projects may be further customized with the following \c CONFIG options: + + \table + \header + \li Option + \li Description + \row + \li insignificant_test + \li The exit code of the test will be ignored during \c{make check}. + \endtable + + Testcases will often be written with \l{QTest} or \l{TestCase}, but + that is not a requirement to make use of \c{CONFIG+=testcase} and \c{make check}. + The only primary requirement is that the test program exit with a zero exit code + on success, and a non-zero exit code on failure. + + \target Library + \section1 Building a Library + + The \c lib template tells qmake to generate a Makefile that will build a + library. When using this template, the \l{VERSION} variable is supported, + in addition to the system variables that the \c app template supports. Use + the variables in your .pro file to specify information about the library. + + When using the \c lib template, the following options can be added to the + \l{CONFIG} variable to determine the type of library that is built: + + \table + \header \li Option \li Description + \row \li dll \li The library is a shared library (dll). + \row \li staticlib \li The library is a static library. + \row \li plugin \li The library is a plugin. + \endtable + + The following option can also be defined to provide additional information about + the library. + + \list + \li VERSION - The version number of the target library. For example, 2.3.1. + \endlist + + The target file name for the library is platform-dependent. For example, on + X11 and Mac OS X, the library name will be prefixed by \c lib. On Windows, + no prefix is added to the file name. + + \target Plugin + \section1 Building a Plugin + + Plugins are built using the \c lib template, as described in the previous + section. This tells qmake to generate a + Makefile for the project that will build a plugin in a suitable form for + each platform, usually in the form of a library. As with ordinary + libraries, the \l{VERSION} variable is used to specify information about the + plugin. + + \list + \li VERSION - The version number of the target library. For example, 2.3.1. + \endlist + + \section2 Building a Qt Designer Plugin + + \QD plugins are built using a specific set of configuration settings that + depend on the way Qt was configured for your system. For convenience, these + settings can be enabled by adding \c designer to the \l{Variables#QT}{QT} + variable. For example: + + \code + QT += widgets designer + \endcode + + See the \l{Qt Designer Examples} for more examples of plugin-based projects. + + \section1 Building and Installing in Debug and Release Modes + + Sometimes, it is necessary to build a project in both debug and release + modes. Although the \l{CONFIG} variable can hold both \c debug and \c release + options, the \c debug option overrides the \c release option. + + \section2 Building in Both Modes + + To enable a project to be built in both modes, you must add the + \c debug_and_release option to the \c CONFIG variable: + + \snippet snippets/qmake/debug_and_release.pro 0 + \snippet snippets/qmake/debug_and_release.pro 1 + + The scope in the above snippet modifies the build target in each mode to + ensure that the resulting targets have different names. Providing different + names for targets ensures that one will not overwrite the other. + + When qmake processes the project file, it will + generate a Makefile rule to allow the project to be built in both modes. + This can be invoked in the following way: + + \snippet snippets/code/doc_src_qmake-manual.pro 124 + + The \c build_all option can be added to the \c CONFIG variable in the + project file to ensure that the project is built in both modes by default: + + \snippet snippets/qmake/debug_and_release.pro 2 + + This allows the Makefile to be processed using the default rule: + + \snippet snippets/code/doc_src_qmake-manual.pro 125 + + \section2 Installing in Both Modes + + The \c build_all option also ensures that both versions of the target + will be installed when the installation rule is invoked: + + \snippet snippets/code/doc_src_qmake-manual.pro 126 + + It is possible to customize the names of the build targets depending on + the target platform. For example, a library or plugin may be named using a + different convention on Windows from the one used on Unix platforms: + + \omit + Note: This was originally used in the customwidgetplugin.pro file, but is + no longer needed there. + \endomit + \snippet snippets/code/doc_src_qmake-manual.pro 127 + + The default behavior in the above snippet is to modify the name used for + the build target when building in debug mode. An \c else clause could be + added to the scope to do the same for release mode. Left as it is, the + target name remains unmodified. +*/ + diff --git a/qmake/doc/src/snippets/code/doc_src_qmake-manual.cpp b/qmake/doc/src/snippets/code/doc_src_qmake-manual.cpp new file mode 100644 index 0000000000..bd63e600cd --- /dev/null +++ b/qmake/doc/src/snippets/code/doc_src_qmake-manual.cpp @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +//! [104] +// Add C includes here + +#if defined __cplusplus +// Add C++ includes here +#include +#include +#include +#include // Qt includes +#include +#include +#include "thirdparty/include/libmain.h" +#include "my_stable_class.h" +... +#endif +//! [104] + + diff --git a/qmake/doc/src/snippets/code/doc_src_qmake-manual.pro b/qmake/doc/src/snippets/code/doc_src_qmake-manual.pro new file mode 100644 index 0000000000..0ee4785887 --- /dev/null +++ b/qmake/doc/src/snippets/code/doc_src_qmake-manual.pro @@ -0,0 +1,917 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#! [0] +make all +#! [0] + + +#! [1] +CONFIG += qt debug +#! [1] + + +#! [2] +QT += network xml +#! [2] + + +#! [3] +QT = network xml # This will omit the core and gui modules. +#! [3] + + +#! [4] +QT -= gui # Only the core module is used. +#! [4] + + +#! [5] +CONFIG += link_pkgconfig +PKGCONFIG += ogg dbus-1 +#! [5] + + +#! [6] +LIBS += -L/usr/local/lib -lmath +#! [6] + + +#! [7] +INCLUDEPATH = c:/msdev/include d:/stl/include +#! [7] + + +#! [8] +qmake [mode] [options] files +#! [8] + + +#! [9] +qmake -makefile [options] files +#! [9] + + +#! [10] +qmake -makefile -o Makefile "CONFIG+=test" test.pro +#! [10] + + +#! [11] +qmake "CONFIG+=test" test.pro +#! [11] + + +#! [12] +qmake -project [options] files +#! [12] + + +#! [13] +qmake -spec macx-g++ +#! [13] + + +#! [14] +QMAKE_LFLAGS += -F/path/to/framework/directory/ +#! [14] + + +#! [15] +LIBS += -framework TheFramework +#! [15] + + +#! [16] +TEMPLATE = lib +CONFIG += lib_bundle +#! [16] + + +#! [17] +FRAMEWORK_HEADERS.version = Versions +FRAMEWORK_HEADERS.files = path/to/header_one.h path/to/header_two.h +FRAMEWORK_HEADERS.path = Headers +QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS +#! [17] + + +#! [19] +qmake -spec macx-xcode project.pro +#! [19] + + +#! [20] +qmake -tp vc +#! [20] + + +#! [21] +qmake -tp vc -r +#! [21] + + +#! [22] +CONFIG -= embed_manifest_exe +#! [22] + + +#! [23] +CONFIG -= embed_manifest_dll +#! [23] + + +#! [24] +make all +#! [24] + + +#! [25] +build_pass:CONFIG(debug, debug|release) { + unix: TARGET = $$join(TARGET,,,_debug) + else: TARGET = $$join(TARGET,,,d) +} +#! [25] + + +#! [26] +CONFIG += console newstuff +... +newstuff { + SOURCES += new.cpp + HEADERS += new.h +} +#! [26] + + +#! [27] +DEFINES += USE_MY_STUFF +#! [27] + + +#! [28] +myFiles.files = path\*.png +DEPLOYMENT += myFiles +#! [28] + + +#! [29] +myFiles.files = path\file1.ext1 path2\file2.ext1 path3\* +myFiles.path = \some\path\on\device +someother.files = C:\additional\files\* +someother.path = \myFiles\path2 +DEPLOYMENT += myFiles someother +#! [29] + + +#! [30] +DESTDIR = ../../lib +#! [30] + + +#! [31] +DISTFILES += ../program.txt +#! [31] + + +#! [32] +FORMS = mydialog.ui \ + mywidget.ui \ + myconfig.ui +#! [32] + + +#! [33] +FORMS3 = my_uic3_dialog.ui \ + my_uic3_widget.ui \ + my_uic3_config.ui +#! [33] + + +#! [34] +HEADERS = myclass.h \ + login.h \ + mainwindow.h +#! [34] + + +#! [35] +INCLUDEPATH = c:/msdev/include d:/stl/include +#! [35] + + +#! [36] +target.path += $$[QT_INSTALL_PLUGINS]/imageformats +INSTALLS += target +#! [36] + + +#! [37] +LEXSOURCES = lexer.l +#! [37] + + +#! [38] +unix:LIBS += -L/usr/local/lib -lmath +win32:LIBS += c:/mylibs/math.lib +#! [38] + + +#! [39] +CONFIG += no_lflags_merge +#! [39] + + +#! [40] +unix:MOC_DIR = ../myproject/tmp +win32:MOC_DIR = c:/myproject/tmp +#! [40] + + +#! [41] +unix:OBJECTS_DIR = ../myproject/tmp +win32:OBJECTS_DIR = c:/myproject/tmp +#! [41] + + +#! [43] +FRAMEWORK_HEADERS.version = Versions +FRAMEWORK_HEADERS.files = path/to/header_one.h path/to/header_two.h +FRAMEWORK_HEADERS.path = Headers +QMAKE_BUNDLE_DATA += FRAMEWORK_HEADERS +#! [43] + + +#! [44] +QMAKE_BUNDLE_EXTENSION = .myframework +#! [44] + + +#! [45] +QMAKE_RESOURCE_FLAGS += -threshold 0 -compress 9 +#! [45] + + +#! [47] +QT -= gui # Only the core module is used. +#! [47] + + +#! [48] +unix:RCC_DIR = ../myproject/resources +win32:RCC_DIR = c:/myproject/resources +#! [48] + + +#! [49] +SOURCES = myclass.cpp \ + login.cpp \ + mainwindow.cpp +#! [49] + + +#! [50] +SUBDIRS = kernel \ + tools +#! [50] + + +#! [51] +CONFIG += ordered +#! [51] + + +#! [52] +TEMPLATE = app +TARGET = myapp +SOURCES = main.cpp +#! [52] + + +#! [53] +TEMPLATE = lib +SOURCES = main.cpp +TARGET = mylib +#! [53] + + +#! [54] +unix:UI_DIR = ../myproject/ui +win32:UI_DIR = c:/myproject/ui +#! [54] + + +#! [57] +VERSION = 1.2.3 +#! [57] + + +#! [58] +YACCSOURCES = moc.y +#! [58] + + +#! [59] +FILE = /etc/passwd +FILENAME = $$basename(FILE) #passwd +#! [59] + + +#! [60] +CONFIG = debug +CONFIG += release +CONFIG(release, debug|release):message(Release build!) #will print +CONFIG(debug, debug|release):message(Debug build!) #no print +#! [60] + + +#! [61] +contains( drivers, network ) { + # drivers contains 'network' + message( "Configuring for network build..." ) + HEADERS += network.h + SOURCES += network.cpp +} +#! [61] + + +#! [62] +error(An error has occurred in the configuration process.) +#! [62] + + +#! [63] +exists( $(QTDIR)/lib/libqt-mt* ) { + message( "Configuring for multi-threaded Qt..." ) + CONFIG += thread +} +#! [63] + + +#! [64] +MY_VAR = one two three four +MY_VAR2 = $$join(MY_VAR, " -L", -L) -Lfive +MY_VAR3 = $$member(MY_VAR, 2) $$find(MY_VAR, t.*) +#! [64] + + +#! [65] +LIST = 1 2 3 +for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!) +#! [65] + + +#! [66] +include( shared.pri ) +OPTIONS = standard custom +!include( options.pri ) { + message( "No custom build options specified" ) +OPTIONS -= custom +} +#! [66] + + +#! [67] +isEmpty( CONFIG ) { +CONFIG += warn_on debug +} +#! [67] + + +#! [68] +message( "This is a message" ) +#! [68] + + +#! [69] +!build_pass:message( "This is a message" ) +#! [69] + + +#! [70] +This is a test. +#! [70] + + +#! [71] +system(ls /bin):HAS_BIN=FALSE +#! [71] + + +#! [72] +UNAME = $$system(uname -s) +contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me ) +#! [72] + + +#! [73] +ARGS = 1 2 3 2 5 1 +ARGS = $$unique(ARGS) #1 2 3 5 +#! [73] + + +#! [74] +qmake -set PROPERTY VALUE +#! [74] + + +#! [75] +qmake -query PROPERTY +qmake -query #queries all current PROPERTY/VALUE pairs +#! [75] + + +#! [77] +qmake -query "QT_INSTALL_PREFIX" +#! [77] + + +#! [78] +QMAKE_VERS = $$[QMAKE_VERSION] +#! [78] + + +#! [79] +documentation.path = /usr/local/program/doc +documentation.files = docs/* +#! [79] + + +#! [80] +INSTALLS += documentation +#! [80] + + +#! [81] +unix:documentation.extra = create_docs; mv master.doc toc.doc +#! [81] + + +#! [82] +target.path = /usr/local/myprogram +INSTALLS += target +#! [82] + + +#! [83] +CONFIG += create_prl +#! [83] + + +#! [84] +CONFIG += link_prl +#! [84] + + +#! [85] +QMAKE_EXT_MOC = .mymoc +#! [85] + + +#! [86] +mytarget.target = .buildfile +mytarget.commands = touch $$mytarget.target +mytarget.depends = mytarget2 + +mytarget2.commands = @echo Building $$mytarget.target +#! [86] + + +#! [87] +QMAKE_EXTRA_TARGETS += mytarget mytarget2 +#! [87] + + +#! [88] +new_moc.output = moc_${QMAKE_FILE_BASE}.cpp +new_moc.commands = moc ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT} +new_moc.depend_command = g++ -E -M ${QMAKE_FILE_NAME} | sed "s,^.*: ,," +new_moc.input = NEW_HEADERS +QMAKE_EXTRA_COMPILERS += new_moc +#! [88] + + +#! [89] +TARGET = myapp +#! [89] + + +#! [90] +DEFINES += USE_MY_STUFF +#! [90] + + +#! [91] +DEFINES -= USE_MY_STUFF +#! [91] + + +#! [92] +DEFINES *= USE_MY_STUFF +#! [92] + + +#! [93] +DEFINES ~= s/QT_[DT].+/QT +#! [93] + + +#! [94] +EVERYTHING = $$SOURCES $$HEADERS +message("The project contains the following files:") +message($$EVERYTHING) +#! [94] + + +#! [95] +win32:DEFINES += USE_MY_STUFF +#! [95] + + +#! [96] +win32:xml { + message(Building for Windows) + SOURCES += xmlhandler_win.cpp +} else:xml { + SOURCES += xmlhandler.cpp +} else { + message("Unknown configuration") +} +#! [96] + + +#! [97] +MY_VARIABLE = value +#! [97] + + +#! [98] +MY_DEFINES = $$DEFINES +#! [98] + + +#! [99] +MY_DEFINES = $${DEFINES} +#! [99] + + +#! [100] +TARGET = myproject_$${TEMPLATE} +#! [100] + + +#! [101] +target.path = $$[QT_INSTALL_PLUGINS]/designer +INSTALLS += target +#! [101] + + +#! [102] +defineReplace(functionName){ + #function code +} +#! [102] + + +#! [103] +CONFIG += myfeatures +#! [103] + + +#! [105] +PRECOMPILED_HEADER = stable.h +#! [105] + + +#! [106] +precompile_header:!isEmpty(PRECOMPILED_HEADER) { +DEFINES += USING_PCH +} +#! [106] + + +#! [107] +PRECOMPILED_HEADER = window.h +SOURCES = window.cpp +#! [107] + + +#! [108] +SOURCES += hello.cpp +#! [108] + + +#! [109] +SOURCES += hello.cpp +SOURCES += main.cpp +#! [109] + + +#! [110] +SOURCES = hello.cpp \ + main.cpp +#! [110] + + +#! [111] +HEADERS += hello.h +SOURCES += hello.cpp +SOURCES += main.cpp +#! [111] + + +#! [112] +TARGET = helloworld +#! [112] + + +#! [113] +HEADERS += hello.h +SOURCES += hello.cpp +SOURCES += main.cpp +#! [113] + + +#! [114] +qmake -o Makefile hello.pro +#! [114] + + +#! [115] +qmake -tp vc hello.pro +#! [115] + + +#! [116] +CONFIG += debug +HEADERS += hello.h +SOURCES += hello.cpp +SOURCES += main.cpp +#! [116] + + +#! [117] +win32 { + SOURCES += hellowin.cpp +} +#! [117] + + +#! [118] +CONFIG += debug +HEADERS += hello.h +SOURCES += hello.cpp +SOURCES += main.cpp +win32 { + SOURCES += hellowin.cpp +} +unix { + SOURCES += hellounix.cpp +} +#! [118] + + +#! [119] +!exists( main.cpp ) { + error( "No main.cpp file found" ) +} +#! [119] + + +#! [120] +CONFIG += debug +HEADERS += hello.h +SOURCES += hello.cpp +SOURCES += main.cpp +win32 { + SOURCES += hellowin.cpp +} +unix { + SOURCES += hellounix.cpp +} +!exists( main.cpp ) { + error( "No main.cpp file found" ) +} +#! [120] + + +#! [121] +win32 { + debug { + CONFIG += console + } +} +#! [121] + + +#! [122] +CONFIG += debug +HEADERS += hello.h +SOURCES += hello.cpp +SOURCES += main.cpp +win32 { + SOURCES += hellowin.cpp +} +unix { + SOURCES += hellounix.cpp +} +!exists( main.cpp ) { + error( "No main.cpp file found" ) +} +win32:debug { + CONFIG += console +} +#! [122] + + +#! [123] +TEMPLATE = app +DESTDIR = c:/helloapp +HEADERS += hello.h +SOURCES += hello.cpp +SOURCES += main.cpp +DEFINES += USE_MY_STUFF +CONFIG += release +#! [123] + + +#! [124] +make all +#! [124] + + +#! [125] +make +#! [125] + + +#! [126] +make install +#! [126] + + +#! [127] +CONFIG(debug, debug|release) { + mac: TARGET = $$join(TARGET,,,_debug) + win32: TARGET = $$join(TARGET,,d) +} +#! [127] + +#! [142] +DEPLOYMENT_PLUGIN += qjpeg +#! [142] + +#! [149] +SUBDIRS += my_executable my_library +my_executable.subdir = app +my_executable.depends = my_library +my_library.subdir = lib +#! [149] + +#! [157] +packagesExist(sqlite3 QtNetwork QtDeclarative) { + DEFINES += USE_FANCY_UI +} +#! [157] + +#! [158] +#ifdef USE_FANCY_UI + // Use the fancy UI, as we have extra packages available +#endif +#! [158] + +#! [159] +message($$absolute_path("readme.txt", "/home/johndoe/myproject")) +#! [159] + + +#! [160] +TARGET = helloworld +equals(TARGET, "helloworld") { + message("The target assignment was successful.") +} +#! [160] + + +#! [161] +CONTACT = firstname middlename surname phone +message($$first(CONTACT)) +#! [161] + + +#! [162] +CONTACT = firstname middlename surname phone +message($$last(CONTACT)) +#! [162] + + +#! [163] +message($$format_number(BAD, ibase=16 width=6 zeropad)) +#! [163] + + +#! [164] +ANSWER = 42 +greaterThan(ANSWER, 1) { + message("The answer might be correct.") +} +#! [164] + + +#! [165] +ANSWER = 42 +lessThan(ANSWER, 1) { + message("The answer might be wrong.") +} +#! [165] + + +#! [166] +if(linux-g++*|macx-g++*):CONFIG(debug, debug|release) { + message("We are on Linux or Mac OS, and we are in debug mode.") +} +#! [166] + + +#! [167] +CONTACT = firstname:middlename:surname:phone +message($$section(CONTACT, :, 2, 2)) +#! [167] + + +#! [168] +CONTACT = firstname:middlename:surname:phone +message($$split(CONTACT, :)) +#! [168] + +#! [169] +NARF = zort +unset(NARF) +!defined(NARF, var) { + message("NARF is not defined.") +} +#! [169] + + +#! [170] +for(var, $$list(foo bar baz)) { + ... +} +#! [170] + + +#! [171] +values = foo bar baz +for(var, values) { + ... +} +#! [171] + + +#! [172] +VALUE = 123 +TMP_VALUE = x$$VALUE +greaterThan(TMP_VALUE, x456): message("Condition may be true.") +#! [172] + + +#! [173] +message("First line$$escape_expand(\\n)Second line") +#! [173] diff --git a/qmake/doc/src/snippets/qmake/comments.pro b/qmake/doc/src/snippets/qmake/comments.pro new file mode 100644 index 0000000000..957052c81d --- /dev/null +++ b/qmake/doc/src/snippets/qmake/comments.pro @@ -0,0 +1,10 @@ +#! [0] +# Comments usually start at the beginning of a line, but they +# can also follow other content on the same line. +#! [0] + +#! [1] +# To include a literal hash character, use the $$LITERAL_HASH variable: +urlPieces = http://qt-project.org/doc/qt-5.0/qtgui/qtextdocument.html pageCount +message($$join(urlPieces, $$LITERAL_HASH)) +#! [1] diff --git a/qmake/doc/src/snippets/qmake/configscopes.pro b/qmake/doc/src/snippets/qmake/configscopes.pro new file mode 100644 index 0000000000..6ab7f7c428 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/configscopes.pro @@ -0,0 +1,23 @@ +SOURCES = main.cpp +#! [0] +CONFIG += opengl +#! [0] + +#! [1] +opengl { + TARGET = application-gl +} else { +#! [1] #! [2] + TARGET = application +#! [2] #! [3] +} +#! [3] + +#! [4] +CONFIG(opengl) { + message(Building with OpenGL support.) +} else { +#! [4] #! [5] + message(OpenGL support is not available.) +} +#! [5] diff --git a/qmake/doc/src/snippets/qmake/debug_and_release.pro b/qmake/doc/src/snippets/qmake/debug_and_release.pro new file mode 100644 index 0000000000..92e8dbf76a --- /dev/null +++ b/qmake/doc/src/snippets/qmake/debug_and_release.pro @@ -0,0 +1,14 @@ +#! [0] +CONFIG += debug_and_release + +CONFIG(debug, debug|release) { + TARGET = debug_binary +} else { +#! [0] #! [1] + TARGET = release_binary +} +#! [1] + +#! [2] +CONFIG += build_all +#! [2] diff --git a/qmake/doc/src/snippets/qmake/delegate.h b/qmake/doc/src/snippets/qmake/delegate.h new file mode 100644 index 0000000000..92c7eb6a48 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/delegate.h @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + diff --git a/qmake/doc/src/snippets/qmake/dereferencing.pro b/qmake/doc/src/snippets/qmake/dereferencing.pro new file mode 100644 index 0000000000..ff0c97995c --- /dev/null +++ b/qmake/doc/src/snippets/qmake/dereferencing.pro @@ -0,0 +1,5 @@ +#! [0] +TEMP_SOURCES = $$SOURCES +#! [0] +# Do something with the SOURCES variable then restore its old value. +SOURCES = $$TEMP_SOURCES diff --git a/qmake/doc/src/snippets/qmake/destdir.pro b/qmake/doc/src/snippets/qmake/destdir.pro new file mode 100644 index 0000000000..b2f943904a --- /dev/null +++ b/qmake/doc/src/snippets/qmake/destdir.pro @@ -0,0 +1,2 @@ +SOURCES = main.cpp +DESTDIR = output diff --git a/qmake/doc/src/snippets/qmake/dirname.pro b/qmake/doc/src/snippets/qmake/dirname.pro new file mode 100644 index 0000000000..59e1f20b3f --- /dev/null +++ b/qmake/doc/src/snippets/qmake/dirname.pro @@ -0,0 +1,6 @@ +#! [0] +FILE = /etc/X11R6/XF86Config +DIRNAME = $$dirname(FILE) #/etc/X11R6 +#! [0] +message($$FILE) +message($$DIRNAME) diff --git a/qmake/doc/src/snippets/qmake/environment.pro b/qmake/doc/src/snippets/qmake/environment.pro new file mode 100644 index 0000000000..808bdeba47 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/environment.pro @@ -0,0 +1,9 @@ +#! [0] #! [1] +DESTDIR = $$(PWD) +message(The project will be installed in $$DESTDIR) +#! [0] + +DESTDIR = $(PWD) +message(The project will be installed in the value of PWD) +message(when the Makefile is processed.) +#! [1] diff --git a/qmake/doc/src/snippets/qmake/functions.pro b/qmake/doc/src/snippets/qmake/functions.pro new file mode 100644 index 0000000000..2766120719 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/functions.pro @@ -0,0 +1,34 @@ +#! [0] +EXTRAS = handlers tests docs +for(dir, EXTRAS) { + exists($$dir) { + SUBDIRS += $$dir + } +} +#! [0] + +SOURCES = paintwidget_mac.cpp paintwidget_unix.cpp paintwidget_win.cpp +macx { + SOURCES = $$find(SOURCES, "_mac") +} + +#! [1] +HEADERS = model.h +HEADERS += $$OTHER_HEADERS +HEADERS = $$unique(HEADERS) +#! [1] + +CONFIG += debug +#! [2] +options = $$find(CONFIG, "debug") $$find(CONFIG, "release") +#! [3] +count(options, 2) { + message(Both release and debug specified.) +} +#! [2] #! [3] + +#! [4] +eval(TARGET = myapp) { + message($$TARGET) +} +#! [4] diff --git a/qmake/doc/src/snippets/qmake/include.pro b/qmake/doc/src/snippets/qmake/include.pro new file mode 100644 index 0000000000..37e7156957 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/include.pro @@ -0,0 +1,3 @@ +#! [0] +include(other.pro) +#! [0] diff --git a/qmake/doc/src/snippets/qmake/main.cpp b/qmake/doc/src/snippets/qmake/main.cpp new file mode 100644 index 0000000000..92c7eb6a48 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/main.cpp @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + diff --git a/qmake/doc/src/snippets/qmake/model.cpp b/qmake/doc/src/snippets/qmake/model.cpp new file mode 100644 index 0000000000..92c7eb6a48 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/model.cpp @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + diff --git a/qmake/doc/src/snippets/qmake/model.h b/qmake/doc/src/snippets/qmake/model.h new file mode 100644 index 0000000000..92c7eb6a48 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/model.h @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + diff --git a/qmake/doc/src/snippets/qmake/other.pro b/qmake/doc/src/snippets/qmake/other.pro new file mode 100644 index 0000000000..e69de29bb2 diff --git a/qmake/doc/src/snippets/qmake/paintwidget_mac.cpp b/qmake/doc/src/snippets/qmake/paintwidget_mac.cpp new file mode 100644 index 0000000000..92c7eb6a48 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/paintwidget_mac.cpp @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + diff --git a/qmake/doc/src/snippets/qmake/paintwidget_unix.cpp b/qmake/doc/src/snippets/qmake/paintwidget_unix.cpp new file mode 100644 index 0000000000..c39fc2cbf6 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/paintwidget_unix.cpp @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +int main(int argc, char *argv[]) +{ + return 0; +} diff --git a/qmake/doc/src/snippets/qmake/paintwidget_win.cpp b/qmake/doc/src/snippets/qmake/paintwidget_win.cpp new file mode 100644 index 0000000000..92c7eb6a48 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/paintwidget_win.cpp @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + diff --git a/qmake/doc/src/snippets/qmake/precompile-stable.h b/qmake/doc/src/snippets/qmake/precompile-stable.h new file mode 100644 index 0000000000..eef8cef728 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/precompile-stable.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +//! [0] +/* Add C includes here */ + +#if defined __cplusplus +/* Add C++ includes here */ + +# include +# include +# include +# include +#endif +//! [0] diff --git a/qmake/doc/src/snippets/qmake/project_location.pro b/qmake/doc/src/snippets/qmake/project_location.pro new file mode 100644 index 0000000000..09d9b3d9d0 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/project_location.pro @@ -0,0 +1,6 @@ +#! [project file] +message($$_PRO_FILE_) +#! [project file] +#! [project file directory] +message($$_PRO_FILE_PWD_) +#! [project file directory] diff --git a/qmake/doc/src/snippets/qmake/qtconfiguration.pro b/qmake/doc/src/snippets/qmake/qtconfiguration.pro new file mode 100644 index 0000000000..55e13be352 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/qtconfiguration.pro @@ -0,0 +1,18 @@ +# Show information about the Qt installation. +#! [0] +message(Qt version: $$[QT_VERSION]) +message(Qt is installed in $$[QT_INSTALL_PREFIX]) +message(Qt resources can be found in the following locations:) +message(Documentation: $$[QT_INSTALL_DOCS]) +message(Header files: $$[QT_INSTALL_HEADERS]) +message(Libraries: $$[QT_INSTALL_LIBS]) +message(Binary files (executables): $$[QT_INSTALL_BINS]) +message(Plugins: $$[QT_INSTALL_PLUGINS]) +message(Data files: $$[QT_INSTALL_DATA]) +message(Translation files: $$[QT_INSTALL_TRANSLATIONS]) +message(Settings: $$[QT_INSTALL_SETTINGS]) +message(Examples: $$[QT_INSTALL_EXAMPLES]) +#! [0] + +# Show configuration information. +message(CONFIG = $$CONFIG) diff --git a/qmake/doc/src/snippets/qmake/quoting.pro b/qmake/doc/src/snippets/qmake/quoting.pro new file mode 100644 index 0000000000..62efb2042e --- /dev/null +++ b/qmake/doc/src/snippets/qmake/quoting.pro @@ -0,0 +1,8 @@ +#! [0] +DEST = "Program Files" +#! [0] +count(DEST, 1) { + message(Only one item found in DEST.) +} else { + message(More than one item found in DEST.) +} diff --git a/qmake/doc/src/snippets/qmake/replace.pro b/qmake/doc/src/snippets/qmake/replace.pro new file mode 100644 index 0000000000..504e01a018 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/replace.pro @@ -0,0 +1,4 @@ +#! [0] +MESSAGE = This is a tent. +message($$replace(MESSAGE, tent, test)) +#! [0] diff --git a/qmake/doc/src/snippets/qmake/replacefunction.pro b/qmake/doc/src/snippets/qmake/replacefunction.pro new file mode 100644 index 0000000000..98013ba42d --- /dev/null +++ b/qmake/doc/src/snippets/qmake/replacefunction.pro @@ -0,0 +1,46 @@ +#! [0] +defineReplace(headersAndSources) { + variable = $$1 + names = $$eval($$variable) + headers = + sources = + + for(name, names) { + header = $${name}.h + exists($$header) { + headers += $$header + } + source = $${name}.cpp + exists($$source) { + sources += $$source + } + } + return($$headers $$sources) +} +#! [0] + +defineReplace(matchingFiles) { + names = $$ARGS + files = + + for(name, names) { + header = $${name}.h + source = $${name}.cpp + exists($$header):exists($$source) { + files += $$header + files += $$source + } + } + return($$files) +} + +names = delegate model view main +message(Finding all headers and sources from the following list of names:) +message($$names) +allFiles = $$headersAndSources(names) +message(Found: $$allFiles) + +message(Finding only matching headers and sources from the following list of names:) +message($$names) +matching = $$matchingFiles($$names) +message(Found: $$matching) diff --git a/qmake/doc/src/snippets/qmake/scopes.pro b/qmake/doc/src/snippets/qmake/scopes.pro new file mode 100644 index 0000000000..63b9b3aa55 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/scopes.pro @@ -0,0 +1,42 @@ +#! [syntax] + { + + ... +} +#! [syntax] + +#! [0] +win32 { + SOURCES += paintwidget_win.cpp +} +#! [0] + +#! [1] +!win32 { + SOURCES -= paintwidget_win.cpp +} +#! [1] + +unix { + SOURCES += paintwidget_unix.cpp +} + +#! [2] +macx { + CONFIG(debug, debug|release) { + HEADERS += debugging.h + } +} +#! [2] + +#! [3] +macx:CONFIG(debug, debug|release) { + HEADERS += debugging.h +} +#! [3] + +#! [4] +win32|macx { + HEADERS += debugging.h +} +#! [4] diff --git a/qmake/doc/src/snippets/qmake/shared_or_static.pro b/qmake/doc/src/snippets/qmake/shared_or_static.pro new file mode 100644 index 0000000000..31c25ea44b --- /dev/null +++ b/qmake/doc/src/snippets/qmake/shared_or_static.pro @@ -0,0 +1,8 @@ +TEMPLIBS = $$[QT_INSTALL_LIBS] libQtGui.prl +include($$join(TEMPLIBS, "/")) + +contains(QMAKE_PRL_CONFIG, shared) { + message(Shared Qt) +} else { + message(Static Qt) +} diff --git a/qmake/doc/src/snippets/qmake/spaces.pro b/qmake/doc/src/snippets/qmake/spaces.pro new file mode 100644 index 0000000000..614d4c553d --- /dev/null +++ b/qmake/doc/src/snippets/qmake/spaces.pro @@ -0,0 +1,9 @@ +#! [quoting library paths with spaces] +win32:LIBS += "C:/mylibs/extra libs/extra.lib" +unix:LIBS += "-L/home/user/extra libs" -lextra +#! [quoting library paths with spaces] + +#! [quoting include paths with spaces] +win32:INCLUDEPATH += "C:/mylibs/extra headers" +unix:INCLUDEPATH += "/home/user/extra headers" +#! [quoting include paths with spaces] diff --git a/qmake/doc/src/snippets/qmake/specifications.pro b/qmake/doc/src/snippets/qmake/specifications.pro new file mode 100644 index 0000000000..f9a0d0a1cb --- /dev/null +++ b/qmake/doc/src/snippets/qmake/specifications.pro @@ -0,0 +1,7 @@ +#! [0] +message($$QMAKESPEC) + +linux-g++ { + message(Linux) +} +#! [0] diff --git a/qmake/doc/src/snippets/qmake/testfunction.pro b/qmake/doc/src/snippets/qmake/testfunction.pro new file mode 100644 index 0000000000..785ffed6be --- /dev/null +++ b/qmake/doc/src/snippets/qmake/testfunction.pro @@ -0,0 +1,20 @@ +#! [0] +defineTest(allFiles) { + files = $$ARGS + + for(file, files) { + !exists($$file) { + return(false) + } + } + return(true) +} +#! [0] + +files = delegate.h model.h view.h + +allFiles($$files) { + message(All files are present: $$files) +} else { + message(Not all files are present: $$files) +} diff --git a/qmake/doc/src/snippets/qmake/variables.pro b/qmake/doc/src/snippets/qmake/variables.pro new file mode 100644 index 0000000000..c1439ba68b --- /dev/null +++ b/qmake/doc/src/snippets/qmake/variables.pro @@ -0,0 +1,7 @@ +#! [0] +HEADERS = mainwindow.h paintwidget.h +#! [0] #! [1] +SOURCES = main.cpp mainwindow.cpp \ + paintwidget.cpp +CONFIG += console +#! [1] diff --git a/qmake/doc/src/snippets/qmake/view.h b/qmake/doc/src/snippets/qmake/view.h new file mode 100644 index 0000000000..92c7eb6a48 --- /dev/null +++ b/qmake/doc/src/snippets/qmake/view.h @@ -0,0 +1,40 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + diff --git a/qmake/qmake-docs.pro b/qmake/qmake-docs.pro new file mode 100644 index 0000000000..3123f7c5d8 --- /dev/null +++ b/qmake/qmake-docs.pro @@ -0,0 +1,2 @@ +TEMPLATE = aux +QMAKE_DOCS = $$PWD/doc/qmake.qdocconf diff --git a/qtbase.pro b/qtbase.pro index 02dc11eac2..5bed630ea9 100644 --- a/qtbase.pro +++ b/qtbase.pro @@ -4,6 +4,8 @@ load(qt_parts) +SUBDIRS += qmake/qmake-docs.pro + cross_compile: CONFIG += nostrip confclean.depends += clean From e80841f11356b3ff52e641e3caa260d556e3d4e8 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 13 Jun 2013 19:13:46 +0200 Subject: [PATCH 48/79] make images non-executable Change-Id: I7d6c28e7fd18125c95e56eca2d0d6d67003f9c5d Reviewed-by: Martin Smith --- doc/global/template/images/arrow.png | Bin doc/global/template/images/bg_l.png | Bin doc/global/template/images/bg_l_blank.png | Bin doc/global/template/images/bg_r.png | Bin doc/global/template/images/bgrContent.png | Bin doc/global/template/images/blu_dot.png | Bin doc/global/template/images/box_bg.png | Bin doc/global/template/images/breadcrumb.png | Bin doc/global/template/images/bullet_gt.png | Bin doc/global/template/images/bullet_sq.png | Bin doc/global/template/images/feedbackground.png | Bin doc/global/template/images/home.png | Bin doc/global/template/images/horBar.png | Bin doc/global/template/images/ico_note.png | Bin doc/global/template/images/ico_note_attention.png | Bin doc/global/template/images/ico_out.png | Bin doc/global/template/images/page_bg.png | Bin doc/global/template/images/sprites-combined.png | Bin 18 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 doc/global/template/images/arrow.png mode change 100755 => 100644 doc/global/template/images/bg_l.png mode change 100755 => 100644 doc/global/template/images/bg_l_blank.png mode change 100755 => 100644 doc/global/template/images/bg_r.png mode change 100755 => 100644 doc/global/template/images/bgrContent.png mode change 100755 => 100644 doc/global/template/images/blu_dot.png mode change 100755 => 100644 doc/global/template/images/box_bg.png mode change 100755 => 100644 doc/global/template/images/breadcrumb.png mode change 100755 => 100644 doc/global/template/images/bullet_gt.png mode change 100755 => 100644 doc/global/template/images/bullet_sq.png mode change 100755 => 100644 doc/global/template/images/feedbackground.png mode change 100755 => 100644 doc/global/template/images/home.png mode change 100755 => 100644 doc/global/template/images/horBar.png mode change 100755 => 100644 doc/global/template/images/ico_note.png mode change 100755 => 100644 doc/global/template/images/ico_note_attention.png mode change 100755 => 100644 doc/global/template/images/ico_out.png mode change 100755 => 100644 doc/global/template/images/page_bg.png mode change 100755 => 100644 doc/global/template/images/sprites-combined.png diff --git a/doc/global/template/images/arrow.png b/doc/global/template/images/arrow.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/bg_l.png b/doc/global/template/images/bg_l.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/bg_l_blank.png b/doc/global/template/images/bg_l_blank.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/bg_r.png b/doc/global/template/images/bg_r.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/bgrContent.png b/doc/global/template/images/bgrContent.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/blu_dot.png b/doc/global/template/images/blu_dot.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/box_bg.png b/doc/global/template/images/box_bg.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/breadcrumb.png b/doc/global/template/images/breadcrumb.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/bullet_gt.png b/doc/global/template/images/bullet_gt.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/bullet_sq.png b/doc/global/template/images/bullet_sq.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/feedbackground.png b/doc/global/template/images/feedbackground.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/home.png b/doc/global/template/images/home.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/horBar.png b/doc/global/template/images/horBar.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/ico_note.png b/doc/global/template/images/ico_note.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/ico_note_attention.png b/doc/global/template/images/ico_note_attention.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/ico_out.png b/doc/global/template/images/ico_out.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/page_bg.png b/doc/global/template/images/page_bg.png old mode 100755 new mode 100644 diff --git a/doc/global/template/images/sprites-combined.png b/doc/global/template/images/sprites-combined.png old mode 100755 new mode 100644 From 4edf22ccd7dc2ff4780fd7e6cbb5f3beddd1bfea Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 12 Jun 2013 19:38:15 +0200 Subject: [PATCH 49/79] update comment Change-Id: I6e5e53d0c7c48a3b859bc61299456f97a209af2a Reviewed-by: Joerg Bornemann --- qmake/qmake.pro | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/qmake/qmake.pro b/qmake/qmake.pro index 0d92ac21ae..a81d0cdf77 100644 --- a/qmake/qmake.pro +++ b/qmake/qmake.pro @@ -1,7 +1,6 @@ -#This is a project file for building qmake, of course it presents a problem - -# it is very hard to make qmake build this, when qmake is the thing it builds, -#once you are boot strapped though, the qmake.pro will offer better coverage of a -#platform than either of the generic makefiles +# This project is not actually used to build qmake, but to support development +# with Qt Creator. The real build system is made up by the Makefile templates +# and the configures. option(host_build) CONFIG += console bootstrap From 70805d852a3dfc4b340316e428f11fd7c584c05d Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 14 Jun 2013 15:55:06 +0200 Subject: [PATCH 50/79] wrap the horrendeous monster switch case Change-Id: Ia8619a9e75006d9a95ae325de7aa326b5dd928a6 Reviewed-by: Thiago Macieira Reviewed-by: Joerg Bornemann --- configure | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/configure b/configure index a5831efb50..baf811ce00 100755 --- a/configure +++ b/configure @@ -1113,7 +1113,45 @@ while [ "$#" -gt 0 ]; do VAL=no ;; #Qt style options that pass an argument - -prefix|-docdir|-headerdir|-plugindir|-importdir|-qmldir|-archdatadir|-datadir|-libdir|-bindir|-libexecdir|-translationdir|-sysconfdir|-examplesdir|-testsdir|-depths|-make|-nomake|-skip|-platform|-xplatform|-device|-device-option|-sdk|-arch|-host-arch|-mysql_config|-sysroot|-hostdatadir|-hostbindir|-hostlibdir|-qpa|-qconfig|-android-sdk|-android-ndk|-android-ndk-platform|-android-ndk-host|-android-arch|-android-toolchain-version) + -prefix| \ + -docdir| \ + -headerdir| \ + -plugindir| \ + -importdir| \ + -qmldir| \ + -archdatadir| \ + -datadir| \ + -libdir| \ + -bindir| \ + -libexecdir| \ + -translationdir| \ + -sysconfdir| \ + -examplesdir| \ + -testsdir| \ + -hostdatadir| \ + -hostbindir| \ + -hostlibdir| \ + -sysroot| \ + -depths| \ + -make| \ + -nomake| \ + -skip| \ + -platform| \ + -xplatform| \ + -device| \ + -device-option| \ + -sdk| \ + -arch| \ + -host-arch| \ + -mysql_config| \ + -qpa| \ + -qconfig| \ + -android-sdk| \ + -android-ndk| \ + -android-ndk-platform| \ + -android-ndk-host| \ + -android-arch| \ + -android-toolchain-version) VAR=`echo $1 | sed "s,^-\(.*\),\1,"` shift VAL="$1" From 864b3b9918bcce34e4fa8769fec19569720c1c50 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 14 Jun 2013 16:45:08 +0200 Subject: [PATCH 51/79] don't write unused QT_INSTALL_* to qmake Makefiles the installation has been moved to the qtbase top-level project a long time ago. Change-Id: I25f1658d1a6544da4bdaa5be6b19f9076c19b7f9 Reviewed-by: Thiago Macieira Reviewed-by: Joerg Bornemann --- configure | 6 ------ 1 file changed, 6 deletions(-) diff --git a/configure b/configure index baf811ce00..6befb05ba1 100755 --- a/configure +++ b/configure @@ -4055,10 +4055,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; if [ '!' -z "$D_FLAGS" ]; then EXTRA_CFLAGS="$EXTRA_CFLAGS $D_FLAGS" fi - QMAKE_BIN_DIR="$QT_INSTALL_BINS" - [ -z "$QMAKE_BIN_DIR" ] && QMAKE_BIN_DIR="${QT_INSTALL_PREFIX}/bin" - QMAKE_DATA_DIR="$QT_INSTALL_ARCHDATA" - [ -z "$QMAKE_DATA_DIR" ] && QMAKE_DATA_DIR="${QT_INSTALL_PREFIX}" echo >>"$mkfile" adjrelpath=`echo "$relpath" | sed 's/ /\\\\\\\\ /g'` adjoutpath=`echo "$outpath" | sed 's/ /\\\\\\\\ /g'` @@ -4078,8 +4074,6 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; echo "QTOBJS = $EXTRA_OBJS" >> "$mkfile" echo "QTSRCS = $EXTRA_SRCS" >> "$mkfile" echo "LFLAGS = $EXTRA_LFLAGS" >> "$mkfile" - echo "QT_INSTALL_BINS = \$(INSTALL_ROOT)$QMAKE_BIN_DIR" >> "$mkfile" - echo "QT_INSTALL_DATA = \$(INSTALL_ROOT)$QMAKE_DATA_DIR" >> "$mkfile" echo "EXEEXT = $EXEEXT" >> "$mkfile" echo "RM_F = rm -f" >> "$mkfile" echo "RM_RF = rm -rf" >> "$mkfile" From d0c9fb8585dcb8d6380c3711fc79698081dc8302 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 14 Jun 2013 16:48:24 +0200 Subject: [PATCH 52/79] normalize file list assignments not quoting the variable references allows the shell to word-split the contents and thus convert the embedded linebreaks into spaces. Change-Id: Id834f02d7a501fb6fe48b45f409f599a8b70b7ed Reviewed-by: Thiago Macieira Reviewed-by: Ray Donnelly Reviewed-by: Joerg Bornemann --- configure | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 6befb05ba1..12b488bedd 100755 --- a/configure +++ b/configure @@ -4071,8 +4071,8 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ]; echo "QT_VERSION = $QT_VERSION" >> "$mkfile" echo "EXTRA_CFLAGS = $EXTRA_CFLAGS" >> "$mkfile" echo "EXTRA_CXXFLAGS = $EXTRA_CXXFLAGS" >> "$mkfile" - echo "QTOBJS = $EXTRA_OBJS" >> "$mkfile" - echo "QTSRCS = $EXTRA_SRCS" >> "$mkfile" + echo "QTOBJS =" $EXTRA_OBJS >> "$mkfile" + echo "QTSRCS =" $EXTRA_SRCS >> "$mkfile" echo "LFLAGS = $EXTRA_LFLAGS" >> "$mkfile" echo "EXEEXT = $EXEEXT" >> "$mkfile" echo "RM_F = rm -f" >> "$mkfile" From 7f709861ec8350487d9cd46f9dacc1c7a86b7444 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 14 Jun 2013 17:37:56 +0200 Subject: [PATCH 53/79] don't claim that "make install" is needed for non-prefix shadow builds Change-Id: I3a72fa8f5f849fba1a4bc79788b090c1a23b0198 Reviewed-by: Thiago Macieira Reviewed-by: Joerg Bornemann --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 12b488bedd..43d52a896b 100755 --- a/configure +++ b/configure @@ -7016,7 +7016,7 @@ fi MAKE=`basename "$MAKE"` echo echo Qt is now configured for building. Just run \'$MAKE\'. -if [ "$relpath" = "$QT_INSTALL_PREFIX" ]; then +if [ "$outpath" = "$QT_INSTALL_PREFIX" ]; then echo Once everything is built, Qt is installed. echo You should not run \'$MAKE install\'. else From 65b749f5ea056261a8c29866cee38b17a52a8556 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 17 Jun 2013 11:00:19 +0200 Subject: [PATCH 54/79] don't try to not build non-existing parts Change-Id: I20896f15f7ab91aac8a9b6977fd3a253bc0e187d Reviewed-by: Joerg Bornemann --- tools/configure/configureapp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index f92fad1d69..50e491f20c 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -1570,8 +1570,8 @@ void Configure::desc(const char *mark_option, const char *mark, const char *opti void Configure::applySpecSpecifics() { if (dictionary.contains("XQMAKESPEC")) { - //Disable building tools, docs and translations when cross compiling. - nobuildParts << "docs" << "translations" << "tools"; + //Disable building tools when cross compiling. + nobuildParts << "tools"; } if (dictionary.value("XQMAKESPEC").startsWith("wince")) { From 7d4980f3ee360baf0793f986daeef49f2be1edd9 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 17 Jun 2013 12:18:36 +0200 Subject: [PATCH 55/79] make use of QT_MODULES to simplify code Change-Id: I1124088f807023faf678e030cfb1fc4a4c8b40d7 Reviewed-by: Joerg Bornemann --- mkspecs/features/qt_functions.prf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf index d1e0e39cff..f8021a2f5a 100644 --- a/mkspecs/features/qt_functions.prf +++ b/mkspecs/features/qt_functions.prf @@ -26,9 +26,8 @@ defineTest(qtAddLibrary) { warning("qtAddLibrary() is deprecated. Use qtAddModule() or QT+= instead.") # Reverse-engineer the module name from the library name. - for(var, $$list($$find($$list($$enumerate_vars()), ^QT\\.[^.]+\\.name$))) { - isEqual($$var, $$1) { - var ~= s,^QT\\.([^.]+)\\.name$,\\1, + for(var, QT_MODULES) { + isEqual(QT.$${var}.name, $$1) { qtAddModule($$var, , LIBS):return(true):break() return(false):break() # Yes, the break is insanity. But necessary. } From 1ebef55cf796c86cdcb693fc01ae39ed688872f8 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 17 Jun 2013 12:22:01 +0200 Subject: [PATCH 56/79] remove pointless return code checking qtAddModule() always returns true anyway. the real checking is done by qtAddModules() and qtAddLibrary() itself. Change-Id: Ieed821acc36dc57ca52aec3e6b2dd6513be9b6c1 Reviewed-by: Joerg Bornemann --- mkspecs/features/qt_functions.prf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf index f8021a2f5a..b043f4dae7 100644 --- a/mkspecs/features/qt_functions.prf +++ b/mkspecs/features/qt_functions.prf @@ -28,8 +28,8 @@ defineTest(qtAddLibrary) { # Reverse-engineer the module name from the library name. for(var, QT_MODULES) { isEqual(QT.$${var}.name, $$1) { - qtAddModule($$var, , LIBS):return(true):break() - return(false):break() # Yes, the break is insanity. But necessary. + qtAddModule($$var, , LIBS) + return(true):break() # Yes, the break is insanity. But necessary. } } error("No module matching library '$$1' found.") @@ -130,7 +130,6 @@ defineTest(qtAddModule) { export(QMAKE_RPATHDIR) export(QMAKE_RPATHLINKDIR) export(PRE_TARGETDEPS) - return(true) } # qt variable, libs variable From 20d667983b5d0ec434b03a68b42f610338877fe8 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Tue, 11 Jun 2013 17:52:45 +0200 Subject: [PATCH 57/79] QMacStyle: enable scroll style changes for non-QScrollBars Task-number: QTBUG-31537 Change-Id: Iee2148609df5cb2c121da4088bcd79f26c2eedc4 Reviewed-by: Gabriel de Dietrich --- src/widgets/styles/qmacstyle_mac.mm | 18 +++++++++++++++--- src/widgets/styles/qmacstyle_mac_p_p.h | 2 ++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index a8fba4fb68..3daa696155 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -119,9 +119,12 @@ QMacStylePrivate *mPrivate; { Q_UNUSED(notification); QEvent event(QEvent::StyleChange); - foreach (QWidget *widget, QApplication::allWidgets()) { - if (QScrollBar *scrollBar = qobject_cast(widget)) - QCoreApplication::sendEvent(scrollBar, &event); + QMutableSetIterator > it(QMacStylePrivate::scrollBars); + while (it.hasNext()) { + if (!it.next()) + it.remove(); + else + QCoreApplication::sendEvent(it.value(), &event); } } @end @@ -142,6 +145,13 @@ const int QMacStylePrivate::PushButtonContentPadding = 6; const qreal QMacStylePrivate::ScrollBarFadeOutDuration = 200.0; const qreal QMacStylePrivate::ScrollBarFadeOutDelay = 450.0; +QSet > QMacStylePrivate::scrollBars; + +static uint qHash(const QPointer &ptr) +{ + return qHash(ptr.data()); +} + // These colors specify the titlebar gradient colors on // Leopard. Ideally we should get them from the system. static const QColor titlebarGradientActiveBegin(220, 220, 220); @@ -4934,6 +4944,8 @@ void QMacStyle::drawComplexControl(ComplexControl cc, const QStyleOptionComplex // no longer possible to move it, second the up/down buttons are removed when // there is not enough space for them. if (cc == CC_ScrollBar) { + if (opt && opt->styleObject && !QMacStylePrivate::scrollBars.contains(opt->styleObject)) + QMacStylePrivate::scrollBars.insert(QPointer(opt->styleObject)); const int scrollBarLength = (slider->orientation == Qt::Horizontal) ? slider->rect.width() : slider->rect.height(); const QMacStyle::WidgetSizePolicy sizePolicy = widgetSizePolicy(widget, opt); diff --git a/src/widgets/styles/qmacstyle_mac_p_p.h b/src/widgets/styles/qmacstyle_mac_p_p.h index c424ff0c3c..bf42087fcb 100644 --- a/src/widgets/styles/qmacstyle_mac_p_p.h +++ b/src/widgets/styles/qmacstyle_mac_p_p.h @@ -93,6 +93,7 @@ #include #include #include +#include #include #include @@ -197,6 +198,7 @@ public: mutable QPointer pressedButton; mutable QPointer defaultButton; mutable QPointer autoDefaultButton; + static QSet > scrollBars; struct ButtonState { int frame; From ed0b5e125bd76c37900a95b23f73cb6690a090f7 Mon Sep 17 00:00:00 2001 From: Rafael Roquetto Date: Fri, 31 May 2013 15:27:50 -0300 Subject: [PATCH 58/79] Fix tst_QWindow for fullscreen platform plugins Some tests assume that QWindow::show() behaves like QWindow::showNormal(), which is not true for platforms in which the show is fullscreen, forcing QWindow::showNormal() to be explicitly called. Change-Id: Ib5f23a4d01bc6a3a2973f57488996c8c198c45f3 Reviewed-by: Friedemann Kleint --- tests/auto/gui/kernel/qwindow/tst_qwindow.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp index 29c72cc02e..d34ab069c3 100644 --- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp +++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp @@ -176,6 +176,12 @@ void tst_QWindow::positioning() QSKIP("Multiple failures in this test on Mac OS X, see QTBUG-23059"); #endif + + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability( + QPlatformIntegration::NonFullScreenWindows)) { + QSKIP("This platform does not support non-fullscreen windows"); + } + // Some platforms enforce minimum widths for windows, which can cause extra resize // events, so set the width to suitably large value to avoid those. const QSize size = QSize(300, 40); @@ -187,7 +193,8 @@ void tst_QWindow::positioning() QCOMPARE(window.geometry().size(), size); window.setGeometry(geometry); QCOMPARE(window.geometry(), geometry); - window.show(); + // explicitly use non-fullscreen show. show() can be fullscreen on some platforms + window.showNormal(); QCoreApplication::processEvents(); QTRY_COMPARE(window.received(QEvent::Resize), 1); @@ -431,7 +438,7 @@ void tst_QWindow::testInputEvents() { InputTestWindow window; window.setGeometry(80, 80, 40, 40); - window.show(); + window.showNormal(); QVERIFY(QTest::qWaitForWindowExposed(&window)); QWindowSystemInterface::handleKeyEvent(&window, QEvent::KeyPress, Qt::Key_A, Qt::NoModifier); From 27107b43a38818dcb74e081a66ed579dda1d12c3 Mon Sep 17 00:00:00 2001 From: Rafael Roquetto Date: Wed, 12 Jun 2013 16:08:43 -0300 Subject: [PATCH 59/79] Fix tst_qlistview for full screen platforms Some test cases rely on the fact that show() is not fullscreen, which may not be true for some platforms. Explicitly make use of showNormal() to avoid full-screen show on these platforms. Change-Id: Ie62fe21bf0f466c561a27cffda99d0201b4a45af Reviewed-by: Friedemann Kleint Reviewed-by: Bernd Weimer Reviewed-by: Kevin Krammer --- tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp index 5d7925aeec..ee936309a4 100644 --- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp +++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp @@ -1469,7 +1469,7 @@ void tst_QListView::wordWrap() lv.setModel(&model); lv.setWordWrap(true); lv.setFixedSize(150, 150); - lv.show(); + lv.showNormal(); QApplication::processEvents(); QTRY_COMPARE(lv.horizontalScrollBar()->isVisible(), false); @@ -2013,7 +2013,7 @@ void tst_QListView::taskQTBUG_9455_wrongScrollbarRanges() w.setMovement(QListView::Static); const int spacing = 40; w.setSpacing(spacing); - w.show(); + w.showNormal(); QVERIFY(QTest::qWaitForWindowExposed(&w)); QCOMPARE(w.verticalScrollBar()->maximum(), w.contentsSize().height() - w.viewport()->geometry().height()); } @@ -2117,7 +2117,7 @@ void tst_QListView::taskQTBUG_21115_scrollToAndHiddenItems() list << QString::number(i); model.setStringList(list); lv.setModel(&model); - lv.show(); + lv.showNormal(); QVERIFY(QTest::qWaitForWindowExposed(&lv)); // Save first item rect for reference From 1d23172c9994cea7a403c1a5cbb81cf824a9fa64 Mon Sep 17 00:00:00 2001 From: Rafael Roquetto Date: Wed, 12 Jun 2013 16:12:31 -0300 Subject: [PATCH 60/79] BlackBerry: fix tst_qlistview Because fonts are bigger on BlackBerry than those assumed when the test was written, explicitly adjust the font size on this platform. Change-Id: I6a23c28c2d32edf744dd5de09ea0a97fd5f9b6d6 Reviewed-by: Friedemann Kleint --- tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp index ee936309a4..268276bd4a 100644 --- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp +++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp @@ -1469,6 +1469,14 @@ void tst_QListView::wordWrap() lv.setModel(&model); lv.setWordWrap(true); lv.setFixedSize(150, 150); +#ifdef Q_OS_BLACKBERRY + // BB standard font size is too big, triggering + // a horizontal scrollbar even when word-wrapping + // is enabled + QFont font = lv.font(); + font.setPointSize(5); + lv.setFont(font); +#endif // Q_OS_BLACKBERRY lv.showNormal(); QApplication::processEvents(); From ae5b0132336b4b944b18f4e4717eb932389ff0ea Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Sat, 13 Apr 2013 14:57:51 +0900 Subject: [PATCH 61/79] Make qtbase compile with QT_NO_TRANSLATION Change-Id: Iaa52ba41218b3ec8f36f0052230e0c2cc31c3ba5 Reviewed-by: Oswald Buddenhagen --- src/tools/qdoc/location.h | 3 +- src/tools/qdoc/openedlist.h | 1 - src/tools/qdoc/qdoc.pro | 1 - src/tools/qdoc/separator.cpp | 2 +- src/tools/qdoc/tr.h | 82 ------------------------------------ 5 files changed, 2 insertions(+), 87 deletions(-) delete mode 100644 src/tools/qdoc/tr.h diff --git a/src/tools/qdoc/location.h b/src/tools/qdoc/location.h index 33472810d3..0c113bcbeb 100644 --- a/src/tools/qdoc/location.h +++ b/src/tools/qdoc/location.h @@ -47,8 +47,7 @@ #define LOCATION_H #include - -#include "tr.h" +#include QT_BEGIN_NAMESPACE diff --git a/src/tools/qdoc/openedlist.h b/src/tools/qdoc/openedlist.h index cf7624b8e3..2aad1f6dcb 100644 --- a/src/tools/qdoc/openedlist.h +++ b/src/tools/qdoc/openedlist.h @@ -49,7 +49,6 @@ #include #include "location.h" -#include "tr.h" QT_BEGIN_NAMESPACE diff --git a/src/tools/qdoc/qdoc.pro b/src/tools/qdoc/qdoc.pro index 3bd11bcd5b..55e32dd4a3 100644 --- a/src/tools/qdoc/qdoc.pro +++ b/src/tools/qdoc/qdoc.pro @@ -38,7 +38,6 @@ HEADERS += atom.h \ separator.h \ text.h \ tokenizer.h \ - tr.h \ tree.h SOURCES += atom.cpp \ codechunk.cpp \ diff --git a/src/tools/qdoc/separator.cpp b/src/tools/qdoc/separator.cpp index 2403fb15c8..af10ba364c 100644 --- a/src/tools/qdoc/separator.cpp +++ b/src/tools/qdoc/separator.cpp @@ -44,7 +44,7 @@ */ #include "separator.h" -#include "tr.h" +#include QT_BEGIN_NAMESPACE diff --git a/src/tools/qdoc/tr.h b/src/tools/qdoc/tr.h deleted file mode 100644 index 36b0c47fef..0000000000 --- a/src/tools/qdoc/tr.h +++ /dev/null @@ -1,82 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of the tools applications of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3.0 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU General Public License version 3.0 requirements will be -** met: http://www.gnu.org/copyleft/gpl.html. -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -/* - tr.h -*/ - -#ifndef TR_H -#define TR_H - -#include - -#if !defined(QT_BOOTSTRAPPED) && !defined(QT_NO_TRANSLATION) -# define TRANSLATE_QDOC -#endif - -#include -#ifdef TRANSLATE_QDOC -# include -#endif - -QT_BEGIN_NAMESPACE - -#ifndef TRANSLATE_QDOC - -#define Q_DECLARE_TR_FUNCTIONS(context) - -inline QString tr(const char *sourceText, const char *comment = 0) -{ - Q_UNUSED(comment); - return QString( QLatin1String(sourceText) ); -} - -struct QCoreApplication -{ - static inline QString translate(const char * /* context */ , const char *sourceText, const char * /* disambiguation */ = 0) - { return QLatin1String(sourceText); } -}; - -#endif // !TRANSLATE_QDOC - -QT_END_NAMESPACE - -#endif From 41dbfd8888e14440041907ac646c2e63284d50c7 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Sun, 16 Jun 2013 19:08:09 -0700 Subject: [PATCH 62/79] Doc: there is no Q_OS_X11 (and has never been) Change the example to Q_OS_UNIX. Change-Id: I8aed12237408a0e526839a96867aceae33b993b9 Reviewed-by: Shawn Rutledge Reviewed-by: Jerome Pasion --- src/corelib/global/qglobal.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp index 6f63a0d9d3..e6da7bb32d 100644 --- a/src/corelib/global/qglobal.cpp +++ b/src/corelib/global/qglobal.cpp @@ -511,7 +511,7 @@ Q_CORE_EXPORT void *qMemSet(void *dest, int c, size_t n); the application is compiled using Forte Developer, or Sun Studio C++. The header file also declares a range of macros (Q_OS_*) that are defined for the specified platforms. For example, - Q_OS_X11 which is defined for the X Window System. + Q_OS_UNIX which is defined for the Unix-based systems. The purpose of these macros is to enable programmers to add compiler or platform specific code to their application. From e3dadce470bcc020dc11331be1877a10e70786a6 Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Sun, 16 Jun 2013 11:32:09 +0300 Subject: [PATCH 63/79] Ensure we don't repeat QTBUG-30931 in Qt5 The issue is already fixed in 5.0 but let's be nice and ensure the issue won't be reintroduced later. Task-number: QTBUG-30931 Change-Id: Ia6944acaf6e7217f8d0f1fa75d0e9977db11d892 Reviewed-by: Lars Knoll --- src/corelib/tools/qchar.cpp | 9 ++++----- tests/auto/corelib/tools/qchar/tst_qchar.cpp | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp index 8545276dac..9ab7155c2d 100644 --- a/src/corelib/tools/qchar.cpp +++ b/src/corelib/tools/qchar.cpp @@ -1739,10 +1739,10 @@ static void composeHelper(QString *str, QChar::UnicodeVersion version, int from) if (from < 0 || s.length() - from < 2) return; - int starter = 0; // starter position uint stcode = 0; // starter code point - int next = -1; - int lastCombining = 0; + int starter = -1; // starter position + int next = -1; // to prevent i == next + int lastCombining = 255; // to prevent combining > lastCombining int pos = from; while (pos < s.length()) { @@ -1766,8 +1766,7 @@ static void composeHelper(QString *str, QChar::UnicodeVersion version, int from) } int combining = p->combiningClass; - if (i == next || combining > lastCombining) { - Q_ASSERT(starter >= from); + if ((i == next || combining > lastCombining) && starter >= from) { // allowed to form ligature with S uint ligature = ligatureHelper(stcode, uc); if (ligature) { diff --git a/tests/auto/corelib/tools/qchar/tst_qchar.cpp b/tests/auto/corelib/tools/qchar/tst_qchar.cpp index c89d553112..2ec85882b8 100644 --- a/tests/auto/corelib/tools/qchar/tst_qchar.cpp +++ b/tests/auto/corelib/tools/qchar/tst_qchar.cpp @@ -909,6 +909,20 @@ void tst_QChar::normalization_manual() QVERIFY(composed.normalized(QString::NormalizationForm_KD) == decomposed); QVERIFY(composed.normalized(QString::NormalizationForm_KC) == decomposed); } + { + QString composed; + composed += QChar(0x0061); + composed += QChar(0x00f2); + QString decomposed; + decomposed += QChar(0x0061); + decomposed += QChar(0x006f); + decomposed += QChar(0x0300); + + QVERIFY(decomposed.normalized(QString::NormalizationForm_D) == decomposed); + QVERIFY(decomposed.normalized(QString::NormalizationForm_C) == composed); + QVERIFY(decomposed.normalized(QString::NormalizationForm_KD) == decomposed); + QVERIFY(decomposed.normalized(QString::NormalizationForm_KC) == composed); + } { // hangul QString composed; composed += QChar(0xc154); From 93c0de7253e79c1510f6c761c1fc7bdfa2d87658 Mon Sep 17 00:00:00 2001 From: Jens Bache-Wiig Date: Tue, 11 Jun 2013 14:50:55 +0200 Subject: [PATCH 64/79] Fix QSpinBox clipping issue on Mac when frame=false This was a regression from 5.0. Since we still require a minimum height to be present in order for the spin buttons to draw correctly, we require the same height from a spinbox without a frame as one with a frame. task-number: QTBUG-31538 Change-Id: I999f59a29e826e8e621faebffce9cccd9bedb8ca Reviewed-by: Gabriel de Dietrich Reviewed-by: Jens Bache-Wiig --- src/widgets/styles/qmacstyle_mac.mm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index 3daa696155..f8905b1b1a 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -6033,10 +6033,14 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, bool useAquaGuideline = true; switch (ct) { - case QStyle::CT_SpinBox: - // hack to work around horrible sizeHint() code in QAbstractSpinBox - sz = QCommonStyle::sizeFromContents(ct, opt, csz, widget); - sz.setHeight(sz.height() - 3); + + case CT_SpinBox: + if (const QStyleOptionSpinBox *vopt = qstyleoption_cast(opt)) { + // Add button + frame widths + int buttonWidth = 20; + int fw = proxy()->pixelMetric(PM_SpinBoxFrameWidth, vopt, widget); + sz += QSize(buttonWidth + 2*fw, 2*fw - 3); + } break; case QStyle::CT_TabWidget: // the size between the pane and the "contentsRect" (+4,+4) From 44630a6f4206832db39ae984687727967d6b7540 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 18 Jun 2013 14:40:29 +0200 Subject: [PATCH 65/79] Add note to remove unused private field. Change-Id: I33c831de1eb6b687a9c033f83bc266bd33a3540e Reviewed-by: Friedemann Kleint --- src/gui/kernel/qevent.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h index 79dcc6d250..82276c5342 100644 --- a/src/gui/kernel/qevent.h +++ b/src/gui/kernel/qevent.h @@ -860,7 +860,14 @@ public: void setContentPos(const QPointF &pos); private: - QObject* m_target; +#ifdef Q_CC_CLANG +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wunused-private-field" +#endif // Q_CC_CLANG + QObject* m_target; // Qt 6 remove. +#ifdef Q_CC_CLANG +# pragma clang diagnostic pop +#endif // Q_CC_CLANG QPointF m_startPos; QSizeF m_viewportSize; QRectF m_contentPosRange; From 5d439eb4ca2f3b576c951a1dbe75ce369ed05a39 Mon Sep 17 00:00:00 2001 From: Giuseppe D'Angelo Date: Tue, 18 Jun 2013 10:42:11 +0200 Subject: [PATCH 66/79] Make PCRE's JIT work on Android devices __clear_cache is missing from Android; use cacheflush instead. Backport in Qt's own PCRE copy of the upstream fix: http://vcs.pcre.org/viewvc?view=revision&revision=1340 Task-number: QTBUG-31754 Change-Id: I4996265f7b19343ba24983d4f8b2f75e2b578504 Reviewed-by: Thiago Macieira --- src/3rdparty/pcre/patches/README | 3 +++ .../patches/r1340_fix_jit_on_android.patch | 18 ++++++++++++++++++ src/3rdparty/pcre/sljit/sljitConfigInternal.h | 7 +++++++ 3 files changed, 28 insertions(+) create mode 100644 src/3rdparty/pcre/patches/README create mode 100644 src/3rdparty/pcre/patches/r1340_fix_jit_on_android.patch diff --git a/src/3rdparty/pcre/patches/README b/src/3rdparty/pcre/patches/README new file mode 100644 index 0000000000..1d2bc389dd --- /dev/null +++ b/src/3rdparty/pcre/patches/README @@ -0,0 +1,3 @@ +These patches are landed in upstream PCRE (they're marked with +their SVN revision number). When upgrading PCRE remember check +if the version you're upgrading to already contains them or not. diff --git a/src/3rdparty/pcre/patches/r1340_fix_jit_on_android.patch b/src/3rdparty/pcre/patches/r1340_fix_jit_on_android.patch new file mode 100644 index 0000000000..41699d4882 --- /dev/null +++ b/src/3rdparty/pcre/patches/r1340_fix_jit_on_android.patch @@ -0,0 +1,18 @@ +Index: sljit/sljitConfigInternal.h +=================================================================== +--- sljit/sljitConfigInternal.h (revision 1339) ++++ sljit/sljitConfigInternal.h (working copy) +@@ -221,6 +221,13 @@ + #define SLJIT_CACHE_FLUSH(from, to) \ + sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from)) + ++#elif defined __ANDROID__ ++ ++/* Android lacks __clear_cache; instead, cacheflush should be used. */ ++ ++#define SLJIT_CACHE_FLUSH(from, to) \ ++ cacheflush((long)(from), (long)(to), 0) ++ + #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) + + /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */ diff --git a/src/3rdparty/pcre/sljit/sljitConfigInternal.h b/src/3rdparty/pcre/sljit/sljitConfigInternal.h index 2b6616ef66..bc945fbcab 100644 --- a/src/3rdparty/pcre/sljit/sljitConfigInternal.h +++ b/src/3rdparty/pcre/sljit/sljitConfigInternal.h @@ -217,6 +217,13 @@ #define SLJIT_CACHE_FLUSH(from, to) \ sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from)) +#elif defined __ANDROID__ + +/* Android lacks __clear_cache; instead, cacheflush should be used. */ + +#define SLJIT_CACHE_FLUSH(from, to) \ + cacheflush((long)(from), (long)(to), 0) + #elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */ From 2a8efea1a90436556f1cd471dce27a0619c5618e Mon Sep 17 00:00:00 2001 From: Nico Vertriest Date: Tue, 18 Jun 2013 12:02:04 +0200 Subject: [PATCH 67/79] Doc: added more details about contains(variablename,value) Task-number: QTBUG-31428 Change-Id: Ie9b4a1f5392f24b5b0b2cb94115edd0814ba92d1 Reviewed-by: Martin Smith Reviewed-by: Oswald Buddenhagen --- qmake/doc/src/qmake-manual.qdoc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc index 5552f6344e..2bc6cc508f 100644 --- a/qmake/doc/src/qmake-manual.qdoc +++ b/qmake/doc/src/qmake-manual.qdoc @@ -2786,8 +2786,10 @@ \section2 contains(variablename, value) Succeeds if the variable \c variablename contains the value \c value; - otherwise fails. You can check the return value of this function using - a scope. + otherwise fails. It is possible to specify a regular expression for + parameter \e value. + + You can check the return value of this function using a scope. For example: From 249c5f0689bf1208a4f1d589de45c20c3ff16de9 Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Tue, 18 Jun 2013 14:42:43 +0200 Subject: [PATCH 68/79] If a QWidget is ignored for auto-quit, ignore its corresponding QWindow. Unit test by Friedemann Kleint Task-number: QTBUG-31569 Change-Id: I526d33d4f88a41f6ac349098476bc45af6c841b0 Reviewed-by: Friedemann Kleint --- src/gui/kernel/qguiapplication.cpp | 8 ++++++ src/gui/kernel/qguiapplication_p.h | 2 ++ src/widgets/kernel/qapplication.cpp | 4 ++- .../kernel/qapplication/tst_qapplication.cpp | 25 +++++++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index add1c1f90b..77c9978a9e 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -2478,11 +2478,19 @@ void QGuiApplicationPrivate::emitLastWindowClosed() } bool QGuiApplicationPrivate::shouldQuit() +{ + const QWindowList processedWindows; + return shouldQuitInternal(processedWindows); +} + +bool QGuiApplicationPrivate::shouldQuitInternal(const QWindowList &processedWindows) { /* if there is no visible top-level window left, we allow the quit */ QWindowList list = QGuiApplication::topLevelWindows(); for (int i = 0; i < list.size(); ++i) { QWindow *w = list.at(i); + if (processedWindows.contains(w)) + continue; if (w->isVisible() && !w->transientParent()) return false; } diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index cd8dfff103..3a4b692b69 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -91,6 +91,8 @@ public: virtual bool shouldQuit(); + bool shouldQuitInternal(const QWindowList &processedWindows); + static Qt::KeyboardModifiers modifier_buttons; static Qt::MouseButtons mouse_buttons; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 6921b4b462..080f4358f2 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2695,12 +2695,14 @@ bool QApplicationPrivate::shouldQuit() the ones without QuitOnClose), we emit the lastWindowClosed signal */ QWidgetList list = QApplication::topLevelWidgets(); + QWindowList processedWindows; for (int i = 0; i < list.size(); ++i) { QWidget *w = list.at(i); + processedWindows.push_back(w->windowHandle()); if (w->isVisible() && !w->parentWidget() && w->testAttribute(Qt::WA_QuitOnClose)) return false; } - return QGuiApplicationPrivate::shouldQuit(); + return QGuiApplicationPrivate::shouldQuitInternal(processedWindows); } static inline void closeAllPopups() diff --git a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp index c6835f6076..c9079e222c 100644 --- a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp +++ b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp @@ -783,6 +783,31 @@ void tst_QApplication::quitOnLastWindowClosed() QVERIFY(timerSpy.count() > 15); // Should be around 20 if closing did not caused the quit } + { // QTBUG-31569: If the last widget with Qt::WA_QuitOnClose set is closed, other + // widgets that don't have the attribute set should be closed automatically. + int argc = 0; + QApplication app(argc, 0); + QVERIFY(app.quitOnLastWindowClosed()); + + QWidget w1; + w1.show(); + + QWidget w2; + w2.setAttribute(Qt::WA_QuitOnClose, false); + w2.show(); + + QVERIFY(QTest::qWaitForWindowExposed(&w2)); + + QTimer timer; + timer.setInterval(100); + timer.start(); + QSignalSpy timerSpy(&timer, SIGNAL(timeout())); + + QTimer::singleShot(100, &w1, SLOT(close())); + app.exec(); + + QVERIFY(timerSpy.count() < 10); + } } class PromptOnCloseWidget : public QWidget From 5f49467c526fe590435fcbadc018b753d6a0f589 Mon Sep 17 00:00:00 2001 From: Sean Harmer Date: Tue, 11 Jun 2013 11:29:22 +0100 Subject: [PATCH 69/79] QNX: Add option to disable screen power save from an envvar Qt itself has no API for disabling screen power save, although this might make an interesting addition at some point. Instead we make the QNX QPA plugin determine if power save should be disabled from the QQNX_DISABLE_POWER_SAVE environment variable. This would typically be set in the application's bar descriptor file. Change-Id: Ie195ecd0496efd533ad9a32b65883283f471c534 Reviewed-by: Kevin Krammer Reviewed-by: Rafael Roquetto --- src/plugins/platforms/qnx/qqnxrootwindow.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/plugins/platforms/qnx/qqnxrootwindow.cpp b/src/plugins/platforms/qnx/qqnxrootwindow.cpp index 5d58890c51..ff5866d1b7 100644 --- a/src/plugins/platforms/qnx/qqnxrootwindow.cpp +++ b/src/plugins/platforms/qnx/qqnxrootwindow.cpp @@ -162,6 +162,16 @@ QQnxRootWindow::QQnxRootWindow(const QQnxScreen *screen) if (result != 0) qFatal("QQnxRootWindow: failed to set window source position, errno=%d", errno); + // Optionally disable the screen power save + bool ok = false; + const int disablePowerSave = qgetenv("QQNX_DISABLE_POWER_SAVE").toInt(&ok); + if (ok && disablePowerSave) { + const int mode = SCREEN_IDLE_MODE_KEEP_AWAKE; + result = screen_set_window_property_iv(m_window, SCREEN_PROPERTY_IDLE_MODE, &mode); + if (result != 0) + qWarning("QQnxRootWindow: failed to disable power saving mode"); + } + createWindowGroup(); // Don't post yet. This will be lazily done from QQnxScreen upon first posting of From 0343b926608a4014ef386b3b21be9a0940d9f8e8 Mon Sep 17 00:00:00 2001 From: Rafael Roquetto Date: Mon, 17 Jun 2013 16:46:39 -0300 Subject: [PATCH 70/79] QNX: Fix screen rotation The behavior introduced by qtdeclarative's 475d1ed4f6a2 mandates that an expose event follows a geometry change event. The fix for this uncovered a bug on the raster backing store which caused the rotation to break on QtWidgets. The problem was rooted on the assumption that the QQnxRasterBackingStore::flush() method was only called after paints to the backing store surface, which was discovered to be a false assumption. Flushing the backing store can occur in other circunstances, which are out of scope on the context of the QNX plugin. Task-number: QTBUG-31329 Change-Id: Icfc3e85324f5a8745f6b5f189f27f8b763f770c7 Reviewed-by: Kevin Krammer Reviewed-by: Sean Harmer --- src/plugins/platforms/qnx/qqnxrasterbackingstore.cpp | 7 ++++++- src/plugins/platforms/qnx/qqnxwindow.cpp | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/platforms/qnx/qqnxrasterbackingstore.cpp b/src/plugins/platforms/qnx/qqnxrasterbackingstore.cpp index 7204e5bce9..6a7a4d0944 100644 --- a/src/plugins/platforms/qnx/qqnxrasterbackingstore.cpp +++ b/src/plugins/platforms/qnx/qqnxrasterbackingstore.cpp @@ -81,6 +81,12 @@ void QQnxRasterBackingStore::flush(QWindow *window, const QRegion ®ion, const { qRasterBackingStoreDebug() << Q_FUNC_INFO << "w =" << this->window(); + // Sometimes this method is called even though there is nothing to be + // flushed, for instance, after an expose event directly follows a + // geometry change event. + if (!m_hasUnflushedPaintOperations) + return; + QQnxWindow *targetWindow = 0; if (window) targetWindow = static_cast(window->handle()); @@ -117,7 +123,6 @@ void QQnxRasterBackingStore::flush(QWindow *window, const QRegion ®ion, const // We assume that the TLW has been flushed previously and that no changes were made to the // backing store inbetween (### does Qt guarantee this?) - Q_ASSERT(!m_hasUnflushedPaintOperations); targetWindow->adjustBufferSize(); targetWindow->blitFrom(platformWindow, offset, region); diff --git a/src/plugins/platforms/qnx/qqnxwindow.cpp b/src/plugins/platforms/qnx/qqnxwindow.cpp index 4c95950a7e..87e59dac61 100644 --- a/src/plugins/platforms/qnx/qqnxwindow.cpp +++ b/src/plugins/platforms/qnx/qqnxwindow.cpp @@ -199,6 +199,7 @@ void QQnxWindow::setGeometry(const QRect &rect) // could result in re-entering QQnxWindow::setGeometry() again. QWindowSystemInterface::setSynchronousWindowsSystemEvents(true); QWindowSystemInterface::handleGeometryChange(window(), rect); + QWindowSystemInterface::handleExposeEvent(window(), rect); QWindowSystemInterface::setSynchronousWindowsSystemEvents(false); // Now move all children. From 1aaeb9538b8f001cee80eef75a15176e0d3910ed Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 17 Jun 2013 11:21:40 +0200 Subject: [PATCH 71/79] complain about bad arguments to -make/-nomake Task-number: QTBUG-5366 Change-Id: I461a6c85fcee4a0216571d294171652b05ee6a34 Reviewed-by: Joerg Bornemann --- configure | 9 +++++++++ tools/configure/configureapp.cpp | 16 ++++++++++++++-- tools/configure/configureapp.h | 1 + 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 43d52a896b..de2b3483d9 100755 --- a/configure +++ b/configure @@ -876,6 +876,7 @@ CFG_SSE=auto CFG_FONTCONFIG=auto CFG_LIBFREETYPE=auto CFG_SQL_AVAILABLE= +QT_ALL_BUILD_PARTS=" libs tools examples tests " QT_DEFAULT_BUILD_PARTS="libs tools examples" CFG_BUILD_PARTS="" CFG_NOBUILD_PARTS="" @@ -1430,9 +1431,17 @@ while [ "$#" -gt 0 ]; do fi ;; nomake) + if [ -n "${QT_ALL_BUILD_PARTS%%* $VAL *}" ]; then + echo "Unknown part $VAL passed to -nomake." >&2 + exit 1 + fi CFG_NOBUILD_PARTS="$CFG_NOBUILD_PARTS $VAL" ;; make) + if [ -n "${QT_ALL_BUILD_PARTS%%* $VAL *}" ]; then + echo "Unknown part $VAL passed to -make." >&2 + exit 1 + fi CFG_BUILD_PARTS="$CFG_BUILD_PARTS $VAL" ;; skip) diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp index 50e491f20c..0ac3730b4e 100644 --- a/tools/configure/configureapp.cpp +++ b/tools/configure/configureapp.cpp @@ -171,6 +171,8 @@ Configure::Configure(int& argc, char** argv) } defaultBuildParts << QStringLiteral("libs") << QStringLiteral("tools") << QStringLiteral("examples"); + allBuildParts = defaultBuildParts; + allBuildParts << QStringLiteral("tests"); dictionary[ "QT_SOURCE_TREE" ] = sourcePath; dictionary[ "QT_BUILD_TREE" ] = buildPath; dictionary[ "QT_INSTALL_PREFIX" ] = installPath; @@ -1001,12 +1003,22 @@ void Configure::parseCmdLine() ++i; if (i == argCount) break; - buildParts += configCmdLine.at(i); + QString part = configCmdLine.at(i); + if (!allBuildParts.contains(part)) { + cout << "Unknown part " << part << " passed to -make." << endl; + dictionary["DONE"] = "error"; + } + buildParts += part; } else if (configCmdLine.at(i) == "-nomake") { ++i; if (i == argCount) break; - nobuildParts.append(configCmdLine.at(i)); + QString part = configCmdLine.at(i); + if (!allBuildParts.contains(part)) { + cout << "Unknown part " << part << " passed to -nomake." << endl; + dictionary["DONE"] = "error"; + } + nobuildParts += part; } else if (configCmdLine.at(i) == "-skip") { diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h index 3014e409f9..8f95e1fb95 100644 --- a/tools/configure/configureapp.h +++ b/tools/configure/configureapp.h @@ -104,6 +104,7 @@ private: // Our variable dictionaries QMap dictionary; + QStringList allBuildParts; QStringList defaultBuildParts; QStringList buildParts; QStringList nobuildParts; From 77d903ae1a2331402b49555a44ef829dced87192 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 17 Jun 2013 11:49:53 +0200 Subject: [PATCH 72/79] catch accidental use of -no-make the option the user most likely meant is called -nomake. Task-number: QTBUG-21778 Change-Id: I6d8c4d5a984c929804f49ffc2ac75f6945f76e81 Reviewed-by: Joerg Bornemann --- configure | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/configure b/configure index de2b3483d9..13e6fd016a 100755 --- a/configure +++ b/configure @@ -1438,11 +1438,15 @@ while [ "$#" -gt 0 ]; do CFG_NOBUILD_PARTS="$CFG_NOBUILD_PARTS $VAL" ;; make) - if [ -n "${QT_ALL_BUILD_PARTS%%* $VAL *}" ]; then - echo "Unknown part $VAL passed to -make." >&2 - exit 1 + if [ "$VAL" = "no" ]; then + UNKNOWN_OPT=yes + else + if [ -n "${QT_ALL_BUILD_PARTS%%* $VAL *}" ]; then + echo "Unknown part $VAL passed to -make." >&2 + exit 1 + fi + CFG_BUILD_PARTS="$CFG_BUILD_PARTS $VAL" fi - CFG_BUILD_PARTS="$CFG_BUILD_PARTS $VAL" ;; skip) VAL=qt${VAL#qt} From deadf598f40d4ee194fc8a0a0b7cb48d46d69654 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 17 Jun 2013 13:25:59 +0200 Subject: [PATCH 73/79] don't claim that mac style needs windows style we have commonstyle for that for a while now. Change-Id: I1ab3c86af994fc9cc7aaf65d28a2428b5e02be99 Reviewed-by: Joerg Bornemann Reviewed-by: Jens Bache-Wiig --- src/widgets/styles/styles.pri | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/widgets/styles/styles.pri b/src/widgets/styles/styles.pri index b39b17fd86..05568e8408 100644 --- a/src/widgets/styles/styles.pri +++ b/src/widgets/styles/styles.pri @@ -54,12 +54,6 @@ contains( styles, mac ) { styles/qmacstyle_mac_p.h \ styles/qmacstyle_mac_p_p.h OBJECTIVE_SOURCES += styles/qmacstyle_mac.mm - - !contains( styles, windows ) { - message( mac requires windows ) - styles += windows - DEFINES+= QT_STYLE_WINDOWS - } } else { DEFINES += QT_NO_STYLE_MAC } From d4f89b5115a0a9dcaf9d0d9973ea8562c2e41f91 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 17 Jun 2013 13:27:03 +0200 Subject: [PATCH 74/79] remove pointless positive QT_FOO_STYLE defines they are not used. only the negative QT_NO_FOO_STYLE defines are used. Change-Id: Ic39081240c78cf66bd50c300b4aad04abca6f38c Reviewed-by: Joerg Bornemann Reviewed-by: Jens Bache-Wiig --- src/widgets/styles/styles.pri | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/widgets/styles/styles.pri b/src/widgets/styles/styles.pri index 05568e8408..6a5565a8eb 100644 --- a/src/widgets/styles/styles.pri +++ b/src/widgets/styles/styles.pri @@ -62,7 +62,6 @@ contains( styles, windows ) { HEADERS += styles/qwindowsstyle_p.h HEADERS += styles/qwindowsstyle_p_p.h SOURCES += styles/qwindowsstyle.cpp - DEFINES += QT_STYLE_WINDOWS } else { DEFINES += QT_NO_STYLE_WINDOWS } @@ -74,7 +73,6 @@ contains( styles, windowsvista ) { !contains( styles, windowsxp ) { message( windowsvista requires windowsxp ) styles += windowsxp - DEFINES += QT_STYLE_WINDOWSXP } } else { DEFINES += QT_NO_STYLE_WINDOWSVISTA @@ -87,7 +85,6 @@ contains( styles, windowsxp ) { !contains( styles, windows ) { message( windowsxp requires windows ) styles += windows - DEFINES += QT_STYLE_WINDOWS } } else { DEFINES += QT_NO_STYLE_WINDOWSXP From 60a5a56359670c276aa6810a1b595c42e9e81a73 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 17 Jun 2013 13:27:56 +0200 Subject: [PATCH 75/79] fix auto-enabling of windows style it needs to come after the vista and xp style blocks. Change-Id: I66b5c1eff41b19a76802a77b6926552d7343b29c Reviewed-by: Joerg Bornemann Reviewed-by: Jens Bache-Wiig --- src/widgets/styles/styles.pri | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/widgets/styles/styles.pri b/src/widgets/styles/styles.pri index 6a5565a8eb..3707090c4c 100644 --- a/src/widgets/styles/styles.pri +++ b/src/widgets/styles/styles.pri @@ -58,14 +58,6 @@ contains( styles, mac ) { DEFINES += QT_NO_STYLE_MAC } -contains( styles, windows ) { - HEADERS += styles/qwindowsstyle_p.h - HEADERS += styles/qwindowsstyle_p_p.h - SOURCES += styles/qwindowsstyle.cpp -} else { - DEFINES += QT_NO_STYLE_WINDOWS -} - contains( styles, windowsvista ) { HEADERS += styles/qwindowsvistastyle_p.h HEADERS += styles/qwindowsvistastyle_p_p.h @@ -90,6 +82,14 @@ contains( styles, windowsxp ) { DEFINES += QT_NO_STYLE_WINDOWSXP } +contains( styles, windows ) { + HEADERS += styles/qwindowsstyle_p.h + HEADERS += styles/qwindowsstyle_p_p.h + SOURCES += styles/qwindowsstyle.cpp +} else { + DEFINES += QT_NO_STYLE_WINDOWS +} + contains( styles, gtk ) { HEADERS += styles/qgtkglobal_p.h HEADERS += styles/qgtkstyle_p.h From 0a55499c9af9a4b0a98a12a8aba82c3764fa5994 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Tue, 18 Jun 2013 09:11:33 +0200 Subject: [PATCH 76/79] Doc: remove the duplicate for in QStyle documentation Task-number: QTBUG-31739 Change-Id: I72ad52da7d7e6899148a91d22266e79dd3184d4c Reviewed-by: Jerome Pasion --- src/widgets/styles/qstyle.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp index 603d0e50a5..dccc9ff3ce 100644 --- a/src/widgets/styles/qstyle.cpp +++ b/src/widgets/styles/qstyle.cpp @@ -351,7 +351,7 @@ static int unpackControlTypes(QSizePolicy::ControlTypes controls, QSizePolicy::C \section1 Styles in Item Views The painting of items in views is performed by a delegate. Qt's - default delegate, QStyledItemDelegate, is also used for for calculating bounding + default delegate, QStyledItemDelegate, is also used for calculating bounding rectangles of items, and their sub-elements for the various kind of item \l{Qt::ItemDataRole}{data roles} QStyledItemDelegate supports. See the QStyledItemDelegate class From 46106c4e16dd36deb17011d8587b301971921f5c Mon Sep 17 00:00:00 2001 From: Tasuku Suzuki Date: Mon, 27 May 2013 00:37:18 +0900 Subject: [PATCH 77/79] hide placeholder text when QLineEdit has preedit text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ica84e9ce715702b690906ef748970e16d9162c4b Reviewed-by: Gabriel de Dietrich Reviewed-by: Aurélien Gâteau --- src/widgets/widgets/qlineedit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/widgets/qlineedit.cpp b/src/widgets/widgets/qlineedit.cpp index 6d648f1126..d44e9ad02f 100644 --- a/src/widgets/widgets/qlineedit.cpp +++ b/src/widgets/widgets/qlineedit.cpp @@ -1802,7 +1802,7 @@ void QLineEdit::paintEvent(QPaintEvent *) int minLB = qMax(0, -fm.minLeftBearing()); int minRB = qMax(0, -fm.minRightBearing()); - if (d->control->text().isEmpty()) { + if (d->control->text().isEmpty() && d->control->preeditAreaText().isEmpty()) { if (!d->placeholderText.isEmpty()) { QColor col = pal.text().color(); col.setAlpha(128); From a4d41f6803beca7e0911610cc4ed8027ab196eb7 Mon Sep 17 00:00:00 2001 From: David Faure Date: Fri, 14 Jun 2013 15:51:48 +0200 Subject: [PATCH 78/79] Doc: QTranslator::translate() isn't an overload anymore Change-Id: Ib50044da48be3fb4f43300aa285e15403bd8d65e Reviewed-by: Jerome Pasion Reviewed-by: Oswald Buddenhagen --- src/corelib/kernel/qtranslator.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp index 9243d093df..903ab2e2cd 100644 --- a/src/corelib/kernel/qtranslator.cpp +++ b/src/corelib/kernel/qtranslator.cpp @@ -1084,8 +1084,6 @@ void QTranslatorPrivate::clear() } /*! - \overload translate() - Returns the translation for the key (\a context, \a sourceText, \a disambiguation). If none is found, also tries (\a context, \a sourceText, ""). If that still fails, returns a null string. From 25739bebba0343a8b35775a073c49f0fba080762 Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Wed, 19 Jun 2013 14:40:17 +0800 Subject: [PATCH 79/79] Doc: Fix spelling error Change-Id: I9225ffeddfe17bc4f56ecd9a9c4656403840f828 Reviewed-by: Friedemann Kleint --- src/corelib/global/qtypeinfo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h index 8e34c9792d..58736ac2b8 100644 --- a/src/corelib/global/qtypeinfo.h +++ b/src/corelib/global/qtypeinfo.h @@ -110,7 +110,7 @@ public: To create a proper QTypeInfo specialization for A struct, we have to check all sub-components; B, C and D, then take the lowest common denominator and call - Q_DECLATE_TYPEINFO with the resulting flags. An easier and less fragile approach is to + Q_DECLARE_TYPEINFO with the resulting flags. An easier and less fragile approach is to use QTypeInfoMerger, which does that automatically. So struct A would have the following QTypeInfo definition: