Merge remote-tracking branch 'origin/5.9' into dev

Change-Id: I84097f8e7b3b2128028bd7693c913d6968b82bfe
This commit is contained in:
Liang Qi 2017-03-02 09:04:38 +01:00
commit 71264bae08
155 changed files with 2017 additions and 1971 deletions

View File

@ -1,8 +1,10 @@
Usage: configure [options] [assignments] Usage: configure [options] [assignments]
Configure understands variable assignments like VAR=value on the command line. Configure understands variable assignments like VAR=value on the command line.
These override any values possibly obtained from pkg-config. The variables Each uppercased library name (obtainable with -list-libraries) supports the
are mentioned in the descriptions of the options they relate to. 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 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. 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. Use this after installing missing dependencies.
-recheck-all ......... Discard all cached configure test results. -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: Build options:
-opensource .......... Build the Open-Source Edition of Qt -opensource .......... Build the Open-Source Edition of Qt
@ -188,9 +197,6 @@ Component selection:
[default on Android and Windows] [default on Android and Windows]
-dbus-linked ......... Build Qt D-Bus and link to libdbus-1 [auto] -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-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] -accessibility ....... Enable accessibility support [yes]
Note: Disabling accessibility is not recommended. Note: Disabling accessibility is not recommended.
-qml-debug ........... Enable QML debugging support [yes] -qml-debug ........... Enable QML debugging support [yes]
@ -210,7 +216,6 @@ Core options:
-pcre ................ Select used libpcre2 [system/qt] -pcre ................ Select used libpcre2 [system/qt]
-pps ................. Enable PPS support [auto] (QNX only) -pps ................. Enable PPS support [auto] (QNX only)
-zlib ................ Select used zlib [system/qt] -zlib ................ Select used zlib [system/qt]
ZLIB_LIBS=
Logging backends: Logging backends:
-journald .......... Enable journald support [no] (Unix only) -journald .......... Enable journald support [no] (Unix only)
@ -223,8 +228,6 @@ Network options:
-no-openssl .......... Do not use OpenSSL [default on Apple and WinRT] -no-openssl .......... Do not use OpenSSL [default on Apple and WinRT]
-openssl-linked ...... Use OpenSSL and link to libssl [no] -openssl-linked ...... Use OpenSSL and link to libssl [no]
-openssl-runtime ..... Use OpenSSL and dynamically load libssl [auto] -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) -securetransport ..... Use SecureTransport [auto] (Apple only)
-sctp ................ Enable SCTP support [no] -sctp ................ Enable SCTP support [no]
@ -292,5 +295,4 @@ Database options:
-sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers: -sql-<driver> ........ Enable SQL <driver> plugin. Supported drivers:
db2 ibase mysql oci odbc psql sqlite2 sqlite tds db2 ibase mysql oci odbc psql sqlite2 sqlite tds
[all auto] [all auto]
MYSQL_PATH= PSQL_LIBS= SYBASE= SYBASE_LIBS=
-sqlite .............. Select used sqlite3 [system/qt] -sqlite .............. Select used sqlite3 [system/qt]

View File

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

View File

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

View File

@ -67,6 +67,7 @@ TabletCanvas::TabletCanvas()
resize(500, 500); resize(500, 500);
initPixmap(); initPixmap();
setAutoFillBackground(true); setAutoFillBackground(true);
setAttribute(Qt::WA_TabletTracking);
} }
void TabletCanvas::initPixmap() void TabletCanvas::initPixmap()

View File

@ -12,7 +12,10 @@
"recheck": { "type": "void", "name": "cache_use", "value": "positive" }, "recheck": { "type": "void", "name": "cache_use", "value": "positive" },
"recheck-all": { "type": "void", "name": "cache_use", "value": "none" }, "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; # 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 # UIKit builds are always multi-arch due to simulator_and_device (unless
# -sdk is used) so this feature cannot possibly work. # -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.name = "Generate moc_predefs.h"
moc_predefs.CONFIG = no_link moc_predefs.CONFIG = no_link
gcc: moc_predefs.commands = $$QMAKE_CXX $$QMAKE_CXXFLAGS -dM -E -o ${QMAKE_FILE_OUT} ${QMAKE_FILE_IN} 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, /) use = $$split(use, /)
name = $$take_first(use) name = $$take_first(use)
nu = $$upper($$name) nu = $$upper($$name)
debug: \ !defined(QMAKE_LIBS_$$nu, var): \
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): \
error("Library '$$name' is not defined.") error("Library '$$name' is not defined.")
!contains(use, nolink) { !contains(use, nolink) {
QMAKE_LIBDIR += $$libdir QMAKE_LIBDIR += $$eval(QMAKE_LIBDIR_$$nu)
LIBS$${suffix} += $$libs 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) { !contains(use, linkonly) {
DEFINES += $$defines DEFINES += $$eval(QMAKE_DEFINES_$${nu})
INCLUDEPATH += $$includes INCLUDEPATH += $$eval(QMAKE_INCDIR_$${nu})
} }
} }
!isEmpty(suffix): break() !isEmpty(suffix): break()

View File

@ -401,6 +401,7 @@ defineReplace(qtConfPrepareArgs) {
} }
defineTest(qtConfSetupLibraries) { defineTest(qtConfSetupLibraries) {
asspfx = $${currentConfig}.commandline.assignments
for (l, $${currentConfig}.libraries._KEYS_) { for (l, $${currentConfig}.libraries._KEYS_) {
lpfx = $${currentConfig}.libraries.$${l} lpfx = $${currentConfig}.libraries.$${l}
# 'export' may be omitted, in which case it falls back to the library's name # 'export' may be omitted, in which case it falls back to the library's name
@ -408,6 +409,15 @@ defineTest(qtConfSetupLibraries) {
$${lpfx}.export = $$l $${lpfx}.export = $$l
export($${lpfx}.export) 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_): \ isEmpty($${lpfx}.sources._KEYS_): \
error("Library $$l defines no sources") error("Library $$l defines no sources")
for (s, $${lpfx}.sources._KEYS_) { 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. # reverse mapping for assignments on command line.
for (a, $${currentConfig}.commandline.assignments._KEYS_) { for (a, $${asspfx}._KEYS_) {
apfx = $${currentConfig}.commandline.assignments.$${a} apfx = $${asspfx}.$${a}
ra = config.commandline.rev_assignments.$$eval($$apfx) ra = config.commandline.rev_assignments.$$eval($$apfx)
$$ra = $$a $$ra = $$a
export($$ra) export($$ra)
@ -444,9 +477,13 @@ defineTest(qtConfLibrary_inline) {
!defined($${1}.libs, var): \ !defined($${1}.libs, var): \
error("'inline' source in library '$$lib' does not specify 'libs'.") 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. # direct libs. overwrites inline libs.
defined(config.input.$${lib}.libs, var) { defined(config.input.$${input}.libs, var) {
$${1}.libs = $$eval(config.input.$${lib}.libs) $${1}.libs = $$eval(config.input.$${input}.libs)
export($${1}.libs) export($${1}.libs)
} }
@ -455,7 +492,7 @@ defineTest(qtConfLibrary_inline) {
any = false any = false
all = true all = true
for (b, $${1}.builds._KEYS_) { for (b, $${1}.builds._KEYS_) {
iv = $${lib}.libs.$${b} iv = $${input}.libs.$${b}
vars += $$eval(config.commandline.rev_assignments.$${iv}) vars += $$eval(config.commandline.rev_assignments.$${iv})
defined(config.input.$${iv}, var) { defined(config.input.$${iv}, var) {
$${1}.builds.$${b}.libs = $$eval(config.input.$${iv}) $${1}.builds.$${b}.libs = $$eval(config.input.$${iv})
@ -471,7 +508,7 @@ defineTest(qtConfLibrary_inline) {
} }
# prefix. prepends to (possibly overwritten) inline libs. # prefix. prepends to (possibly overwritten) inline libs.
prefix = $$val_escape(config.input.$${lib}.prefix) prefix = $$val_escape(config.input.$${input}.prefix)
!isEmpty(prefix) { !isEmpty(prefix) {
$${1}.includedir = $$prefix/include $${1}.includedir = $$prefix/include
export($${1}.includedir) export($${1}.includedir)
@ -479,6 +516,18 @@ defineTest(qtConfLibrary_inline) {
export($${1}.libs) 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) return(true)
} }
@ -562,14 +611,20 @@ defineReplace(qtConfLibraryArgs) {
} }
defineTest(qtConfExportLibrary) { defineTest(qtConfExportLibrary) {
isEmpty(2): return() lpfx = $${currentConfig}.libraries.$$1
!$$qtConfEvaluate($$eval($${1}.export)): return() 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 output = privatePro
eval(libs = $$eval($${1}.libs)) eval(libs = $$eval($${spfx}.libs))
eval(cflags = $$eval($${1}.cflags)) eval(cflags = $$eval($${spfx}.cflags))
eval(includes = $$eval($${1}.includedir)) eval(includes = $$eval($${spfx}.includedir))
# Split $$cflags into stuff that goes into DEFINES, INCLUDEPATH, and other stuff. # Split $$cflags into stuff that goes into DEFINES, INCLUDEPATH, and other stuff.
defines = defines =
@ -588,30 +643,46 @@ defineTest(qtConfExportLibrary) {
} }
} }
!isEmpty(ignored): \ !isEmpty(ignored): \
qtConfAddNote("Dropped compiler flags '$$ignored' when detecting library '$$2'.") qtConfAddNote("Dropped compiler flags '$$ignored' when detecting library '$$name'.")
NAME = $$upper($$2) NAME = $$upper($$name)
!isEmpty(libs): qtConfOutputVar(assign, $$output, QMAKE_LIBS_$$NAME, $$libs) # LIBS is emitted even if empty, as this allows the library to be "seen".
for (b, $${1}.builds._KEYS_): \ qtConfOutputVar(assign, $$output, QMAKE_LIBS_$$NAME, $$libs)
for (b, $${spfx}.builds._KEYS_): \
qtConfOutputVar(assign, $$output, QMAKE_LIBS_$${NAME}_$$upper($$b), \ 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(defines): qtConfOutputVar(assign, $$output, QMAKE_DEFINES_$$NAME, $$defines)
!isEmpty(includes): qtConfOutputVar(assign, $$output, QMAKE_INCDIR_$$NAME, $$includes) !isEmpty(includes): qtConfOutputVar(assign, $$output, QMAKE_INCDIR_$$NAME, $$includes)
!isEmpty($${currentConfig}.module): \ !isEmpty($${currentConfig}.module): \
qtConfExtendVar($$output, "QT.$${currentModule}_private.libraries", $$2) qtConfExtendVar($$output, "QT.$${currentModule}_private.libraries", $$name)
} }
defineTest(qtConfHandleLibrary) { defineTest(qtConfHandleLibrary) {
lpfx = $${currentConfig}.libraries.$$1 lpfx = $${currentConfig}.libraries.$$1
defined($${lpfx}.result, var): return() 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") qtConfEnsureTestTypeDeps("library")
qtConfTestPrepare_compile($$lpfx) !qtConfTestPrepare_compile($$lpfx) {
$${lpfx}.result = false
export($${lpfx}.result)
return()
}
use_args = $$eval($${lpfx}.literal_args) use_args = $$eval($${lpfx}.literal_args)
qtConfLoadResult($${lpfx}, $$1) { qtConfLoadResult($${lpfx}, $$1) {
$$eval($${lpfx}.result): \ $$eval($${lpfx}.result): \
qtConfExportLibrary($${lpfx}.sources.$$eval($${lpfx}.source), $$eval($${lpfx}.export)) qtConfExportLibrary($$1)
return() return()
} }
@ -634,14 +705,14 @@ defineTest(qtConfHandleLibrary) {
next() next()
} }
!$${call}($$spfx) { !$${call}($$spfx, $$lpfx) {
qtLog(" => source produced no result.") qtLog(" => source produced no result.")
next() next()
} }
# if the library defines a test, use it to verify the source. # if the library defines a test, use it to verify the source.
!isEmpty($${lpfx}.test) { !isEmpty($${lpfx}.test) {
$${lpfx}.literal_args = $$use_args $$qtConfLibraryArgs($$spfx) $${lpfx}.literal_args = $$qtConfLibraryArgs($$spfx) $$use_args
$${lpfx}.host = $$eval($${spfx}.host) $${lpfx}.host = $$eval($${spfx}.host)
!qtConfTest_compile($$lpfx) { !qtConfTest_compile($$lpfx) {
qtLog(" => source failed verification.") qtLog(" => source failed verification.")
@ -657,11 +728,12 @@ defineTest(qtConfHandleLibrary) {
for (b, $${spfx}.builds._KEYS_): \ for (b, $${spfx}.builds._KEYS_): \
$${lpfx}.cache += sources.$${s}.builds.$${b} $${lpfx}.cache += sources.$${s}.builds.$${b}
# immediately output the library as well.
qtConfExportLibrary($${spfx}, $$eval($${lpfx}.export))
$${lpfx}.source = $$s $${lpfx}.source = $$s
export($${lpfx}.source) export($${lpfx}.source)
# immediately output the library as well.
qtConfExportLibrary($$1)
result = true result = true
break() break()
} }
@ -679,27 +751,76 @@ defineTest(qtConfTest_library) {
} }
defineTest(qtConfTestPrepare_compile) { 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 = libConfig =
contains($${currentConfig}.libraries._KEYS_, $$u) { exports = $$eval($${currentConfig}.exports.$$u)
libConfig = $${currentConfig} !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) qtConfHandleLibrary($$u)
} else { } else {
for (d, QMAKE_CONFIG_DEPS) { # otherwise, verify that all options were resolved.
contains($${d}.libraries._KEYS_, $$u) { 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_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 libConfig = $$d
break() break()
} }
for (x, exports) {
isEmpty($${d}.libraries.$${x}.result): \
error("Test $$1 refers to unresolved library export '$$u' in '$$d'")
}
return(false)
}
} }
} }
isEmpty(libConfig) { isEmpty(libConfig) {
nu = $$upper($$u) nu = $$upper($$u)
libs = $$eval(QMAKE_LIBS_$$nu) $$eval(QMAKE_LIBS_$${nu}_DEBUG) $$eval(QMAKE_LIBS_$${nu}_RELEASE) !defined(QMAKE_LIBS_$$nu, var): \
defines = $$eval(QMAKE_DEFINES_$${nu})
includes = $$eval(QMAKE_INCDIR_$${nu})
isEmpty(libs):isEmpty(defines):isEmpty(includes): \
error("Test $$1 tries to use undeclared library '$$u'") error("Test $$1 tries to use undeclared library '$$u'")
# using an external library by exported name.
$${1}.literal_args += $$system_quote(QMAKE_USE += $$u) $${1}.literal_args += $$system_quote(QMAKE_USE += $$u)
} else { } else {
lpfx = $${libConfig}.libraries.$${u} lpfx = $${libConfig}.libraries.$${u}
@ -1252,14 +1373,14 @@ defineTest(qtConfProcessFeatures) {
# reporting # 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) { defineTest(qtConfReportPadded) {
pad = $$num_add($$str_size($$QT_CONF_REPORT_PADDING), -$$str_size($${1})) qtConfAddReport($$qtConfPadCols($$1, "........................................", $$2))
lessThan(pad, 0): pad = 0
str = "$$1 $$str_member($$QT_CONF_REPORT_PADDING, 0, $$pad)"
qtConfAddReport("$$str $${2}")
} }
defineReplace(qtConfCollectFeatures) { defineReplace(qtConfCollectFeatures) {
@ -1749,8 +1870,6 @@ for(ever) {
jsonFile = $$thisDir/configure.json jsonFile = $$thisDir/configure.json
priFile = $$thisDir/configure.pri priFile = $$thisDir/configure.pri
allConfigs += $$currentConfig
# load configuration data # load configuration data
configure_data = $$cat($$jsonFile, blob) configure_data = $$cat($$jsonFile, blob)
!parseJson(configure_data, $$currentConfig): \ !parseJson(configure_data, $$currentConfig): \
@ -1758,25 +1877,88 @@ for(ever) {
exists($$priFile): \ exists($$priFile): \
!include($$priFile): error() !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 # prepend all subconfigs to files to keep a depth first search order
subconfigs = subconfigs =
for(n, $${currentConfig}.subconfigs._KEYS_) { for(n, $${currentConfig}.subconfigs._KEYS_) {
subconfig = $$eval($${currentConfig}.subconfigs.$${n}) subconfig = $$eval($${currentConfig}.subconfigs.$${n})
name = $$basename(subconfig) name = $$basename(subconfig)
ex = $$eval(config.$${name}.dir)
!isEmpty(ex): \
error("Basename clash between $$thisDir/$$subconfig and $${ex}.")
config.$${name}.dir = $$thisDir/$$subconfig config.$${name}.dir = $$thisDir/$$subconfig
subconfigs += $$name subconfigs += $$name
} }
configsToProcess = $$subconfigs $$configsToProcess configsToProcess = $$subconfigs $$configsToProcess
} }
for (currentConfig, allConfigs): \
qtConfSetupLibraries()
QMAKE_SAVED_ARGS = $$QMAKE_EXTRA_ARGS QMAKE_SAVED_ARGS = $$QMAKE_EXTRA_ARGS
QMAKE_REDO_CONFIG = false QMAKE_REDO_CONFIG = false
qtConfParseCommandLine() qtConfParseCommandLine()
qtConfCheckErrors() 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) { for (currentConfig, allConfigs) {
qtConfSetModuleName() qtConfSetModuleName()
qtConfSetupModuleOutputs() qtConfSetupModuleOutputs()
@ -1833,11 +2015,15 @@ for (currentConfig, allConfigs) {
# correctly setup dependencies # correctly setup dependencies
QMAKE_CONFIG_DEPS = global global_private QMAKE_CONFIG_DEPS = global global_private
QMAKE_LIBRARY_DEPS = $$eval(config.modules.global)
!isEmpty($${currentConfig}.module) { !isEmpty($${currentConfig}.module) {
for (d, $${currentConfig}.depends._KEYS_) { for (d, $${currentConfig}.depends._KEYS_) {
dep = $$replace($${currentConfig}.depends.$$d, -private$, _private) dep = $$replace($${currentConfig}.depends.$$d, -private$, _private)
dep *= $$replace(dep, _private$, ) gdep = $$replace(dep, _private$, )
dep *= $$gdep
QMAKE_CONFIG_DEPS += $$dep 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 darwin: MODULE_DEBUG_LIBS = -L$$DESTDIR -l$${TARGET}_debug
MODULE_RELEASE_LIBS = -L$$DESTDIR -l$$TARGET MODULE_RELEASE_LIBS = -L$$DESTDIR -l$$TARGET
MODULE_PRI_CONT += \ 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}_DEBUG = $$val_escape(MODULE_DEBUG_LIBS)" \
"QMAKE_LIBS_$${ucmodule}_RELEASE = $$val_escape(MODULE_RELEASE_LIBS)" "QMAKE_LIBS_$${ucmodule}_RELEASE = $$val_escape(MODULE_RELEASE_LIBS)"
} else { } else {

View File

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

View File

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

View File

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

View File

@ -2,31 +2,37 @@
############################################################################# #############################################################################
## ##
## Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> ## Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
## Contact: http://www.qt.io/licensing/ ## Contact: https://www.qt.io/licensing/
## ##
## This file is the build configuration utility of the Qt Toolkit. ## This file is the build configuration utility of the Qt Toolkit.
## ##
## $QT_BEGIN_LICENSE:LGPL21$ ## $QT_BEGIN_LICENSE:LGPL$
## Commercial License Usage ## Commercial License Usage
## Licensees holding valid commercial Qt licenses may use this file in ## Licensees holding valid commercial Qt licenses may use this file in
## accordance with the commercial license agreement provided with the ## accordance with the commercial license agreement provided with the
## Software or, alternatively, in accordance with the terms contained in ## Software or, alternatively, in accordance with the terms contained in
## a written agreement between you and The Qt Company. For licensing terms ## a written agreement between you and The Qt Company. For licensing terms
## and conditions see http://www.qt.io/terms-conditions. For further ## and conditions see https://www.qt.io/terms-conditions. For further
## information use the contact form at http://www.qt.io/contact-us. ## information use the contact form at https://www.qt.io/contact-us.
## ##
## GNU Lesser General Public License Usage ## GNU Lesser General Public License Usage
## Alternatively, this file may be used under the terms of the GNU Lesser ## Alternatively, this file may be used under the terms of the GNU Lesser
## General Public License version 2.1 or version 3 as published by the Free ## General Public License version 3 as published by the Free Software
## Software Foundation and appearing in the file LICENSE.LGPLv21 and ## Foundation and appearing in the file LICENSE.LGPL3 included in the
## LICENSE.LGPLv3 included in the packaging of this file. Please review the ## packaging of this file. Please review the following information to
## following information to ensure the GNU Lesser General Public License ## ensure the GNU Lesser General Public License version 3 requirements
## requirements will be met: https://www.gnu.org/licenses/lgpl.html and ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
## ##
## As a special exception, The Qt Company gives you certain additional ## GNU General Public License Usage
## rights. These rights are described in The Qt Company LGPL Exception ## Alternatively, this file may be used under the terms of the GNU
## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## General Public License version 2.0 or (at your option) the GNU General
## Public license version 3 or any later version approved by the KDE Free
## Qt Foundation. The licenses are as published by the Free Software
## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
## included in the packaging of this file. Please review the following
## information to ensure the GNU General Public License requirements will
## be met: https://www.gnu.org/licenses/gpl-2.0.html and
## https://www.gnu.org/licenses/gpl-3.0.html.
## ##
## $QT_END_LICENSE$ ## $QT_END_LICENSE$
## ##

View File

@ -279,6 +279,9 @@ public class QtActivityDelegate
if (m_softInputMode != 0) { if (m_softInputMode != 0) {
m_activity.getWindow().setSoftInputMode(m_softInputMode); m_activity.getWindow().setSoftInputMode(m_softInputMode);
final boolean softInputIsHidden = (m_softInputMode & WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) != 0;
if (softInputIsHidden)
return;
} else { } else {
if (height > visibleHeight) if (height > visibleHeight)
m_activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 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); 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 struct PushBackWrapper
{ {
typedef void result_type; typedef void result_type;
@ -231,6 +257,20 @@ struct ReduceResultType<T(C::*)(U)>
typedef C ResultType; 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> template <class InputSequence, class MapFunctor>
struct MapResultType struct MapResultType
{ {
@ -249,6 +289,20 @@ struct MapResultType<void, T(C::*)() const>
typedef T ResultType; 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 #ifndef QT_NO_TEMPLATE_TEMPLATE_PARAMETERS
template <template <typename> class InputSequence, typename MapFunctor, typename T> template <template <typename> class InputSequence, typename MapFunctor, typename T>
@ -269,6 +323,21 @@ struct MapResultType<InputSequence<T>, U(C::*)() const>
typedef InputSequence<U> ResultType; 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 #endif // QT_NO_TEMPLATE_TEMPLATE_PARAMETER
template <class MapFunctor> template <class MapFunctor>
@ -289,6 +358,21 @@ struct MapResultType<QStringList, U(C::*)() const>
typedef QList<U> ResultType; 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. } // namespace QtPrivate.
#endif //Q_QDOC #endif //Q_QDOC

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 Samuel Gaist <samuel.gaist@edeltech.ch> ** Copyright (C) 2016 Samuel Gaist <samuel.gaist@edeltech.ch>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the documentation of the Qt Toolkit. ** This file is part of the documentation of the Qt Toolkit.
** **

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 Samuel Gaist <samuel.gaist@edeltech.ch> ** Copyright (C) 2016 Samuel Gaist <samuel.gaist@edeltech.ch>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the documentation of the Qt Toolkit. ** This file is part of the documentation of the Qt Toolkit.
** **

View File

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

View File

@ -80,6 +80,8 @@ gcc:ltcg {
SOURCES += $$VERSIONTAGGING_SOURCES SOURCES += $$VERSIONTAGGING_SOURCES
} }
# On AARCH64 the fp16 extension is mandatory, so we don't need the conversion tables.
!contains(QT_ARCH, "arm64") {
QMAKE_QFLOAT16_TABLES_GENERATE = global/qfloat16.h QMAKE_QFLOAT16_TABLES_GENERATE = global/qfloat16.h
qtPrepareTool(QMAKE_QFLOAT16_TABLES, qfloat16-tables) qtPrepareTool(QMAKE_QFLOAT16_TABLES, qfloat16-tables)
@ -90,3 +92,4 @@ qfloat16_tables.depends = $$QMAKE_QFLOAT16_TABLES
qfloat16_tables.input = QMAKE_QFLOAT16_TABLES_GENERATE qfloat16_tables.input = QMAKE_QFLOAT16_TABLES_GENERATE
qfloat16_tables.variable_out = SOURCES qfloat16_tables.variable_out = SOURCES
QMAKE_EXTRA_COMPILERS += qfloat16_tables QMAKE_EXTRA_COMPILERS += qfloat16_tables
}

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

@ -472,6 +472,8 @@ public:
WA_AlwaysStackOnTop = 128, WA_AlwaysStackOnTop = 128,
WA_TabletTracking = 129,
// Add new attributes before this line // Add new attributes before this line
WA_AttributeCount WA_AttributeCount
}; };

View File

@ -1139,6 +1139,9 @@
\value WA_StyleSheet Indicates that the widget is styled using a \value WA_StyleSheet Indicates that the widget is styled using a
\l{Qt Style Sheets}{style sheet}. \l{Qt Style Sheets}{style sheet}.
\value WA_TabletTracking Indicates that the widget has tablet
tracking enabled. See QWidget::tabletTracking.
\value WA_TranslucentBackground Indicates that the widget should have a \value WA_TranslucentBackground Indicates that the widget should have a
translucent background, i.e., any non-opaque regions of the widgets will be translucent background, i.e., any non-opaque regions of the widgets will be
translucent because the widget will have an alpha channel. Setting this translucent because the widget will have an alpha channel. Setting this

View File

@ -557,45 +557,75 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM
return data.hasFlags(what); 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 //static
bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents) bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents)
{ {
QString dirName = entry.filePath(); QString dirName = entry.filePath();
if (createParents) {
dirName = QDir::cleanPath(dirName); // Darwin doesn't support trailing /'s, so remove for everyone
for (int oldslash = -1, slash=0; slash != -1; oldslash = slash) { while (dirName.size() > 1 && dirName.endsWith(QLatin1Char('/')))
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('/')))
dirName.chop(1); 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 //static

View File

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

View File

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

View File

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

View File

@ -4169,10 +4169,10 @@ QUrl QUrl::fromUserInput(const QString &userInput, const QString &workingDirecto
return url; 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) // 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)) { if (url.isRelative() && !QDir::isAbsolutePath(userInput)) {
QFileInfo fileInfo(QDir(workingDirectory), trimmedString); QFileInfo fileInfo(QDir(workingDirectory), userInput);
if ((options & AssumeLocalFile) || fileInfo.exists()) if ((options & AssumeLocalFile) || fileInfo.exists())
return QUrl::fromLocalFile(fileInfo.absoluteFilePath()); return QUrl::fromLocalFile(fileInfo.absoluteFilePath());
} }

View File

@ -284,6 +284,8 @@ public:
Pointer = 218, // QQuickPointerEvent; ### Qt 6: QPointerEvent Pointer = 218, // QQuickPointerEvent; ### Qt 6: QPointerEvent
TabletTrackingChange = 219, // tablet tracking state has changed
// 512 reserved for Qt Jambi's MetaCall event // 512 reserved for Qt Jambi's MetaCall event
// 513 reserved for Qt Jambi's DeleteOnMainThread event // 513 reserved for Qt Jambi's DeleteOnMainThread event

View File

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

View File

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

View File

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

View File

@ -57,11 +57,22 @@
#include "QtCore/qobject.h" #include "QtCore/qobject.h"
#include "QtCore/qstringlist.h" #include "QtCore/qstringlist.h"
#include "QtCore/qjsonobject.h" #include "QtCore/qjsonobject.h"
#include "QtCore/qjsondocument.h"
#include "QtCore/qmap.h" #include "QtCore/qmap.h"
#include "QtCore/qendian.h"
#include "private/qlibrary_p.h" #include "private/qlibrary_p.h"
QT_BEGIN_NAMESPACE 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 QFactoryLoaderPrivate;
class Q_CORE_EXPORT QFactoryLoader : public QObject class Q_CORE_EXPORT QFactoryLoader : public QObject
{ {

View File

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

View File

@ -58,25 +58,12 @@
#include "QtCore/qstringlist.h" #include "QtCore/qstringlist.h"
#include "QtCore/qplugin.h" #include "QtCore/qplugin.h"
#include "QtCore/qsharedpointer.h" #include "QtCore/qsharedpointer.h"
#include "QtCore/qjsonobject.h"
#include "QtCore/qjsondocument.h"
#include "QtCore/qendian.h"
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
# include "QtCore/qt_windows.h" # include "QtCore/qt_windows.h"
#endif #endif
QT_BEGIN_NAMESPACE 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 #ifndef QT_NO_LIBRARY

View File

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

View File

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

View File

@ -140,8 +140,6 @@ struct QByteArrayDataPtr
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, sizeof(QByteArrayData)) \ Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(size, sizeof(QByteArrayData)) \
/**/ /**/
#if defined(Q_COMPILER_LAMBDA)
# define QByteArrayLiteral(str) \ # define QByteArrayLiteral(str) \
([]() -> QByteArray { \ ([]() -> QByteArray { \
enum { Size = sizeof(str) - 1 }; \ enum { Size = sizeof(str) - 1 }; \
@ -154,14 +152,6 @@ struct QByteArrayDataPtr
}()) \ }()) \
/**/ /**/
#endif
#ifndef QByteArrayLiteral
// no lambdas, not GCC, just return a temporary QByteArray
# define QByteArrayLiteral(str) QByteArray(str, sizeof(str) - 1)
#endif
class Q_CORE_EXPORT QByteArray class Q_CORE_EXPORT QByteArray
{ {
private: private:

View File

@ -125,7 +125,7 @@ private:
friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QEasingCurve &); friend Q_CORE_EXPORT QDataStream &operator>>(QDataStream &, QEasingCurve &);
#endif #endif
}; };
Q_DECLARE_TYPEINFO(QEasingCurve, Q_MOVABLE_TYPE); Q_DECLARE_SHARED(QEasingCurve)
#ifndef QT_NO_DEBUG_STREAM #ifndef QT_NO_DEBUG_STREAM
Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QEasingCurve &item); Q_CORE_EXPORT QDebug operator<<(QDebug debug, const QEasingCurve &item);

View File

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

View File

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

View File

@ -1323,8 +1323,8 @@ QDebug operator<<(QDebug dbg, const QRect &r)
rendering. rendering.
A QRectF can be constructed with a set of left, top, width and 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 height coordinates, or from a QPointF and a QSizeF. The following
creates two identical rectangles. code creates two identical rectangles.
\snippet code/src_corelib_tools_qrect.cpp 1 \snippet code/src_corelib_tools_qrect.cpp 1
@ -1344,7 +1344,7 @@ QDebug operator<<(QDebug dbg, const QRect &r)
translated copy of this rectangle. translated copy of this rectangle.
The size() function returns the rectange's dimensions as a 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 width() and height() functions. To manipulate the dimensions use
the setSize(), setWidth() or setHeight() functions. Alternatively, the setSize(), setWidth() or setHeight() functions. Alternatively,
the size can be changed by applying either of the functions 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 QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const
{ {
if (hasTransitions()) if (hasTransitions())
return d->toOffsetData(d->data(forDateTime.toMSecsSinceEpoch())); return QTimeZonePrivate::toOffsetData(d->data(forDateTime.toMSecsSinceEpoch()));
else else
return d->invalidOffsetData(); return QTimeZonePrivate::invalidOffsetData();
} }
/*! /*!
@ -712,9 +712,9 @@ bool QTimeZone::hasTransitions() const
QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const
{ {
if (hasTransitions()) if (hasTransitions())
return d->toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch())); return QTimeZonePrivate::toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch()));
else 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 QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const
{ {
if (hasTransitions()) if (hasTransitions())
return d->toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch())); return QTimeZonePrivate::toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch()));
else else
return d->invalidOffsetData(); return QTimeZonePrivate::invalidOffsetData();
} }
/*! /*!
@ -755,7 +755,7 @@ QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime,
toDateTime.toMSecsSinceEpoch()); toDateTime.toMSecsSinceEpoch());
list.reserve(plist.count()); list.reserve(plist.count());
for (const QTimeZonePrivate::Data &pdata : plist) for (const QTimeZonePrivate::Data &pdata : plist)
list.append(d->toOffsetData(pdata)); list.append(QTimeZonePrivate::toOffsetData(pdata));
} }
return list; return list;
} }

View File

@ -74,7 +74,7 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class Q_CORE_EXPORT QTimeZonePrivate : public QSharedData class Q_AUTOTEST_EXPORT QTimeZonePrivate : public QSharedData
{ {
public: public:
//Version of QTimeZone::OffsetData struct using msecs for efficiency //Version of QTimeZone::OffsetData struct using msecs for efficiency

View File

@ -146,8 +146,16 @@ public:
T value(int i, const T &defaultValue) const; T value(int i, const T &defaultValue) const;
inline void append(const T &t) { 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); realloc(s, s<<1);
const int idx = s++;
if (QTypeInfo<T>::isComplex) {
new (ptr + idx) T(std::move(copy));
} else {
ptr[idx] = std::move(copy);
}
} else {
const int idx = s++; const int idx = s++;
if (QTypeInfo<T>::isComplex) { if (QTypeInfo<T>::isComplex) {
new (ptr + idx) T(t); new (ptr + idx) T(t);
@ -155,6 +163,18 @@ public:
ptr[idx] = t; ptr[idx] = t;
} }
} }
}
void append(T &&t) {
if (s == a)
realloc(s, s << 1);
const int idx = s++;
if (QTypeInfo<T>::isComplex)
new (ptr + idx) T(std::move(t));
else
ptr[idx] = std::move(t);
}
void append(const T *buf, int size); void append(const T *buf, int size);
inline QVarLengthArray<T, Prealloc> &operator<<(const T &t) inline QVarLengthArray<T, Prealloc> &operator<<(const T &t)
{ append(t); return *this; } { append(t); return *this; }
@ -208,6 +228,7 @@ public:
// STL compatibility: // STL compatibility:
inline bool empty() const { return isEmpty(); } inline bool empty() const { return isEmpty(); }
inline void push_back(const T &t) { append(t); } inline void push_back(const T &t) { append(t); }
void push_back(T &&t) { append(std::move(t)); }
inline void pop_back() { removeLast(); } inline void pop_back() { removeLast(); }
inline T &front() { return first(); } inline T &front() { return first(); }
inline const T &front() const { return first(); } inline const T &front() const { return first(); }

View File

@ -302,6 +302,34 @@
Provided for STL-compatibility. Provided for STL-compatibility.
*/ */
/*!
\fn void QVarLengthArray::append(T &&t)
\overload append
\since 5.9
\note Unlike the lvalue overload of append(), passing a reference to
an object that is already an element of \c *this leads to undefined
behavior:
\code
vla.append(std::move(vla[0])); // BUG: passing an object that is already in the container
\endcode
*/
/*!
\fn void QVarLengthArray::push_back(T &&t)
\overload push_back
\since 5.9
\note Unlike the lvalue overload of push_back(), passing a reference to
an object that is already an element of \c *this leads to undefined
behavior:
\code
vla.push_back(std::move(vla[0])); // BUG: passing an object that is already in the container
\endcode
*/
/*! /*!
\fn inline void QVarLengthArray::removeLast() \fn inline void QVarLengthArray::removeLast()
\since 4.5 \since 4.5

View File

@ -161,9 +161,10 @@
"test": "unix/libpng", "test": "unix/libpng",
"sources": [ "sources": [
{ "type": "pkgConfig", "args": "libpng" }, { "type": "pkgConfig", "args": "libpng" },
{ "libs": "-llibpng -lzdll", "condition": "config.msvc" }, { "libs": "-llibpng", "condition": "config.msvc" },
{ "libs": "-lpng -lz", "condition": "!config.msvc" } { "libs": "-lpng", "condition": "!config.msvc" }
] ],
"use": "zlib"
}, },
"mirclient": { "mirclient": {
"label": "Mir client libraries", "label": "Mir client libraries",
@ -974,6 +975,7 @@
"label": "QSystemTrayIcon", "label": "QSystemTrayIcon",
"purpose": "Provides an icon for an application in the system tray.", "purpose": "Provides an icon for an application in the system tray.",
"section": "Utilities", "section": "Utilities",
"condition": "features.temporaryfile",
"output": [ "publicFeature", "feature" ] "output": [ "publicFeature", "feature" ]
}, },
"accessibility": { "accessibility": {

View File

@ -190,32 +190,42 @@ enum _qt_BuiltInFormatType {
_qt_NoFormat = -1 _qt_NoFormat = -1
}; };
#if !defined(QT_NO_IMAGEFORMAT_PPM)
# define MAX_MT_SIZE 20
#elif !defined(QT_NO_IMAGEFORMAT_XBM) || !defined(QT_NO_IMAGEFORMAT_XPM)
# define MAX_MT_SIZE 10
#else
# define MAX_MT_SIZE 4
#endif
struct _qt_BuiltInFormatStruct struct _qt_BuiltInFormatStruct
{ {
const char *extension; char extension[4];
const char *mimeType; char mimeType[MAX_MT_SIZE];
}; };
#undef MAX_MT_SIZE
static const _qt_BuiltInFormatStruct _qt_BuiltInFormats[] = { static const _qt_BuiltInFormatStruct _qt_BuiltInFormats[] = {
#ifndef QT_NO_IMAGEFORMAT_PNG #ifndef QT_NO_IMAGEFORMAT_PNG
{"png", "image/png"}, {"png", "png"},
#endif #endif
#ifndef QT_NO_IMAGEFORMAT_BMP #ifndef QT_NO_IMAGEFORMAT_BMP
{"bmp", "image/bmp"}, {"bmp", "bmp"},
#endif #endif
#ifndef QT_NO_IMAGEFORMAT_PPM #ifndef QT_NO_IMAGEFORMAT_PPM
{"ppm", "image/x-portable-pixmap"}, {"ppm", "x-portable-pixmap"},
{"pgm", "image/x-portable-graymap"}, {"pgm", "x-portable-graymap"},
{"pbm", "image/x-portable-bitmap"}, {"pbm", "x-portable-bitmap"},
#endif #endif
#ifndef QT_NO_IMAGEFORMAT_XBM #ifndef QT_NO_IMAGEFORMAT_XBM
{"xbm", "image/x-xbitmap"}, {"xbm", "x-xbitmap"},
#endif #endif
#ifndef QT_NO_IMAGEFORMAT_XPM #ifndef QT_NO_IMAGEFORMAT_XPM
{"xpm", "image/x-xpixmap"}, {"xpm", "x-xpixmap"},
#endif #endif
{"", ""}
}; };
Q_STATIC_ASSERT(_qt_NumFormats == sizeof _qt_BuiltInFormats / sizeof *_qt_BuiltInFormats);
static QImageIOHandler *createReadHandlerHelper(QIODevice *device, static QImageIOHandler *createReadHandlerHelper(QIODevice *device,
const QByteArray &format, const QByteArray &format,
@ -1604,8 +1614,8 @@ QList<QByteArray> QImageReader::supportedMimeTypes()
{ {
QList<QByteArray> mimeTypes; QList<QByteArray> mimeTypes;
mimeTypes.reserve(_qt_NumFormats); mimeTypes.reserve(_qt_NumFormats);
for (int i = 0; i < _qt_NumFormats; ++i) for (const auto &fmt : _qt_BuiltInFormats)
mimeTypes << _qt_BuiltInFormats[i].mimeType; mimeTypes.append(QByteArrayLiteral("image/") + fmt.mimeType);
#ifndef QT_NO_IMAGEFORMATPLUGIN #ifndef QT_NO_IMAGEFORMATPLUGIN
supportedImageHandlerMimeTypes(loader(), QImageIOPlugin::CanRead, &mimeTypes); supportedImageHandlerMimeTypes(loader(), QImageIOPlugin::CanRead, &mimeTypes);

View File

@ -1814,6 +1814,15 @@ void QWindowPrivate::destroy()
q->setVisible(false); q->setVisible(false);
// Let subclasses act, typically by doing graphics resource cleaup, when
// the window, to which graphics resource may be tied, is going away.
//
// NB! This is disfunctional when destroy() is invoked from the dtor since
// a reimplemented event() will not get called in the subclasses at that
// stage. However, the typical QWindow cleanup involves either close() or
// going through QWindowContainer, both of which will do an explicit, early
// destroy(), which is good here.
QPlatformSurfaceEvent e(QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed); QPlatformSurfaceEvent e(QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed);
QGuiApplication::sendEvent(q, &e); QGuiApplication::sendEvent(q, &e);

View File

@ -532,7 +532,7 @@ GLuint QOpenGLEngineShaderManager::getUniformLocation(Uniform id)
if (uniformLocations.isEmpty()) if (uniformLocations.isEmpty())
uniformLocations.fill(GLuint(-1), NumUniforms); uniformLocations.fill(GLuint(-1), NumUniforms);
static const char *const uniformNames[] = { const char uniformNames[][26] = {
"imageTexture", "imageTexture",
"patternColor", "patternColor",
"globalOpacity", "globalOpacity",

View File

@ -1006,7 +1006,7 @@ bool QBrush::operator==(const QBrush &b) const
*/ */
QDebug operator<<(QDebug dbg, const QBrush &b) QDebug operator<<(QDebug dbg, const QBrush &b)
{ {
static const char *const BRUSH_STYLES[] = { static const char BRUSH_STYLES[][24] = {
"NoBrush", "NoBrush",
"SolidPattern", "SolidPattern",
"Dense1Pattern", "Dense1Pattern",
@ -1025,7 +1025,7 @@ QDebug operator<<(QDebug dbg, const QBrush &b)
"LinearGradientPattern", "LinearGradientPattern",
"RadialGradientPattern", "RadialGradientPattern",
"ConicalGradientPattern", "ConicalGradientPattern",
0, 0, 0, 0, 0, 0, "", "", "", "", "", "",
"TexturePattern" // 24 "TexturePattern" // 24
}; };

View File

@ -1118,16 +1118,16 @@ QDataStream & operator>>(QDataStream &s, QTransform &t)
#ifndef QT_NO_DEBUG_STREAM #ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QTransform &m) QDebug operator<<(QDebug dbg, const QTransform &m)
{ {
static const char *const typeStr[] = static const char typeStr[][12] =
{ {
"TxNone", "TxNone",
"TxTranslate", "TxTranslate",
"TxScale", "TxScale",
0, "",
"TxRotate", "TxRotate",
0, 0, 0, "", "", "",
"TxShear", "TxShear",
0, 0, 0, 0, 0, 0, 0, "", "", "", "", "", "", "",
"TxProject" "TxProject"
}; };

View File

@ -265,7 +265,7 @@ void QTextDocumentPrivate::clear()
unreachableCharacterCount = 0; unreachableCharacterCount = 0;
modifiedState = 0; modifiedState = 0;
modified = false; modified = false;
formats = QTextFormatCollection(); formats.clear();
int len = fragments.length(); int len = fragments.length();
fragments.clear(); fragments.clear();
blocks.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() QTextFormatCollection::~QTextFormatCollection()
{ {
} }
void QTextFormatCollection::clear()
{
formats.clear();
objFormats.clear();
hashes.clear();
}
int QTextFormatCollection::indexForFormat(const QTextFormat &format) int QTextFormatCollection::indexForFormat(const QTextFormat &format)
{ {
uint hash = getHash(format.d, format.format_type); uint hash = getHash(format.d, format.format_type);

View File

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

View File

@ -39,9 +39,9 @@
#include "qhsts_p.h" #include "qhsts_p.h"
#include "QtCore/qstringlist.h"
#include "QtCore/private/qipaddress_p.h" #include "QtCore/private/qipaddress_p.h"
#include "QtCore/qvector.h"
#include "QtCore/qlist.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -84,7 +84,7 @@ void QHstsCache::updateFromHeaders(const QList<QPair<QByteArray, QByteArray>> &h
updateKnownHost(url.host(), parser.expirationDate(), parser.includeSubDomains()); updateKnownHost(url.host(), parser.expirationDate(), parser.includeSubDomains());
} }
void QHstsCache::updateFromPolicies(const QList<QHstsPolicy> &policies) void QHstsCache::updateFromPolicies(const QVector<QHstsPolicy> &policies)
{ {
for (const auto &policy : policies) for (const auto &policy : policies)
updateKnownHost(policy.host(), policy.expiry(), policy.includesSubDomains()); updateKnownHost(policy.host(), policy.expiry(), policy.includesSubDomains());
@ -183,9 +183,13 @@ void QHstsCache::clear()
knownHosts.clear(); knownHosts.clear();
} }
QList<QHstsPolicy> QHstsCache::policies() const QVector<QHstsPolicy> QHstsCache::policies() const
{ {
return knownHosts.values(); QVector<QHstsPolicy> values;
values.reserve(knownHosts.size());
for (const auto &host : knownHosts)
values << host;
return values;
} }
// The parser is quite simple: 'nextToken' knowns exactly what kind of tokens // The parser is quite simple: 'nextToken' knowns exactly what kind of tokens

View File

@ -57,26 +57,28 @@
#include <QtCore/qdatetime.h> #include <QtCore/qdatetime.h>
#include <QtCore/qstring.h> #include <QtCore/qstring.h>
#include <QtCore/qglobal.h> #include <QtCore/qglobal.h>
#include <QtCore/qlist.h>
#include <QtCore/qpair.h> #include <QtCore/qpair.h>
#include <QtCore/qurl.h> #include <QtCore/qurl.h>
#include <QtCore/qmap.h> #include <QtCore/qmap.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
template<typename T> class QList;
template <typename T> class QVector;
class Q_AUTOTEST_EXPORT QHstsCache class Q_AUTOTEST_EXPORT QHstsCache
{ {
public: public:
void updateFromHeaders(const QList<QPair<QByteArray, QByteArray>> &headers, void updateFromHeaders(const QList<QPair<QByteArray, QByteArray>> &headers,
const QUrl &url); const QUrl &url);
void updateFromPolicies(const QList<QHstsPolicy> &hosts); void updateFromPolicies(const QVector<QHstsPolicy> &hosts);
void updateKnownHost(const QUrl &url, const QDateTime &expires, void updateKnownHost(const QUrl &url, const QDateTime &expires,
bool includeSubDomains); bool includeSubDomains);
bool isKnownHost(const QUrl &url) const; bool isKnownHost(const QUrl &url) const;
void clear(); void clear();
QList<QHstsPolicy> policies() const; QVector<QHstsPolicy> policies() const;
private: private:

View File

@ -60,10 +60,10 @@ QT_BEGIN_NAMESPACE
applies to subdomains, either in the constructor or by calling setExpiry(), applies to subdomains, either in the constructor or by calling setExpiry(),
setHost() and setIncludesSubdomains(). setHost() and setIncludesSubdomains().
\sa QNetworkAccessManager::enableStrictTransportSecurity() \sa QNetworkAccessManager::setStrictTransportSecurityEnabled()
*/ */
class QHstsPolicyPrivate class QHstsPolicyPrivate : public QSharedData
{ {
public: public:
QUrl url; QUrl url;
@ -77,6 +77,15 @@ public:
} }
}; };
/*!
Returns \c true if the two policies have the same host and expiration date
while agreeing on whether to include or exclude subdomains.
*/
bool operator==(const QHstsPolicy &lhs, const QHstsPolicy &rhs)
{
return *lhs.d == *rhs.d;
}
/*! /*!
Constructs an invalid (expired) policy with empty host name and subdomains Constructs an invalid (expired) policy with empty host name and subdomains
not included. not included.
@ -121,17 +130,7 @@ QHstsPolicy::~QHstsPolicy()
*/ */
QHstsPolicy &QHstsPolicy::operator=(const QHstsPolicy &other) QHstsPolicy &QHstsPolicy::operator=(const QHstsPolicy &other)
{ {
*d = *other.d; d = other.d;
return *this;
}
/*!
Move-assignment operator.
*/
QHstsPolicy &QHstsPolicy::operator=(QHstsPolicy &&other) Q_DECL_NOTHROW
{
qSwap(d, other.d);
return *this; return *this;
} }
@ -195,15 +194,6 @@ bool QHstsPolicy::includesSubDomains() const
return d->includeSubDomains; return d->includeSubDomains;
} }
/*!
Returns \c true if the two policies have the same host and expiration date
while agreeing on whether to include or exclude subdomains.
*/
bool QHstsPolicy::operator==(const QHstsPolicy &other) const
{
return *d == *other.d;
}
/*! /*!
Return \c true if this policy has a valid expiration date and this date Return \c true if this policy has a valid expiration date and this date
is greater than QDateTime::currentGetDateTimeUtc(). is greater than QDateTime::currentGetDateTimeUtc().

View File

@ -42,7 +42,7 @@
#include <QtNetwork/qtnetworkglobal.h> #include <QtNetwork/qtnetworkglobal.h>
#include <QtCore/qscopedpointer.h> #include <QtCore/qshareddata.h>
#include <QtCore/qurl.h> #include <QtCore/qurl.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -55,13 +55,15 @@ class Q_NETWORK_EXPORT QHstsPolicy
public: public:
QHstsPolicy(); QHstsPolicy();
QHstsPolicy(const QDateTime &expiry, bool includeSubDomains, const QString &host, explicit QHstsPolicy(const QDateTime &expiry, bool includeSubDomains, const QString &host,
QUrl::ParsingMode mode = QUrl::DecodedMode); QUrl::ParsingMode mode = QUrl::DecodedMode);
QHstsPolicy(const QHstsPolicy &rhs); QHstsPolicy(const QHstsPolicy &rhs);
QHstsPolicy &operator=(const QHstsPolicy &rhs); QHstsPolicy &operator=(const QHstsPolicy &rhs);
QHstsPolicy &operator=(QHstsPolicy &&rhs) Q_DECL_NOTHROW; QHstsPolicy &operator=(QHstsPolicy &&other) Q_DECL_NOTHROW { swap(other); return *this; }
~QHstsPolicy(); ~QHstsPolicy();
void swap(QHstsPolicy &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
void setHost(const QString &host, QUrl::ParsingMode mode = QUrl::DecodedMode); void setHost(const QString &host, QUrl::ParsingMode mode = QUrl::DecodedMode);
QString host(QUrl::ComponentFormattingOptions options = QUrl::FullyDecoded) const; QString host(QUrl::ComponentFormattingOptions options = QUrl::FullyDecoded) const;
void setExpiry(const QDateTime &expiry); void setExpiry(const QDateTime &expiry);
@ -69,14 +71,25 @@ public:
void setIncludesSubDomains(bool include); void setIncludesSubDomains(bool include);
bool includesSubDomains() const; bool includesSubDomains() const;
bool operator==(const QHstsPolicy &rhs) const;
bool isExpired() const; bool isExpired() const;
private: private:
QScopedPointer<QHstsPolicyPrivate> d; QSharedDataPointer<QHstsPolicyPrivate> d;
friend Q_NETWORK_EXPORT bool operator==(const QHstsPolicy &lhs, const QHstsPolicy &rhs);
}; };
Q_DECLARE_SHARED(QHstsPolicy)
Q_NETWORK_EXPORT bool operator==(const QHstsPolicy &lhs, const QHstsPolicy &rhs);
inline bool operator!=(const QHstsPolicy &lhs, const QHstsPolicy &rhs)
{
return !(lhs == rhs);
}
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // QHSTSPOLICY_H #endif // QHSTSPOLICY_H

View File

@ -550,15 +550,15 @@ QUrl QHttpNetworkConnectionPrivate::parseRedirectResponse(QAbstractSocket *socke
// Check redirect url protocol // Check redirect url protocol
const QUrl priorUrl(reply->request().url()); const QUrl priorUrl(reply->request().url());
if (redirectUrl.scheme() == QLatin1String("http") || redirectUrl.scheme() == QLatin1String("https")) { if (redirectUrl.scheme() == QLatin1String("http") || redirectUrl.scheme() == QLatin1String("https")) {
switch (reply->request().redirectsPolicy()) { switch (reply->request().redirectPolicy()) {
case QNetworkRequest::NoLessSafeRedirectsPolicy: case QNetworkRequest::NoLessSafeRedirectPolicy:
// Here we could handle https->http redirects as InsecureProtocolError. // Here we could handle https->http redirects as InsecureProtocolError.
// However, if HSTS is enabled and redirectUrl.host() is a known STS // However, if HSTS is enabled and redirectUrl.host() is a known STS
// host, then we'll replace its scheme and this won't downgrade protocol, // host, then we'll replace its scheme and this won't downgrade protocol,
// after all. We cannot access QNAM's STS cache from here, so delegate // after all. We cannot access QNAM's STS cache from here, so delegate
// this check to QNetworkReplyHttpImpl. // this check to QNetworkReplyHttpImpl.
break; break;
case QNetworkRequest::SameOriginRedirectsPolicy: case QNetworkRequest::SameOriginRedirectPolicy:
if (priorUrl.host() != redirectUrl.host() if (priorUrl.host() != redirectUrl.host()
|| priorUrl.scheme() != redirectUrl.scheme() || priorUrl.scheme() != redirectUrl.scheme()
|| priorUrl.port() != redirectUrl.port()) { || priorUrl.port() != redirectUrl.port()) {
@ -566,7 +566,7 @@ QUrl QHttpNetworkConnectionPrivate::parseRedirectResponse(QAbstractSocket *socke
return QUrl(); return QUrl();
} }
break; break;
case QNetworkRequest::UserVerifiedRedirectsPolicy: case QNetworkRequest::UserVerifiedRedirectPolicy:
break; break;
default: default:
Q_ASSERT(!"Unexpected redirect policy"); Q_ASSERT(!"Unexpected redirect policy");

View File

@ -49,7 +49,7 @@ QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(QHttpNetworkRequest::Oper
: QHttpNetworkHeaderPrivate(newUrl), operation(op), priority(pri), uploadByteDevice(0), : QHttpNetworkHeaderPrivate(newUrl), operation(op), priority(pri), uploadByteDevice(0),
autoDecompress(false), pipeliningAllowed(false), spdyAllowed(false), http2Allowed(false), autoDecompress(false), pipeliningAllowed(false), spdyAllowed(false), http2Allowed(false),
withCredentials(true), preConnect(false), redirectCount(0), withCredentials(true), preConnect(false), redirectCount(0),
redirectsPolicy(QNetworkRequest::ManualRedirectsPolicy) redirectPolicy(QNetworkRequest::ManualRedirectPolicy)
{ {
} }
@ -67,7 +67,7 @@ QHttpNetworkRequestPrivate::QHttpNetworkRequestPrivate(const QHttpNetworkRequest
ssl(other.ssl), ssl(other.ssl),
preConnect(other.preConnect), preConnect(other.preConnect),
redirectCount(other.redirectCount), redirectCount(other.redirectCount),
redirectsPolicy(other.redirectsPolicy) redirectPolicy(other.redirectPolicy)
{ {
} }
@ -90,7 +90,7 @@ bool QHttpNetworkRequestPrivate::operator==(const QHttpNetworkRequestPrivate &ot
&& (withCredentials == other.withCredentials) && (withCredentials == other.withCredentials)
&& (ssl == other.ssl) && (ssl == other.ssl)
&& (preConnect == other.preConnect) && (preConnect == other.preConnect)
&& (redirectsPolicy == other.redirectsPolicy); && (redirectPolicy == other.redirectPolicy);
} }
QByteArray QHttpNetworkRequest::methodName() const QByteArray QHttpNetworkRequest::methodName() const
@ -231,17 +231,17 @@ void QHttpNetworkRequest::setPreConnect(bool preConnect)
bool QHttpNetworkRequest::isFollowRedirects() const bool QHttpNetworkRequest::isFollowRedirects() const
{ {
return d->redirectsPolicy != QNetworkRequest::ManualRedirectsPolicy; return d->redirectPolicy != QNetworkRequest::ManualRedirectPolicy;
} }
void QHttpNetworkRequest::setRedirectsPolicy(QNetworkRequest::RedirectsPolicy policy) void QHttpNetworkRequest::setRedirectPolicy(QNetworkRequest::RedirectPolicy policy)
{ {
d->redirectsPolicy = policy; d->redirectPolicy = policy;
} }
QNetworkRequest::RedirectsPolicy QHttpNetworkRequest::redirectsPolicy() const QNetworkRequest::RedirectPolicy QHttpNetworkRequest::redirectPolicy() const
{ {
return d->redirectsPolicy; return d->redirectPolicy;
} }
int QHttpNetworkRequest::redirectCount() const int QHttpNetworkRequest::redirectCount() const

View File

@ -131,8 +131,8 @@ public:
void setPreConnect(bool preConnect); void setPreConnect(bool preConnect);
bool isFollowRedirects() const; bool isFollowRedirects() const;
void setRedirectsPolicy(QNetworkRequest::RedirectsPolicy policy); void setRedirectPolicy(QNetworkRequest::RedirectPolicy policy);
QNetworkRequest::RedirectsPolicy redirectsPolicy() const; QNetworkRequest::RedirectPolicy redirectPolicy() const;
int redirectCount() const; int redirectCount() const;
void setRedirectCount(int count); void setRedirectCount(int count);
@ -176,7 +176,7 @@ public:
bool ssl; bool ssl;
bool preConnect; bool preConnect;
int redirectCount; int redirectCount;
QNetworkRequest::RedirectsPolicy redirectsPolicy; QNetworkRequest::RedirectPolicy redirectPolicy;
}; };

View File

@ -697,36 +697,22 @@ void QNetworkAccessManager::setCookieJar(QNetworkCookieJar *cookieJar)
/*! /*!
\since 5.9 \since 5.9
Enables HTTP Strict Transport Security (HSTS, RFC6797). When processing a If \a enabled is \c true, QNetworkAccessManager follows the HTTP Strict Transport
request, QNetworkAccessManager automatically replaces "http" scheme with Security policy (HSTS, RFC6797). When processing a request, QNetworkAccessManager
"https" and uses a secure transport if a host is a known HSTS host. automatically replaces the "http" scheme with "https" and uses a secure transport
Port 80 if it's set explicitly is replaced by port 443. for HSTS hosts. If it's set explicitly, port 80 is replaced by port 443.
When HSTS is enabled, for each HTTP response containing HSTS header and When HSTS is enabled, for each HTTP response containing HSTS header and
received over a secure transport, QNetworkAccessManager will update its HSTS received over a secure transport, QNetworkAccessManager will update its HSTS
cache, either remembering a host with a valid policy or removing a host with cache, either remembering a host with a valid policy or removing a host with
expired/disabled HSTS policy. an expired or disabled HSTS policy.
\sa disableStrictTransportSecurity(), strictTransportSecurityEnabled() \sa isStrictTransportSecurityEnabled()
*/ */
void QNetworkAccessManager::enableStrictTransportSecurity() void QNetworkAccessManager::setStrictTransportSecurityEnabled(bool enabled)
{ {
Q_D(QNetworkAccessManager); Q_D(QNetworkAccessManager);
d->stsEnabled = true; d->stsEnabled = enabled;
}
/*!
\since 5.9
Disables HTTP Strict Transport Security (HSTS). HSTS headers in responses would
be ignored, no scheme/port mapping is done.
\sa enableStrictTransportSecurity()
*/
void QNetworkAccessManager::disableStrictTransportSecurity()
{
Q_D(QNetworkAccessManager);
d->stsEnabled = false;
} }
/*! /*!
@ -735,9 +721,9 @@ void QNetworkAccessManager::disableStrictTransportSecurity()
Returns true if HTTP Strict Transport Security (HSTS) was enabled. By default Returns true if HTTP Strict Transport Security (HSTS) was enabled. By default
HSTS is disabled. HSTS is disabled.
\sa enableStrictTransportSecurity \sa setStrictTransportSecurityEnabled()
*/ */
bool QNetworkAccessManager::strictTransportSecurityEnabled() const bool QNetworkAccessManager::isStrictTransportSecurityEnabled() const
{ {
Q_D(const QNetworkAccessManager); Q_D(const QNetworkAccessManager);
return d->stsEnabled; return d->stsEnabled;
@ -761,7 +747,7 @@ bool QNetworkAccessManager::strictTransportSecurityEnabled() const
\sa addStrictTransportSecurityHosts(), QHstsPolicy \sa addStrictTransportSecurityHosts(), QHstsPolicy
*/ */
void QNetworkAccessManager::addStrictTransportSecurityHosts(const QList<QHstsPolicy> &knownHosts) void QNetworkAccessManager::addStrictTransportSecurityHosts(const QVector<QHstsPolicy> &knownHosts)
{ {
Q_D(QNetworkAccessManager); Q_D(QNetworkAccessManager);
d->stsCache.updateFromPolicies(knownHosts); d->stsCache.updateFromPolicies(knownHosts);
@ -776,7 +762,7 @@ void QNetworkAccessManager::addStrictTransportSecurityHosts(const QList<QHstsPol
\sa addStrictTransportSecurityHosts(), QHstsPolicy \sa addStrictTransportSecurityHosts(), QHstsPolicy
*/ */
QList<QHstsPolicy> QNetworkAccessManager::strictTransportSecurityHosts() const QVector<QHstsPolicy> QNetworkAccessManager::strictTransportSecurityHosts() const
{ {
Q_D(const QNetworkAccessManager); Q_D(const QNetworkAccessManager);
return d->stsCache.policies(); return d->stsCache.policies();
@ -1171,7 +1157,7 @@ void QNetworkAccessManager::connectToHost(const QString &hostName, quint16 port)
/*! /*!
\since 5.9 \since 5.9
Sets the manager's redirects policy to be the \a policy specified. This policy Sets the manager's redirect policy to be the \a policy specified. This policy
will affect all subsequent requests created by the manager. will affect all subsequent requests created by the manager.
Use this function to enable or disable HTTP redirects on the manager's level. Use this function to enable or disable HTTP redirects on the manager's level.
@ -1180,18 +1166,18 @@ void QNetworkAccessManager::connectToHost(const QString &hostName, quint16 port)
the highest priority, next by priority is QNetworkRequest::FollowRedirectsAttribute. the highest priority, next by priority is QNetworkRequest::FollowRedirectsAttribute.
Finally, the manager's policy has the lowest priority. Finally, the manager's policy has the lowest priority.
For backwards compatibility the default value is QNetworkRequest::ManualRedirectsPolicy. For backwards compatibility the default value is QNetworkRequest::ManualRedirectPolicy.
This may change in the future and some type of auto-redirect policy will become This may change in the future and some type of auto-redirect policy will become
the default; clients relying on manual redirect handling are encouraged to set the default; clients relying on manual redirect handling are encouraged to set
this policy explicitly in their code. this policy explicitly in their code.
\sa redirectsPolicy(), QNetworkRequest::RedirectsPolicy, \sa redirectPolicy(), QNetworkRequest::RedirectPolicy,
QNetworkRequest::FollowRedirectsAttribute QNetworkRequest::FollowRedirectsAttribute
*/ */
void QNetworkAccessManager::setRedirectsPolicy(QNetworkRequest::RedirectsPolicy policy) void QNetworkAccessManager::setRedirectPolicy(QNetworkRequest::RedirectPolicy policy)
{ {
Q_D(QNetworkAccessManager); Q_D(QNetworkAccessManager);
d->redirectsPolicy = policy; d->redirectPolicy = policy;
} }
/*! /*!
@ -1199,12 +1185,12 @@ void QNetworkAccessManager::setRedirectsPolicy(QNetworkRequest::RedirectsPolicy
Returns the redirect policy that is used when creating new requests. Returns the redirect policy that is used when creating new requests.
\sa setRedirectsPolicy(), QNetworkRequest::RedirectsPolicy \sa setRedirectPolicy(), QNetworkRequest::RedirectPolicy
*/ */
QNetworkRequest::RedirectsPolicy QNetworkAccessManager::redirectsPolicy() const QNetworkRequest::RedirectPolicy QNetworkAccessManager::redirectPolicy() const
{ {
Q_D(const QNetworkAccessManager); Q_D(const QNetworkAccessManager);
return d->redirectsPolicy; return d->redirectPolicy;
} }
/*! /*!
@ -1294,12 +1280,12 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
Q_D(QNetworkAccessManager); Q_D(QNetworkAccessManager);
QNetworkRequest req(originalReq); QNetworkRequest req(originalReq);
if (req.attribute(QNetworkRequest::RedirectsPolicyAttribute).isNull() if (req.attribute(QNetworkRequest::RedirectPolicyAttribute).isNull()
&& req.attribute(QNetworkRequest::FollowRedirectsAttribute).isNull()) { && req.attribute(QNetworkRequest::FollowRedirectsAttribute).isNull()) {
// We only apply the general manager's policy if: // We only apply the general manager's policy if:
// - RedirectsPolicyAttribute is not set already on request and // - RedirectPolicyAttribute is not set already on request and
// - no FollowRedirectsAttribute is set. // - no FollowRedirectsAttribute is set.
req.setAttribute(QNetworkRequest::RedirectsPolicyAttribute, redirectsPolicy()); req.setAttribute(QNetworkRequest::RedirectPolicyAttribute, redirectPolicy());
} }
bool isLocalFile = req.url().isLocalFile(); bool isLocalFile = req.url().isLocalFile();
@ -1390,7 +1376,7 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
#endif #endif
) { ) {
#ifndef QT_NO_SSL #ifndef QT_NO_SSL
if (strictTransportSecurityEnabled() && d->stsCache.isKnownHost(request.url())) { if (isStrictTransportSecurityEnabled() && d->stsCache.isKnownHost(request.url())) {
QUrl stsUrl(request.url()); QUrl stsUrl(request.url());
// RFC6797, 8.3: // RFC6797, 8.3:
// The UA MUST replace the URI scheme with "https" [RFC2818], // The UA MUST replace the URI scheme with "https" [RFC2818],

View File

@ -42,6 +42,7 @@
#include <QtNetwork/qtnetworkglobal.h> #include <QtNetwork/qtnetworkglobal.h>
#include <QtNetwork/qnetworkrequest.h> #include <QtNetwork/qnetworkrequest.h>
#include <QtCore/QVector>
#include <QtCore/QObject> #include <QtCore/QObject>
#ifndef QT_NO_SSL #ifndef QT_NO_SSL
#include <QtNetwork/QSslConfiguration> #include <QtNetwork/QSslConfiguration>
@ -121,11 +122,10 @@ public:
QNetworkCookieJar *cookieJar() const; QNetworkCookieJar *cookieJar() const;
void setCookieJar(QNetworkCookieJar *cookieJar); void setCookieJar(QNetworkCookieJar *cookieJar);
void enableStrictTransportSecurity(); void setStrictTransportSecurityEnabled(bool enabled);
void disableStrictTransportSecurity(); bool isStrictTransportSecurityEnabled() const;
bool strictTransportSecurityEnabled() const; void addStrictTransportSecurityHosts(const QVector<QHstsPolicy> &knownHosts);
void addStrictTransportSecurityHosts(const QList<QHstsPolicy> &knownHosts); QVector<QHstsPolicy> strictTransportSecurityHosts() const;
QList<QHstsPolicy> strictTransportSecurityHosts() const;
QNetworkReply *head(const QNetworkRequest &request); QNetworkReply *head(const QNetworkRequest &request);
QNetworkReply *get(const QNetworkRequest &request); QNetworkReply *get(const QNetworkRequest &request);
@ -155,8 +155,8 @@ public:
#endif #endif
void connectToHost(const QString &hostName, quint16 port = 80); void connectToHost(const QString &hostName, quint16 port = 80);
void setRedirectsPolicy(QNetworkRequest::RedirectsPolicy policy); void setRedirectPolicy(QNetworkRequest::RedirectPolicy policy);
QNetworkRequest::RedirectsPolicy redirectsPolicy() const; QNetworkRequest::RedirectPolicy redirectPolicy() const;
Q_SIGNALS: Q_SIGNALS:
#ifndef QT_NO_NETWORKPROXY #ifndef QT_NO_NETWORKPROXY

View File

@ -93,7 +93,7 @@ public:
#endif #endif
cookieJarCreated(false), cookieJarCreated(false),
defaultAccessControl(true), defaultAccessControl(true),
redirectsPolicy(QNetworkRequest::ManualRedirectsPolicy), redirectPolicy(QNetworkRequest::ManualRedirectPolicy),
authenticationManager(QSharedPointer<QNetworkAccessAuthenticationManager>::create()) authenticationManager(QSharedPointer<QNetworkAccessAuthenticationManager>::create())
{ {
#ifndef QT_NO_BEARERMANAGEMENT #ifndef QT_NO_BEARERMANAGEMENT
@ -196,7 +196,7 @@ public:
bool cookieJarCreated; bool cookieJarCreated;
bool defaultAccessControl; bool defaultAccessControl;
QNetworkRequest::RedirectsPolicy redirectsPolicy; QNetworkRequest::RedirectPolicy redirectPolicy;
// The cache with authorization data: // The cache with authorization data:
QSharedPointer<QNetworkAccessAuthenticationManager> authenticationManager; QSharedPointer<QNetworkAccessAuthenticationManager> authenticationManager;

View File

@ -736,7 +736,7 @@ void QNetworkReply::setSslConfiguration(const QSslConfiguration &config)
this function has no effect. this function has no effect.
\sa sslConfiguration(), sslErrors(), QSslSocket::ignoreSslErrors(), \sa sslConfiguration(), sslErrors(), QSslSocket::ignoreSslErrors(),
QNetworkAccessManager::enableStrictTransportSecurity() QNetworkAccessManager::setStrictTransportSecurityEnabled()
*/ */
void QNetworkReply::ignoreSslErrors(const QList<QSslError> &errors) void QNetworkReply::ignoreSslErrors(const QList<QSslError> &errors)
{ {

View File

@ -668,14 +668,14 @@ void QNetworkReplyHttpImplPrivate::postRequest(const QNetworkRequest &newHttpReq
} }
#endif #endif
auto redirectsPolicy = QNetworkRequest::ManualRedirectsPolicy; auto redirectPolicy = QNetworkRequest::ManualRedirectPolicy;
const QVariant value = newHttpRequest.attribute(QNetworkRequest::RedirectsPolicyAttribute); const QVariant value = newHttpRequest.attribute(QNetworkRequest::RedirectPolicyAttribute);
if (value.isValid()) if (value.isValid())
redirectsPolicy = value.value<QNetworkRequest::RedirectsPolicy>(); redirectPolicy = value.value<QNetworkRequest::RedirectPolicy>();
else if (newHttpRequest.attribute(QNetworkRequest::FollowRedirectsAttribute).toBool()) else if (newHttpRequest.attribute(QNetworkRequest::FollowRedirectsAttribute).toBool())
redirectsPolicy = QNetworkRequest::NoLessSafeRedirectsPolicy; redirectPolicy = QNetworkRequest::NoLessSafeRedirectPolicy;
httpRequest.setRedirectsPolicy(redirectsPolicy); httpRequest.setRedirectPolicy(redirectPolicy);
httpRequest.setPriority(convert(newHttpRequest.priority())); httpRequest.setPriority(convert(newHttpRequest.priority()));
@ -1155,7 +1155,7 @@ void QNetworkReplyHttpImplPrivate::onRedirected(const QUrl &redirectUrl, int htt
const bool isLessSafe = schemeBefore == QLatin1String("https") const bool isLessSafe = schemeBefore == QLatin1String("https")
&& url.scheme() == QLatin1String("http"); && url.scheme() == QLatin1String("http");
if (httpRequest.redirectsPolicy() == QNetworkRequest::NoLessSafeRedirectsPolicy if (httpRequest.redirectPolicy() == QNetworkRequest::NoLessSafeRedirectPolicy
&& isLessSafe) { && isLessSafe) {
error(QNetworkReply::InsecureRedirectError, error(QNetworkReply::InsecureRedirectError,
QCoreApplication::translate("QHttp", "Insecure redirect")); QCoreApplication::translate("QHttp", "Insecure redirect"));
@ -1165,7 +1165,7 @@ void QNetworkReplyHttpImplPrivate::onRedirected(const QUrl &redirectUrl, int htt
redirectRequest = createRedirectRequest(originalRequest, url, maxRedirectsRemaining); redirectRequest = createRedirectRequest(originalRequest, url, maxRedirectsRemaining);
operation = getRedirectOperation(operation, httpStatus); operation = getRedirectOperation(operation, httpStatus);
if (httpRequest.redirectsPolicy() != QNetworkRequest::UserVerifiedRedirectsPolicy) if (httpRequest.redirectPolicy() != QNetworkRequest::UserVerifiedRedirectPolicy)
followRedirect(); followRedirect();
emit q->redirected(url); emit q->redirected(url);

View File

@ -289,9 +289,9 @@ QT_BEGIN_NAMESPACE
marked to be decompressed automatically. marked to be decompressed automatically.
(This value was introduced in 5.9.) (This value was introduced in 5.9.)
\value RedirectsPolicyAttribute \value RedirectPolicyAttribute
Requests only, type: QMetaType::Int, should be one of the Requests only, type: QMetaType::Int, should be one of the
QNetworkRequest::RedirectsPolicy values (default: ManualRedirectsPolicy). QNetworkRequest::RedirectPolicy values (default: ManualRedirectPolicy).
This attribute obsoletes FollowRedirectsAttribute. This attribute obsoletes FollowRedirectsAttribute.
(This value was introduced in 5.9.) (This value was introduced in 5.9.)
@ -343,25 +343,25 @@ QT_BEGIN_NAMESPACE
*/ */
/*! /*!
\enum QNetworkRequest::RedirectsPolicy \enum QNetworkRequest::RedirectPolicy
\since 5.9 \since 5.9
Indicates whether the Network Access API should automatically follow a Indicates whether the Network Access API should automatically follow a
HTTP redirect response or not. HTTP redirect response or not.
\value ManualRedirectsPolicy Default value: not following any redirects. \value ManualRedirectPolicy Default value: not following any redirects.
\value NoLessSafeRedirectsPolicy Only "http"->"http", "http" -> "https" \value NoLessSafeRedirectPolicy Only "http"->"http", "http" -> "https"
or "https" -> "https" redirects are allowed. or "https" -> "https" redirects are allowed.
Equivalent to setting the old FollowRedirectsAttribute Equivalent to setting the old FollowRedirectsAttribute
to true to true
\value SameOriginRedirectsPolicy Require the same protocol, host and port. \value SameOriginRedirectPolicy Require the same protocol, host and port.
Note, http://example.com and http://example.com:80 Note, http://example.com and http://example.com:80
will fail with this policy (implicit/explicit ports will fail with this policy (implicit/explicit ports
are considered to be a mismatch). are considered to be a mismatch).
\value UserVerifiedRedirectsPolicy Client decides whether to follow each \value UserVerifiedRedirectPolicy Client decides whether to follow each
redirect by handling the redirected() redirect by handling the redirected()
signal, emitting redirectAllowed() on signal, emitting redirectAllowed() on
the QNetworkReply object to allow the QNetworkReply object to allow

View File

@ -91,7 +91,7 @@ public:
HTTP2AllowedAttribute, HTTP2AllowedAttribute,
HTTP2WasUsedAttribute, HTTP2WasUsedAttribute,
OriginalContentLengthAttribute, OriginalContentLengthAttribute,
RedirectsPolicyAttribute, RedirectPolicyAttribute,
User = 1000, User = 1000,
UserMax = 32767 UserMax = 32767
@ -113,11 +113,11 @@ public:
LowPriority = 5 LowPriority = 5
}; };
enum RedirectsPolicy { enum RedirectPolicy {
ManualRedirectsPolicy, ManualRedirectPolicy,
NoLessSafeRedirectsPolicy, NoLessSafeRedirectPolicy,
SameOriginRedirectsPolicy, SameOriginRedirectPolicy,
UserVerifiedRedirectsPolicy UserVerifiedRedirectPolicy
}; };
@ -177,6 +177,6 @@ Q_DECLARE_SHARED(QNetworkRequest)
QT_END_NAMESPACE QT_END_NAMESPACE
Q_DECLARE_METATYPE(QNetworkRequest) Q_DECLARE_METATYPE(QNetworkRequest)
Q_DECLARE_METATYPE(QNetworkRequest::RedirectsPolicy) Q_DECLARE_METATYPE(QNetworkRequest::RedirectPolicy)
#endif #endif

View File

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

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com> ** Copyright (C) 2016 Alex Trotsenko <alex1973tr@gmail.com>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the documentation of the Qt Toolkit. ** This file is part of the documentation of the Qt Toolkit.
** **

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 Intel Corporation. ** Copyright (C) 2016 Intel Corporation.
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtNetwork module of the Qt Toolkit. ** This file is part of the QtNetwork module of the Qt Toolkit.
** **

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 Intel Corporation. ** Copyright (C) 2016 Intel Corporation.
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtNetwork module of the Qt Toolkit. ** This file is part of the QtNetwork module of the Qt Toolkit.
** **

View File

@ -1,31 +1,37 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 Intel Corporation. ** Copyright (C) 2015 Intel Corporation.
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtNetwork module of the Qt Toolkit. ** This file is part of the QtNetwork module of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -358,17 +358,41 @@ bool QNativeSocketEnginePrivate::checkProxy(const QHostAddress &address)
#if !defined(QT_NO_NETWORKPROXY) #if !defined(QT_NO_NETWORKPROXY)
QObject *parent = q_func()->parent(); QObject *parent = q_func()->parent();
QNetworkProxy proxy; QNetworkProxy proxy;
QNetworkProxyQuery::QueryType queryType = QNetworkProxyQuery::TcpSocket;
if (QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(parent)) { if (QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(parent)) {
proxy = socket->proxy(); proxy = socket->proxy();
switch (socket->socketType()) {
case QAbstractSocket::UdpSocket:
queryType = QNetworkProxyQuery::UdpSocket;
break;
case QAbstractSocket::SctpSocket:
queryType = QNetworkProxyQuery::SctpSocket;
break;
case QAbstractSocket::TcpSocket:
case QAbstractSocket::UnknownSocketType:
queryType = QNetworkProxyQuery::TcpSocket;
}
} else if (QTcpServer *server = qobject_cast<QTcpServer *>(parent)) { } else if (QTcpServer *server = qobject_cast<QTcpServer *>(parent)) {
proxy = server->proxy(); proxy = server->proxy();
queryType = QNetworkProxyQuery::TcpServer;
#ifndef QT_NO_SCTP
if (qobject_cast<QSctpServer *>(server))
queryType = QNetworkProxyQuery::SctpServer;
#endif
} else { } else {
// no parent -> no proxy // no parent -> no proxy
return true; return true;
} }
if (proxy.type() == QNetworkProxy::DefaultProxy) if (proxy.type() == QNetworkProxy::DefaultProxy) {
proxy = QNetworkProxy::applicationProxy(); // This is similar to what we have in QNetworkProxy::applicationProxy,
// the only difference is that we provide the correct query type instead of
// always using TcpSocket unconditionally (this is the default type for
// QNetworkProxyQuery).
QNetworkProxyQuery query;
query.setQueryType(queryType);
proxy = QNetworkProxyFactory::systemProxyForQuery(query).constFirst();
}
if (proxy.type() != QNetworkProxy::DefaultProxy && if (proxy.type() != QNetworkProxy::DefaultProxy &&
proxy.type() != QNetworkProxy::NoProxy) { proxy.type() != QNetworkProxy::NoProxy) {

View File

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

View File

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

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk> ** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtNetwork module of the Qt Toolkit. ** This file is part of the QtNetwork module of the Qt Toolkit.
** **

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk> ** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtNetwork module of the Qt Toolkit. ** This file is part of the QtNetwork module of the Qt Toolkit.
** **

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk> ** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtNetwork module of the Qt Toolkit. ** This file is part of the QtNetwork module of the Qt Toolkit.
** **

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk> ** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtNetwork module of the Qt Toolkit. ** This file is part of the QtNetwork module of the Qt Toolkit.
** **

View File

@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk> ** Copyright (C) 2015 Mikkel Krautz <mikkel@krautz.dk>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtNetwork module of the Qt Toolkit. ** This file is part of the QtNetwork module of the Qt Toolkit.
** **

View File

@ -56,7 +56,7 @@ qtConfig(ssl) {
ssl/qsslellipticcurve_dummy.cpp ssl/qsslellipticcurve_dummy.cpp
} }
qtConfig(openssl)|qtConfig(openssl-linked) { qtConfig(openssl) {
HEADERS += ssl/qsslcontext_openssl_p.h \ HEADERS += ssl/qsslcontext_openssl_p.h \
ssl/qsslsocket_openssl_p.h \ ssl/qsslsocket_openssl_p.h \
ssl/qsslsocket_openssl_symbols_p.h ssl/qsslsocket_openssl_symbols_p.h
@ -79,16 +79,10 @@ qtConfig(ssl) {
# - libs in <OPENSSL_DIR>\lib\VC\static # - 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" # - 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) qtConfig(openssl-linked): \
QMAKE_USE_FOR_PRIVATE += openssl
CONFIG(debug, debug|release) { else: \
LIBS_PRIVATE += $$OPENSSL_LIBS_DEBUG QMAKE_USE_FOR_PRIVATE += openssl/nolink
} else {
LIBS_PRIVATE += $$OPENSSL_LIBS_RELEASE
}
QMAKE_CXXFLAGS += $$OPENSSL_CFLAGS
LIBS_PRIVATE += $$OPENSSL_LIBS
win32: LIBS_PRIVATE += -lcrypt32 win32: LIBS_PRIVATE += -lcrypt32
} }
} }

View File

@ -1,31 +1,37 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/ ** Contact: http://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -5,27 +5,33 @@
** **
** This file is part of the plugins module of the Qt Toolkit. ** This file is part of the plugins module of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -37,6 +37,8 @@
** **
****************************************************************************/ ****************************************************************************/
#include <QtGui/qtgui-config.h>
#ifndef QT_NO_SYSTEMTRAYICON #ifndef QT_NO_SYSTEMTRAYICON
#include "qdbustrayicon_p.h" #include "qdbustrayicon_p.h"
#endif #endif

View File

@ -3,5 +3,8 @@ SOURCES += $$PWD/qgenericunixthemes.cpp
qtConfig(dbus) { qtConfig(dbus) {
include(dbusmenu/dbusmenu.pri) include(dbusmenu/dbusmenu.pri)
qtConfig(systemtrayicon) {
include(dbustray/dbustray.pri) include(dbustray/dbustray.pri)
} }
}

View File

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

View File

@ -100,10 +100,6 @@ bool QAndroidPlatformOpenGLContext::makeCurrent(QPlatformSurface *surface)
bool ret = QEGLPlatformContext::makeCurrent(surface); bool ret = QEGLPlatformContext::makeCurrent(surface);
QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context()); 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()) if (!ctx_d->workaround_brokenFBOReadBack && needsFBOReadBackWorkaround())
ctx_d->workaround_brokenFBOReadBack = true; ctx_d->workaround_brokenFBOReadBack = true;

View File

@ -1,32 +1,38 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Copyright (C) 2015-2016 Oleksandr Tymoshenko <gonzo@bluezbox.com> ** Copyright (C) 2015-2016 Oleksandr Tymoshenko <gonzo@bluezbox.com>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -1,32 +1,38 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Copyright (C) 2015-2016 Oleksandr Tymoshenko <gonzo@bluezbox.com> ** Copyright (C) 2015-2016 Oleksandr Tymoshenko <gonzo@bluezbox.com>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -1,31 +1,37 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -1,32 +1,38 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Copyright (C) 2015-2016 Oleksandr Tymoshenko <gonzo@bluezbox.com> ** Copyright (C) 2015-2016 Oleksandr Tymoshenko <gonzo@bluezbox.com>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -1,32 +1,38 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2016 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Copyright (C) 2015-2016 Oleksandr Tymoshenko <gonzo@bluezbox.com> ** Copyright (C) 2015-2016 Oleksandr Tymoshenko <gonzo@bluezbox.com>
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

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

View File

@ -1,31 +1,37 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -1,31 +1,37 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -1,31 +1,37 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -1,31 +1,37 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -1,31 +1,37 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 The Qt Company Ltd. ** Copyright (C) 2017 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the plugins of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

View File

@ -1,31 +1,37 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2015 Green Hills Software ** Copyright (C) 2015 Green Hills Software
** Contact: http://www.qt.io/licensing/ ** Contact: https://www.qt.io/licensing/
** **
** This file is part of the QtGui module of the Qt Toolkit. ** This file is part of the plugins of the Qt Toolkit.
** **
** $QT_BEGIN_LICENSE:LGPL21$ ** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage ** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in ** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the ** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in ** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms ** a written agreement between you and The Qt Company. For licensing terms
** and conditions see http://www.qt.io/terms-conditions. For further ** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us. ** information use the contact form at https://www.qt.io/contact-us.
** **
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser ** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 or version 3 as published by the Free ** General Public License version 3 as published by the Free Software
** Software Foundation and appearing in the file LICENSE.LGPLv21 and ** Foundation and appearing in the file LICENSE.LGPL3 included in the
** LICENSE.LGPLv3 included in the packaging of this file. Please review the ** packaging of this file. Please review the following information to
** following information to ensure the GNU Lesser General Public License ** ensure the GNU Lesser General Public License version 3 requirements
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
** **
** As a special exception, The Qt Company gives you certain additional ** GNU General Public License Usage
** rights. These rights are described in The Qt Company LGPL Exception ** Alternatively, this file may be used under the terms of the GNU
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
** **
** $QT_END_LICENSE$ ** $QT_END_LICENSE$
** **

Some files were not shown because too many files have changed in this diff Show More