Merge "Merge remote-tracking branch 'origin/5.8' into 5.9" into refs/staging/5.9

This commit is contained in:
Simon Hausmann 2017-02-24 22:15:56 +00:00 committed by The Qt Project
commit 63856135da
69 changed files with 904 additions and 1262 deletions

View File

@ -1,8 +1,10 @@
Usage: configure [options] [assignments]
Configure understands variable assignments like VAR=value on the command line.
These override any values possibly obtained from pkg-config. The variables
are mentioned in the descriptions of the options they relate to.
Each uppercased library name (obtainable with -list-libraries) supports the
suffixes _INCDIR, _LIBDIR, _PREFIX (INCDIR=PREFIX/include, LIBDIR=PREFIX/lib),
_LIBS, and - on Windows and Darwin - _LIBS_DEBUG and _LIBS_RELEASE. E.g.,
ICU_PREFIX=/opt/icu42 ICU_LIBS="-licui18n -licuuc -licudata".
It is also possible to manipulate any QMAKE_* variable, to amend the values
from the mkspec for the build of Qt itself, e.g., QMAKE_CXXFLAGS+=-g3.
@ -62,6 +64,13 @@ Configure meta:
Use this after installing missing dependencies.
-recheck-all ......... Discard all cached configure test results.
-feature-<feature> ... Enable <feature>
-no-feature-<feature> Disable <feature> [none]
-list-features ....... List available features. Note that some features
have dedicated command line options as well.
-list-libraries ...... List possible external dependencies.
Build options:
-opensource .......... Build the Open-Source Edition of Qt
@ -188,9 +197,6 @@ Component selection:
[default on Android and Windows]
-dbus-linked ......... Build Qt D-Bus and link to libdbus-1 [auto]
-dbus-runtime ........ Build Qt D-Bus and dynamically load libdbus-1 [no]
DBUS_PATH= DBUS_HOST_PATH=
-feature-<feature> ... Enable <feature>. The available features are described
in src/corelib/global/qfeatures.txt. [all enabled]
-accessibility ....... Enable accessibility support [yes]
Note: Disabling accessibility is not recommended.
-qml-debug ........... Enable QML debugging support [yes]
@ -210,7 +216,6 @@ Core options:
-pcre ................ Select used libpcre2 [system/qt]
-pps ................. Enable PPS support [auto] (QNX only)
-zlib ................ Select used zlib [system/qt]
ZLIB_LIBS=
Logging backends:
-journald .......... Enable journald support [no] (Unix only)
@ -223,8 +228,6 @@ Network options:
-no-openssl .......... Do not use OpenSSL [default on Apple and WinRT]
-openssl-linked ...... Use OpenSSL and link to libssl [no]
-openssl-runtime ..... Use OpenSSL and dynamically load libssl [auto]
OPENSSL_PATH= OPENSSL_LIBS=, and on Windows also
OPENSSL_LIBS_DEBUG= OPENSSL_LIBS_RELEASE=
-securetransport ..... Use SecureTransport [auto] (Apple only)
-sctp ................ Enable SCTP support [no]
@ -292,5 +295,4 @@ Database options:
-sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers:
db2 ibase mysql oci odbc psql sqlite2 sqlite tds
[all auto]
MYSQL_PATH= PSQL_LIBS= SYBASE= SYBASE_LIBS=
-sqlite .............. Select used sqlite3 [system/qt]

View File

@ -20,8 +20,7 @@
"commandline": {
"assignments": {
"DBUS_HOST_PATH": "host_dbus.prefix",
"DBUS_PATH": "dbus.prefix",
"ZLIB_LIBS": "zlib.libs"
"DBUS_PATH": "dbus.prefix"
},
"custom": "qmakeArgs",
"options": {
@ -990,7 +989,10 @@
},
"qml-debug": {
"label": "QML debugging",
"output": [ { "type": "publicQtConfig", "negative": true } ]
"output": [
"privateFeature",
{ "type": "publicQtConfig", "negative": true }
]
},
"compile_examples": {
"label": "Compile examples",

View File

@ -30,7 +30,6 @@ qtHaveModule(widgets) {
}
qtConfig(openssl): SUBDIRS += securesocketclient
qtConfig(openssl-linked): SUBDIRS += securesocketclient
qtConfig(sctp): SUBDIRS += multistreamserver multistreamclient
}

View File

@ -12,7 +12,10 @@
"recheck": { "type": "void", "name": "cache_use", "value": "positive" },
"recheck-all": { "type": "void", "name": "cache_use", "value": "none" },
"redo": { "type": "redo" }
"redo": { "type": "redo" },
"list-features": "void",
"list-libraries": "void"
}
}
}

View File

@ -27,7 +27,7 @@ win32:count(MOC_INCLUDEPATH, 40, >) {
# QNX's compiler sets "gcc" config, but does not support the -dM option;
# UIKit builds are always multi-arch due to simulator_and_device (unless
# -sdk is used) so this feature cannot possibly work.
if(gcc|intel_icl|msvc):!rim_qcc:!uikit:if(!macos|count(QMAKE_APPLE_DEVICE_ARCHS, 1)) {
if(gcc|intel_icl|msvc):!rim_qcc:!uikit:!no_moc_predefs:if(!macos|count(QMAKE_APPLE_DEVICE_ARCHS, 1)) {
moc_predefs.name = "Generate moc_predefs.h"
moc_predefs.CONFIG = no_link
gcc: moc_predefs.commands = $$QMAKE_CXX $$QMAKE_CXXFLAGS -dM -E -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN}

View File

@ -5,25 +5,19 @@ for(ever) {
use = $$split(use, /)
name = $$take_first(use)
nu = $$upper($$name)
debug: \
libs = $$eval(QMAKE_LIBS_$${nu}_DEBUG)
else: \
libs = $$eval(QMAKE_LIBS_$${nu}_RELEASE)
libs += $$eval(QMAKE_LIBS_$$nu)
libdir = $$eval(QMAKE_LIBDIR_$$nu)
defines = $$eval(QMAKE_DEFINES_$${nu})
includes = $$eval(QMAKE_INCDIR_$${nu})
isEmpty(libs):isEmpty(defines):isEmpty(includes): \
!defined(QMAKE_LIBS_$$nu, var): \
error("Library '$$name' is not defined.")
!contains(use, nolink) {
QMAKE_LIBDIR += $$libdir
LIBS$${suffix} += $$libs
QMAKE_LIBDIR += $$eval(QMAKE_LIBDIR_$$nu)
debug: \
LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_DEBUG) $$eval(QMAKE_LIBS_$$nu)
else: \
LIBS$${suffix} += $$eval(QMAKE_LIBS_$${nu}_RELEASE) $$eval(QMAKE_LIBS_$$nu)
}
!contains(use, linkonly) {
DEFINES += $$defines
INCLUDEPATH += $$includes
DEFINES += $$eval(QMAKE_DEFINES_$${nu})
INCLUDEPATH += $$eval(QMAKE_INCDIR_$${nu})
}
}
!isEmpty(suffix): break()

View File

@ -401,6 +401,7 @@ defineReplace(qtConfPrepareArgs) {
}
defineTest(qtConfSetupLibraries) {
asspfx = $${currentConfig}.commandline.assignments
for (l, $${currentConfig}.libraries._KEYS_) {
lpfx = $${currentConfig}.libraries.$${l}
# 'export' may be omitted, in which case it falls back to the library's name
@ -408,6 +409,15 @@ defineTest(qtConfSetupLibraries) {
$${lpfx}.export = $$l
export($${lpfx}.export)
}
# 'export' may also be empty, but we need a derived identifier
alias = $$eval($${lpfx}.export)
isEmpty(alias): alias = $$l
$${lpfx}.alias = $$alias
export($${lpfx}.alias)
# make it easy to refer to the library by its export name.
$${currentConfig}.exports._KEYS_ += $$alias
$${currentConfig}.exports.$$alias += $$l
export($${currentConfig}.exports.$$alias)
isEmpty($${lpfx}.sources._KEYS_): \
error("Library $$l defines no sources")
for (s, $${lpfx}.sources._KEYS_) {
@ -427,10 +437,33 @@ defineTest(qtConfSetupLibraries) {
}
}
}
$${currentConfig}.exports._KEYS_ = $$unique($${currentConfig}.exports._KEYS_)
export($${currentConfig}.exports._KEYS_)
for (alias, $${currentConfig}.exports._KEYS_) {
ua = $$upper($$alias)
$${asspfx}._KEYS_ += \
$${ua}_PREFIX $${ua}_INCDIR $${ua}_LIBDIR \
$${ua}_LIBS $${ua}_LIBS_DEBUG $${ua}_LIBS_RELEASE
uapfx = $${asspfx}.$${ua}
$${uapfx}_PREFIX = $${alias}.prefix
$${uapfx}_INCDIR = $${alias}.incdir
$${uapfx}_LIBDIR = $${alias}.libdir
$${uapfx}_LIBS = $${alias}.libs
$${uapfx}_LIBS_DEBUG = $${alias}.libs.debug
$${uapfx}_LIBS_RELEASE = $${alias}.libs.release
export($${uapfx}_PREFIX)
export($${uapfx}_INCDIR)
export($${uapfx}_LIBDIR)
export($${uapfx}_LIBS)
export($${uapfx}_LIBS_DEBUG)
export($${uapfx}_LIBS_RELEASE)
}
export($${asspfx}._KEYS_)
# reverse mapping for assignments on command line.
for (a, $${currentConfig}.commandline.assignments._KEYS_) {
apfx = $${currentConfig}.commandline.assignments.$${a}
for (a, $${asspfx}._KEYS_) {
apfx = $${asspfx}.$${a}
ra = config.commandline.rev_assignments.$$eval($$apfx)
$$ra = $$a
export($$ra)
@ -444,9 +477,13 @@ defineTest(qtConfLibrary_inline) {
!defined($${1}.libs, var): \
error("'inline' source in library '$$lib' does not specify 'libs'.")
# if multiple libraries provide the same export, it makes sense
# to make them recognize the same input variables.
input = $$eval($${2}.alias)
# direct libs. overwrites inline libs.
defined(config.input.$${lib}.libs, var) {
$${1}.libs = $$eval(config.input.$${lib}.libs)
defined(config.input.$${input}.libs, var) {
$${1}.libs = $$eval(config.input.$${input}.libs)
export($${1}.libs)
}
@ -455,7 +492,7 @@ defineTest(qtConfLibrary_inline) {
any = false
all = true
for (b, $${1}.builds._KEYS_) {
iv = $${lib}.libs.$${b}
iv = $${input}.libs.$${b}
vars += $$eval(config.commandline.rev_assignments.$${iv})
defined(config.input.$${iv}, var) {
$${1}.builds.$${b}.libs = $$eval(config.input.$${iv})
@ -471,7 +508,7 @@ defineTest(qtConfLibrary_inline) {
}
# prefix. prepends to (possibly overwritten) inline libs.
prefix = $$val_escape(config.input.$${lib}.prefix)
prefix = $$val_escape(config.input.$${input}.prefix)
!isEmpty(prefix) {
$${1}.includedir = $$prefix/include
export($${1}.includedir)
@ -479,6 +516,18 @@ defineTest(qtConfLibrary_inline) {
export($${1}.libs)
}
incdir = $$val_escape(config.input.$${input}.incdir)
!isEmpty(incdir) {
$${1}.includedir = $$incdir
export($${1}.includedir)
}
libdir = $$val_escape(config.input.$${input}.libdir)
!isEmpty(libdir) {
$${1}.libs = "-L$$libdir $$eval($${1}.libs)"
export($${1}.libs)
}
return(true)
}
@ -562,14 +611,20 @@ defineReplace(qtConfLibraryArgs) {
}
defineTest(qtConfExportLibrary) {
isEmpty(2): return()
!$$qtConfEvaluate($$eval($${1}.export)): return()
lpfx = $${currentConfig}.libraries.$$1
alias = $$eval($${lpfx}.alias)
$${currentConfig}.found.$$alias = $$1
export($${currentConfig}.found.$$alias)
name = $$eval($${lpfx}.export)
isEmpty(name): return()
spfx = $${lpfx}.sources.$$eval($${lpfx}.source)
!$$qtConfEvaluate($$eval($${spfx}.export)): return()
output = privatePro
eval(libs = $$eval($${1}.libs))
eval(cflags = $$eval($${1}.cflags))
eval(includes = $$eval($${1}.includedir))
eval(libs = $$eval($${spfx}.libs))
eval(cflags = $$eval($${spfx}.cflags))
eval(includes = $$eval($${spfx}.includedir))
# Split $$cflags into stuff that goes into DEFINES, INCLUDEPATH, and other stuff.
defines =
@ -588,30 +643,46 @@ defineTest(qtConfExportLibrary) {
}
}
!isEmpty(ignored): \
qtConfAddNote("Dropped compiler flags '$$ignored' when detecting library '$$2'.")
qtConfAddNote("Dropped compiler flags '$$ignored' when detecting library '$$name'.")
NAME = $$upper($$2)
!isEmpty(libs): qtConfOutputVar(assign, $$output, QMAKE_LIBS_$$NAME, $$libs)
for (b, $${1}.builds._KEYS_): \
NAME = $$upper($$name)
# LIBS is emitted even if empty, as this allows the library to be "seen".
qtConfOutputVar(assign, $$output, QMAKE_LIBS_$$NAME, $$libs)
for (b, $${spfx}.builds._KEYS_): \
qtConfOutputVar(assign, $$output, QMAKE_LIBS_$${NAME}_$$upper($$b), \
$$eval($${1}.builds.$${b}))
$$eval($${spfx}.builds.$${b}))
!isEmpty(defines): qtConfOutputVar(assign, $$output, QMAKE_DEFINES_$$NAME, $$defines)
!isEmpty(includes): qtConfOutputVar(assign, $$output, QMAKE_INCDIR_$$NAME, $$includes)
!isEmpty($${currentConfig}.module): \
qtConfExtendVar($$output, "QT.$${currentModule}_private.libraries", $$2)
qtConfExtendVar($$output, "QT.$${currentModule}_private.libraries", $$name)
}
defineTest(qtConfHandleLibrary) {
lpfx = $${currentConfig}.libraries.$$1
defined($${lpfx}.result, var): return()
alias = $$eval($${lpfx}.alias)
!isEmpty($${currentConfig}.found.$$alias) {
# this happening indicates a logic error in the conditions
# of the feature(s) referring to this library.
# note that this does not look across module boundaries, as
# multiple modules may know the same libraries; de-duplication
# happens via the cache (obviously, this assumes identical
# definitions and logic).
error("A library exporting '$$alias' was already found.")
}
qtConfEnsureTestTypeDeps("library")
qtConfTestPrepare_compile($$lpfx)
!qtConfTestPrepare_compile($$lpfx) {
$${lpfx}.result = false
export($${lpfx}.result)
return()
}
use_args = $$eval($${lpfx}.literal_args)
qtConfLoadResult($${lpfx}, $$1) {
$$eval($${lpfx}.result): \
qtConfExportLibrary($${lpfx}.sources.$$eval($${lpfx}.source), $$eval($${lpfx}.export))
qtConfExportLibrary($$1)
return()
}
@ -634,14 +705,14 @@ defineTest(qtConfHandleLibrary) {
next()
}
!$${call}($$spfx) {
!$${call}($$spfx, $$lpfx) {
qtLog(" => source produced no result.")
next()
}
# if the library defines a test, use it to verify the source.
!isEmpty($${lpfx}.test) {
$${lpfx}.literal_args = $$use_args $$qtConfLibraryArgs($$spfx)
$${lpfx}.literal_args = $$qtConfLibraryArgs($$spfx) $$use_args
$${lpfx}.host = $$eval($${spfx}.host)
!qtConfTest_compile($$lpfx) {
qtLog(" => source failed verification.")
@ -657,11 +728,12 @@ defineTest(qtConfHandleLibrary) {
for (b, $${spfx}.builds._KEYS_): \
$${lpfx}.cache += sources.$${s}.builds.$${b}
# immediately output the library as well.
qtConfExportLibrary($${spfx}, $$eval($${lpfx}.export))
$${lpfx}.source = $$s
export($${lpfx}.source)
# immediately output the library as well.
qtConfExportLibrary($$1)
result = true
break()
}
@ -679,27 +751,76 @@ defineTest(qtConfTest_library) {
}
defineTest(qtConfTestPrepare_compile) {
for (u, $$list($$eval($${1}.use))) {
!isEmpty($${1}.use._KEYS_) {
uses =
for (k, $${1}.use._KEYS_) {
use = $$eval($${1}.use.$${k}.lib)
isEmpty(use): \
error("'use' entry $$k in test $$1 lacks 'lib' field.")
!$$qtConfEvaluate($$eval($${1}.use.$${k}.condition)): \
next()
uses += $$use
}
} else {
uses = $$split($${1}.use)
}
for (u, uses) {
libConfig =
contains($${currentConfig}.libraries._KEYS_, $$u) {
libConfig = $${currentConfig}
exports = $$eval($${currentConfig}.exports.$$u)
!isEmpty(exports) {
# using a local library by exported name.
ru = $$eval($${currentConfig}.found.$$u)
!isEmpty(ru) {
# if it was already found, all is good.
u = $$ru
} else: count(exports, 1) {
# otherwise, if there is only one option, ensure it's resolved.
u = $$exports
qtConfHandleLibrary($$u)
} else {
# otherwise, verify that all options were resolved.
for (x, exports) {
isEmpty($${currentConfig}.libraries.$${x}.result) {
# the higher-level logic is in the features, which we cannot
# infer from here. so the only option is failing.
error("Test $$1 refers to yet unresolved library export '$$u'")
}
}
return(false)
}
libConfig = $$currentConfig
} else: contains($${currentConfig}.libraries._KEYS_, $$u) {
# using a local library by real name. this should be the exception.
qtConfHandleLibrary($$u)
libConfig = $$currentConfig
} else {
for (d, QMAKE_CONFIG_DEPS) {
contains($${d}.libraries._KEYS_, $$u) {
libConfig = $$d
break()
for (d, QMAKE_LIBRARY_DEPS) {
exports = $$eval($${d}.exports.$$u)
!isEmpty(exports) {
# using a foreign library by exported name.
# foreign libraries may be external (if they are from a different
# repository and the build is modular), and using these by real
# name is impossible. so for consistency, uses by real name are
# limited to local libraries.
ru = $$eval($${d}.found.$$u)
!isEmpty(ru) {
u = $$ru
libConfig = $$d
break()
}
for (x, exports) {
isEmpty($${d}.libraries.$${x}.result): \
error("Test $$1 refers to unresolved library export '$$u' in '$$d'")
}
return(false)
}
}
}
isEmpty(libConfig) {
nu = $$upper($$u)
libs = $$eval(QMAKE_LIBS_$$nu) $$eval(QMAKE_LIBS_$${nu}_DEBUG) $$eval(QMAKE_LIBS_$${nu}_RELEASE)
defines = $$eval(QMAKE_DEFINES_$${nu})
includes = $$eval(QMAKE_INCDIR_$${nu})
isEmpty(libs):isEmpty(defines):isEmpty(includes): \
!defined(QMAKE_LIBS_$$nu, var): \
error("Test $$1 tries to use undeclared library '$$u'")
# using an external library by exported name.
$${1}.literal_args += $$system_quote(QMAKE_USE += $$u)
} else {
lpfx = $${libConfig}.libraries.$${u}
@ -1252,14 +1373,14 @@ defineTest(qtConfProcessFeatures) {
# reporting
#
QT_CONF_REPORT_PADDING = "........................................"
defineReplace(qtConfPadCols) {
pad = $$num_add($$str_size($$2), -$$str_size($${1}))
lessThan(pad, 0): pad = 0
return("$$1 $$str_member($$2, 0, $$pad) $$3")
}
defineTest(qtConfReportPadded) {
pad = $$num_add($$str_size($$QT_CONF_REPORT_PADDING), -$$str_size($${1}))
lessThan(pad, 0): pad = 0
str = "$$1 $$str_member($$QT_CONF_REPORT_PADDING, 0, $$pad)"
qtConfAddReport("$$str $${2}")
qtConfAddReport($$qtConfPadCols($$1, "........................................", $$2))
}
defineReplace(qtConfCollectFeatures) {
@ -1749,8 +1870,6 @@ for(ever) {
jsonFile = $$thisDir/configure.json
priFile = $$thisDir/configure.pri
allConfigs += $$currentConfig
# load configuration data
configure_data = $$cat($$jsonFile, blob)
!parseJson(configure_data, $$currentConfig): \
@ -1758,25 +1877,88 @@ for(ever) {
exists($$priFile): \
!include($$priFile): error()
# only configs which contain more than just subconfigs are saved for later.
$${currentConfig}._KEYS_ -= subconfigs
!isEmpty($${currentConfig}._KEYS_) {
allConfigs += $$currentConfig
contains($${currentConfig}._KEYS_, libraries) {
qtConfSetupLibraries()
# this ensures that references in QMAKE_LIBRARY_DEPS are unique.
qtConfSetModuleName()
ex = $$eval(config.modules.$${currentModule})
!isEmpty(ex): \
error("Module $$currentModule is claimed by both $$currentConfig and $${ex}.")
config.modules.$${currentModule} = $$currentConfig
}
}
# prepend all subconfigs to files to keep a depth first search order
subconfigs =
for(n, $${currentConfig}.subconfigs._KEYS_) {
subconfig = $$eval($${currentConfig}.subconfigs.$${n})
name = $$basename(subconfig)
ex = $$eval(config.$${name}.dir)
!isEmpty(ex): \
error("Basename clash between $$thisDir/$$subconfig and $${ex}.")
config.$${name}.dir = $$thisDir/$$subconfig
subconfigs += $$name
}
configsToProcess = $$subconfigs $$configsToProcess
}
for (currentConfig, allConfigs): \
qtConfSetupLibraries()
QMAKE_SAVED_ARGS = $$QMAKE_EXTRA_ARGS
QMAKE_REDO_CONFIG = false
qtConfParseCommandLine()
qtConfCheckErrors()
!isEmpty(config.input.list-features) {
all_ft =
for (currentConfig, allConfigs) {
for (k, $${currentConfig}.features._KEYS_) {
pp = $$eval($${currentConfig}.features.$${k}.purpose)
!isEmpty(pp) {
all_ft += $$qtConfPadCols($$k, ".......................", \
$$section(pp, $$escape_expand(\\n), 0, 0))
}
}
}
all_ft = $$sorted(all_ft)
logn()
for (ft, all_ft): \
logn($$ft)
error()
}
!isEmpty(config.input.list-libraries) {
logn()
for (currentConfig, allConfigs) {
!isEmpty($${currentConfig}.exports._KEYS_) {
!isEmpty($${currentConfig}.module): \
logn($$eval($${currentConfig}.module):)
else: \
logn($$section(currentConfig, ., -1):)
all_xp =
for (xport, $${currentConfig}.exports._KEYS_) {
libs = $$eval($${currentConfig}.exports.$$xport)
isEqual($${currentConfig}.libraries.$$first(libs).export, "") { # not isEmpty()!
!isEmpty(config.input.verbose): \
all_xp += "$$xport!"
} else {
out = "$$xport"
!isEmpty(config.input.verbose):!isEqual(xport, $$libs): \
out += "($$libs)"
all_xp += "$$out"
}
}
all_xp = $$sorted(all_xp)
all_xp ~= s,^([^!]*)!$,(\\1),g
for (xp, all_xp): \
logn(" $$xp")
}
}
error()
}
for (currentConfig, allConfigs) {
qtConfSetModuleName()
qtConfSetupModuleOutputs()
@ -1833,11 +2015,15 @@ for (currentConfig, allConfigs) {
# correctly setup dependencies
QMAKE_CONFIG_DEPS = global global_private
QMAKE_LIBRARY_DEPS = $$eval(config.modules.global)
!isEmpty($${currentConfig}.module) {
for (d, $${currentConfig}.depends._KEYS_) {
dep = $$replace($${currentConfig}.depends.$$d, -private$, _private)
dep *= $$replace(dep, _private$, )
gdep = $$replace(dep, _private$, )
dep *= $$gdep
QMAKE_CONFIG_DEPS += $$dep
!isEqual(gdep, $$dep): \ # libraries are in the private module.
QMAKE_LIBRARY_DEPS += $$eval(config.modules.$$gdep)
}
}

View File

@ -42,6 +42,7 @@ THE_TARGET = $$qt5LibraryTarget($$TARGET)
darwin: MODULE_DEBUG_LIBS = -L$$DESTDIR -l$${TARGET}_debug
MODULE_RELEASE_LIBS = -L$$DESTDIR -l$$TARGET
MODULE_PRI_CONT += \
"QMAKE_LIBS_$${ucmodule} =" \ # Needed for the module to be recognized.
"QMAKE_LIBS_$${ucmodule}_DEBUG = $$val_escape(MODULE_DEBUG_LIBS)" \
"QMAKE_LIBS_$${ucmodule}_RELEASE = $$val_escape(MODULE_RELEASE_LIBS)"
} else {

View File

@ -59,7 +59,7 @@ defineReplace(qtExportLibsForModule) {
QMAKE_LIBS_$$NAME QMAKE_LIBS_$${NAME}_DEBUG QMAKE_LIBS_$${NAME}_RELEASE \
QMAKE_DEFINES_$$NAME QMAKE_INCDIR_$$NAME
for (var, vars) {
!isEmpty($$var): \
defined($$var, var): \
result += "$$var = $$val_escape($$var)"
}
}

View File

@ -16,7 +16,7 @@ QMAKE_CFLAGS_APP = -fPIC
QMAKE_CFLAGS_DEPS = -M
QMAKE_CFLAGS_WARN_ON = -w1 -Wall -Wcheck -wd1572,873,2259,2261,3373
QMAKE_CFLAGS_WARN_OFF = -w
QMAKE_CFLAGS_RELEASE = -O2 -ansi-alias -fstrict-aliasing
QMAKE_CFLAGS_RELEASE = -O2
QMAKE_CFLAGS_DEBUG = -O0 -g
QMAKE_CFLAGS_SHLIB = -fPIC
QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB

View File

@ -16,8 +16,8 @@ QMAKE_CFLAGS =
QMAKE_CFLAGS_DEPS = -M
QMAKE_CFLAGS_WARN_ON = -w1 -Wcheck -wd654,1572,411,873,1125,2259,2261,3280,3373
QMAKE_CFLAGS_WARN_OFF = -w
QMAKE_CFLAGS_RELEASE =
QMAKE_CFLAGS_DEBUG = -g
QMAKE_CFLAGS_RELEASE = -O2
QMAKE_CFLAGS_DEBUG = -g -O0
QMAKE_CFLAGS_SHLIB = -fPIC
QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses

View File

@ -276,6 +276,9 @@ public class QtActivityDelegate
if (m_softInputMode != 0) {
m_activity.getWindow().setSoftInputMode(m_softInputMode);
final boolean softInputIsHidden = (m_softInputMode & WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) != 0;
if (softInputIsHidden)
return;
} else {
if (height > visibleHeight)
m_activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

View File

@ -192,6 +192,32 @@ QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func
return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func);
}
#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
template <typename T, typename U>
QtConcurrent::FunctionWrapper1<T, U> createFunctionWrapper(T (*func)(U) noexcept)
{
return QtConcurrent::FunctionWrapper1<T, U>(func);
}
template <typename T, typename C>
QtConcurrent::MemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)() noexcept)
{
return QtConcurrent::MemberFunctionWrapper<T, C>(func);
}
template <typename T, typename C, typename U>
QtConcurrent::MemberFunctionWrapper1<T, C, U> createFunctionWrapper(T (C::*func)(U) noexcept)
{
return QtConcurrent::MemberFunctionWrapper1<T, C, U>(func);
}
template <typename T, typename C>
QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)() const noexcept)
{
return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func);
}
#endif
struct PushBackWrapper
{
typedef void result_type;
@ -231,6 +257,20 @@ struct ReduceResultType<T(C::*)(U)>
typedef C ResultType;
};
#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
template <class U, class V>
struct ReduceResultType<void(*)(U&,V) noexcept>
{
typedef U ResultType;
};
template <class T, class C, class U>
struct ReduceResultType<T(C::*)(U) noexcept>
{
typedef C ResultType;
};
#endif
template <class InputSequence, class MapFunctor>
struct MapResultType
{
@ -249,6 +289,20 @@ struct MapResultType<void, T(C::*)() const>
typedef T ResultType;
};
#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
template <class U, class V>
struct MapResultType<void, U (*)(V) noexcept>
{
typedef U ResultType;
};
template <class T, class C>
struct MapResultType<void, T(C::*)() const noexcept>
{
typedef T ResultType;
};
#endif
#ifndef QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
template <template <typename> class InputSequence, typename MapFunctor, typename T>
@ -269,6 +323,21 @@ struct MapResultType<InputSequence<T>, U(C::*)() const>
typedef InputSequence<U> ResultType;
};
#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
template <template <typename> class InputSequence, class T, class U, class V>
struct MapResultType<InputSequence<T>, U (*)(V) noexcept>
{
typedef InputSequence<U> ResultType;
};
template <template <typename> class InputSequence, class T, class U, class C>
struct MapResultType<InputSequence<T>, U(C::*)() const noexcept>
{
typedef InputSequence<U> ResultType;
};
#endif
#endif // QT_NO_TEMPLATE_TEMPLATE_PARAMETER
template <class MapFunctor>
@ -289,6 +358,21 @@ struct MapResultType<QStringList, U(C::*)() const>
typedef QList<U> ResultType;
};
#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510
template <class U, class V>
struct MapResultType<QStringList, U (*)(V) noexcept>
{
typedef QList<U> ResultType;
};
template <class U, class C>
struct MapResultType<QStringList, U(C::*)() const noexcept>
{
typedef QList<U> ResultType;
};
#endif
} // namespace QtPrivate.
#endif //Q_QDOC

View File

@ -55,6 +55,6 @@ QRect r2(QPoint(100, 200), QSize(11, 16));
//! [1]
QRectF r1(100, 200, 11, 16);
QRectF r2(QPoint(100, 200), QSize(11, 16));
QRectF r1(100.0, 200.1, 11.2, 16.3);
QRectF r2(QPointF(100.0, 200.1), QSizeF(11.2, 16.3));
//! [1]

View File

@ -1,956 +0,0 @@
# Generic entry format
#Feature: UPPERCASENAME (for the #define)
#Description: One sentence description of what this does.
#Section: Categorization
#Requires: UPPERCASENAME...
#Name: CamelCaseName (often a class name)
#SeeAlso: UPPERCASENAME... (currently unused)
# Kernel
Feature: PROPERTIES
Description: Supports scripting Qt-based applications.
Section: Kernel
Requires:
Name: Properties
Feature: TEXTHTMLPARSER
Description: Parser for HTML
Section: Kernel
Requires:
Name: HtmlParser
Feature: TEXTODFWRITER
Description: Provides an ODF writer
Section: Kernel
Requires: XMLSTREAMWRITER
Name: OdfWriter
Feature: CSSPARSER
Description: Parser for Style Sheets
Section: Kernel
Requires:
Name: CssParser
Feature: REGULAREXPRESSION
Description: Perl-compatible regular expression APIs
Section: Kernel
Requires:
Name: QRegularExpression
Feature: CONCURRENT
Description: Provides a high-level multi-threaded APIs
Section: Kernel
Requires:
Name: QtConcurrent
Feature: DRAGANDDROP
Description: Supports the drag and drop mechansim.
Section: Kernel
Requires: IMAGEFORMAT_XPM
Name: Drag and drop
Feature: SESSIONMANAGER
Description: Supports session management.
Section: Kernel
Requires:
Name: Session Manager
Feature: SHORTCUT
Description: Supports keyboard accelerators and shortcuts.
Section: Kernel
Requires:
Name: QShortcut
Feature: ACTION
Description: Supports widget actions.
Section: Kernel
Requires:
Name: QAction
Feature: CURSOR
Description: Supports mouse cursors.
Section: Kernel
Requires:
Name: QCursor
Feature: CLIPBOARD
Description: Supports cut and paste operations.
Section: Kernel
Requires:
Name: QClipboard
Feature: WHEELEVENT
Description: Supports wheel events.
Section: Kernel
Requires:
Name: QWheelEvent
Feature: TABLETEVENT
Description: Supports tablet events.
Section: Kernel
Requires:
Name: QTabletEvent
Feature: EFFECTS
Description: Supports special widget effects (e.g. fading and scrolling).
Section: Kernel
Requires:
Name: Effects
Feature: SHAREDMEMORY
Description: Provides access to a shared memory segment.
Section: Kernel
Requires:
Name: QSharedMemory
Feature: SYSTEMSEMAPHORE
Description: Provides a general counting system semaphore.
Section: Kernel
Requires: SHAREDMEMORY
Name: QSystemSemaphore
Feature: XMLSTREAM
Description: Provides a simple streaming API for XML.
Section: Kernel
Requires:
Name: XML Streaming APIs
Feature: XMLSTREAMREADER
Description: Provides a well-formed XML parser with a simple streaming API.
Section: Kernel
Requires: XMLSTREAM
Name: QXmlStreamReader
Feature: XMLSTREAMWRITER
Description: Provides a XML writer with a simple streaming API.
Section: Kernel
Requires: XMLSTREAM
Name: QXmlStreamWriter
Feature: IM
Description: Inputmethods with QInputContext
Section: Kernel
Requires: LIBRARY
Name: QInputContext
# Data structures
Feature: TEXTDATE
Description: Supports month and day names in dates.
Section: Data structures
Requires:
Name: Text Date
Feature: DATESTRING
Description: Supports convertion between dates and strings.
Section: Data structures
Requires: TEXTDATE
Name: QDate/QTime/QDateTime
# File I/O
Feature: PROCESS
Description: Supports external process invocation.
Section: File I/O
Requires:
Name: QProcess
Feature: TEMPORARYFILE
Description: Provides an I/O device that operates on temporary files.
Section: File I/O
Requires:
Name: QTemporaryFile
Feature: LIBRARY
Description: Supports a shared library wrapper.
Section: File I/O
Requires:
Name: QLibrary
Feature: SETTINGS
Description: Supports persistent application settings.
Section: File I/O
Requires:
Name: QSettings
Feature: DOM
Description: Supports the Document Object Model.
Section: File I/O
Requires:
Name: Document Object Model
Feature: FILESYSTEMMODEL
Description: Provides a data model for the local filesystem.
Section: File I/O
Requires:
Name: QFileSystemModel
Feature: FILESYSTEMWATCHER
Description: Provides an interface for monitoring files and directories for modications.
Section: File I/O
Requires:
Name: QFileSystemWatcher
Feature: FILESYSTEMITERATOR
Description: Provides fast file-system iteration.
Section: File I/O
Requires:
Name: QFileSystemIterator
# Widgets
Feature: TREEWIDGET
Description: Supports views using tree models.
Section: Widgets
Requires: TREEVIEW
Name: QTreeWidget
Feature: LISTWIDGET
Description: Supports item-based list widgets.
Section: Widgets
Requires: LISTVIEW
Name: QListWidget
Feature: TABLEWIDGET
Description: Supports item-based table views.
Section: Widgets
Requires: TABLEVIEW
Name: QTableWidget
Feature: DATETIMEEDIT
Description: Supports editing dates and times.
Section: Widgets
Requires: CALENDARWIDGET DATESTRING
Name: QDateTimeEdit
Feature: STACKEDWIDGET
Description: Supports stacked widgets.
Section: Widgets
Requires:
Name: QStackedWidget
Feature: TEXTBROWSER
Description: Supports HTML document browsing.
Section: Widgets
Requires: TEXTEDIT
Name: QTextBrowser
Feature: SPLASHSCREEN
Description: Supports splash screens that can be shown during application startup.
Section: Widgets
Requires:
Name: Splash screen widget
Feature: SPLITTER
Description: Supports user controlled splitter widgets.
Section: Widgets
Requires: RUBBERBAND
Name: QSplitter
Feature: LCDNUMBER
Description: Supports LCD-like digits.
Section: Widgets
Requires:
Name: QLCDNumber
Feature: MENU
Description: Supports popup-menus.
Section: Widgets
Requires: ACTION
Name: QMenu
Feature: LINEEDIT
Description: Supports single-line edits.
Section: Widgets
Requires:
Name: QLineEdit
Feature: SPINBOX
Description: Supports spin boxes handling integers and discrete sets of values.
Section: Widgets
Requires: SPINWIDGET LINEEDIT VALIDATOR
Name: QSpinBox
Feature: TABBAR
Description: Supports tab bars, e.g. for use in tabbed dialogs.
Section: Widgets
Requires: TOOLBUTTON
Name: QTabBar
Feature: TABWIDGET
Description: Supports stacking tabbed widgets.
Section: Widgets
Requires: TABBAR STACKEDWIDGET
Name: QTabWidget
Feature: COMBOBOX
Description: Supports comboboxes presenting a list of options to the user.
Section: Widgets
Requires: LINEEDIT STANDARDITEMMODEL LISTVIEW
Name: QComboBox
Feature: FONTCOMBOBOX
Description: Supports a combobox that lets the user select a font family.
Section: Widgets
Requires: COMBOBOX STRINGLISTMODEL
Name: QFontComboBox
Feature: TOOLBUTTON
Description: Supports quick-access buttons to commands and options.
Section: Widgets
Requires: ACTION
Name: QToolButton
Feature: TOOLBAR
Description: Supports movable panels containing a set of controls.
Section: Widgets
Requires: MAINWINDOW
Name: QToolBar
Feature: TOOLBOX
Description: Supports columns of tabbed widget items.
Section: Widgets
Requires: TOOLBUTTON SCROLLAREA
Name: QToolBox
Feature: GROUPBOX
Description: Supports group box frames.
Section: Widgets
Requires:
Name: QGroupBox
Feature: BUTTONGROUP
Description: Supports organizing groups of button widgets.
Section: Widgets
Requires: GROUPBOX
Name: QButtonGroup
Feature: MAINWINDOW
Description: Supports main application windows.
Section: Widgets
Requires: MENU RESIZEHANDLER TOOLBUTTON
Name: QMainWindow
Feature: DOCKWIDGET
Description: Supports docking widgets inside a QMainWindow or floated as a top-level window on the desktop.
Section: Widgets
Requires: RUBBERBAND MAINWINDOW
Name: QDockwidget
Feature: MDIAREA
Description: Provides an area in which MDI windows are displayed.
Section: Widgets
Requires: SCROLLAREA
Name: QMdiArea
Feature: RESIZEHANDLER
Description: Supports an internal resize handler.
Section: Widgets
Requires:
Name: Resize Handler
Feature: STATUSBAR
Description: Supports presentation of status information.
Section: Widgets
Requires:
Name: QStatusBar
Feature: MENUBAR
Description: Supports pull-down menu items.
Section: Widgets
Requires: MENU TOOLBUTTON
Name: QMenuBar
Feature: CONTEXTMENU
Description: Supports pop-up menus on right mouse click
Section: Widgets
Requires: MENU
Name: Context menu
Feature: PROGRESSBAR
Description: Supports presentation of operation progress.
Section: Widgets
Requires:
Name: QProgressBar
Feature: SLIDER
Description: Supports sliders controlling a bounded value.
Section: Widgets
Requires:
Name: QSlider
Feature: SCROLLBAR
Description: Supports scrollbars allowing the user access parts of a document that is larger than the widget used to display it.
Section: Widgets
Requires: SLIDER
Name: QScrollBar
Feature: DIAL
Description: Supports rounded range control, e.g. like a speedometer.
Section: Widgets
Requires: SLIDER
Name: QDial
Feature: SCROLLAREA
Description: Supports scrolling views onto widgets.
Section: Widgets
Requires: SCROLLBAR
Name: QScrollArea
Feature: GRAPHICSVIEW
Description: Supports the graphicsview classes.
Section: Widgets
Requires: SCROLLAREA
Name: QGraphicsView
Feature: GRAPHICSEFFECT
Description: Supports the graphicseffect classes.
Section: Widgets
Requires: GRAPHICSVIEW
Name: QGraphicsEffect
Feature: SPINWIDGET
Description: Supports spinbox control widgets.
Section: Widgets
Requires:
Name: Spin Widget
Feature: TEXTEDIT
Description: Supports rich text editing.
Section: Widgets
Requires: SCROLLAREA PROPERTIES
Name: QTextEdit
Feature: SYNTAXHIGHLIGHTER
Description: Supports custom syntax highlighting.
Section: Widgets
Requires: TEXTEDIT
Name: QSyntaxHighlighter
Feature: RUBBERBAND
Description: Supports using rubberbands to indicate selections and boundaries.
Section: Widgets
Requires:
Name: QRubberBand
Feature: TOOLTIP
Description: Supports presentation of tooltips.
Section: Widgets
Requires:
Name: QToolTip
Feature: STATUSTIP
Description: Supports status tip functionality and events.
Section: Widgets
Requires:
Name: Status Tip
Feature: WHATSTHIS
Description: Supports displaying "What's this" help.
Section: Widgets
Requires: TOOLBUTTON
Name: QWhatsThis
Feature: VALIDATOR
Description: Supports validation of input text.
Section: Widgets
Requires:
Name: QValidator
Feature: SIZEGRIP
Description: Supports corner-grips for resizing a top-level windows.
Section: Widgets
Requires:
Name: QSizeGrip
Feature: CALENDARWIDGET
Description: Provides a monthly based calendar widget allowing the user to select a date.
Section: Widgets
Requires: TABLEVIEW MENU TEXTDATE SPINBOX TOOLBUTTON
Name: QCalendarWidget
Feature: PRINTPREVIEWWIDGET
Description: Provides a widget for previewing page layouts for printer output.
Section: Widgets
Requires: GRAPHICSVIEW PRINTER MAINWINDOW
Name: QPrintPreviewWidget
Feature: KEYSEQUENCEEDIT
Description: Provides a widget for editing QKeySequences
Section: Widgets
Requires: LINEEDIT SHORTCUT
Name: QKeySequenceEdit
# Dialogs
Feature: MESSAGEBOX
Description: Supports message boxes displaying
informative messages and simple questions.
Section: Dialogs
Requires:
Name: QMessageBox
Feature: COLORDIALOG
Description: Supports a dialog widget for specifying colors.
Section: Dialogs
Requires: SPINBOX
Name: QColorDialog
Feature: FILEDIALOG
Description: Supports a dialog widget for selecting files or directories.
Section: Dialogs
Requires: FILESYSTEMMODEL TREEVIEW COMBOBOX TOOLBUTTON BUTTONGROUP TOOLTIP SPLITTER STACKEDWIDGET PROXYMODEL
Name: QFileDialog
Feature: FONTDIALOG
Description: Supports a dialog widget for selecting fonts.
Section: Dialogs
Requires: STRINGLISTMODEL COMBOBOX VALIDATOR GROUPBOX
Name: QFontDialog
Feature: PRINTDIALOG
Description: Supports a dialog widget for specifying printer configuration.
Section: Dialogs
Requires: PRINTER COMBOBOX BUTTONGROUP SPINBOX TABWIDGET
Name: QPrintDialog
Feature: PRINTPREVIEWDIALOG
Description: Provides a dialog for previewing and configuring page layouts for printer output.
Section: Dialogs
Requires: PRINTPREVIEWWIDGET PRINTDIALOG TOOLBAR
Name: QPrintPreviewDialog
Feature: PROGRESSDIALOG
Description: Supports feedback on the progress of a slow operation.
Section: Dialogs
Requires: PROGRESSBAR
Name: QProgressDialog
Feature: INPUTDIALOG
Description: Supports a simple convenience dialog to get a single value from the user.
Section: Dialogs
Requires: COMBOBOX SPINBOX STACKEDWIDGET
Name: QInputDialog
Feature: ERRORMESSAGE
Description: Supports an error message display dialog.
Section: Dialogs
Requires: TEXTEDIT
Name: QErrorMessage
Feature: WIZARD
Description: Provides a framework for wizards.
Section: Dialogs
Requires: PROPERTIES
Name: QWizard
# ItemViews
Feature: ITEMVIEWS
Description: Supports the model/view architecture managing the relationship between data and the way it is presented to the user.
Section: ItemViews
Requires: RUBBERBAND SCROLLAREA
Name: The Model/View Framework
Feature: DIRMODEL
Description: Supports a data model for the local filesystem.
Section: ItemViews
Requires: ITEMVIEWS FILESYSTEMMODEL
Name: QDirModel
Feature: STANDARDITEMMODEL
Description: Supports a generic model for storing custom data.
Section: ItemViews
Requires: ITEMVIEWS
Name: QStandardItemModel
Feature: PROXYMODEL
Description: Supports processing of data passed between another model and a view.
Section: ItemViews
Requires: ITEMVIEWS
Name: QAbstractProxyModel
Feature: SORTFILTERPROXYMODEL
Description: Supports sorting and filtering of data passed between another model and a view.
Section: ItemViews
Requires: PROXYMODEL
Name: QSortFilterProxyModel
Feature: IDENTITYPROXYMODEL
Description: Supports proxying a source model unmodified.
Section: ItemViews
Requires: PROXYMODEL
Name: QIdentityProxyModel
Feature: STRINGLISTMODEL
Description: Supports a model that supplies strings to views.
Section: ItemViews
Requires: ITEMVIEWS
Name: QStringListModel
Feature: LISTVIEW
Description: Supports a list or icon view onto a model.
Section: ItemViews
Requires: ITEMVIEWS
Name: QListView
Feature: TABLEVIEW
Description: Supports a default model/view implementation of a table view.
Section: ItemViews
Requires: ITEMVIEWS
Name: QTableView
Feature: TREEVIEW
Description: Supports a default model/view implementation of a tree view.
Section: ItemViews
Requires: ITEMVIEWS
Name: QTreeView
Feature: DATAWIDGETMAPPER
Description: Provides mapping between a section of a data model to widgets.
Section: ItemViews
Requires: ITEMVIEWS PROPERTIES
Name: QDataWidgetMapper
Feature: COLUMNVIEW
Description: Provides a model/view implementation of a column view.
Section: ItemViews
Requires: LISTVIEW
Name: QColumnView
# Styles
Feature: STYLE_WINDOWS
Description: Supports a Microsoft Windows-like look and feel.
Section: Styles
Requires:
Name: QWindowsStyle
Feature: STYLE_FUSION
Description: Supports a modern platform independent widget style.
Section: Styles
Requires: IMAGEFORMAT_XPM
Name: QFusionStyle
Feature: STYLE_WINDOWSXP
Description: Supports a Microsoft WindowsXP-like look and feel.
Section: Styles
Requires: STYLE_WINDOWS
Name: QWindowsXPStyle
Feature: STYLE_WINDOWSVISTA
Description: Supports a Microsoft WindowsVista-like look and feel.
Section: Styles
Requires: STYLE_WINDOWSXP
Name: QWindowsVistaStyle
Feature: STYLE_WINDOWSCE
Description: WindowsCE look and feel
Section: Styles
Requires: STYLE_WINDOWS IMAGEFORMAT_XPM
Name: QWindowsCEStyle
Feature: STYLE_WINDOWSMOBILE
Description: WindowsMobile look and feel
Section: Styles
Requires: STYLE_WINDOWS IMAGEFORMAT_XPM
Name: QWindowsMobileStyle
Feature: STYLE_STYLESHEET
Description:
Section: Styles
Requires: STYLE_WINDOWS PROPERTIES CSSPARSER
Name: QStyleSheetStyle
# Images
Feature: IMAGEFORMATPLUGIN
Description: Supports writing an image format plugin.
Section: Images
Requires: LIBRARY
Name: QImageIOPlugin
Feature: MOVIE
Description: Supports animated images.
Section: Images
Requires:
Name: QMovie
Feature: IMAGEFORMAT_BMP
Description: Supports Microsoft's Bitmap image file format.
Section: Images
Requires:
Name: BMP Image Format
Feature: IMAGEFORMAT_PPM
Description: Supports the Portable Pixmap image file format.
Section: Images
Requires:
Name: PPM Image Format
Feature: IMAGEFORMAT_XBM
Description: Supports the X11 Bitmap image file format.
Section: Images
Requires:
Name: XBM Image Format
Feature: IMAGEFORMAT_XPM
Description: Supports the X11 Pixmap image file format.
Section: Images
Requires:
Name: XPM Image Format
Feature: IMAGEFORMAT_PNG
Description: Supports the Portable Network Graphics image file format.
Section: Images
Requires:
Name: PNG Image Format
Feature: IMAGEFORMAT_JPEG
Description: Supports the Joint Photographic Experts Group image file format.
Section: Images
Requires:
Name: JPEG Image Format
Feature: IMAGE_HEURISTIC_MASK
Description: Supports creating a 1-bpp heuristic mask for images.
Section: Images
Requires:
Name: QImage::createHeuristicMask()
Feature: IMAGE_TEXT
Description: Supports image file text strings.
Section: Images
Requires:
Name: Image Text
# Painting
Feature: PICTURE
Description: Supports recording and replaying QPainter commands.
Section: Painting
Requires:
Name: QPicture
Feature: COLORNAMES
Description: Supports color names such as "red", used by QColor and by some HTML documents.
Section: Painting
Requires:
Name: Color Names
Feature: PDF
Description: Supports pdf format
Section: Painting
Requires: TEMPORARYFILE
Name: QPdf
Feature: PRINTER
Description: Supports printing
Section: Painting
Requires: PICTURE TEMPORARYFILE PDF
Name: QPrinter
Feature: CUPS
Description Supports the Common UNIX Printing System
Section: Painting
Requires: PRINTER LIBRARY
Name: Common UNIX Printing System
Feature: PAINT_DEBUG
Description: Debug painting with the environment variables QT_FLUSH_UPDATE and QT_FLUSH_PAINT
Section: Painting
Requires:
Name: Painting Debug Utilities
# Fonts
Feature: FREETYPE
Description: Supports the FreeType 2 font engine (and its supported font formats).
Section: Fonts
Requires:
Name: Freetype Font Engine
# Internationalization
Feature: TRANSLATION
Description: Supports translations using QObject::tr().
Section: Internationalization
Requires:
Name: Translation
Feature: TEXTCODEC
Description: Supports conversions between text encodings.
Section: Internationalization
Requires:
Name: QTextCodec
Feature: CODECS
Description: Supports non-unicode text conversions.
Section: Internationalization
Requires: TEXTCODEC
Name: Codecs
Feature: BIG_CODECS
Description: Supports big codecs, e.g. CJK.
Section: Internationalization
Requires: TEXTCODEC
Name: Big Codecs
Feature: ICONV
Description: Supports conversions between text encodings using iconv.
Section: Internationalization
Requires: TEXTCODEC
Name: iconv
# Networking
Feature: FTP
Description: Supports FTP file access.
Section: Networking
Requires: TEXTDATE
Name: File Transfer Protocol
Feature: HTTP
Description: Supports HTTP file access.
Section: Networking
Requires:
Name: Hyper Text Transfer Protocol
Feature: UDPSOCKET
Description: Supports User Datagram Protocol sockets.
Section: Networking
Requires:
Name: QUdpSocket
Feature: NETWORKPROXY
Description: Supports configuring network layer proxy support to the Qt network classes.
Section: Networking
Requires:
Name: QNetworkProxy
Feature: SOCKS5
Description: Supports SOCKS v5 network proxy.
Section: Networking
Requires: NETWORKPROXY
Name: SOCKS5
Feature: NETWORKINTERFACE
Description: Supports listing the host's IP addresses and network interfaces
Section: Networking
Requires:
Name: QNetworkInterface
Feature: NETWORKDISKCACHE
Description: Supports a disk cache for network resources
Section: Networking
Requires: TEMPORARYFILE
Name: QNetworkDiskCache
Feature: BEARERMANAGEMENT
Description: Provides bearer management support
Section: Networking
Requires: LIBRARY NETWORKINTERFACE PROPERTIES
Name: Bearer Management
Feature: LOCALSERVER
Description: Supports a local socket based server
Section: Networking
Requires: TEMPORARYFILE
Name: QLocalServer
# Utilities
Feature: COMPLETER
Description: Provides completions based on an item model.
Section: Utilities
Requires: PROXYMODEL
Name: QCompleter
Feature: FSCOMPLETER
Description: Provides completions based on an item model.
Section: Utilities
Requires: FILESYSTEMMODEL COMPLETER
Name: QCompleter
Feature: DESKTOPSERVICES
Description: Provides methods for accessing common desktop services.
Section: Utilities
Requires:
Name: QDesktopServices
Feature: MIMETYPE
Description: Describes types of file or data, represented by a MIME type string.
Section: Utilities
Requires:
Name: QMimeType
Feature: SYSTEMTRAYICON
Description: Provides an icon for an application in the system tray.
Section: Utilities
Requires:
Name: QSystemTrayIcon
Feature: UNDOCOMMAND
Description: Applies (redo or) undo of a single change in a document.
Section: Utilities
Requires:
Name: QUndoCommand
Feature: UNDOSTACK
Description: Provides the ability to (redo or) undo a list of changes in a document.
Section: Utilities
Requires: UNDOCOMMAND
Name: QUndoStack
Feature: UNDOGROUP
Description:
Section: Utilities
Requires: UNDOSTACK
Name: QUndoGroup
Feature: UNDOVIEW
Description: A widget which shows the contents of an undo stack.
Section: Utilities
Requires: UNDOSTACK LISTVIEW
Name: QUndoView
Feature: ACCESSIBILITY
Description: Provides accessibility support.
Section: Utilities
Requires: PROPERTIES MENUBAR
Name: Accessibility
Feature: ANIMATION
Description: Provides a framework for animations.
Section: Utilities
Requires: PROPERTIES
Name: Animation
Feature: STATEMACHINE
Description: Provides hierarchical finite state machines.
Section: Utilities
Requires: PROPERTIES
Name: State machine
Feature: GESTURES
Description: Provides a framework for gestures.
Section: Utilities
Requires:
Name: Gesture
# D-Bus
Feature: DBUS
Description: Provides classes for D-Bus.
Section: D-Bus
Requires: PROPERTIES XMLSTREAMREADER
Name: Qt D-Bus module
# XML Patterns
Feature: XMLSCHEMA
Description: Provides XML schema validation.
Section: Xml Patterns
Requires:
Name: XML Schema APIs

View File

@ -553,45 +553,75 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
return data.hasFlags(what);
}
// Note: if \a shouldMkdirFirst is false, we assume the caller did try to mkdir
// before calling this function.
static bool createDirectoryWithParents(const QByteArray &nativeName, bool shouldMkdirFirst = true)
{
// helper function to check if a given path is a directory, since mkdir can
// fail if the dir already exists (it may have been created by another
// thread or another process)
const auto isDir = [](const QByteArray &nativeName) {
QT_STATBUF st;
return QT_STAT(nativeName.constData(), &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR;
};
if (shouldMkdirFirst && QT_MKDIR(nativeName, 0777) == 0)
return true;
if (errno == EEXIST)
return isDir(nativeName);
if (errno != ENOENT)
return false;
// mkdir failed because the parent dir doesn't exist, so try to create it
int slash = nativeName.lastIndexOf('/');
if (slash < 1)
return false;
QByteArray parentNativeName = nativeName.left(slash);
if (!createDirectoryWithParents(parentNativeName))
return false;
// try again
if (QT_MKDIR(nativeName, 0777) == 0)
return true;
return errno == EEXIST && isDir(nativeName);
}
//static
bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents)
{
QString dirName = entry.filePath();
if (createParents) {
dirName = QDir::cleanPath(dirName);
for (int oldslash = -1, slash=0; slash != -1; oldslash = slash) {
slash = dirName.indexOf(QDir::separator(), oldslash+1);
if (slash == -1) {
if (oldslash == dirName.length())
break;
slash = dirName.length();
}
if (slash) {
const QByteArray chunk = QFile::encodeName(dirName.left(slash));
if (QT_MKDIR(chunk.constData(), 0777) != 0) {
if (errno == EEXIST
#if defined(Q_OS_QNX)
// On QNX the QNet (VFS paths of other hosts mounted under a directory
// such as /net) mountpoint returns ENOENT, despite existing. stat()
// on the QNet mountpoint returns successfully and reports S_IFDIR.
|| errno == ENOENT
#endif
) {
QT_STATBUF st;
if (QT_STAT(chunk.constData(), &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR)
continue;
}
return false;
}
}
}
return true;
}
#if defined(Q_OS_DARWIN) // Mac X doesn't support trailing /'s
if (dirName.endsWith(QLatin1Char('/')))
// Darwin doesn't support trailing /'s, so remove for everyone
while (dirName.size() > 1 && dirName.endsWith(QLatin1Char('/')))
dirName.chop(1);
#endif
return (QT_MKDIR(QFile::encodeName(dirName).constData(), 0777) == 0);
// try to mkdir this directory
QByteArray nativeName = QFile::encodeName(dirName);
if (QT_MKDIR(nativeName, 0777) == 0)
return true;
if (!createParents)
return false;
// we need the cleaned path in order to create the parents
// and we save errno just in case encodeName needs to load codecs
int savedErrno = errno;
bool pathChanged;
{
QString cleanName = QDir::cleanPath(dirName);
// Check if the cleaned name is the same or not. If we were given a
// path with resolvable "../" sections, cleanPath will remove them, but
// this may change the target dir if one of those segments was a
// symlink. This operation depends on cleanPath's optimization of
// returning the original string if it didn't modify anything.
pathChanged = !dirName.isSharedWith(cleanName);
if (pathChanged)
nativeName = QFile::encodeName(cleanName);
}
errno = savedErrno;
return createDirectoryWithParents(nativeName, pathChanged);
}
//static

View File

@ -276,10 +276,11 @@ static QVector<QLoggingRule> loadRulesFromFile(const QString &filePath)
*/
void QLoggingRegistry::init()
{
QVector<QLoggingRule> er, qr, cr;
// get rules from environment
const QByteArray rulesFilePath = qgetenv("QT_LOGGING_CONF");
if (!rulesFilePath.isEmpty())
envRules = loadRulesFromFile(QFile::decodeName(rulesFilePath));
er = loadRulesFromFile(QFile::decodeName(rulesFilePath));
const QByteArray rulesSrc = qgetenv("QT_LOGGING_RULES").replace(';', '\n');
if (!rulesSrc.isEmpty()) {
@ -287,7 +288,7 @@ void QLoggingRegistry::init()
QLoggingSettingsParser parser;
parser.setSection(QStringLiteral("Rules"));
parser.setContent(stream);
envRules += parser.rules();
er += parser.rules();
}
const QString configFileName = QStringLiteral("qtlogging.ini");
@ -296,17 +297,22 @@ void QLoggingRegistry::init()
// get rules from Qt data configuration path
const QString qtConfigPath
= QDir(QLibraryInfo::location(QLibraryInfo::DataPath)).absoluteFilePath(configFileName);
qtConfigRules = loadRulesFromFile(qtConfigPath);
qr = loadRulesFromFile(qtConfigPath);
#endif
// get rules from user's/system configuration
const QString envPath = QStandardPaths::locate(QStandardPaths::GenericConfigLocation,
QString::fromLatin1("QtProject/") + configFileName);
if (!envPath.isEmpty())
configRules = loadRulesFromFile(envPath);
cr = loadRulesFromFile(envPath);
const QMutexLocker locker(&registryMutex);
envRules = std::move(er);
qtConfigRules = std::move(qr);
configRules = std::move(cr);
if (!envRules.isEmpty() || !qtConfigRules.isEmpty() || !configRules.isEmpty()) {
QMutexLocker locker(&registryMutex);
updateRules();
}
}
@ -347,11 +353,11 @@ void QLoggingRegistry::setApiRules(const QString &content)
parser.setSection(QStringLiteral("Rules"));
parser.setContent(content);
QMutexLocker locker(&registryMutex);
if (qtLoggingDebug())
debugMsg("Loading logging rules set by QLoggingCategory::setFilterRules ...");
const QMutexLocker locker(&registryMutex);
apiRules = parser.rules();
updateRules();
@ -405,6 +411,8 @@ QLoggingRegistry *QLoggingRegistry::instance()
/*!
\internal
Updates category settings according to rules.
As a category filter, it is run with registryMutex held.
*/
void QLoggingRegistry::defaultCategoryFilter(QLoggingCategory *cat)
{

View File

@ -129,6 +129,7 @@ private:
QMutex registryMutex;
// protected by mutex:
QVector<QLoggingRule> qtConfigRules;
QVector<QLoggingRule> configRules;
QVector<QLoggingRule> envRules;

View File

@ -844,7 +844,8 @@ static bool startDetachedUacPrompt(const QString &programIn, const QStringList &
SHELLEXECUTEINFOW shellExecuteExInfo;
memset(&shellExecuteExInfo, 0, sizeof(SHELLEXECUTEINFOW));
shellExecuteExInfo.cbSize = sizeof(SHELLEXECUTEINFOW);
shellExecuteExInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_UNICODE | SEE_MASK_FLAG_NO_UI;
shellExecuteExInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_UNICODE | SEE_MASK_FLAG_NO_UI | SEE_MASK_CLASSNAME;
shellExecuteExInfo.lpClass = L"exefile";
shellExecuteExInfo.lpVerb = L"runas";
const QString program = QDir::toNativeSeparators(programIn);
shellExecuteExInfo.lpFile = reinterpret_cast<LPCWSTR>(program.utf16());

View File

@ -4169,10 +4169,10 @@ QUrl QUrl::fromUserInput(const QString &userInput, const QString &workingDirecto
return url;
}
QUrl url = QUrl(trimmedString, QUrl::TolerantMode);
QUrl url = QUrl(userInput, QUrl::TolerantMode);
// Check both QUrl::isRelative (to detect full URLs) and QDir::isAbsolutePath (since on Windows drive letters can be interpreted as schemes)
if (url.isRelative() && !QDir::isAbsolutePath(trimmedString)) {
QFileInfo fileInfo(QDir(workingDirectory), trimmedString);
if (url.isRelative() && !QDir::isAbsolutePath(userInput)) {
QFileInfo fileInfo(QDir(workingDirectory), userInput);
if ((options & AssumeLocalFile) || fileInfo.exists())
return QUrl::fromLocalFile(fileInfo.absoluteFilePath());
}

View File

@ -44,7 +44,6 @@
#include <QtCore/qthread.h>
#include <QtCore/private/qcoreapplication_p.h>
#include <QtCore/private/qcore_unix_p.h>
#include <QtCore/private/qcore_mac_p.h>
#include <QtCore/private/qthread_p.h>
#include <limits>
@ -59,11 +58,13 @@
QT_USE_NAMESPACE
@interface RunLoopModeTracker : NSObject {
@interface QT_MANGLE_NAMESPACE(RunLoopModeTracker) : NSObject {
QStack<CFStringRef> m_runLoopModes;
}
@end
QT_NAMESPACE_ALIAS_OBJC_CLASS(RunLoopModeTracker);
@implementation RunLoopModeTracker
- (id) init

View File

@ -90,14 +90,11 @@
#include <QtCore/qabstracteventdispatcher.h>
#include <QtCore/private/qtimerinfo_unix_p.h>
#include <QtCore/private/qcfsocketnotifier_p.h>
#include <QtCore/private/qcore_mac_p.h>
#include <QtCore/qdebug.h>
#include <CoreFoundation/CoreFoundation.h>
#ifdef __OBJC__
@class RunLoopModeTracker;
#else
typedef struct objc_object RunLoopModeTracker;
#endif
Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(RunLoopModeTracker));
QT_BEGIN_NAMESPACE
@ -253,7 +250,7 @@ private:
RunLoopSource<> m_postedEventsRunLoopSource;
RunLoopObserver<> m_runLoopActivityObserver;
RunLoopModeTracker *m_runLoopModeTracker;
QT_MANGLE_NAMESPACE(RunLoopModeTracker) *m_runLoopModeTracker;
QTimerInfoList m_timerInfoList;
CFRunLoopTimerRef m_runLoopTimer;

View File

@ -296,12 +296,15 @@ QMimeGlobMatchResult QMimeBinaryProvider::findByFileName(const QString &fileName
const QString lowerFileName = fileName.toLower();
// TODO this parses in the order (local, global). Check that it handles "NOGLOBS" correctly.
for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) {
// Check literals (e.g. "Makefile")
matchGlobList(result, cacheFile, cacheFile->getUint32(PosLiteralListOffset), fileName);
// Check complex globs (e.g. "callgrind.out[0-9]*")
matchGlobList(result, cacheFile, cacheFile->getUint32(PosGlobListOffset), fileName);
// Check the very common *.txt cases with the suffix tree
const int reverseSuffixTreeOffset = cacheFile->getUint32(PosReverseSuffixTreeOffset);
const int numRoots = cacheFile->getUint32(reverseSuffixTreeOffset);
const int firstRootOffset = cacheFile->getUint32(reverseSuffixTreeOffset + 4);
matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, lowerFileName, fileName.length() - 1, false);
matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, lowerFileName, lowerFileName.length() - 1, false);
if (result.m_matchingMimeTypes.isEmpty())
matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, fileName, fileName.length() - 1, true);
}

View File

@ -57,11 +57,22 @@
#include "QtCore/qobject.h"
#include "QtCore/qstringlist.h"
#include "QtCore/qjsonobject.h"
#include "QtCore/qjsondocument.h"
#include "QtCore/qmap.h"
#include "QtCore/qendian.h"
#include "private/qlibrary_p.h"
QT_BEGIN_NAMESPACE
inline QJsonDocument qJsonFromRawLibraryMetaData(const char *raw)
{
raw += strlen("QTMETADATA ");
// the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h),
// but doesn't include the size of the header (8 bytes)
QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8);
return QJsonDocument::fromBinaryData(json);
}
class QFactoryLoaderPrivate;
class Q_CORE_EXPORT QFactoryLoader : public QObject
{

View File

@ -42,6 +42,7 @@
#ifndef QT_NO_LIBRARY
#include "qfactoryloader_p.h"
#include "qlibrary_p.h"
#include <qstringlist.h>
#include <qfile.h>

View File

@ -58,25 +58,12 @@
#include "QtCore/qstringlist.h"
#include "QtCore/qplugin.h"
#include "QtCore/qsharedpointer.h"
#include "QtCore/qjsonobject.h"
#include "QtCore/qjsondocument.h"
#include "QtCore/qendian.h"
#ifdef Q_OS_WIN
# include "QtCore/qt_windows.h"
#endif
QT_BEGIN_NAMESPACE
// Needed also in case of QT_NO_LIBRARY, for static plugin loading.
inline QJsonDocument qJsonFromRawLibraryMetaData(const char *raw)
{
raw += strlen("QTMETADATA ");
// the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h),
// but doesn't include the size of the header (8 bytes)
QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8);
return QJsonDocument::fromBinaryData(json);
}
#ifndef QT_NO_LIBRARY

View File

@ -43,7 +43,7 @@
#include "qcoreapplication.h"
#include "qpluginloader.h"
#include <qfileinfo.h>
#include "qlibrary_p.h"
#include "qfactoryloader_p.h"
#include "qdebug.h"
#include "qdir.h"

View File

@ -392,13 +392,13 @@ bool QReadWriteLock::tryLockForWrite(int timeout)
*/
void QReadWriteLock::unlock()
{
QReadWriteLockPrivate *d = d_ptr.load();
QReadWriteLockPrivate *d = d_ptr.loadAcquire();
while (true) {
Q_ASSERT_X(d, "QReadWriteLock::unlock()", "Cannot unlock an unlocked lock");
// Fast case: no contention: (no waiters, no other readers)
if (quintptr(d) <= 2) { // 1 or 2 (StateLockedForRead or StateLockedForWrite)
if (!d_ptr.testAndSetRelease(d, nullptr, d))
if (!d_ptr.testAndSetOrdered(d, nullptr, d))
continue;
return;
}
@ -407,7 +407,7 @@ void QReadWriteLock::unlock()
Q_ASSERT(quintptr(d) > (1U<<4)); //otherwise that would be the fast case
// Just decrease the reader's count.
auto val = reinterpret_cast<QReadWriteLockPrivate *>(quintptr(d) - (1U<<4));
if (!d_ptr.testAndSetRelease(d, val, d))
if (!d_ptr.testAndSetOrdered(d, val, d))
continue;
return;
}

View File

@ -237,7 +237,7 @@ inline int QFreeList<T, ConstantsType>::next()
int id, newid, at;
ElementType *v;
do {
id = _next.load();
id = _next.loadAcquire();
at = id & ConstantsType::IndexMask;
const int block = blockfor(at);
@ -254,7 +254,7 @@ inline int QFreeList<T, ConstantsType>::next()
}
newid = v[at].next.load() | (id & ~ConstantsType::IndexMask);
} while (!_next.testAndSetRelaxed(id, newid));
} while (!_next.testAndSetRelease(id, newid));
// qDebug("QFreeList::next(): returning %d (_next now %d, serial %d)",
// id & ConstantsType::IndexMask,
// newid & ConstantsType::IndexMask,

View File

@ -594,7 +594,6 @@ static QLocalePrivate *c_private()
*/
QSystemLocale::QSystemLocale()
{
delete _systemLocale;
_systemLocale = this;
if (system_data)

View File

@ -1323,8 +1323,8 @@ QDebug operator<<(QDebug dbg, const QRect &r)
rendering.
A QRectF can be constructed with a set of left, top, width and
height integers, or from a QPoint and a QSize. The following code
creates two identical rectangles.
height coordinates, or from a QPointF and a QSizeF. The following
code creates two identical rectangles.
\snippet code/src_corelib_tools_qrect.cpp 1
@ -1344,7 +1344,7 @@ QDebug operator<<(QDebug dbg, const QRect &r)
translated copy of this rectangle.
The size() function returns the rectange's dimensions as a
QSize. The dimensions can also be retrieved separately using the
QSizeF. The dimensions can also be retrieved separately using the
width() and height() functions. To manipulate the dimensions use
the setSize(), setWidth() or setHeight() functions. Alternatively,
the size can be changed by applying either of the functions

View File

@ -674,9 +674,9 @@ bool QTimeZone::isDaylightTime(const QDateTime &atDateTime) const
QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const
{
if (hasTransitions())
return d->toOffsetData(d->data(forDateTime.toMSecsSinceEpoch()));
return QTimeZonePrivate::toOffsetData(d->data(forDateTime.toMSecsSinceEpoch()));
else
return d->invalidOffsetData();
return QTimeZonePrivate::invalidOffsetData();
}
/*!
@ -712,9 +712,9 @@ bool QTimeZone::hasTransitions() const
QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const
{
if (hasTransitions())
return d->toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch()));
return QTimeZonePrivate::toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch()));
else
return d->invalidOffsetData();
return QTimeZonePrivate::invalidOffsetData();
}
/*!
@ -733,9 +733,9 @@ QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime)
QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const
{
if (hasTransitions())
return d->toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch()));
return QTimeZonePrivate::toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch()));
else
return d->invalidOffsetData();
return QTimeZonePrivate::invalidOffsetData();
}
/*!
@ -755,7 +755,7 @@ QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime,
toDateTime.toMSecsSinceEpoch());
list.reserve(plist.count());
for (const QTimeZonePrivate::Data &pdata : plist)
list.append(d->toOffsetData(pdata));
list.append(QTimeZonePrivate::toOffsetData(pdata));
}
return list;
}

View File

@ -146,15 +146,25 @@ public:
T value(int i, const T &defaultValue) const;
inline void append(const T &t) {
if (s == a) // i.e. s != 0
if (s == a) { // i.e. s != 0
T copy(t);
realloc(s, s<<1);
const int idx = s++;
if (QTypeInfo<T>::isComplex) {
new (ptr + idx) T(t);
const int idx = s++;
if (QTypeInfo<T>::isComplex) {
new (ptr + idx) T(std::move(copy));
} else {
ptr[idx] = std::move(copy);
}
} else {
ptr[idx] = t;
const int idx = s++;
if (QTypeInfo<T>::isComplex) {
new (ptr + idx) T(t);
} else {
ptr[idx] = t;
}
}
}
void append(const T *buf, int size);
inline QVarLengthArray<T, Prealloc> &operator<<(const T &t)
{ append(t); return *this; }

View File

@ -161,9 +161,10 @@
"test": "unix/libpng",
"sources": [
{ "type": "pkgConfig", "args": "libpng" },
{ "libs": "-llibpng -lzdll", "condition": "config.msvc" },
{ "libs": "-lpng -lz", "condition": "!config.msvc" }
]
{ "libs": "-llibpng", "condition": "config.msvc" },
{ "libs": "-lpng", "condition": "!config.msvc" }
],
"use": "zlib"
},
"mirclient": {
"label": "Mir client libraries",

View File

@ -265,7 +265,7 @@ void QTextDocumentPrivate::clear()
unreachableCharacterCount = 0;
modifiedState = 0;
modified = false;
formats = QTextFormatCollection();
formats.clear();
int len = fragments.length();
fragments.clear();
blocks.clear();

View File

@ -3371,24 +3371,17 @@ QTextTableCellFormat::QTextTableCellFormat(const QTextFormat &fmt)
// ------------------------------------------------------
QTextFormatCollection::QTextFormatCollection(const QTextFormatCollection &rhs)
{
formats = rhs.formats;
objFormats = rhs.objFormats;
}
QTextFormatCollection &QTextFormatCollection::operator=(const QTextFormatCollection &rhs)
{
formats = rhs.formats;
objFormats = rhs.objFormats;
return *this;
}
QTextFormatCollection::~QTextFormatCollection()
{
}
void QTextFormatCollection::clear()
{
formats.clear();
objFormats.clear();
hashes.clear();
}
int QTextFormatCollection::indexForFormat(const QTextFormat &format)
{
uint hash = getHash(format.d, format.format_type);

View File

@ -63,8 +63,7 @@ public:
QTextFormatCollection() {}
~QTextFormatCollection();
QTextFormatCollection(const QTextFormatCollection &rhs);
QTextFormatCollection &operator=(const QTextFormatCollection &rhs);
void clear();
inline QTextFormat objectFormat(int objectIndex) const
{ return format(objectFormatIndex(objectIndex)); }
@ -104,6 +103,8 @@ public:
private:
QFont defaultFnt;
Q_DISABLE_COPY(QTextFormatCollection)
};
QT_END_NAMESPACE

View File

@ -7,9 +7,6 @@
"commandline": {
"assignments": {
"OPENSSL_LIBS": "openssl.libs",
"OPENSSL_LIBS_DEBUG": "openssl.libs.debug",
"OPENSSL_LIBS_RELEASE": "openssl.libs.release",
"OPENSSL_PATH": "openssl.prefix"
},
"options": {
@ -46,13 +43,24 @@
"-lproxy"
]
},
"openssl_headers": {
"label": "OpenSSL Headers",
"export": "openssl",
"test": "unix/openssl",
"sources": [
{
"comment": "placeholder for OPENSSL_PATH",
"libs": ""
}
]
},
"openssl": {
"label": "OpenSSL Libraries",
"export": "",
"label": "OpenSSL",
"test": "unix/openssl",
"sources": [
{ "type": "openssl" },
{
"comment": "placeholder for OPENSSL_LIBS{,_{DEBUG,RELEASE}}",
"comment": "placeholder for OPENSSL_{PATH,LIBS{,_{DEBUG,RELEASE}}}",
"libs": "",
"builds": {
"debug": "",
@ -92,11 +100,6 @@
"test": "unix/ipv6ifname",
"use": "network"
},
"openssl": {
"label": "OpenSSL",
"type": "compile",
"test": "unix/openssl"
},
"sctp": {
"label": "SCTP support",
"type": "compile",
@ -138,7 +141,7 @@
"enable": "input.openssl == 'yes' || input.openssl == 'linked' || input.openssl == 'runtime'",
"disable": "input.openssl == 'no' || input.ssl == 'no'",
"autoDetect": "!config.winrt",
"condition": "!features.securetransport && tests.openssl",
"condition": "!features.securetransport && (features.openssl-linked || libs.openssl_headers)",
"output": [
"privateFeature",
{ "type": "publicQtConfig", "condition": "!features.openssl-linked" },
@ -149,14 +152,9 @@
"label": " Qt directly linked to OpenSSL",
"enable": "input.openssl == 'linked'",
"disable": "input.openssl != 'linked'",
"condition": "features.openssl && libs.openssl",
"condition": "!features.securetransport && libs.openssl",
"output": [
"privateFeature",
{ "type": "varAssign", "name": "OPENSSL_LIBS", "value": "libs.openssl.libs", "eval": "true" },
{ "type": "varAssign", "name": "OPENSSL_LIBS_DEBUG", "value": "libs.openssl.builds.debug.libs",
"eval": "true", "condition": "config.win32" },
{ "type": "varAssign", "name": "OPENSSL_LIBS_RELEASE", "value": "libs.openssl.builds.release.libs",
"eval": "true", "condition": "config.win32" },
{ "type": "define", "name": "QT_LINKED_OPENSSL" }
]
},

View File

@ -679,10 +679,16 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d,
if (interface.isValid()) {
const QList<QNetworkAddressEntry> addressEntries = interface.addressEntries();
if (!addressEntries.isEmpty()) {
QHostAddress firstIP = addressEntries.first().ip();
mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address());
} else {
bool found = false;
for (const QNetworkAddressEntry &entry : addressEntries) {
const QHostAddress ip = entry.ip();
if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address());
found = true;
break;
}
}
if (!found) {
d->setError(QAbstractSocket::NetworkError,
QNativeSocketEnginePrivate::NetworkUnreachableErrorString);
return false;

View File

@ -955,10 +955,16 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d,
if (iface.isValid()) {
const QList<QNetworkAddressEntry> addressEntries = iface.addressEntries();
if (!addressEntries.isEmpty()) {
QHostAddress firstIP = addressEntries.first().ip();
mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address());
} else {
bool found = false;
for (const QNetworkAddressEntry &entry : addressEntries) {
const QHostAddress ip = entry.ip();
if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address());
found = true;
break;
}
}
if (!found) {
d->setError(QAbstractSocket::NetworkError,
QNativeSocketEnginePrivate::NetworkUnreachableErrorString);
return false;

View File

@ -56,7 +56,7 @@ qtConfig(ssl) {
ssl/qsslellipticcurve_dummy.cpp
}
qtConfig(openssl)|qtConfig(openssl-linked) {
qtConfig(openssl) {
HEADERS += ssl/qsslcontext_openssl_p.h \
ssl/qsslsocket_openssl_p.h \
ssl/qsslsocket_openssl_symbols_p.h
@ -79,16 +79,10 @@ qtConfig(ssl) {
# - libs in <OPENSSL_DIR>\lib\VC\static
# - configure: -openssl -openssl-linked -I <OPENSSL_DIR>\include -L <OPENSSL_DIR>\lib\VC\static OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32" OPENSSL_LIBS_DEBUG="-lssleay32MDd -llibeay32MDd" OPENSSL_LIBS_RELEASE="-lssleay32MD -llibeay32MD"
include($$OUT_PWD/qtnetwork-config.pri)
CONFIG(debug, debug|release) {
LIBS_PRIVATE += $$OPENSSL_LIBS_DEBUG
} else {
LIBS_PRIVATE += $$OPENSSL_LIBS_RELEASE
}
QMAKE_CXXFLAGS += $$OPENSSL_CFLAGS
LIBS_PRIVATE += $$OPENSSL_LIBS
qtConfig(openssl-linked): \
QMAKE_USE_FOR_PRIVATE += openssl
else: \
QMAKE_USE_FOR_PRIVATE += openssl/nolink
win32: LIBS_PRIVATE += -lcrypt32
}
}

View File

@ -572,7 +572,8 @@ QString QIBusPlatformInputContextPrivate::getSocketPath()
if (debug)
qDebug() << "host=" << host << "displayNumber" << displayNumber;
return QDir::homePath() + QLatin1String("/.config/ibus/bus/") +
return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) +
QLatin1String("/ibus/bus/") +
QLatin1String(QDBusConnection::localMachineId()) +
QLatin1Char('-') + QString::fromLocal8Bit(host) + QLatin1Char('-') + QString::fromLocal8Bit(displayNumber);
}

View File

@ -100,10 +100,6 @@ bool QAndroidPlatformOpenGLContext::makeCurrent(QPlatformSurface *surface)
bool ret = QEGLPlatformContext::makeCurrent(surface);
QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context());
const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0)
ctx_d->workaround_missingPrecisionQualifiers = true;
if (!ctx_d->workaround_brokenFBOReadBack && needsFBOReadBackWorkaround())
ctx_d->workaround_brokenFBOReadBack = true;

View File

@ -201,6 +201,10 @@ QPixmap QCocoaDrag::dragPixmap(QDrag *drag, QPoint &hotSpot) const
dpr = sourceWindow->devicePixelRatio();
}
#endif
else {
if (const QWindow *focusWindow = qApp->focusWindow())
dpr = focusWindow->devicePixelRatio();
}
pm = QPixmap(width * dpr, height * dpr);
pm.setDevicePixelRatio(dpr);
QPainter p(&pm);

View File

@ -142,7 +142,7 @@ void QVncClient::convertPixels(char *dst, const char *src, int count) const
case 16: {
quint16 p = *reinterpret_cast<const quint16*>(src);
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
if (swapBytes)
if (m_swapBytes)
p = ((p & 0xff) << 8) | ((p & 0xff00) >> 8);
#endif
r = (p >> 11) & 0x1f;
@ -484,7 +484,7 @@ void QVncClient::setPixelFormat()
m_sameEndian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) == !!m_pixelFormat.bigEndian;
m_needConversion = pixelConversionNeeded();
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
m_swapBytes = qvnc_screen->swapBytes();
m_swapBytes = server()->screen()->swapBytes();
#endif
}
}
@ -639,7 +639,7 @@ bool QVncClient::pixelConversionNeeded() const
return true;
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
if (qvnc_screen->swapBytes())
if (server()->screen()->swapBytes())
return true;
#endif

View File

@ -43,6 +43,7 @@
#include <QtFbSupport/private/qfbcursor_p.h>
#include <QtGui/QPainter>
#include <QtGui/QScreen>
#include <QtCore/QRegularExpression>
@ -172,14 +173,18 @@ QPixmap QVncScreen::grabWindow(WId wid, int x, int y, int width, int height) con
}
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
bool QVNCScreen::swapBytes() const
bool QVncScreen::swapBytes() const
{
return false;
/* TODO
if (depth() != 16)
return false;
if (screen())
return screen()->frameBufferLittleEndian();
return frameBufferLittleEndian();
*/
}
#endif

View File

@ -75,7 +75,7 @@ public:
void clearDirty() { dirtyRegion = QRegion(); }
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
bool swapBytes() const
bool swapBytes() const;
#endif
QStringList mArgs;

View File

@ -8,7 +8,6 @@
"commandline": {
"assignments": {
"MYSQL_PATH": "mysql.prefix",
"PSQL_LIBS": "psql.libs",
"SYBASE": "tds.prefix",
"SYBASE_LIBS": "tds.libs"
},
@ -115,8 +114,10 @@
"test": "unix/sqlite",
"sources": [
{ "type": "pkgConfig", "args": "sqlite3" },
{ "libs": "-lsqlite3", "condition": "config.win32" },
{ "libs": "-lsqlite3 -lz", "condition": "!config.win32" }
"-lsqlite3"
],
"use": [
{ "lib": "zlib", "condition": "!config.win32" }
]
}
},

View File

@ -6669,12 +6669,7 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt,
break;
}
case CT_Menu: {
QStyleHintReturnMask menuMask;
QStyleOption myOption = *opt;
myOption.rect.setSize(sz);
if (proxy()->styleHint(SH_Menu_Mask, &myOption, widget, &menuMask)) {
sz = menuMask.region.boundingRect().size();
}
sz = csz;
break; }
case CT_HeaderSection:{
const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt);

View File

@ -2092,7 +2092,7 @@ void QDockAreaLayoutInfo::reparentWidgets(QWidget *parent)
const QDockAreaLayoutItem &item = item_list.at(i);
if (item.flags & QDockAreaLayoutItem::GapItem)
continue;
if (!item.widgetItem && item.skip())
if (item.skip())
continue;
if (item.subinfo)
item.subinfo->reparentWidgets(parent);

View File

@ -1026,6 +1026,12 @@ void QDockWidgetPrivate::nonClientAreaMouseEvent(QMouseEvent *event)
}
}
void QDockWidgetPrivate::recalculatePressPos(QResizeEvent *event)
{
qreal ratio = event->oldSize().width() / (1.0 * event->size().width());
state->pressPos.setX(state->pressPos.x() / ratio);
}
/*! \internal
Called when the QDockWidget or the QDockWidgetGroupWindow is moved
*/
@ -1542,6 +1548,13 @@ bool QDockWidget::event(QEvent *event)
// if the mainwindow is plugging us, we don't want to update undocked geometry
if (isFloating() && layout != 0 && layout->pluggingWidget != this)
d->undockedGeometry = geometry();
// Usually the window won't get resized while it's being moved, but it can happen,
// for example on Windows when moving to a screen with bigger scale factor
// (and Qt::AA_EnableHighDpiScaling is enabled). If that happens we should
// update state->pressPos, otherwise it will be outside the window when the window shrinks.
if (d->state && d->state->dragging)
d->recalculatePressPos(static_cast<QResizeEvent*>(event));
break;
default:
break;

View File

@ -118,6 +118,7 @@ public:
void startDrag(bool group = true);
void endDrag(bool abort = false);
void moveEvent(QMoveEvent *event);
void recalculatePressPos(QResizeEvent *event);
void unplug(const QRect &rect);
void plug(const QRect &rect);

View File

@ -2195,10 +2195,8 @@ void QMainWindowLayout::animationFinished(QWidget *widget)
}
if (QDockWidget *dw = qobject_cast<QDockWidget*>(widget)) {
if (currentHoveredFloat) {
dw->setParent(currentHoveredFloat);
dw->show();
}
dw->setParent(currentHoveredFloat ? currentHoveredFloat.data() : parentWidget());
dw->show();
dw->d_func()->plug(currentGapRect);
}
#endif
@ -2380,7 +2378,8 @@ QLayoutItem *QMainWindowLayout::unplug(QWidget *widget, bool group)
// We are unplugging a dock widget from a floating window.
if (QDockWidget *dw = qobject_cast<QDockWidget*>(widget)) {
dw->d_func()->unplug(widget->geometry());
return 0;
int index = widget->parentWidget()->layout()->indexOf(widget);
return widget->parentWidget()->layout()->itemAt(index);
}
}
}

View File

@ -3,3 +3,6 @@ TARGET = tst_qtconcurrentmap
QT = core testlib concurrent
SOURCES = tst_qtconcurrentmap.cpp
DEFINES += QT_STRICT_ITERATORS
# Force C++17 if available
contains(QT_CONFIG, c++1z): CONFIG += c++1z

View File

@ -48,6 +48,7 @@ private slots:
void blocking_mappedReduced();
void assignResult();
void functionOverloads();
void noExceptFunctionOverloads();
#ifndef QT_NO_EXCEPTIONS
void exceptions();
#endif
@ -2025,6 +2026,16 @@ int fn(int &i)
return i;
}
int fnConstNoExcept(const int &i) Q_DECL_NOTHROW
{
return i;
}
int fnNoExcept(int &i) Q_DECL_NOTHROW
{
return i;
}
QString changeTypeConst(const int &)
{
return QString();
@ -2035,6 +2046,16 @@ QString changeType(int &)
return QString();
}
QString changeTypeConstNoExcept(const int &) Q_DECL_NOTHROW
{
return QString();
}
QString changeTypeNoExcept(int &) Q_DECL_NOTHROW
{
return QString();
}
int changeTypeQStringListConst(const QStringList &)
{
return 0;
@ -2045,6 +2066,16 @@ int changeTypeQStringList(QStringList &)
return 0;
}
int changeTypeQStringListConstNoExcept(const QStringList &) Q_DECL_NOTHROW
{
return 0;
}
int changeTypeQStringListNoExcept(QStringList &) Q_DECL_NOTHROW
{
return 0;
}
class MemFnTester
{
public:
@ -2069,6 +2100,26 @@ public:
{
return QString();
}
MemFnTester fnNoExcept() Q_DECL_NOTHROW
{
return MemFnTester();
}
MemFnTester fnConstNoExcept() const Q_DECL_NOTHROW
{
return MemFnTester();
}
QString changeTypeNoExcept() Q_DECL_NOTHROW
{
return QString();
}
QString changeTypeConstNoExcept() const Q_DECL_NOTHROW
{
return QString();
}
};
Q_DECLARE_METATYPE(QVector<MemFnTester>);
@ -2097,6 +2148,29 @@ void tst_QtConcurrentMap::functionOverloads()
QtConcurrent::blockingMapped<QList<QString> >(constMemFnTesterList, &MemFnTester::changeTypeConst);
}
void tst_QtConcurrentMap::noExceptFunctionOverloads()
{
QList<int> intList;
const QList<int> constIntList;
QList<MemFnTester> classList;
const QList<MemFnTester> constMemFnTesterList;
QtConcurrent::mapped(intList, fnConstNoExcept);
QtConcurrent::mapped(constIntList, fnConstNoExcept);
QtConcurrent::mapped(classList, &MemFnTester::fnConstNoExcept);
QtConcurrent::mapped(constMemFnTesterList, &MemFnTester::fnConstNoExcept);
QtConcurrent::blockingMapped<QVector<int> >(intList, fnConstNoExcept);
QtConcurrent::blockingMapped<QVector<int> >(constIntList, fnConstNoExcept);
QtConcurrent::blockingMapped<QVector<MemFnTester> >(classList, &MemFnTester::fnConstNoExcept);
QtConcurrent::blockingMapped<QVector<MemFnTester> >(constMemFnTesterList, &MemFnTester::fnConstNoExcept);
QtConcurrent::blockingMapped<QList<QString> >(intList, changeTypeConstNoExcept);
QtConcurrent::blockingMapped<QList<QString> >(constIntList, changeTypeConstNoExcept);
QtConcurrent::blockingMapped<QList<QString> >(classList, &MemFnTester::changeTypeConstNoExcept);
QtConcurrent::blockingMapped<QList<QString> >(constMemFnTesterList, &MemFnTester::changeTypeConstNoExcept);
}
QAtomicInt currentInstanceCount;
QAtomicInt peakInstanceCount;
class InstanceCounter

View File

@ -2,3 +2,6 @@ CONFIG += testcase
TARGET = tst_qtconcurrentrun
QT = core testlib concurrent
SOURCES = tst_qtconcurrentrun.cpp
# Force C++17 if available
contains(QT_CONFIG, c++1z): CONFIG += c++1z

View File

@ -123,6 +123,28 @@ public:
int operator()(int in) const { return in; }
};
class ANoExcept
{
public:
int member0() Q_DECL_NOTHROW { return 10; }
int member1(int in) Q_DECL_NOTHROW { return in; }
typedef int result_type;
int operator()() Q_DECL_NOTHROW { return 10; }
int operator()(int in) Q_DECL_NOTHROW { return in; }
};
class AConstNoExcept
{
public:
int member0() const Q_DECL_NOTHROW { return 10; }
int member1(int in) const Q_DECL_NOTHROW { return in; }
typedef int result_type;
int operator()() const Q_DECL_NOTHROW { return 10; }
int operator()(int in) const Q_DECL_NOTHROW { return in; }
};
void tst_QtConcurrentRun::returnValue()
{
QThreadPool pool;
@ -214,6 +236,88 @@ void tst_QtConcurrentRun::returnValue()
QCOMPARE(f.result(), 20);
f = run(&pool, &aConst, 20);
QCOMPARE(f.result(), 20);
ANoExcept aNoExcept;
f = run(&aNoExcept, &ANoExcept::member0);
QCOMPARE(f.result(), 10);
f = run(&pool, &aNoExcept, &ANoExcept::member0);
QCOMPARE(f.result(), 10);
f = run(&aNoExcept, &ANoExcept::member1, 20);
QCOMPARE(f.result(), 20);
f = run(&pool, &aNoExcept, &ANoExcept::member1, 20);
QCOMPARE(f.result(), 20);
f = run(aNoExcept, &ANoExcept::member0);
QCOMPARE(f.result(), 10);
f = run(&pool, aNoExcept, &ANoExcept::member0);
QCOMPARE(f.result(), 10);
f = run(aNoExcept, &ANoExcept::member1, 20);
QCOMPARE(f.result(), 20);
f = run(&pool, aNoExcept, &ANoExcept::member1, 20);
QCOMPARE(f.result(), 20);
f = run(aNoExcept);
QCOMPARE(f.result(), 10);
f = run(&pool, aNoExcept);
QCOMPARE(f.result(), 10);
f = run(&aNoExcept);
QCOMPARE(f.result(), 10);
f = run(&pool, &aNoExcept);
QCOMPARE(f.result(), 10);
f = run(aNoExcept, 20);
QCOMPARE(f.result(), 20);
f = run(&pool, aNoExcept, 20);
QCOMPARE(f.result(), 20);
f = run(&aNoExcept, 20);
QCOMPARE(f.result(), 20);
f = run(&pool, &aNoExcept, 20);
QCOMPARE(f.result(), 20);
const AConstNoExcept aConstNoExcept = AConstNoExcept();
f = run(&aConstNoExcept, &AConstNoExcept::member0);
QCOMPARE(f.result(), 10);
f = run(&pool, &aConstNoExcept, &AConstNoExcept::member0);
QCOMPARE(f.result(), 10);
f = run(&aConstNoExcept, &AConstNoExcept::member1, 20);
QCOMPARE(f.result(), 20);
f = run(&pool, &aConstNoExcept, &AConstNoExcept::member1, 20);
QCOMPARE(f.result(), 20);
f = run(aConstNoExcept, &AConstNoExcept::member0);
QCOMPARE(f.result(), 10);
f = run(&pool, aConstNoExcept, &AConstNoExcept::member0);
QCOMPARE(f.result(), 10);
f = run(aConstNoExcept, &AConstNoExcept::member1, 20);
QCOMPARE(f.result(), 20);
f = run(&pool, aConstNoExcept, &AConstNoExcept::member1, 20);
QCOMPARE(f.result(), 20);
f = run(aConstNoExcept);
QCOMPARE(f.result(), 10);
f = run(&pool, aConstNoExcept);
QCOMPARE(f.result(), 10);
f = run(&aConstNoExcept);
QCOMPARE(f.result(), 10);
f = run(&pool, &aConstNoExcept);
QCOMPARE(f.result(), 10);
f = run(aConstNoExcept, 20);
QCOMPARE(f.result(), 20);
f = run(&pool, aConstNoExcept, 20);
QCOMPARE(f.result(), 20);
f = run(&aConstNoExcept, 20);
QCOMPARE(f.result(), 20);
f = run(&pool, &aConstNoExcept, 20);
QCOMPARE(f.result(), 20);
}
struct TestClass

View File

@ -353,7 +353,7 @@ void tst_QDir::mkdir_data()
<< QDir::currentPath() + "/testdir/two/three";
QTest::newRow("data0") << dirs.at(0) << true;
QTest::newRow("data1") << dirs.at(1) << false;
QTest::newRow("data2") << dirs.at(2) << false;
QTest::newRow("data2") << dirs.at(2) << false; // note: requires data1 to have been run!
// Ensure that none of these directories already exist
QDir dir;

View File

@ -46,6 +46,7 @@ class tst_QUrl : public QObject
Q_OBJECT
private slots:
void initTestCase();
void effectiveTLDs_data();
void effectiveTLDs();
void getSetCheck();
@ -182,8 +183,15 @@ private slots:
private:
void testThreadingHelper();
QTemporaryDir m_tempDir;
};
void tst_QUrl::initTestCase()
{
QVERIFY2(m_tempDir.isValid(), qPrintable(m_tempDir.errorString()));
}
// Testing get/set functions
void tst_QUrl::getSetCheck()
{
@ -3062,49 +3070,59 @@ void tst_QUrl::fromUserInputWithCwd_data()
// Null
QTest::newRow("null") << QString() << QString() << QUrl() << QUrl();
// Existing file
QDirIterator it(QDir::currentPath(), QDir::NoDotDot | QDir::AllEntries);
int c = 0;
while (it.hasNext()) {
it.next();
QUrl url = QUrl::fromLocalFile(it.filePath());
if (it.fileName() == QLatin1String(".")) {
url = QUrl::fromLocalFile(QDir::currentPath()
// Use a tempdir with files, for testing specific file names
// We use canonicalPath() on the dir path because ::getcwd() canonicalizes,
// so we get a canonical base path for URLs with "." as working directory.
const QString base = QDir(m_tempDir.path()).canonicalPath();
QDir::setCurrent(base); // for the tests that use "." as working dir
// "."
{
const QUrl url = QUrl::fromLocalFile(base
#ifdef Q_OS_WINRT
+ QLatin1Char('/')
#endif
); // fromUserInput cleans the path
}
QTest::newRow(("file-" + QByteArray::number(c)).constData())
<< it.fileName() << QDir::currentPath() << url << url;
QTest::newRow(("file-" + QByteArray::number(c) + "-dot").constData())
<< it.fileName() << QStringLiteral(".") << url << url;
++c;
QTest::newRow("dot-in-path") << "." << base << url << url;
QTest::newRow("dot-in-dot") << "." << QStringLiteral(".") << url << url;
}
// Existing files
for (const char *fileName : {"file.txt", "file#a.txt", "file .txt", "file.txt "}) {
const QString filePath = base + '/' + fileName;
QFile file(filePath);
QVERIFY2(file.open(QIODevice::WriteOnly), qPrintable(filePath));
file.write("Hello world\n");
const QUrl url = QUrl::fromLocalFile(filePath);
QTest::newRow(fileName) << fileName << base << url << url;
QTest::newRow(QByteArray(fileName) + "-in-dot") << fileName << QStringLiteral(".") << url << url;
}
#ifndef Q_OS_WINRT // WinRT cannot cd outside current / sandbox
QDir parent = QDir::current();
QDir parent(base);
QVERIFY(parent.cdUp());
QUrl parentUrl = QUrl::fromLocalFile(parent.path());
QTest::newRow("dotdot") << ".." << QDir::currentPath() << parentUrl << parentUrl;
QTest::newRow("dotdot") << ".." << base << parentUrl << parentUrl;
#endif
QTest::newRow("nonexisting") << "nonexisting" << QDir::currentPath() << QUrl("http://nonexisting") << QUrl::fromLocalFile(QDir::currentPath() + "/nonexisting");
QTest::newRow("short-url") << "example.org" << QDir::currentPath() << QUrl("http://example.org") << QUrl::fromLocalFile(QDir::currentPath() + "/example.org");
QTest::newRow("full-url") << "http://example.org" << QDir::currentPath() << QUrl("http://example.org") << QUrl("http://example.org");
QTest::newRow("absolute") << "/doesnotexist.txt" << QDir::currentPath() << QUrl("file:///doesnotexist.txt") << QUrl("file:///doesnotexist.txt");
QTest::newRow("nonexisting") << "nonexisting" << base << QUrl("http://nonexisting") << QUrl::fromLocalFile(base + "/nonexisting");
QTest::newRow("short-url") << "example.org" << base << QUrl("http://example.org") << QUrl::fromLocalFile(base + "/example.org");
QTest::newRow("full-url") << "http://example.org" << base << QUrl("http://example.org") << QUrl("http://example.org");
QTest::newRow("absolute") << "/doesnotexist.txt" << base << QUrl("file:///doesnotexist.txt") << QUrl("file:///doesnotexist.txt");
#ifdef Q_OS_WIN
QTest::newRow("windows-absolute") << "c:/doesnotexist.txt" << QDir::currentPath() << QUrl("file:///c:/doesnotexist.txt") << QUrl("file:///c:/doesnotexist.txt");
QTest::newRow("windows-absolute") << "c:/doesnotexist.txt" << base << QUrl("file:///c:/doesnotexist.txt") << QUrl("file:///c:/doesnotexist.txt");
#endif
// IPv4 & IPv6
// same as fromUserInput, but needs retesting
QTest::newRow("ipv4-1") << "127.0.0.1" << QDir::currentPath() << QUrl("http://127.0.0.1") << QUrl::fromLocalFile(QDir::currentPath() + "/127.0.0.1");
QTest::newRow("ipv6-0") << "::" << QDir::currentPath() << QUrl("http://[::]") << QUrl("http://[::]");
QTest::newRow("ipv6-1") << "::1" << QDir::currentPath() << QUrl("http://[::1]") << QUrl("http://[::1]");
QTest::newRow("ipv6-2") << "1::1" << QDir::currentPath() << QUrl("http://[1::1]") << QUrl("http://[1::1]");
QTest::newRow("ipv6-3") << "1::" << QDir::currentPath() << QUrl("http://[1::]") << QUrl("http://[1::]");
QTest::newRow("ipv6-4") << "c::" << QDir::currentPath() << QUrl("http://[c::]") << QUrl("http://[c::]");
QTest::newRow("ipv6-5") << "c:f00:ba4::" << QDir::currentPath() << QUrl("http://[c:f00:ba4::]") << QUrl("http://[c:f00:ba4::]");
QTest::newRow("ipv4-1") << "127.0.0.1" << base << QUrl("http://127.0.0.1") << QUrl::fromLocalFile(base + "/127.0.0.1");
QTest::newRow("ipv6-0") << "::" << base << QUrl("http://[::]") << QUrl("http://[::]");
QTest::newRow("ipv6-1") << "::1" << base << QUrl("http://[::1]") << QUrl("http://[::1]");
QTest::newRow("ipv6-2") << "1::1" << base << QUrl("http://[1::1]") << QUrl("http://[1::1]");
QTest::newRow("ipv6-3") << "1::" << base << QUrl("http://[1::]") << QUrl("http://[1::]");
QTest::newRow("ipv6-4") << "c::" << base << QUrl("http://[c::]") << QUrl("http://[c::]");
QTest::newRow("ipv6-5") << "c:f00:ba4::" << base << QUrl("http://[c:f00:ba4::]") << QUrl("http://[c:f00:ba4::]");
}
void tst_QUrl::fromUserInputWithCwd()

View File

@ -307,6 +307,7 @@ void tst_QMimeDatabase::mimeTypesForFileName_data()
QTest::newRow("txtfoobar, 0 hit") << "foo.foobar" << QStringList();
QTest::newRow("m, 2 hits") << "foo.m" << (QStringList() << "text/x-matlab" << "text/x-objcsrc");
QTest::newRow("sub, 3 hits") << "foo.sub" << (QStringList() << "text/x-microdvd" << "text/x-mpsub" << "text/x-subviewer");
QTest::newRow("non_ascii") << QString::fromUtf8("AİİA.pdf") << (QStringList() << "application/pdf");
}
void tst_QMimeDatabase::mimeTypesForFileName()

View File

@ -7,6 +7,8 @@ TARGET = $$qtLibraryTarget(plugin1)
DESTDIR = ../bin
winrt:include(../winrt.pri)
!qtConfig(library): DEFINES += QT_STATICPLUGIN
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qfactoryloader/bin
INSTALLS += target

View File

@ -7,6 +7,8 @@ TARGET = $$qtLibraryTarget(plugin2)
DESTDIR = ../bin
winrt:include(../winrt.pri)
!qtConfig(library): DEFINES += QT_STATICPLUGIN
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qfactoryloader/bin
INSTALLS += target

View File

@ -1033,7 +1033,8 @@ void tst_QDate::fromStringFormat_data()
QTest::addColumn<QString>("format");
QTest::addColumn<QDate>("expected");
//get localized names
// Undo this (inline the C-locale versions) for ### Qt 6
// Get localized names:
QString january = QDate::longMonthName(1);
QString february = QDate::longMonthName(2);
QString march = QDate::longMonthName(3);

View File

@ -31,6 +31,9 @@
#include <time.h>
#include <qdatetime.h>
#include <private/qdatetime_p.h>
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
# include <locale.h>
#endif
#ifdef Q_OS_WIN
# include <qt_windows.h>
@ -185,6 +188,14 @@ Q_DECLARE_METATYPE(Qt::DateFormat)
tst_QDateTime::tst_QDateTime()
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
// Some tests depend on C locale - BF&I it with belt *and* braces:
qputenv("LC_ALL", "C");
setlocale(LC_ALL, "C");
// Need to do this as early as possible, before anything accesses the
// QSystemLocale singleton; once it exists, there's no changing it.
#endif // remove for ### Qt 6
/*
Due to some jurisdictions changing their zones and rules, it's possible
for a non-CET zone to accidentally match CET at a few tested moments but
@ -2332,13 +2343,6 @@ void tst_QDateTime::fromStringStringFormat_data()
QTest::addColumn<QString>("format");
QTest::addColumn<QDateTime>("expected");
QString january = QDate::longMonthName(1);
QString oct = QDate::shortMonthName(10);
QString december = QDate::longMonthName(12);
QString thu = QDate::shortDayName(4);
QString fri = QDate::shortDayName(5);
QString date = "10 " + oct + " 10";
QTest::newRow("data0") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data1") << QString("1020") << QString("sss") << invalidDateTime();
QTest::newRow("data2") << QString("1010") << QString("sss") << QDateTime(defDate(), QTime(0, 0, 10));
@ -2349,16 +2353,14 @@ void tst_QDateTime::fromStringStringFormat_data()
QTest::newRow("data7") << QString("foo") << QString("ap") << invalidDateTime();
// Day non-conflict should not hide earlier year conflict (1963-03-01 was a
// Friday; asking for Thursday moves this, without conflict, to the 7th):
QTest::newRow("data8") << QString("77 03 1963 " + thu) << QString("yy MM yyyy ddd") << invalidDateTime();
QTest::newRow("data8") << QString("77 03 1963 Thu") << QString("yy MM yyyy ddd") << invalidDateTime();
QTest::newRow("data9") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data10") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data11") << date << QString("dd MMM yy") << QDateTime(QDate(1910, 10, 10), QTime());
date = fri + QLatin1Char(' ') + december + " 3 2004";
QTest::newRow("data12") << date << QString("ddd MMMM d yyyy") << QDateTime(QDate(2004, 12, 3), QTime());
QTest::newRow("data11") << QString("10 Oct 10") << QString("dd MMM yy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data12") << QString("Fri December 3 2004") << QString("ddd MMMM d yyyy") << QDateTime(QDate(2004, 12, 3), QTime());
QTest::newRow("data13") << QString("30.02.2004") << QString("dd.MM.yyyy") << invalidDateTime();
QTest::newRow("data14") << QString("32.01.2004") << QString("dd.MM.yyyy") << invalidDateTime();
date = thu + QLatin1Char(' ') + january + " 2004";
QTest::newRow("data15") << date << QString("ddd MMMM yyyy") << QDateTime(QDate(2004, 1, 1), QTime());
QTest::newRow("data15") << QString("Thu January 2004") << QString("ddd MMMM yyyy") << QDateTime(QDate(2004, 1, 1), QTime());
QTest::newRow("data16") << QString("2005-06-28T07:57:30.001Z")
<< QString("yyyy-MM-ddThh:mm:ss.zZ")
<< QDateTime(QDate(2005, 06, 28), QTime(07, 57, 30, 1));

View File

@ -28,10 +28,26 @@
#include <QtTest/QtTest>
#include "qdatetime.h"
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
# include <locale.h>
#endif
class tst_QTime : public QObject
{
Q_OBJECT
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
public:
tst_QTime()
{
// Some tests depend on C locale - BF&I it with belt *and* braces:
qputenv("LC_ALL", "C");
setlocale(LC_ALL, "C");
// Need to instantiate as early as possible, before anything accesses
// the QSystemLocale singleton; once it exists, there's no changing it.
}
#endif // remove for ### Qt 6
private slots:
void msecsTo_data();
void msecsTo();

View File

@ -77,8 +77,21 @@ struct Foo
void tst_QVarLengthArray::append()
{
QVarLengthArray<QString> v;
v.append(QString("hello"));
QVarLengthArray<QString, 2> v;
v.append(QString("1"));
v.append(v.front());
QCOMPARE(v.capacity(), 2);
// transition from prealloc to heap:
v.append(v.front());
QVERIFY(v.capacity() > 2);
QCOMPARE(v.front(), v.back());
while (v.size() < v.capacity())
v.push_back(v[0]);
QCOMPARE(v.back(), v.front());
QCOMPARE(v.size(), v.capacity());
// transition from heap to larger heap:
v.push_back(v.front());
QCOMPARE(v.back(), v.front());
QVarLengthArray<int> v2; // rocket!
v2.append(5);

View File

@ -60,6 +60,7 @@ private slots:
void setFont();
void setFont_collection_data();
void setFont_collection();
void clearCollection();
};
/*! \internal
@ -640,5 +641,32 @@ void tst_QTextFormat::setFont_collection()
}
}
void tst_QTextFormat::clearCollection()
{
QTextFormatCollection collection;
QFont f;
f.setUnderline(true);
collection.setDefaultFont(f);
QTextCharFormat charFormat;
charFormat.setFontStyleHint(QFont::SansSerif);
int formatIndex = collection.indexForFormat(charFormat);
QCOMPARE(formatIndex, 0);
QTextCharFormat charFormat2;
charFormat2.setUnderlineStyle(QTextCharFormat::SingleUnderline);
int formatIndex2 = collection.indexForFormat(charFormat2);
QCOMPARE(formatIndex2, 1);
QCOMPARE(collection.formats.count(), 2);
QCOMPARE(collection.hashes.count(), 2);
QCOMPARE(collection.defaultFont(), f);
collection.clear();
QCOMPARE(collection.formats.count(), 0);
QCOMPARE(collection.hashes.count(), 0);
QCOMPARE(collection.indexForFormat(charFormat2), 0);
QCOMPARE(collection.formats.count(), 1);
QCOMPARE(collection.hashes.count(), 1);
QCOMPARE(collection.defaultFont(), f); // kept, QTextDocument::clear or setPlainText should not reset the font set by setDefaultFont
}
QTEST_MAIN(tst_QTextFormat)
#include "tst_qtextformat.moc"

View File

@ -14,12 +14,6 @@ win32 {
}
}
# OpenSSL support
qtConfig(openssl)|qtConfig(openssl-linked) {
# Add optional SSL libs
LIBS += $$OPENSSL_LIBS
}
DEFINES += SRCDIR=\\\"$$PWD/\\\"
requires(qtConfig(private_tests))

View File

@ -54,7 +54,7 @@ dialogs \
windowtransparency \
unc
!qtConfig(openssl):!qtConfig(openssl-linked): SUBDIRS -= qssloptions
!qtConfig(openssl): SUBDIRS -= qssloptions
qtConfig(opengl) {
SUBDIRS += qopengltextureblitter